This is the mail archive of the libc-hacker@sourceware.org mailing list for the glibc project.
Note that libc-hacker is a closed list. You may look at the archives of this list, but subscription and posting are not open.
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
Other format: | [Raw text] |
Hi! The first 2 changed files fix most of the cancellation tests on sparc64 (the only remaining failures ATM are: tst-cancel24 (failes due to buggy G++ 3.4.x, I have verified it is fixed in 4.1.x), tst-cancelx{4,5} (cancellation for pause failed, no idea what's going up yet) and tst-cancelx21 (haven't looked)), most of the changes are to use sparc64 stat64/lstat64 syscalls (not fstat64 yet, since it is broken in the kernel) to get nsec precision in *stat* and the last 3 changed files is c++ types check data addition and while I've been doing that I have also updated alpha. 2006-01-09 Jakub Jelinek <jakub@redhat.com> * sysdeps/unix/sysv/linux/sparc/bits/setjmp.h (_JMPBUF_UNWINDS): Add stack bias to mc_fp field. * sysdeps/unix/sysv/linux/sparc/sparc64/kernel_stat.h (struct kernel_stat): Rename st_[amc]time fields to st_[amc]time_sec. (struct kernel_stat64): New type. (_HAVE___UNUSED1, _HAVE___UNUSED2, _HAVE_STAT___UNUSED1, _HAVE_STAT___UNUSED2, _HAVE_STAT___UNUSED3, _HAVE_STAT___UNUSED4, _HAVE_STAT___UNUSED5, _HAVE_STAT___PAD1, _HAVE_STAT___PAD2, _HAVE_STAT64___UNUSED1, _HAVE_STAT64___UNUSED2, _HAVE_STAT64___UNUSED3, _HAVE_STAT64___UNUSED4, _HAVE_STAT64___UNUSED5, _HAVE_STAT64___PAD1, _HAVE_STAT64___PAD2): Remove. * sysdeps/unix/sysv/linux/sparc/sparc64/xstat.c: New file. * sysdeps/unix/sysv/linux/sparc/sparc64/lxstat.c: New file. * sysdeps/unix/sysv/linux/sparc/sparc64/fxstatat.c: New file. * sysdeps/unix/sysv/linux/sparc/sparc64/xstatconv.c: New file. * sysdeps/unix/sysv/linux/sparc/bits/stat.h (struct stat, struct stat64): Add nsec resolution for 64-bit code like already done for 32-bit code. * sysdeps/unix/sysv/linux/kernel-features.h (__ASSUME_TRUNCATE64_SYSCALL, __ASSUME_MMAP2_SYSCALL) Don't define for sparc64. (__ASSUME_STAT64_SYSCALL): Only define for sparc64 for >= 2.6.12 kernels. * scripts/data/c++-types-sparc-linux-gnu.data: New file. * scripts/data/c++-types-sparc64-linux-gnu.data: New file. * scripts/data/c++-types-alpha-linux-gnu.data: Adjust. nptl/ * sysdeps/sparc/sparc64/jmpbuf-unwind.h (_JMPBUF_UNWINDS_ADJ): Add stack bias to mc_ftp field. --- libc/sysdeps/unix/sysv/linux/sparc/bits/setjmp.h.jj 2006-01-02 15:48:54.000000000 -0500 +++ libc/sysdeps/unix/sysv/linux/sparc/bits/setjmp.h 2006-01-02 15:48:54.000000000 -0500 @@ -61,7 +61,7 @@ typedef struct __sparc64_jmp_buf /* Test if longjmp to JMPBUF would unwind the frame containing a local variable at ADDRESS. */ #define _JMPBUF_UNWINDS(jmpbuf, address, demangle) \ - ((unsigned long int) (address) < (jmpbuf)->uc_mcontext.mc_fp) + ((unsigned long int) (address) < (jmpbuf)->uc_mcontext.mc_fp + 2047) #else --- libc/nptl/sysdeps/sparc/sparc64/jmpbuf-unwind.h.jj 2006-01-02 15:53:34.000000000 -0500 +++ libc/nptl/sysdeps/sparc/sparc64/jmpbuf-unwind.h 2006-01-07 07:36:15.000000000 -0500 @@ -25,7 +25,8 @@ _JMPBUF_UNWINDS_ADJ (_jmpbuf, (void *) _Unwind_GetCFA (_context), _adj) #define _JMPBUF_UNWINDS_ADJ(_jmpbuf, _address, _adj) \ - ((uintptr_t) (_address) - (_adj) < (uintptr_t) (_jmpbuf)[0].uc_mcontext.mc_fp - (_adj)) + ((uintptr_t) (_address) - (_adj) \ + < (uintptr_t) (_jmpbuf)[0].uc_mcontext.mc_fp + 2047 - (_adj)) /* We use the normal lobngjmp for unwinding. */ #define __libc_unwind_longjmp(buf, val) __libc_longjmp (buf, val) --- libc/sysdeps/unix/sysv/linux/sparc/sparc64/kernel_stat.h.jj 2000-08-12 01:12:58.000000000 -0400 +++ libc/sysdeps/unix/sysv/linux/sparc/sparc64/kernel_stat.h 2006-01-08 14:57:35.000000000 -0500 @@ -9,31 +9,39 @@ struct kernel_stat unsigned int st_gid; unsigned int st_rdev; long int st_size; - long int st_atime; - long int st_mtime; - long int st_ctime; + long int st_atime_sec; + long int st_mtime_sec; + long int st_ctime_sec; long int st_blksize; long int st_blocks; unsigned long int __unused1; unsigned long int __unused2; }; -#define _HAVE___UNUSED1 -#define _HAVE___UNUSED2 +/* Definition of `struct stat64' used in the kernel. */ +struct kernel_stat64 + { + unsigned long int st_dev; + unsigned long int st_ino; + unsigned long int st_nlink; -#define _HAVE_STAT___UNUSED1 -#define _HAVE_STAT___UNUSED2 -#define _HAVE_STAT___UNUSED3 -#define _HAVE_STAT___UNUSED4 -#define _HAVE_STAT___UNUSED5 -#define _HAVE_STAT___PAD1 -#define _HAVE_STAT___PAD2 -#define _HAVE_STAT64___UNUSED1 -#define _HAVE_STAT64___UNUSED2 -#define _HAVE_STAT64___UNUSED3 -#define _HAVE_STAT64___UNUSED4 -#define _HAVE_STAT64___UNUSED5 -#define _HAVE_STAT64___PAD1 -#define _HAVE_STAT64___PAD2 + unsigned int st_mode; + unsigned int st_uid; + unsigned int st_gid; + unsigned int __pad0; + + unsigned long int st_rdev; + long int st_size; + long int st_blksize; + long int st_blocks; + + unsigned long int st_atime_sec; + unsigned long int st_atime_nsec; + unsigned long int st_mtime_sec; + unsigned long int st_mtime_nsec; + unsigned long int st_ctime_sec; + unsigned long int st_ctime_nsec; + long int __unused[3]; + }; #define XSTAT_IS_XSTAT64 1 --- libc/sysdeps/unix/sysv/linux/sparc/sparc64/xstat.c.jj 2004-03-23 18:25:52.000000000 -0500 +++ libc/sysdeps/unix/sysv/linux/sparc/sparc64/xstat.c 2006-01-08 14:51:26.000000000 -0500 @@ -1 +1,8 @@ -#include "../../xstat.c" +#include "../../i386/xstat.c" + +#ifdef __NR_stat64 +# if __ASSUME_STAT64_SYSCALL == 0 +/* The variable is shared between all wrappers around *stat{,64} calls. */ +int __have_no_stat64; +# endif +#endif --- libc/sysdeps/unix/sysv/linux/sparc/sparc64/xstatconv.c.jj 2006-01-08 14:51:26.000000000 -0500 +++ libc/sysdeps/unix/sysv/linux/sparc/sparc64/xstatconv.c 2006-01-08 15:30:28.000000000 -0500 @@ -0,0 +1,127 @@ +/* Convert between the kernel's `struct stat' format, and libc's. + Copyright (C) 1991, 1995, 1996, 1997, 2000, 2002, 2003, 2006 + 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. */ + +#include <assert.h> +#include <errno.h> +#include <sys/stat.h> +#include <kernel_stat.h> +#include <string.h> +#include <kernel-features.h> + +int +__xstat_conv (int vers, struct kernel_stat *kbuf, void *ubuf) +{ + switch (vers) + { + case _STAT_VER_KERNEL: + /* Nothing to do. The struct is in the form the kernel expects. + We should have short-circuted before we got here, but for + completeness... */ + *(struct kernel_stat *) ubuf = *kbuf; + break; + + case _STAT_VER_LINUX: + { + struct stat *buf = ubuf; + + /* Convert to current kernel version of `struct stat'. */ + buf->st_dev = kbuf->st_dev; + buf->__pad1 = 0; + buf->st_ino = kbuf->st_ino; + buf->st_mode = kbuf->st_mode; + buf->st_nlink = kbuf->st_nlink; + buf->st_uid = kbuf->st_uid; + buf->st_gid = kbuf->st_gid; + buf->st_rdev = kbuf->st_rdev; + buf->__pad2 = 0; + buf->st_size = kbuf->st_size; + buf->st_blksize = kbuf->st_blksize; + buf->st_blocks = kbuf->st_blocks; + buf->st_atim.tv_sec = kbuf->st_atime_sec; + buf->st_atim.tv_nsec = 0; + buf->st_mtim.tv_sec = kbuf->st_mtime_sec; + buf->st_mtim.tv_nsec = 0; + buf->st_ctim.tv_sec = kbuf->st_ctime_sec; + buf->st_ctim.tv_nsec = 0; + buf->__unused4 = 0; + buf->__unused5 = 0; + } + break; + + default: + __set_errno (EINVAL); + return -1; + } + + return 0; +} + +int +__xstat32_conv (int vers, struct stat64 *sbuf, struct stat *buf) +{ + struct kernel_stat64 *kbuf; + + /* *stat64 syscalls on sparc64 really fill in struct kernel_stat64, + rather than struct stat64. But it is the same size as + struct kernel_stat64, so use this hack so that we can reuse + i386 {,f,l}xstat{,at}.c routines. */ + __asm ("" : "=r" (kbuf) : "0" (sbuf)); + assert (sizeof (struct stat) == sizeof (struct stat64)); + assert (sizeof (struct stat64) >= sizeof (struct kernel_stat64)); + + switch (vers) + { + case _STAT_VER_LINUX: + { + /* Convert current kernel version of `struct stat64' to + `struct stat'. */ + buf->st_dev = kbuf->st_dev; + buf->__pad1 = 0; + buf->st_ino = kbuf->st_ino; + buf->st_mode = kbuf->st_mode; + buf->st_nlink = kbuf->st_nlink; + buf->st_uid = kbuf->st_uid; + buf->st_gid = kbuf->st_gid; + buf->st_rdev = kbuf->st_rdev; + buf->__pad2 = 0; + buf->st_size = kbuf->st_size; + buf->st_blksize = kbuf->st_blksize; + buf->st_blocks = kbuf->st_blocks; + buf->st_atim.tv_sec = kbuf->st_atime_sec; + buf->st_atim.tv_nsec = kbuf->st_atime_nsec; + buf->st_mtim.tv_sec = kbuf->st_mtime_sec; + buf->st_mtim.tv_nsec = kbuf->st_mtime_nsec; + buf->st_ctim.tv_sec = kbuf->st_ctime_sec; + buf->st_ctim.tv_nsec = kbuf->st_ctime_nsec; + buf->__unused4 = 0; + buf->__unused5 = 0; + } + break; + + /* If struct stat64 is different from struct stat then + _STAT_VER_KERNEL does not make sense. */ + case _STAT_VER_KERNEL: + default: + __set_errno (EINVAL); + return -1; + } + + return 0; +} --- libc/sysdeps/unix/sysv/linux/sparc/sparc64/fxstatat.c.jj 2005-11-11 14:56:19.000000000 -0500 +++ libc/sysdeps/unix/sysv/linux/sparc/sparc64/fxstatat.c 2006-01-08 14:56:14.000000000 -0500 @@ -1 +1 @@ -#include "../../fxstatat.c" +#include "../../i386/fxstatat.c" --- libc/sysdeps/unix/sysv/linux/sparc/bits/stat.h.jj 2003-06-26 13:00:37.000000000 -0400 +++ libc/sysdeps/unix/sysv/linux/sparc/bits/stat.h 2006-01-08 14:51:26.000000000 -0500 @@ -1,4 +1,5 @@ -/* Copyright (C) 1992,95,96,97,98,99,2000,2001,2002 Free Software Foundation, Inc. +/* Copyright (C) 1992, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2006 + 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 @@ -60,15 +61,7 @@ struct stat #else __blkcnt64_t st_blocks; /* Number 512-byte blocks allocated. */ #endif -#if __WORDSIZE == 64 - __time_t st_atime; /* Time of last access. */ - unsigned long int __unused1; - __time_t st_mtime; /* Time of last modification. */ - unsigned long int __unused2; - __time_t st_ctime; /* Time of last status change. */ - unsigned long int __unused3; -#else -# ifdef __USE_MISC +#ifdef __USE_MISC /* Nanosecond resolution timestamps are stored in a format equivalent to 'struct timespec'. This is the type used whenever possible but the Unix namespace rules do not allow the @@ -78,17 +71,16 @@ struct stat struct timespec st_atim; /* Time of last access. */ struct timespec st_mtim; /* Time of last modification. */ struct timespec st_ctim; /* Time of last status change. */ -# define st_atime st_atim.tv_sec /* Backward compatibility. */ -# define st_mtime st_mtim.tv_sec -# define st_ctime st_ctim.tv_sec -# else +# define st_atime st_atim.tv_sec /* Backward compatibility. */ +# define st_mtime st_mtim.tv_sec +# define st_ctime st_ctim.tv_sec +#else __time_t st_atime; /* Time of last access. */ unsigned long int st_atimensec; /* Nscecs of last access. */ __time_t st_mtime; /* Time of last modification. */ unsigned long int st_mtimensec; /* Nsecs of last modification. */ __time_t st_ctime; /* Time of last status change. */ unsigned long int st_ctimensec; /* Nsecs of last status change. */ -# endif #endif unsigned long int __unused4; unsigned long int __unused5; @@ -112,15 +104,7 @@ struct stat64 __blksize_t st_blksize; /* Optimal block size for I/O. */ __blkcnt64_t st_blocks; /* Number 512-byte blocks allocated. */ -#if __WORDSIZE == 64 - __time_t st_atime; /* Time of last access. */ - unsigned long int __unused1; - __time_t st_mtime; /* Time of last modification. */ - unsigned long int __unused2; - __time_t st_ctime; /* Time of last status change. */ - unsigned long int __unused3; -#else -# ifdef __USE_MISC +#ifdef __USE_MISC /* Nanosecond resolution timestamps are stored in a format equivalent to 'struct timespec'. This is the type used whenever possible but the Unix namespace rules do not allow the @@ -130,17 +114,16 @@ struct stat64 struct timespec st_atim; /* Time of last access. */ struct timespec st_mtim; /* Time of last modification. */ struct timespec st_ctim; /* Time of last status change. */ -# define st_atime st_atim.tv_sec /* Backward compatibility. */ -# define st_mtime st_mtim.tv_sec -# define st_ctime st_ctim.tv_sec -# else +# define st_atime st_atim.tv_sec /* Backward compatibility. */ +# define st_mtime st_mtim.tv_sec +# define st_ctime st_ctim.tv_sec +#else __time_t st_atime; /* Time of last access. */ unsigned long int st_atimensec; /* Nscecs of last access. */ __time_t st_mtime; /* Time of last modification. */ unsigned long int st_mtimensec; /* Nsecs of last modification. */ __time_t st_ctime; /* Time of last status change. */ unsigned long int st_ctimensec; /* Nsecs of last status change. */ -# endif #endif unsigned long int __unused4; unsigned long int __unused5; --- libc/sysdeps/unix/sysv/linux/kernel-features.h.jj 2006-01-06 20:35:33.000000000 -0500 +++ libc/sysdeps/unix/sysv/linux/kernel-features.h 2006-01-06 20:35:33.000000000 -0500 @@ -111,7 +111,8 @@ /* On sparc and ARM the truncate64/ftruncate64/mmap2/stat64/lstat64/fstat64 syscalls were introduced in 2.3.35. */ -#if __LINUX_KERNEL_VERSION >= 131875 && (defined __sparc__ || defined __arm__) +#if __LINUX_KERNEL_VERSION >= 131875 \ + && ((defined __sparc__ && !defined __arch64__) || defined __arm__) # define __ASSUME_TRUNCATE64_SYSCALL 1 # define __ASSUME_MMAP2_SYSCALL 1 # define __ASSUME_STAT64_SYSCALL 1 @@ -447,3 +448,9 @@ #if __LINUX_KERNEL_VERSION >= 0x020609 && defined __alpha__ #define __ASSUME_IEEE_RAISE_EXCEPTION 1 #endif + +/* On sparc64 stat64/lstat64/fstat64 syscalls were introduced in 2.6.12. */ +#if __LINUX_KERNEL_VERSION >= 0x02060c && defined __sparc__ \ + && defined __arch64__ +# define __ASSUME_STAT64_SYSCALL 1 +#endif --- libc/scripts/data/c++-types-sparc-linux-gnu.data.jj 2006-01-09 05:05:36.000000000 -0500 +++ libc/scripts/data/c++-types-sparc-linux-gnu.data 2006-01-09 05:01:44.000000000 -0500 @@ -0,0 +1,67 @@ +blkcnt64_t:x +blkcnt_t:l +blksize_t:l +caddr_t:Pc +clockid_t:i +clock_t:l +daddr_t:i +dev_t:y +fd_mask:l +fsblkcnt64_t:y +fsblkcnt_t:m +fsfilcnt64_t:y +fsfilcnt_t:m +fsid_t:8__fsid_t +gid_t:j +id_t:j +ino64_t:y +ino_t:m +int16_t:s +int32_t:i +int64_t:x +int8_t:a +intptr_t:i +key_t:i +loff_t:x +mode_t:j +nlink_t:j +off64_t:x +off_t:l +pid_t:i +pthread_attr_t:14pthread_attr_t +pthread_barrier_t:17pthread_barrier_t +pthread_barrierattr_t:21pthread_barrierattr_t +pthread_cond_t:14pthread_cond_t +pthread_condattr_t:18pthread_condattr_t +pthread_key_t:j +pthread_mutex_t:15pthread_mutex_t +pthread_mutexattr_t:19pthread_mutexattr_t +pthread_once_t:i +pthread_rwlock_t:16pthread_rwlock_t +pthread_rwlockattr_t:20pthread_rwlockattr_t +pthread_spinlock_t:i +pthread_t:m +quad_t:x +register_t:i +rlim64_t:y +rlim_t:m +sigset_t:10__sigset_t +size_t:j +socklen_t:j +ssize_t:i +suseconds_t:i +time_t:l +u_char:h +uid_t:j +uint:j +u_int:j +u_int16_t:t +u_int32_t:j +u_int64_t:y +u_int8_t:h +ulong:m +u_long:m +u_quad_t:y +useconds_t:j +ushort:t +u_short:t --- libc/scripts/data/c++-types-sparc64-linux-gnu.data.jj 2006-01-09 05:05:40.000000000 -0500 +++ libc/scripts/data/c++-types-sparc64-linux-gnu.data 2006-01-09 05:02:04.000000000 -0500 @@ -0,0 +1,67 @@ +blkcnt64_t:l +blkcnt_t:l +blksize_t:l +caddr_t:Pc +clockid_t:i +clock_t:l +daddr_t:i +dev_t:m +fd_mask:l +fsblkcnt64_t:m +fsblkcnt_t:m +fsfilcnt64_t:m +fsfilcnt_t:m +fsid_t:8__fsid_t +gid_t:j +id_t:j +ino64_t:m +ino_t:m +int16_t:s +int32_t:i +int64_t:l +int8_t:a +intptr_t:l +key_t:i +loff_t:l +mode_t:j +nlink_t:j +off64_t:l +off_t:l +pid_t:i +pthread_attr_t:14pthread_attr_t +pthread_barrier_t:17pthread_barrier_t +pthread_barrierattr_t:21pthread_barrierattr_t +pthread_cond_t:14pthread_cond_t +pthread_condattr_t:18pthread_condattr_t +pthread_key_t:j +pthread_mutex_t:15pthread_mutex_t +pthread_mutexattr_t:19pthread_mutexattr_t +pthread_once_t:i +pthread_rwlock_t:16pthread_rwlock_t +pthread_rwlockattr_t:20pthread_rwlockattr_t +pthread_spinlock_t:i +pthread_t:m +quad_t:l +register_t:l +rlim64_t:m +rlim_t:m +sigset_t:10__sigset_t +size_t:m +socklen_t:j +ssize_t:l +suseconds_t:i +time_t:l +u_char:h +uid_t:j +uint:j +u_int:j +u_int16_t:t +u_int32_t:j +u_int64_t:m +u_int8_t:h +ulong:m +u_long:m +u_quad_t:m +useconds_t:j +ushort:t +u_short:t --- libc/scripts/data/c++-types-alpha-linux-gnu.data.jj 2004-09-15 14:23:39.000000000 +0200 +++ libc/scripts/data/c++-types-alpha-linux-gnu.data 2006-01-09 15:42:34.000000000 +0100 @@ -28,8 +28,17 @@ nlink_t:j off64_t:l off_t:l pid_t:i +pthread_attr_t:14pthread_attr_t +pthread_barrier_t:17pthread_barrier_t +pthread_barrierattr_t:21pthread_barrierattr_t +pthread_cond_t:14pthread_cond_t +pthread_condattr_t:18pthread_condattr_t pthread_key_t:j +pthread_mutex_t:15pthread_mutex_t +pthread_mutexattr_t:19pthread_mutexattr_t pthread_once_t:i +pthread_rwlock_t:16pthread_rwlock_t +pthread_rwlockattr_t:20pthread_rwlockattr_t pthread_spinlock_t:i pthread_t:m quad_t:l Jakub
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |