diff options
| -rw-r--r-- | libc/sysdeps/linux/powerpc/README.bits | 14 | ||||
| -rw-r--r-- | libc/sysdeps/linux/powerpc/bits/atomic.h | 252 | ||||
| -rw-r--r-- | libc/sysdeps/linux/powerpc/bits/mathinline.h | 76 | ||||
| -rw-r--r-- | libc/sysdeps/linux/powerpc/bits/setjmp.h | 7 | ||||
| -rw-r--r-- | libc/sysdeps/linux/powerpc/bits/stat.h | 108 | ||||
| -rw-r--r-- | libc/sysdeps/linux/powerpc/bits/wordsize.h | 7 | ||||
| -rw-r--r-- | libc/sysdeps/linux/powerpc/jmpbuf-offsets.h | 25 | ||||
| -rw-r--r-- | libc/sysdeps/linux/powerpc/powerpc32/sysdep.h | 151 | ||||
| -rw-r--r-- | libc/sysdeps/linux/powerpc/powerpc64/sysdep.h | 243 | ||||
| -rw-r--r-- | libc/sysdeps/linux/powerpc/sys/ucontext.h | 78 | ||||
| -rw-r--r-- | libc/sysdeps/linux/powerpc/sysdep.h | 104 | 
11 files changed, 102 insertions, 963 deletions
| diff --git a/libc/sysdeps/linux/powerpc/README.bits b/libc/sysdeps/linux/powerpc/README.bits deleted file mode 100644 index c0542e5b2..000000000 --- a/libc/sysdeps/linux/powerpc/README.bits +++ /dev/null @@ -1,14 +0,0 @@ - -include/bits is mostly the same as glibc-2.2.4.  The glibc-2.2.4 -versions can be accessed with the tag glibc224. - -Major differences: - -  - termios.h is from the Linux kernel, not glibc, because glibc has -    a very strange legacy conversion layer, which we ignore. - -  - syscall.h is deleted; instead, sysnum.h is autogenerated in uClibc - -  - syscalls.h is added. - - diff --git a/libc/sysdeps/linux/powerpc/bits/atomic.h b/libc/sysdeps/linux/powerpc/bits/atomic.h index a401206d5..4294fb206 100644 --- a/libc/sysdeps/linux/powerpc/bits/atomic.h +++ b/libc/sysdeps/linux/powerpc/bits/atomic.h @@ -1,247 +1,3 @@ -/* Atomic operations.  PowerPC Common version. -   Copyright (C) 2003, 2004 Free Software Foundation, Inc. -   This file is part of the GNU C Library. -   Contributed by Paul Mackerras <paulus@au.ibm.com>, 2003. - -   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, see -   <http://www.gnu.org/licenses/>.  */ - -#include <bits/wordsize.h> - -#if __WORDSIZE == 64 -/* Atomic operations.  PowerPC64 version. -   Copyright (C) 2003, 2004 Free Software Foundation, Inc. -   This file is part of the GNU C Library. -   Contributed by Paul Mackerras <paulus@au.ibm.com>, 2003. - -   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, see -   <http://www.gnu.org/licenses/>.  */ - -/* The 32-bit exchange_bool is different on powerpc64 because the subf -   does signed 64-bit arthmatic while the lwarx is 32-bit unsigned -   (a load word and zero (high 32) form) load. -   In powerpc64 register values are 64-bit by default,  including oldval. -   The value in old val unknown sign extension, lwarx loads the 32-bit -   value as unsigned.  So we explicitly clear the high 32 bits in oldval.  */ -# define __arch_compare_and_exchange_bool_32_acq(mem, newval, oldval) \ -({									      \ -  unsigned int __tmp, __tmp2;						      \ -  __asm__ __volatile__ ("   clrldi  %1,%1,32\n"				      \ -		    "1:	lwarx	%0,0,%2\n"				      \ -		    "	subf.	%0,%1,%0\n"				      \ -		    "	bne	2f\n"					      \ -		    "	stwcx.	%4,0,%2\n"				      \ -		    "	bne-	1b\n"					      \ -		    "2:	" __ARCH_ACQ_INSTR				      \ -		    : "=&r" (__tmp), "=r" (__tmp2)			      \ -		    : "b" (mem), "1" (oldval), "r" (newval)		      \ -		    : "cr0", "memory");					      \ -  __tmp != 0;								      \ -}) - -# define __arch_compare_and_exchange_bool_32_rel(mem, newval, oldval) \ -({									      \ -  unsigned int __tmp, __tmp2;						      \ -  __asm__ __volatile__ (__ARCH_REL_INSTR "\n"				      \ -		    "   clrldi  %1,%1,32\n"				      \ -		    "1:	lwarx	%0,0,%2\n"				      \ -		    "	subf.	%0,%1,%0\n"				      \ -		    "	bne	2f\n"					      \ -		    "	stwcx.	%4,0,%2\n"				      \ -		    "	bne-	1b\n"					      \ -		    "2:	"						      \ -		    : "=&r" (__tmp), "=r" (__tmp2)			      \ -		    : "b" (mem), "1" (oldval), "r" (newval)		      \ -		    : "cr0", "memory");					      \ -  __tmp != 0;								      \ -}) - -/* - * Only powerpc64 processors support Load doubleword and reserve index (ldarx) - * and Store doubleword conditional indexed (stdcx) instructions.  So here - * we define the 64-bit forms. - */ -# define __arch_compare_and_exchange_bool_64_acq(mem, newval, oldval) \ -({									      \ -  unsigned long	__tmp;							      \ -  __asm__ __volatile__ (							      \ -		    "1:	ldarx	%0,0,%1\n"				      \ -		    "	subf.	%0,%2,%0\n"				      \ -		    "	bne	2f\n"					      \ -		    "	stdcx.	%3,0,%1\n"				      \ -		    "	bne-	1b\n"					      \ -		    "2:	" __ARCH_ACQ_INSTR				      \ -		    : "=&r" (__tmp)					      \ -		    : "b" (mem), "r" (oldval), "r" (newval)		      \ -		    : "cr0", "memory");					      \ -  __tmp != 0;								      \ -}) - -# define __arch_compare_and_exchange_bool_64_rel(mem, newval, oldval) \ -({									      \ -  unsigned long	__tmp;							      \ -  __asm__ __volatile__ (__ARCH_REL_INSTR "\n"				      \ -		    "1:	ldarx	%0,0,%1\n"				      \ -		    "	subf.	%0,%2,%0\n"				      \ -		    "	bne	2f\n"					      \ -		    "	stdcx.	%3,0,%1\n"				      \ -		    "	bne-	1b\n"					      \ -		    "2:	"						      \ -		    : "=&r" (__tmp)					      \ -		    : "b" (mem), "r" (oldval), "r" (newval)		      \ -		    : "cr0", "memory");					      \ -  __tmp != 0;								      \ -}) - -#define __arch_compare_and_exchange_val_64_acq(mem, newval, oldval) \ -  ({									      \ -      __typeof (*(mem)) __tmp;						      \ -      __typeof (mem)  __memp = (mem);					      \ -      __asm__ __volatile__ (						      \ -		        "1:	ldarx	%0,0,%1\n"			      \ -		        "	cmpd	%0,%2\n"			      \ -		        "	bne	2f\n"				      \ -		        "	stdcx.	%3,0,%1\n"			      \ -		        "	bne-	1b\n"				      \ -		        "2:	" __ARCH_ACQ_INSTR			      \ -		        : "=&r" (__tmp)					      \ -		        : "b" (__memp), "r" (oldval), "r" (newval)	      \ -		        : "cr0", "memory");				      \ -      __tmp;								      \ -  }) - -#define __arch_compare_and_exchange_val_64_rel(mem, newval, oldval) \ -  ({									      \ -      __typeof (*(mem)) __tmp;						      \ -      __typeof (mem)  __memp = (mem);					      \ -      __asm__ __volatile__ (__ARCH_REL_INSTR "\n"				      \ -		        "1:	ldarx	%0,0,%1\n"			      \ -		        "	cmpd	%0,%2\n"			      \ -		        "	bne	2f\n"				      \ -		        "	stdcx.	%3,0,%1\n"			      \ -		        "	bne-	1b\n"				      \ -		        "2:	"					      \ -		        : "=&r" (__tmp)					      \ -		        : "b" (__memp), "r" (oldval), "r" (newval)	      \ -		        : "cr0", "memory");				      \ -      __tmp;								      \ -  }) - -# define __arch_atomic_exchange_64_acq(mem, value) \ -    ({									      \ -      __typeof (*mem) __val;						      \ -      __asm__ __volatile__ (__ARCH_REL_INSTR "\n"				      \ -			"1:	ldarx	%0,0,%2\n"			      \ -			"	stdcx.	%3,0,%2\n"			      \ -			"	bne-	1b\n"				      \ -		  " " __ARCH_ACQ_INSTR					      \ -			: "=&r" (__val), "=m" (*mem)			      \ -			: "b" (mem), "r" (value), "m" (*mem)		      \ -			: "cr0", "memory");				      \ -      __val;								      \ -    }) - -# define __arch_atomic_exchange_64_rel(mem, value) \ -    ({									      \ -      __typeof (*mem) __val;						      \ -      __asm__ __volatile__ (__ARCH_REL_INSTR "\n"				      \ -			"1:	ldarx	%0,0,%2\n"			      \ -			"	stdcx.	%3,0,%2\n"			      \ -			"	bne-	1b"				      \ -			: "=&r" (__val), "=m" (*mem)			      \ -			: "b" (mem), "r" (value), "m" (*mem)		      \ -			: "cr0", "memory");				      \ -      __val;								      \ -    }) - -# define __arch_atomic_exchange_and_add_64(mem, value) \ -    ({									      \ -      __typeof (*mem) __val, __tmp;					      \ -      __asm__ __volatile__ ("1:	ldarx	%0,0,%3\n"			      \ -			"	add	%1,%0,%4\n"			      \ -			"	stdcx.	%1,0,%3\n"			      \ -			"	bne-	1b"				      \ -			: "=&b" (__val), "=&r" (__tmp), "=m" (*mem)	      \ -			: "b" (mem), "r" (value), "m" (*mem)		      \ -			: "cr0", "memory");				      \ -      __val;								      \ -    }) - -# define __arch_atomic_increment_val_64(mem) \ -    ({									      \ -      __typeof (*(mem)) __val;						      \ -      __asm__ __volatile__ ("1:	ldarx	%0,0,%2\n"			      \ -			"	addi	%0,%0,1\n"			      \ -			"	stdcx.	%0,0,%2\n"			      \ -			"	bne-	1b"				      \ -			: "=&b" (__val), "=m" (*mem)			      \ -			: "b" (mem), "m" (*mem)				      \ -			: "cr0", "memory");				      \ -      __val;								      \ -    }) - -# define __arch_atomic_decrement_val_64(mem) \ -    ({									      \ -      __typeof (*(mem)) __val;						      \ -      __asm__ __volatile__ ("1:	ldarx	%0,0,%2\n"			      \ -			"	subi	%0,%0,1\n"			      \ -			"	stdcx.	%0,0,%2\n"			      \ -			"	bne-	1b"				      \ -			: "=&b" (__val), "=m" (*mem)			      \ -			: "b" (mem), "m" (*mem)				      \ -			: "cr0", "memory");				      \ -      __val;								      \ -    }) - -# define __arch_atomic_decrement_if_positive_64(mem) \ -  ({ int __val, __tmp;							      \ -     __asm__ __volatile__ ("1:	ldarx	%0,0,%3\n"			      \ -		       "	cmpdi	0,%0,0\n"			      \ -		       "	addi	%1,%0,-1\n"			      \ -		       "	ble	2f\n"				      \ -		       "	stdcx.	%1,0,%3\n"			      \ -		       "	bne-	1b\n"				      \ -		       "2:	" __ARCH_ACQ_INSTR			      \ -		       : "=&b" (__val), "=&r" (__tmp), "=m" (*mem)	      \ -		       : "b" (mem), "m" (*mem)				      \ -		       : "cr0", "memory");				      \ -     __val;								      \ -  }) - -/* - * All powerpc64 processors support the new "light weight"  sync (lwsync). - */ -# define atomic_read_barrier()	__asm__ ("lwsync" ::: "memory") -/* - * "light weight" sync can also be used for the release barrier. - */ -# ifndef UP -#  define __ARCH_REL_INSTR	"lwsync" -# endif - -#else  /* Atomic operations.  PowerPC32 version.     Copyright (C) 2003, 2004 Free Software Foundation, Inc.     This file is part of the GNU C Library. @@ -261,12 +17,6 @@     License along with the GNU C Library; if not, see     <http://www.gnu.org/licenses/>.  */ -/* - * The 32-bit exchange_bool is different on powerpc64 because the subf - * does signed 64-bit arthmatic while the lwarx is 32-bit unsigned - * (a load word and zero (high 32) form).  So powerpc64 has a slightly - * different version in sysdeps/powerpc/powerpc64/bits/atomic.h. - */  # define __arch_compare_and_exchange_bool_32_acq(mem, newval, oldval)         \  ({									      \    unsigned int __tmp;							      \ @@ -355,8 +105,6 @@  # define atomic_read_barrier()	__asm__ ("sync" ::: "memory")  #endif -#endif -  #include <stdint.h>  typedef int32_t atomic32_t; diff --git a/libc/sysdeps/linux/powerpc/bits/mathinline.h b/libc/sysdeps/linux/powerpc/bits/mathinline.h index 206ca977e..f98d4d60b 100644 --- a/libc/sysdeps/linux/powerpc/bits/mathinline.h +++ b/libc/sysdeps/linux/powerpc/bits/mathinline.h @@ -57,30 +57,12 @@  # endif /* __GNUC_PREREQ (2,97) */ -/* The gcc, version 2.7 or below, has problems with all this inlining -   code.  So disable it for this version of the compiler.  */ -# if __GNUC_PREREQ (2, 8) -/* Test for negative number.  Used in the signbit() macro.  */ -__MATH_INLINE int -__NTH (__signbitf (float __x)) -{ -  __extension__ union { float __f; int __i; } __u = { __f: __x }; -  return __u.__i < 0; -} -__MATH_INLINE int -__NTH (__signbit (double __x)) -{ -  __extension__ union { double __d; int __i[2]; } __u = { __d: __x }; -  return __u.__i[0] < 0; -} -# endif  #endif /* __USE_ISOC99 */  #if !defined __NO_MATH_INLINES && defined __OPTIMIZE__  #ifdef __USE_ISOC99 -# ifndef __powerpc64__  __MATH_INLINE long int lrint (double __x) __THROW;  __MATH_INLINE long int  __NTH (lrint (double __x)) @@ -104,7 +86,6 @@ __NTH (lrintf (float __x))    __asm__ ("fctiw %0,%1" : "=f"(__u.__d) : "f"(__x));    return __u.__ll[1];  } -# endif  __MATH_INLINE double fdim (double __x, double __y) __THROW;  __MATH_INLINE double @@ -123,62 +104,5 @@ __NTH (fdimf (float __x, float __y))  #endif /* __USE_ISOC99 */  #endif /* !__NO_MATH_INLINES && __OPTIMIZE__ */ -/* This code is used internally in the GNU libc.  */ -#if 0 /*def __LIBC_INTERNAL_MATH_INLINES*/ - -#include <sysdep.h> -#include <ldsodefs.h> -#include <dl-procinfo.h> - -# if __WORDSIZE == 64 || defined _ARCH_PWR4 -#  define __CPU_HAS_FSQRT 1 -# else -#  define __CPU_HAS_FSQRT ((GLRO(dl_hwcap) & PPC_FEATURE_64) != 0) -# endif - -extern double __slow_ieee754_sqrt (double); -__MATH_INLINE double -__NTH (__ieee754_sqrt (double __x)) -{ -  double __z; - -  /* If the CPU is 64-bit we can use the optional FP instructions.  */ -  if (__CPU_HAS_FSQRT) -  { -    /* Volatile is required to prevent the compiler from moving the -       fsqrt instruction above the branch.  */ -     __asm__ __volatile__ ( -	"	fsqrt	%0,%1\n" -		: "=f" (__z) -		: "f" (__x)); -  } -  else -     __z = __slow_ieee754_sqrt(__x); - -  return __z; -} - -extern float __slow_ieee754_sqrtf (float); -__MATH_INLINE float -__NTH (__ieee754_sqrtf (float __x)) -{ -  float __z; - -  /* If the CPU is 64-bit we can use the optional FP instructions.  */ -  if (__CPU_HAS_FSQRT) -  { -    /* Volatile is required to prevent the compiler from moving the -       fsqrts instruction above the branch.  */ -     __asm__ __volatile__ ( -	"	fsqrts	%0,%1\n" -		: "=f" (__z) -		: "f" (__x)); -  } -  else -     __z = __slow_ieee754_sqrtf(__x); - -  return __z; -} -#endif /* __LIBC_INTERNAL_MATH_INLINES */  #endif /* __GNUC__ && !_SOFT_FLOAT */ diff --git a/libc/sysdeps/linux/powerpc/bits/setjmp.h b/libc/sysdeps/linux/powerpc/bits/setjmp.h index 46e8bf7d1..1cc1d836e 100644 --- a/libc/sysdeps/linux/powerpc/bits/setjmp.h +++ b/libc/sysdeps/linux/powerpc/bits/setjmp.h @@ -29,8 +29,6 @@     assembler easier. Naturally, user code should not depend on     either representation. */ -#include <bits/wordsize.h> -  /* The current powerpc 32-bit Altivec ABI specifies for SVR4 ABI and EABI     the vrsave must be at byte 248 & v20 at byte 256.  So we must pad this     correctly on 32 bit.  It also insists that vecregs are only gauranteed @@ -38,12 +36,9 @@     We have to version the code because members like  int __mask_was_saved     in the jmp_buf will move as jmp_buf is now larger than 248 bytes.  We     cannot keep the altivec jmp_buf backward compatible with the jmp_buf.  */ -#if __WORDSIZE == 64 -typedef long int __jmp_buf[64] __attribute__ ((__aligned__ (16))); -#else +  /* The alignment is not essential, i.e.the buffer can be copied to a 4 byte     aligned buffer as per the ABI it is just added for performance reasons.  */  typedef long int __jmp_buf[64 + (12 * 4)] __attribute__ ((__aligned__ (16))); -#endif  #endif  /* bits/setjmp.h */ diff --git a/libc/sysdeps/linux/powerpc/bits/stat.h b/libc/sysdeps/linux/powerpc/bits/stat.h index 10fa2cbf7..a90043f8a 100644 --- a/libc/sysdeps/linux/powerpc/bits/stat.h +++ b/libc/sysdeps/linux/powerpc/bits/stat.h @@ -20,27 +20,18 @@  # error "Never include <bits/stat.h> directly; use <sys/stat.h> instead."  #endif -#include <bits/wordsize.h> -  /* Versions of the `struct stat' data structure.  */  #define _STAT_VER_LINUX_OLD	1  #define _STAT_VER_KERNEL	1  #define _STAT_VER_SVR4		2  #define _STAT_VER_LINUX	  3 -#if __WORDSIZE == 32 -# define _STAT_VER		_STAT_VER_LINUX -#else -# define _STAT_VER		_STAT_VER_KERNEL -#endif +#define _STAT_VER		_STAT_VER_LINUX  /* Versions of the `xmknod' interface.  */  #define _MKNOD_VER_LINUX	1  #define _MKNOD_VER_SVR4		2  #define _MKNOD_VER		_MKNOD_VER_LINUX /* The bits defined below.  */ - -#if __WORDSIZE == 32 -  struct stat    {      __dev_t st_dev;			/* Device.  */ @@ -134,103 +125,6 @@ struct stat64    };  # endif /* __USE_LARGEFILE64 */ -#else /* __WORDSIZE == 32 */ - -struct stat -  { -    __dev_t st_dev;			/* Device.  */ -# ifndef __USE_FILE_OFFSET64 -    __ino_t st_ino;			/* File serial number.	*/ -# else -    __ino64_t st_ino;			/* File serial number.	*/ -# endif -    __nlink_t st_nlink;			/* Link count.  */ -    __mode_t st_mode;			/* File mode.  */ -    __uid_t st_uid;			/* User ID of the file's owner.	*/ -    __gid_t st_gid;			/* Group ID of the file's group.*/ -    int __pad2; -    __dev_t st_rdev;			/* Device number, if device.  */ -# ifndef __USE_FILE_OFFSET64 -    __off_t st_size;			/* Size of file, in bytes.  */ -# else -    __off64_t st_size;			/* Size of file, in bytes.  */ -# endif -    __blksize_t st_blksize;		/* Optimal block size for I/O.  */ - -# ifndef __USE_FILE_OFFSET64 -    __blkcnt_t st_blocks;		/* Number 512-byte blocks allocated. */ -# else -    __blkcnt64_t st_blocks;		/* Number 512-byte blocks allocated. */ -# endif -#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 -       identifier 'timespec' to appear in the <sys/stat.h> header. -       Therefore we have to handle the use of this header in strictly -       standard-compliant sources special.  */ -    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 -    __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 -    unsigned long int __unused4; -    unsigned long int __unused5; -    unsigned long int __unused6; -  }; - -# ifdef __USE_LARGEFILE64 -struct stat64 -  { -    __dev_t st_dev;			/* Device.  */ -    __ino64_t st_ino;			/* File serial number.	*/ -    __nlink_t st_nlink;			/* Link count.  */ -    __mode_t st_mode;			/* File mode.  */ -    __uid_t st_uid;			/* User ID of the file's owner.	*/ -    __gid_t st_gid;			/* Group ID of the file's group.*/ -    int __pad2; -    __dev_t st_rdev;			/* Device number, if device.  */ -    __off64_t st_size;			/* Size of file, in bytes.  */ -    __blksize_t st_blksize;		/* Optimal block size for I/O.  */ -    __blkcnt64_t st_blocks;		/* Number 512-byte blocks allocated. */ -#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 -       identifier 'timespec' to appear in the <sys/stat.h> header. -       Therefore we have to handle the use of this header in strictly -       standard-compliant sources special.  */ -    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 -    __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 -    unsigned long int __unused4; -    unsigned long int __unused5; -    unsigned long int __unused6; -  }; -# endif /* __USE_LARGEFILE64 */ -#endif - -  /* Tell code we have these members.  */  #define	_STATBUF_ST_BLKSIZE  #define _STATBUF_ST_RDEV diff --git a/libc/sysdeps/linux/powerpc/bits/wordsize.h b/libc/sysdeps/linux/powerpc/bits/wordsize.h index 3e8a1e0a1..0c0d31b98 100644 --- a/libc/sysdeps/linux/powerpc/bits/wordsize.h +++ b/libc/sysdeps/linux/powerpc/bits/wordsize.h @@ -1,11 +1,6 @@  /* Determine the wordsize from the preprocessor defines.  */ -#if defined __powerpc64__ -# define __WORDSIZE	64 -# define __WORDSIZE_TIME64_COMPAT32	1 -#else -# define __WORDSIZE	32 -#endif +#define __WORDSIZE	32  #if !defined __NO_LONG_DOUBLE_MATH && !defined __LONG_DOUBLE_MATH_OPTIONAL diff --git a/libc/sysdeps/linux/powerpc/jmpbuf-offsets.h b/libc/sysdeps/linux/powerpc/jmpbuf-offsets.h index eb7d7fd17..5639ac5ed 100644 --- a/libc/sysdeps/linux/powerpc/jmpbuf-offsets.h +++ b/libc/sysdeps/linux/powerpc/jmpbuf-offsets.h @@ -16,25 +16,12 @@     License along with the GNU C Library; if not, see     <http://www.gnu.org/licenses/>.  */ -#include <bits/wordsize.h> -  #define JB_GPR1   0  /* Also known as the stack pointer */  #define JB_GPR2   1  #define JB_LR     2  /* The address we will return to */ -#if __WORDSIZE == 64 -# define JB_GPRS   3  /* GPRs 14 through 31 are saved, 18*2 words total.  */ -# define JB_CR     21 /* Condition code registers with the VRSAVE at */ -                       /* offset 172 (low half of the double word.  */ -# define JB_FPRS   22 /* FPRs 14 through 31 are saved, 18*2 words total.  */ -# define JB_SIZE   (64 * 8) /* As per PPC64-VMX ABI.  */ -# define JB_VRSAVE 21 /* VRSAVE shares a double word with the CR at offset */ -                       /* 168 (high half of the double word).  */ -# define JB_VRS    40 /* VRs 20 through 31 are saved, 12*4 words total.  */ -#else -# define JB_GPRS   3  /* GPRs 14 through 31 are saved, 18 in total.  */ -# define JB_CR     21 /* Condition code registers.  */ -# define JB_FPRS   22 /* FPRs 14 through 31 are saved, 18*2 words total.  */ -# define JB_SIZE   ((64 + (12 * 4)) * 4) -# define JB_VRSAVE 62 -# define JB_VRS    64 -#endif +#define JB_GPRS   3  /* GPRs 14 through 31 are saved, 18 in total.  */ +#define JB_CR     21 /* Condition code registers.  */ +#define JB_FPRS   22 /* FPRs 14 through 31 are saved, 18*2 words total.  */ +#define JB_SIZE   ((64 + (12 * 4)) * 4) +#define JB_VRSAVE 62 +#define JB_VRS    64 diff --git a/libc/sysdeps/linux/powerpc/powerpc32/sysdep.h b/libc/sysdeps/linux/powerpc/powerpc32/sysdep.h deleted file mode 100644 index 9459e7919..000000000 --- a/libc/sysdeps/linux/powerpc/powerpc32/sysdep.h +++ /dev/null @@ -1,151 +0,0 @@ -/* Assembly macros for 32-bit PowerPC. -   Copyright (C) 1999, 2001, 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, see -   <http://www.gnu.org/licenses/>.  */ - -#ifdef __ASSEMBLER__ - -#ifdef __ELF__ - -/* If compiled for profiling, call `_mcount' at the start of each -   function.  */ -#ifdef	PROF -/* The mcount code relies on a the return address being on the stack -   to locate our caller and so it can restore it; so store one just -   for its benefit.  */ -# define CALL_MCOUNT							      \ -  mflr  r0;								      \ -  stw   r0,4(r1);							      \ -  cfi_offset (lr, 4);	       						      \ -  bl    JUMPTARGET(_mcount); -#else  /* PROF */ -# define CALL_MCOUNT		/* Do nothing.  */ -#endif /* PROF */ - -#define	ENTRY(name)							      \ -  .globl C_SYMBOL_NAME(name);				      \ -  ASM_TYPE_DIRECTIVE (C_SYMBOL_NAME(name),@function)			      \ -  .align ALIGNARG(2);							      \ -  C_LABEL(name)								      \ -  cfi_startproc;							      \ -  CALL_MCOUNT - -#define EALIGN_W_0  /* No words to insert.  */ -#define EALIGN_W_1  nop -#define EALIGN_W_2  nop;nop -#define EALIGN_W_3  nop;nop;nop -#define EALIGN_W_4  EALIGN_W_3;nop -#define EALIGN_W_5  EALIGN_W_4;nop -#define EALIGN_W_6  EALIGN_W_5;nop -#define EALIGN_W_7  EALIGN_W_6;nop - -/* EALIGN is like ENTRY, but does alignment to 'words'*4 bytes -   past a 2^align boundary.  */ -#ifdef PROF -# define EALIGN(name, alignt, words)					      \ -  .globl C_SYMBOL_NAME(name);				      \ -  ASM_TYPE_DIRECTIVE (C_SYMBOL_NAME(name),@function)			      \ -  .align ALIGNARG(2);							      \ -  C_LABEL(name)								      \ -  cfi_startproc;							      \ -  CALL_MCOUNT								      \ -  b 0f;									      \ -  .align ALIGNARG(alignt);						      \ -  EALIGN_W_##words;							      \ -  0: -#else /* PROF */ -# define EALIGN(name, alignt, words)					      \ -  .globl C_SYMBOL_NAME(name);				      \ -  ASM_TYPE_DIRECTIVE (C_SYMBOL_NAME(name),@function)			      \ -  .align ALIGNARG(alignt);						      \ -  EALIGN_W_##words;							      \ -  C_LABEL(name)								      \ -  cfi_startproc; -#endif - -#undef	END -#define END(name)							      \ -  cfi_endproc;								      \ -  ASM_SIZE_DIRECTIVE(name) - -#define DO_CALL(syscall)				      		      \ -    li 0,syscall;						              \ -    sc - -#undef JUMPTARGET -#ifdef PIC -# define JUMPTARGET(name) name##@plt -#else -# define JUMPTARGET(name) name -#endif - -#if defined SHARED && defined DO_VERSIONING && defined PIC \ -    && !defined NO_HIDDEN -# undef HIDDEN_JUMPTARGET -# define HIDDEN_JUMPTARGET(name) __GI_##name##@local -#endif - -#define PSEUDO(name, syscall_name, args)				      \ -  .section ".text";							      \ -  ENTRY (name)								      \ -    DO_CALL (SYS_ify (syscall_name)); - -#define PSEUDO_RET							      \ -    bnslr+;								      \ -    b __syscall_error@local -#define ret PSEUDO_RET - -#undef	PSEUDO_END -#define	PSEUDO_END(name)						      \ -  END (name) - -#define PSEUDO_NOERRNO(name, syscall_name, args)			      \ -  .section ".text";							      \ -  ENTRY (name)								      \ -    DO_CALL (SYS_ify (syscall_name)); - -#define PSEUDO_RET_NOERRNO						      \ -    blr -#define ret_NOERRNO PSEUDO_RET_NOERRNO - -#undef	PSEUDO_END_NOERRNO -#define	PSEUDO_END_NOERRNO(name)					      \ -  END (name) - -#define PSEUDO_ERRVAL(name, syscall_name, args)				      \ -  .section ".text";							      \ -  ENTRY (name)								      \ -    DO_CALL (SYS_ify (syscall_name)); - -#define PSEUDO_RET_ERRVAL						      \ -    blr -#undef ret_ERRVAL -#define ret_ERRVAL PSEUDO_RET_ERRVAL - -#undef	PSEUDO_END_ERRVAL -#define	PSEUDO_END_ERRVAL(name)						      \ -  END (name) - -/* Local labels stripped out by the linker.  */ -#undef L -#define L(x) .L##x - -/* Label in text section.  */ -#define C_TEXT(name) name - -#endif /* __ELF__ */ - -#endif	/* __ASSEMBLER__ */ diff --git a/libc/sysdeps/linux/powerpc/powerpc64/sysdep.h b/libc/sysdeps/linux/powerpc/powerpc64/sysdep.h deleted file mode 100644 index 5a194af58..000000000 --- a/libc/sysdeps/linux/powerpc/powerpc64/sysdep.h +++ /dev/null @@ -1,243 +0,0 @@ -/* Assembly macros for 64-bit PowerPC. -   Copyright (C) 2002, 2003, 2004, 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, see -   <http://www.gnu.org/licenses/>.  */ - -#ifdef __ELF__ - -#ifdef __ASSEMBLER__ - -/* Support macros for CALL_MCOUNT.  */ -	.macro SAVE_ARG NARG -	.if \NARG -	SAVE_ARG \NARG-1 -	std	2+\NARG,-72+8*(\NARG)(1) -	.endif -	.endm - -	.macro REST_ARG NARG -	.if \NARG -	REST_ARG \NARG-1 -	ld	2+\NARG,40+8*(\NARG)(1) -	.endif -	.endm - -/* If compiled for profiling, call `_mcount' at the start of each function. -   see ppc-mcount.S for more details.  */ -	.macro CALL_MCOUNT NARG -#ifdef	PROF -	mflr	r0 -	SAVE_ARG \NARG -	std	r0,16(r1) -	stdu	r1,-112(r1) -	bl	JUMPTARGET (_mcount) -	ld	r0,128(r1) -	REST_ARG \NARG -	addi	r1,r1,112 -	mtlr	r0 -#endif -	.endm - -#ifdef USE_PPC64_OVERLAPPING_OPD -# define OPD_ENT(name)	.quad BODY_LABEL (name), .TOC.@tocbase -#else -# define OPD_ENT(name)	.quad BODY_LABEL (name), .TOC.@tocbase, 0 -#endif - -#define ENTRY_1(name)	\ -	.section	".text";		\ -	.type BODY_LABEL(name),@function;	\ -	.globl name;				\ -	.section ".opd","aw";			\ -	.align 3;				\ -name##: OPD_ENT (name);				\ -	.previous; - -# define DOT_LABEL(X) X -# define BODY_LABEL(X) .LY##X -# define ENTRY_2(name)	\ -	.type name,@function;			\ -	ENTRY_1(name) -# define END_2(name)	\ -	.size name,.-BODY_LABEL(name);		\ -	.size BODY_LABEL(name),.-BODY_LABEL(name); - -#define ENTRY(name)	\ -	ENTRY_2(name)				\ -	.align ALIGNARG(2);			\ -BODY_LABEL(name):				\ -	cfi_startproc; - -#define EALIGN_W_0  /* No words to insert.  */ -#define EALIGN_W_1  nop -#define EALIGN_W_2  nop;nop -#define EALIGN_W_3  nop;nop;nop -#define EALIGN_W_4  EALIGN_W_3;nop -#define EALIGN_W_5  EALIGN_W_4;nop -#define EALIGN_W_6  EALIGN_W_5;nop -#define EALIGN_W_7  EALIGN_W_6;nop - -/* EALIGN is like ENTRY, but does alignment to 'words'*4 bytes -   past a 2^alignt boundary.  */ -#define EALIGN(name, alignt, words) \ -	ENTRY_2(name)				\ -	.align ALIGNARG(alignt);		\ -	EALIGN_W_##words;			\ -BODY_LABEL(name):				\ -	cfi_startproc; - -/* Local labels stripped out by the linker.  */ -#undef L -#define L(x) .L##x - -#define tostring(s) #s -#define stringify(s) tostring(s) -#define XGLUE(a,b) a##b -#define GLUE(a,b) XGLUE(a,b) -#define LT_LABEL(name) GLUE(.LT,name) -#define LT_LABELSUFFIX(name,suffix) GLUE(GLUE(.LT,name),suffix) - -/* Support Traceback tables */ -#define TB_ASM			0x000c000000000000 -#define TB_GLOBALLINK		0x0000800000000000 -#define TB_IS_EPROL		0x0000400000000000 -#define TB_HAS_TBOFF		0x0000200000000000 -#define TB_INT_PROC		0x0000100000000000 -#define TB_HAS_CTL		0x0000080000000000 -#define TB_TOCLESS		0x0000040000000000 -#define TB_FP_PRESENT		0x0000020000000000 -#define TB_LOG_ABORT		0x0000010000000000 -#define TB_INT_HANDL		0x0000008000000000 -#define TB_NAME_PRESENT		0x0000004000000000 -#define TB_USES_ALLOCA		0x0000002000000000 -#define TB_SAVES_CR		0x0000000200000000 -#define TB_SAVES_LR		0x0000000100000000 -#define TB_STORES_BC		0x0000000080000000 -#define TB_FIXUP		0x0000000040000000 -#define TB_FP_SAVED(fprs)	(((fprs) & 0x3f) << 24) -#define TB_GPR_SAVED(gprs)	(((fprs) & 0x3f) << 16) -#define TB_FIXEDPARMS(parms)	(((parms) & 0xff) << 8) -#define TB_FLOATPARMS(parms)	(((parms) & 0x7f) << 1) -#define TB_PARMSONSTK		0x0000000000000001 - -#define PPC_HIGHER(v) 		(((v) >> 32) & 0xffff) -#define TB_DEFAULT		TB_ASM | TB_HAS_TBOFF | TB_NAME_PRESENT - -#define TRACEBACK(name) \ -LT_LABEL(name): ; \ -	.long	0 ; \ -	.quad	TB_DEFAULT ; \ -	.long	LT_LABEL(name)-BODY_LABEL(name) ; \ -	.short	LT_LABELSUFFIX(name,_name_end)-LT_LABELSUFFIX(name,_name_start) ; \ -LT_LABELSUFFIX(name,_name_start): ;\ -	.ascii	stringify(name) ; \ -LT_LABELSUFFIX(name,_name_end): ; \ -	.align	2 ; - -#define TRACEBACK_MASK(name,mask) \ -LT_LABEL(name): ; \ -	.long	0 ; \ -	.quad	TB_DEFAULT | mask ; \ -	.long	LT_LABEL(name)-BODY_LABEL(name) ; \ -	.short	LT_LABELSUFFIX(name,_name_end)-LT_LABELSUFFIX(name,_name_start) ; \ -LT_LABELSUFFIX(name,_name_start): ;\ -	.ascii	stringify(name) ; \ -LT_LABELSUFFIX(name,_name_end): ; \ -	.align	2 ; - -/* END generates Traceback tables */ -#undef	END -#define END(name) \ -  cfi_endproc;			\ -  TRACEBACK(name)		\ -  END_2(name) - -/* This form supports more informative traceback tables */ -#define END_GEN_TB(name,mask)	\ -  cfi_endproc;			\ -  TRACEBACK_MASK(name,mask)	\ -  END_2(name) - -#define DO_CALL(syscall) \ -    li 0,syscall; \ -    sc - -/* ppc64 is always PIC */ -#undef JUMPTARGET -#define JUMPTARGET(name) DOT_LABEL(name) - -#define PSEUDO(name, syscall_name, args) \ -  .section ".text";	\ -  ENTRY (name) \ -  DO_CALL (SYS_ify (syscall_name)); - -#define PSEUDO_RET \ -    bnslr+; \ -    b JUMPTARGET(__syscall_error) - -#define ret PSEUDO_RET - -#undef	PSEUDO_END -#define	PSEUDO_END(name) \ -  END (name) - -#define PSEUDO_NOERRNO(name, syscall_name, args) \ -  .section ".text";	\ -  ENTRY (name) \ -  DO_CALL (SYS_ify (syscall_name)); - -#define PSEUDO_RET_NOERRNO \ -    blr - -#define ret_NOERRNO PSEUDO_RET_NOERRNO - -#undef	PSEUDO_END_NOERRNO -#define	PSEUDO_END_NOERRNO(name) \ -  END (name) - -#define PSEUDO_ERRVAL(name, syscall_name, args) \ -  .section ".text";	\ -  ENTRY (name) \ -  DO_CALL (SYS_ify (syscall_name)); - -#define PSEUDO_RET_ERRVAL \ -    blr - -#undef ret_ERRVAL -#define ret_ERRVAL PSEUDO_RET_ERRVAL - -#undef	PSEUDO_END_ERRVAL -#define	PSEUDO_END_ERRVAL(name) \ -  END (name) - -#else /* !__ASSEMBLER__ */ - -#ifdef USE_PPC64_OVERLAPPING_OPD -# define OPD_ENT(name)	".quad " BODY_PREFIX #name ", .TOC.@tocbase;" -#else -# define OPD_ENT(name)	".quad " BODY_PREFIX #name ", .TOC.@tocbase, 0;" -#endif - -# define DOT_PREFIX "" -# define BODY_PREFIX ".LY" -# define ENTRY_2(name) ".type " #name ",@function;" -# define END_2(name)	\ -	".size " #name ",.-" BODY_PREFIX #name ";\n"			\ -	".size " BODY_PREFIX #name ",.-" BODY_PREFIX #name ";" - -#endif	/* __ASSEMBLER__ */ - -#endif /* __ELF__ */ diff --git a/libc/sysdeps/linux/powerpc/sys/ucontext.h b/libc/sysdeps/linux/powerpc/sys/ucontext.h index 72fbae4f2..fa3cbb68d 100644 --- a/libc/sysdeps/linux/powerpc/sys/ucontext.h +++ b/libc/sysdeps/linux/powerpc/sys/ucontext.h @@ -25,8 +25,6 @@     included in <signal.h>.  */  #include <bits/sigcontext.h> -#if __WORDSIZE == 32 -  /* Number of general registers.  */  # define NGREG	48 @@ -59,84 +57,12 @@ typedef struct  	vrregset_t vrregs __attribute__((__aligned__(16)));  } mcontext_t; -#else - -/* For 64-bit kernels with Altivec support, a machine context is exactly - * a sigcontext.  For older kernel (without Altivec) the sigcontext matches - * the mcontext upto but not including the v_regs field.  For kernels that - * don't AT_HWCAP or return AT_HWCAP without PPC_FEATURE_HAS_ALTIVEC the - * v_regs field may not exit and should not be referenced.  The v_regd field - * can be refernced safely only after verifying that PPC_FEATURE_HAS_ALTIVEC - * is set in AT_HWCAP.  */ - -/* Number of general registers.  */ -# define NGREG	48	/* includes r0-r31, nip, msr, lr, etc.   */ -# define NFPREG	33	/* includes fp0-fp31 &fpscr.  */ -# define NVRREG	34	/* includes v0-v31, vscr, & vrsave in split vectors */ - -typedef unsigned long gregset_t[NGREG]; -typedef double fpregset_t[NFPREG]; - -/* Container for Altivec/VMX Vector Status and Control Register.  Only 32-bits -   but can only be copied to/from a 128-bit vector register.  So we allocated -   a whole quadword speedup save/restore.  */ -typedef struct _libc_vscr -{ -	unsigned int __pad[3]; -	unsigned int vscr_word; -} vscr_t; - -/* Container for Altivec/VMX registers and status. -   Must to be aligned on a 16-byte boundary. */ -typedef struct _libc_vrstate -{ -	unsigned int	vrregs[32][4]; -	vscr_t		vscr; -	unsigned int	vrsave; -	unsigned int	__pad[3]; -} vrregset_t  __attribute__((__aligned__(16))); - -typedef struct { -	unsigned long	__unused[4]; -	int		signal; -	int		__pad0; -	unsigned long	handler; -	unsigned long	oldmask; -	struct pt_regs	*regs; -	gregset_t	gp_regs; -	fpregset_t	fp_regs; -/* - * To maintain compatibility with current implementations the sigcontext is - * extended by appending a pointer (v_regs) to a quadword type (elf_vrreg_t) - * followed by an unstructured (vmx_reserve) field of 69 doublewords.  This - * allows the array of vector registers to be quadword aligned independent of - * the alignment of the containing sigcontext or ucontext. It is the - * responsibility of the code setting the sigcontext to set this pointer to - * either NULL (if this processor does not support the VMX feature) or the - * address of the first quadword within the allocated (vmx_reserve) area. - * - * The pointer (v_regs) of vector type (elf_vrreg_t) is essentually - * an array of 34 quadword entries.  The entries with - * indexes 0-31 contain the corresponding vector registers.  The entry with - * index 32 contains the vscr as the last word (offset 12) within the - * quadword.  This allows the vscr to be stored as either a quadword (since - * it must be copied via a vector register to/from storage) or as a word. - * The entry with index 33 contains the vrsave as the first word (offset 0) - * within the quadword. - */ -	vrregset_t	*v_regs; -	long		vmx_reserve[NVRREG+NVRREG+1]; -} mcontext_t; - -#endif -  /* Userlevel context.  */  typedef struct ucontext    {      unsigned long int uc_flags;      struct ucontext *uc_link;      stack_t uc_stack; -#if __WORDSIZE == 32      /*       * These fields are set up this way to maximize source and       * binary compatibility with code written for the old @@ -167,10 +93,6 @@ typedef struct ucontext      } uc_mcontext;      sigset_t    uc_sigmask;      char uc_reg_space[sizeof(mcontext_t) + 12];  /* last for extensibility */ -#else /* 64-bit */ -    sigset_t    uc_sigmask; -    mcontext_t  uc_mcontext;  /* last for extensibility */ -#endif    } ucontext_t;  #endif /* sys/ucontext.h */ diff --git a/libc/sysdeps/linux/powerpc/sysdep.h b/libc/sysdeps/linux/powerpc/sysdep.h index 9a57062dc..c512c5ab5 100644 --- a/libc/sysdeps/linux/powerpc/sysdep.h +++ b/libc/sysdeps/linux/powerpc/sysdep.h @@ -16,6 +16,7 @@     <http://www.gnu.org/licenses/>.  */  #include <common/sysdep.h> +#include <sys/syscall.h>  /*    * Powerpc Feature masks for the Aux Vector Hardware Capabilities (AT_HWCAP).  @@ -169,9 +170,6 @@  #define VRSAVE	256 - -#ifdef __ELF__ -  /* This seems to always be the case on PPC.  */  #define ALIGNARG(log2) log2  /* For ELF we need the `.type' directive to make shared libs work right.  */ @@ -182,14 +180,98 @@  #undef	NO_UNDERSCORES  #define NO_UNDERSCORES -#endif /* __ELF__ */ +#define	ENTRY(name)							      \ +  .globl C_SYMBOL_NAME(name);				      \ +  ASM_TYPE_DIRECTIVE (C_SYMBOL_NAME(name),@function)			      \ +  .align ALIGNARG(2);							      \ +  C_LABEL(name)								      \ +  cfi_startproc;							      \ -# include <sys/syscall.h> -# if defined(__powerpc64__) -#  include "powerpc64/sysdep.h" -# else -#  include "powerpc32/sysdep.h" -# endif +#define EALIGN_W_0  /* No words to insert.  */ +#define EALIGN_W_1  nop +#define EALIGN_W_2  nop;nop +#define EALIGN_W_3  nop;nop;nop +#define EALIGN_W_4  EALIGN_W_3;nop +#define EALIGN_W_5  EALIGN_W_4;nop +#define EALIGN_W_6  EALIGN_W_5;nop +#define EALIGN_W_7  EALIGN_W_6;nop -#endif	/* __ASSEMBLER__ */ +#define EALIGN(name, alignt, words)					      \ +  .globl C_SYMBOL_NAME(name);				      \ +  ASM_TYPE_DIRECTIVE (C_SYMBOL_NAME(name),@function)			      \ +  .align ALIGNARG(alignt);						      \ +  EALIGN_W_##words;							      \ +  C_LABEL(name)								      \ +  cfi_startproc; + +#undef	END +#define END(name)							      \ +  cfi_endproc;								      \ +  ASM_SIZE_DIRECTIVE(name) + +#define DO_CALL(syscall)				      		      \ +    li 0,syscall;						              \ +    sc + +#undef JUMPTARGET +#ifdef PIC +# define JUMPTARGET(name) name##@plt +#else +# define JUMPTARGET(name) name +#endif + +#if defined SHARED && defined DO_VERSIONING && defined PIC \ +    && !defined NO_HIDDEN +# undef HIDDEN_JUMPTARGET +# define HIDDEN_JUMPTARGET(name) __GI_##name##@local +#endif + +#define PSEUDO(name, syscall_name, args)				      \ +  .section ".text";							      \ +  ENTRY (name)								      \ +    DO_CALL (SYS_ify (syscall_name)); + +#define PSEUDO_RET							      \ +    bnslr+;								      \ +    b __syscall_error@local +#define ret PSEUDO_RET + +#undef	PSEUDO_END +#define	PSEUDO_END(name)						      \ +  END (name) +#define PSEUDO_NOERRNO(name, syscall_name, args)			      \ +  .section ".text";							      \ +  ENTRY (name)								      \ +    DO_CALL (SYS_ify (syscall_name)); + +#define PSEUDO_RET_NOERRNO						      \ +    blr +#define ret_NOERRNO PSEUDO_RET_NOERRNO + +#undef	PSEUDO_END_NOERRNO +#define	PSEUDO_END_NOERRNO(name)					      \ +  END (name) + +#define PSEUDO_ERRVAL(name, syscall_name, args)				      \ +  .section ".text";							      \ +  ENTRY (name)								      \ +    DO_CALL (SYS_ify (syscall_name)); + +#define PSEUDO_RET_ERRVAL						      \ +    blr +#undef ret_ERRVAL +#define ret_ERRVAL PSEUDO_RET_ERRVAL + +#undef	PSEUDO_END_ERRVAL +#define	PSEUDO_END_ERRVAL(name)						      \ +  END (name) + +/* Local labels stripped out by the linker.  */ +#undef L +#define L(x) .L##x + +/* Label in text section.  */ +#define C_TEXT(name) name + +#endif	/* __ASSEMBLER__ */ | 
