Consolidated 64bit support for Linux.
authordrepper <drepper>
Tue, 23 Mar 2004 23:25:52 +0000 (23:25 +0000)
committerdrepper <drepper>
Tue, 23 Mar 2004 23:25:52 +0000 (23:25 +0000)
35 files changed:
sysdeps/unix/sysv/linux/alpha/getdents64.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/powerpc/powerpc64/syscalls.list [new file with mode: 0644]
sysdeps/unix/sysv/linux/sparc/sparc64/fxstat.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/sparc/sparc64/lxstat.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/sparc/sparc64/xstat.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/wordsize-64/fstatfs64.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/wordsize-64/fstatvfs.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/wordsize-64/fstatvfs64.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/wordsize-64/ftruncate64.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/wordsize-64/fxstat.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/wordsize-64/fxstat64.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/wordsize-64/getdents.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/wordsize-64/getdents64.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/wordsize-64/getrlimit64.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/wordsize-64/glob64.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/wordsize-64/lxstat.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/wordsize-64/lxstat64.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/wordsize-64/mmap64.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/wordsize-64/posix_fadvise.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/wordsize-64/posix_fadvise64.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/wordsize-64/pread64.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/wordsize-64/pwrite64.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/wordsize-64/readdir.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/wordsize-64/readdir64.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/wordsize-64/readdir64_r.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/wordsize-64/readdir_r.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/wordsize-64/sendfile64.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/wordsize-64/setrlimit64.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/wordsize-64/statfs64.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/wordsize-64/statvfs.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/wordsize-64/statvfs64.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/wordsize-64/syscalls.list [new file with mode: 0644]
sysdeps/unix/sysv/linux/wordsize-64/truncate64.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/wordsize-64/xstat.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/wordsize-64/xstat64.c [new file with mode: 0644]

diff --git a/sysdeps/unix/sysv/linux/alpha/getdents64.c b/sysdeps/unix/sysv/linux/alpha/getdents64.c
new file mode 100644 (file)
index 0000000..e53570c
--- /dev/null
@@ -0,0 +1 @@
+#include "../getdents64.c"
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/syscalls.list b/sysdeps/unix/sysv/linux/powerpc/powerpc64/syscalls.list
new file mode 100644 (file)
index 0000000..aee60bf
--- /dev/null
@@ -0,0 +1,3 @@
+# File name    Caller  Syscall name    # args  Strong name     Weak names
+
+getrlimit      -       ugetrlimit      i:ip    __getrlimit     getrlimit getrlimit64
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/fxstat.c b/sysdeps/unix/sysv/linux/sparc/sparc64/fxstat.c
new file mode 100644 (file)
index 0000000..6b37477
--- /dev/null
@@ -0,0 +1 @@
+#include "../../fxstat.c"
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/lxstat.c b/sysdeps/unix/sysv/linux/sparc/sparc64/lxstat.c
new file mode 100644 (file)
index 0000000..7637472
--- /dev/null
@@ -0,0 +1 @@
+#include "../../lxstat.c"
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/xstat.c b/sysdeps/unix/sysv/linux/sparc/sparc64/xstat.c
new file mode 100644 (file)
index 0000000..27d700b
--- /dev/null
@@ -0,0 +1 @@
+#include "../../xstat.c"
diff --git a/sysdeps/unix/sysv/linux/wordsize-64/fstatfs64.c b/sysdeps/unix/sysv/linux/wordsize-64/fstatfs64.c
new file mode 100644 (file)
index 0000000..2be4e59
--- /dev/null
@@ -0,0 +1 @@
+/* fstatfs64 is the same as fstatfs. */
diff --git a/sysdeps/unix/sysv/linux/wordsize-64/fstatvfs.c b/sysdeps/unix/sysv/linux/wordsize-64/fstatvfs.c
new file mode 100644 (file)
index 0000000..d04bcd4
--- /dev/null
@@ -0,0 +1,5 @@
+#define __fstatvfs64(file, buf) __no_fstatvfs64(file, buf)
+#define fstatvfs64(file, buf) no_fstatvfs64(file, buf)
+#include "../fstatvfs.c"
+strong_alias (fstatvfs, __fstatvfs64)
+weak_alias (fstatvfs, fstatvfs64)
diff --git a/sysdeps/unix/sysv/linux/wordsize-64/fstatvfs64.c b/sysdeps/unix/sysv/linux/wordsize-64/fstatvfs64.c
new file mode 100644 (file)
index 0000000..60f3dfe
--- /dev/null
@@ -0,0 +1 @@
+/* fstatvfs64 is the same as fstatvfs. */
diff --git a/sysdeps/unix/sysv/linux/wordsize-64/ftruncate64.c b/sysdeps/unix/sysv/linux/wordsize-64/ftruncate64.c
new file mode 100644 (file)
index 0000000..673a8b5
--- /dev/null
@@ -0,0 +1 @@
+/* ftruncate64 is the same as ftruncate. */
diff --git a/sysdeps/unix/sysv/linux/wordsize-64/fxstat.c b/sysdeps/unix/sysv/linux/wordsize-64/fxstat.c
new file mode 100644 (file)
index 0000000..dd47dbb
--- /dev/null
@@ -0,0 +1,48 @@
+/* fxstat using old-style Unix fstat system call.
+   Copyright (C) 1991, 1995, 1996, 1997, 1998, 2000, 2002, 2003, 2004
+   Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+/* Ho hum, since xstat == xstat64 we must get rid of the prototype or gcc
+   will complain since they don't strictly match.  */
+#define __fxstat64 __fxstat64_disable
+
+#include <errno.h>
+#include <stddef.h>
+#include <sys/stat.h>
+
+#include <sysdep.h>
+#include <sys/syscall.h>
+#include <bp-checks.h>
+
+/* Get information about the file FD in BUF.  */
+int
+__fxstat (int vers, int fd, struct stat *buf)
+{
+  if (vers == _STAT_VER_KERNEL || vers == _STAT_VER_LINUX)
+    return INLINE_SYSCALL (fstat, 2, fd, CHECK_1 ((struct kernel_stat *) buf));
+
+  __set_errno (EINVAL);
+  return -1;
+}
+
+hidden_def (__fxstat)
+weak_alias (__fxstat, _fxstat);
+#undef __fxstat64
+strong_alias (__fxstat, __fxstat64);
+hidden_ver (__fxstat, __fxstat64)
diff --git a/sysdeps/unix/sysv/linux/wordsize-64/fxstat64.c b/sysdeps/unix/sysv/linux/wordsize-64/fxstat64.c
new file mode 100644 (file)
index 0000000..9eff9eb
--- /dev/null
@@ -0,0 +1 @@
+/* fxstat64 is in fxstat.c */
diff --git a/sysdeps/unix/sysv/linux/wordsize-64/getdents.c b/sysdeps/unix/sysv/linux/wordsize-64/getdents.c
new file mode 100644 (file)
index 0000000..491fa9d
--- /dev/null
@@ -0,0 +1,4 @@
+#define __getdents64 __no___getdents64_decl
+#include <sysdeps/unix/sysv/linux/getdents.c>
+#undef __getdents64
+weak_alias(__getdents, __getdents64);
diff --git a/sysdeps/unix/sysv/linux/wordsize-64/getdents64.c b/sysdeps/unix/sysv/linux/wordsize-64/getdents64.c
new file mode 100644 (file)
index 0000000..0df2c8f
--- /dev/null
@@ -0,0 +1 @@
+/* getdents64 is in getdents.c */
diff --git a/sysdeps/unix/sysv/linux/wordsize-64/getrlimit64.c b/sysdeps/unix/sysv/linux/wordsize-64/getrlimit64.c
new file mode 100644 (file)
index 0000000..9feab0e
--- /dev/null
@@ -0,0 +1 @@
+/* getrlimit64 is the same as getrlimit. */
diff --git a/sysdeps/unix/sysv/linux/wordsize-64/glob64.c b/sysdeps/unix/sysv/linux/wordsize-64/glob64.c
new file mode 100644 (file)
index 0000000..33918ea
--- /dev/null
@@ -0,0 +1 @@
+/* glob64 is in glob.c */
diff --git a/sysdeps/unix/sysv/linux/wordsize-64/lxstat.c b/sysdeps/unix/sysv/linux/wordsize-64/lxstat.c
new file mode 100644 (file)
index 0000000..2b93776
--- /dev/null
@@ -0,0 +1,48 @@
+/* lxstat using old-style Unix lstat system call.
+   Copyright (C) 1991, 1995, 1996, 1997, 1998, 2000, 2002, 2003, 2004
+   Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+/* Ho hum, since xstat == xstat64 we must get rid of the prototype or gcc
+   will complain since they don't strictly match.  */
+#define __lxstat64 __lxstat64_disable
+
+#include <errno.h>
+#include <stddef.h>
+#include <sys/stat.h>
+
+#include <sysdep.h>
+#include <sys/syscall.h>
+#include <bp-checks.h>
+
+/* Get information about the file FD in BUF.  */
+int
+__lxstat (int vers, const char *name, struct stat *buf)
+{
+  if (vers == _STAT_VER_KERNEL || vers == _STAT_VER_LINUX)
+    return INLINE_SYSCALL (lstat, 2, CHECK_STRING (name), CHECK_1 (buf));
+
+  __set_errno (EINVAL);
+  return -1;
+}
+
+hidden_def (__lxstat)
+weak_alias (__lxstat, _lxstat);
+#undef __lxstat64
+strong_alias (__lxstat, __lxstat64);
+hidden_ver (__lxstat, __lxstat64)
diff --git a/sysdeps/unix/sysv/linux/wordsize-64/lxstat64.c b/sysdeps/unix/sysv/linux/wordsize-64/lxstat64.c
new file mode 100644 (file)
index 0000000..bb5dbd0
--- /dev/null
@@ -0,0 +1 @@
+/* lxstat64 is in lxstat.c */
diff --git a/sysdeps/unix/sysv/linux/wordsize-64/mmap64.c b/sysdeps/unix/sysv/linux/wordsize-64/mmap64.c
new file mode 100644 (file)
index 0000000..0dbd384
--- /dev/null
@@ -0,0 +1 @@
+/* mmap64 is the same as mmap. */
diff --git a/sysdeps/unix/sysv/linux/wordsize-64/posix_fadvise.c b/sysdeps/unix/sysv/linux/wordsize-64/posix_fadvise.c
new file mode 100644 (file)
index 0000000..b230748
--- /dev/null
@@ -0,0 +1,41 @@
+/* Copyright (C) 2003, 2004 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+#define posix_fadvise64 __no_posix_fadvise64
+#include <errno.h>
+#include <fcntl.h>
+#include <sysdep.h>
+#undef posix_fadvise64
+
+/* Advice the system about the expected behaviour of the application with
+   respect to the file associated with FD.  */
+
+int
+posix_fadvise (int fd, off_t offset, off_t len, int advise)
+{
+#ifdef __NR_fadvise64
+  INTERNAL_SYSCALL_DECL (err);
+  int ret = INTERNAL_SYSCALL (fadvise64, err, 4, fd, offset, len, advise);
+  if (INTERNAL_SYSCALL_ERROR_P (ret, err))
+    return INTERNAL_SYSCALL_ERRNO (ret, err);
+  return 0;
+#else
+  return ENOSYS;
+#endif
+}
+strong_alias (posix_fadvise, posix_fadvise64)
diff --git a/sysdeps/unix/sysv/linux/wordsize-64/posix_fadvise64.c b/sysdeps/unix/sysv/linux/wordsize-64/posix_fadvise64.c
new file mode 100644 (file)
index 0000000..c9f72c4
--- /dev/null
@@ -0,0 +1 @@
+/* posix_fadvise64 is in posix_fadvise.c */
diff --git a/sysdeps/unix/sysv/linux/wordsize-64/pread64.c b/sysdeps/unix/sysv/linux/wordsize-64/pread64.c
new file mode 100644 (file)
index 0000000..b7f298d
--- /dev/null
@@ -0,0 +1 @@
+/* Empty since the pread syscall is equivalent.  */
diff --git a/sysdeps/unix/sysv/linux/wordsize-64/pwrite64.c b/sysdeps/unix/sysv/linux/wordsize-64/pwrite64.c
new file mode 100644 (file)
index 0000000..b7f298d
--- /dev/null
@@ -0,0 +1 @@
+/* Empty since the pread syscall is equivalent.  */
diff --git a/sysdeps/unix/sysv/linux/wordsize-64/readdir.c b/sysdeps/unix/sysv/linux/wordsize-64/readdir.c
new file mode 100644 (file)
index 0000000..300ebb2
--- /dev/null
@@ -0,0 +1,7 @@
+#define readdir64 __no_readdir64_decl
+#define __readdir64 __no___readdir64_decl
+#include <sysdeps/unix/readdir.c>
+#undef __readdir64
+strong_alias (__readdir, __readdir64)
+#undef readdir64
+weak_alias (__readdir, readdir64)
diff --git a/sysdeps/unix/sysv/linux/wordsize-64/readdir64.c b/sysdeps/unix/sysv/linux/wordsize-64/readdir64.c
new file mode 100644 (file)
index 0000000..9796431
--- /dev/null
@@ -0,0 +1 @@
+/* readdir64 is in readdir.c */
diff --git a/sysdeps/unix/sysv/linux/wordsize-64/readdir64_r.c b/sysdeps/unix/sysv/linux/wordsize-64/readdir64_r.c
new file mode 100644 (file)
index 0000000..b8fe9a3
--- /dev/null
@@ -0,0 +1 @@
+/* readdir64_r is in readdir_r.c */
diff --git a/sysdeps/unix/sysv/linux/wordsize-64/readdir_r.c b/sysdeps/unix/sysv/linux/wordsize-64/readdir_r.c
new file mode 100644 (file)
index 0000000..adb92db
--- /dev/null
@@ -0,0 +1,4 @@
+#define readdir64_r __no_readdir64_r_decl
+#include <sysdeps/unix/readdir_r.c>
+#undef readdir64_r
+weak_alias (__readdir_r, readdir64_r)
diff --git a/sysdeps/unix/sysv/linux/wordsize-64/sendfile64.c b/sysdeps/unix/sysv/linux/wordsize-64/sendfile64.c
new file mode 100644 (file)
index 0000000..4c451bd
--- /dev/null
@@ -0,0 +1 @@
+/* sendfile64 is alias of sendfile syscall.  */
diff --git a/sysdeps/unix/sysv/linux/wordsize-64/setrlimit64.c b/sysdeps/unix/sysv/linux/wordsize-64/setrlimit64.c
new file mode 100644 (file)
index 0000000..8edcff0
--- /dev/null
@@ -0,0 +1 @@
+/* setrlimit64 is the same as setrlimit. */
diff --git a/sysdeps/unix/sysv/linux/wordsize-64/statfs64.c b/sysdeps/unix/sysv/linux/wordsize-64/statfs64.c
new file mode 100644 (file)
index 0000000..06bc688
--- /dev/null
@@ -0,0 +1 @@
+/* statfs64 is the same as statfs. */
diff --git a/sysdeps/unix/sysv/linux/wordsize-64/statvfs.c b/sysdeps/unix/sysv/linux/wordsize-64/statvfs.c
new file mode 100644 (file)
index 0000000..f369976
--- /dev/null
@@ -0,0 +1,5 @@
+#define __statvfs64(file, buf) __no_statvfs64(file, buf)
+#define statvfs64(file, buf) no_statvfs64(file, buf)
+#include "../statvfs.c"
+strong_alias (statvfs, __statvfs64)
+weak_alias (statvfs, statvfs64)
diff --git a/sysdeps/unix/sysv/linux/wordsize-64/statvfs64.c b/sysdeps/unix/sysv/linux/wordsize-64/statvfs64.c
new file mode 100644 (file)
index 0000000..510015e
--- /dev/null
@@ -0,0 +1 @@
+/* statvfs64 is the same as statvfs. */
diff --git a/sysdeps/unix/sysv/linux/wordsize-64/syscalls.list b/sysdeps/unix/sysv/linux/wordsize-64/syscalls.list
new file mode 100644 (file)
index 0000000..58904fc
--- /dev/null
@@ -0,0 +1,16 @@
+# File name    Caller  Syscall name    # args  Strong name     Weak names
+
+# Whee! 64-bit systems naturally implement llseek.
+llseek         EXTRA   lseek           Ci:iii  __libc_lseek    __lseek lseek __libc_lseek64 __llseek llseek __lseek64 lseek64
+lseek          llseek  -
+pread          -       pread           Ci:ibni __libc_pread    __libc_pread64 __pread pread __pread64 pread64
+pwrite         -       pwrite          Ci:ibni __libc_pwrite   __libc_pwrite64 __pwrite pwrite __pwrite64 pwrite64
+fstatfs                -       fstatfs         i:ip    __fstatfs       fstatfs fstatfs64 __fstatfs64
+statfs         -       statfs          i:sp    __statfs        statfs statfs64
+mmap           -       mmap            b:aniiii __mmap         mmap __mmap64 mmap64
+ftruncate      -       ftruncate       i:ii    __ftruncate     ftruncate ftruncate64 __ftruncate64
+truncate       -       truncate        i:si    truncate        truncate64
+getrlimit      -       getrlimit       i:ip    __getrlimit     getrlimit getrlimit64
+setrlimit      -       setrlimit       i:ip    __setrlimit     setrlimit setrlimit64
+readahead      -       readahead       i:iii   __readahead     readahead
+sendfile       -       sendfile        i:iipi  sendfile        sendfile64
diff --git a/sysdeps/unix/sysv/linux/wordsize-64/truncate64.c b/sysdeps/unix/sysv/linux/wordsize-64/truncate64.c
new file mode 100644 (file)
index 0000000..8999768
--- /dev/null
@@ -0,0 +1 @@
+/* truncate64 is the same as truncate. */
diff --git a/sysdeps/unix/sysv/linux/wordsize-64/xstat.c b/sysdeps/unix/sysv/linux/wordsize-64/xstat.c
new file mode 100644 (file)
index 0000000..38f32b6
--- /dev/null
@@ -0,0 +1,47 @@
+/* xstat using old-style Unix stat system call.
+   Copyright (C) 1991, 1995, 1996, 1997, 1998, 2000, 2002, 2003, 2004
+   Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+/* Ho hum, since xstat == xstat64 we must get rid of the prototype or gcc
+   will complain since they don't strictly match.  */
+#define __xstat64 __xstat64_disable
+
+#include <errno.h>
+#include <stddef.h>
+#include <sys/stat.h>
+
+#include <sysdep.h>
+#include <sys/syscall.h>
+#include <bp-checks.h>
+
+/* Get information about the file NAME in BUF.  */
+int
+__xstat (int vers, const char *name, struct stat *buf)
+{
+  if (vers == _STAT_VER_KERNEL || vers == _STAT_VER_LINUX)
+    return INLINE_SYSCALL (stat, 2, name, CHECK_1 (buf));
+
+  __set_errno (EINVAL);
+  return -1;
+}
+hidden_def (__xstat)
+weak_alias (__xstat, _xstat);
+#undef __xstat64
+strong_alias (__xstat, __xstat64);
+hidden_ver (__xstat, __xstat64)
diff --git a/sysdeps/unix/sysv/linux/wordsize-64/xstat64.c b/sysdeps/unix/sysv/linux/wordsize-64/xstat64.c
new file mode 100644 (file)
index 0000000..e7acd3b
--- /dev/null
@@ -0,0 +1 @@
+/* xstat64 is in xstat.c */