diff options
Diffstat (limited to 'sysdeps')
51 files changed, 760 insertions, 124 deletions
diff --git a/sysdeps/generic/_strerror.c b/sysdeps/generic/_strerror.c index 83156293a5..bcba45d519 100644 --- a/sysdeps/generic/_strerror.c +++ b/sysdeps/generic/_strerror.c @@ -45,7 +45,7 @@ _strerror_internal (int errnum, char *buf, size_t buflen) const size_t unklen = strlen (unk); char *p = buf + buflen; *--p = '\0'; - p = _itoa (errnum, p, 10, 0); + p = _itoa_word (errnum, p, 10, 0); return memcpy (p - unklen, unk, unklen); } diff --git a/sysdeps/generic/des_impl.c b/sysdeps/generic/des_impl.c index e0a3af9dd9..f801a841fc 100644 --- a/sysdeps/generic/des_impl.c +++ b/sysdeps/generic/des_impl.c @@ -18,6 +18,8 @@ /* We must not distribute the DES implementation as part of the glibc. So we have to provide a dummy version here. */ +#include <des.h> + int _des_crypt (char *buf, unsigned len, struct desparams *desp) { diff --git a/sysdeps/generic/dl-cache.c b/sysdeps/generic/dl-cache.c index c704fd869d..36d6c707d3 100644 --- a/sysdeps/generic/dl-cache.c +++ b/sysdeps/generic/dl-cache.c @@ -53,10 +53,7 @@ _dl_load_cache_lookup (const char *name) static struct cache_file *cache; static size_t cachesize; unsigned int i; - - if (cache == (void *) -1) - /* Previously looked for the cache file and didn't find it. */ - return NULL; + const char *best; if (cache == NULL) { @@ -76,6 +73,11 @@ _dl_load_cache_lookup (const char *name) } } + if (cache == (void *) -1) + /* Previously looked for the cache file and didn't find it. */ + return NULL; + + best = NULL; for (i = 0; i < cache->nlibs; ++i) if ((cache->libs[i].flags == 1 || cache->libs[i].flags == 3) && /* ELF library entry. */ @@ -85,7 +87,14 @@ _dl_load_cache_lookup (const char *name) /* Does the name match? */ ! strcmp (name, ((const char *) &cache->libs[cache->nlibs] + cache->libs[i].key))) - return (const char *) &cache->libs[cache->nlibs] + cache->libs[i].value; + { + best = ((const char *) &cache->libs[cache->nlibs] + + cache->libs[i].value); - return NULL; + if (cache->libs[i].flags == 3) + /* We've found an exact match for the shared object and no + general `ELF' release. Stop searching. */ + break; + } + return best; } diff --git a/sysdeps/generic/memcmp.c b/sysdeps/generic/memcmp.c index 844cdc6afb..213ccc07de 100644 --- a/sysdeps/generic/memcmp.c +++ b/sysdeps/generic/memcmp.c @@ -18,56 +18,64 @@ Boston, MA 02111-1307, USA. */ #ifdef HAVE_CONFIG_H -#include "config.h" +# include "config.h" #endif #undef __ptr_t -#if defined (__cplusplus) || (defined (__STDC__) && __STDC__) -#define __ptr_t void * +#if defined __cplusplus || (defined __STDC__ && __STDC__) +# define __ptr_t void * #else /* Not C++ or ANSI C. */ -#undef const -#define const -#define __ptr_t char * +# undef const +# define const +# define __ptr_t char * #endif /* C++ or ANSI C. */ -#if defined (HAVE_STRING_H) || defined (_LIBC) -#include <string.h> +#ifndef __P +# if defined __GNUC__ || (defined __STDC__ && __STDC__) +# define __P(args) args +# else +# define __P(args) () +# endif /* GCC. */ +#endif /* Not __P. */ + +#if defined HAVE_STRING_H || defined _LIBC +# include <string.h> #endif #undef memcmp #ifdef _LIBC -#include <memcopy.h> +# include <memcopy.h> #else /* Not in the GNU C library. */ -#include <sys/types.h> +# include <sys/types.h> /* Type to use for aligned memory operations. This should normally be the biggest type supported by a single load and store. Must be an unsigned type. */ -#define op_t unsigned long int -#define OPSIZ (sizeof(op_t)) +# define op_t unsigned long int +# define OPSIZ (sizeof(op_t)) /* Threshold value for when to enter the unrolled loops. */ -#define OP_T_THRES 16 +# define OP_T_THRES 16 /* Type to use for unaligned operations. */ typedef unsigned char byte; -#ifndef WORDS_BIGENDIAN -#define MERGE(w0, sh_1, w1, sh_2) (((w0) >> (sh_1)) | ((w1) << (sh_2))) -#else -#define MERGE(w0, sh_1, w1, sh_2) (((w0) << (sh_1)) | ((w1) >> (sh_2))) -#endif +# ifndef WORDS_BIGENDIAN +# define MERGE(w0, sh_1, w1, sh_2) (((w0) >> (sh_1)) | ((w1) << (sh_2))) +# else +# define MERGE(w0, sh_1, w1, sh_2) (((w0) << (sh_1)) | ((w1) >> (sh_2))) +# endif #endif /* In the GNU C library. */ #ifdef WORDS_BIGENDIAN -#define CMP_LT_OR_GT(a, b) ((a) > (b) ? 1 : -1) +# define CMP_LT_OR_GT(a, b) ((a) > (b) ? 1 : -1) #else -#define CMP_LT_OR_GT(a, b) memcmp_bytes ((a), (b)) +# define CMP_LT_OR_GT(a, b) memcmp_bytes ((a), (b)) #endif /* BE VERY CAREFUL IF YOU CHANGE THIS CODE! */ @@ -90,9 +98,9 @@ typedef unsigned char byte; static int memcmp_bytes __P((op_t, op_t)); -#ifdef __GNUC__ +# ifdef __GNUC__ __inline -#endif +# endif static int memcmp_bytes (a, b) op_t a, b; @@ -376,6 +384,6 @@ memcmp (s1, s2, len) } #ifdef weak_alias -#undef bcmp +# undef bcmp weak_alias (memcmp, bcmp) #endif diff --git a/sysdeps/generic/pread.c b/sysdeps/generic/pread.c index 5fdaf7b4af..82548d0272 100644 --- a/sysdeps/generic/pread.c +++ b/sysdeps/generic/pread.c @@ -22,7 +22,7 @@ /* Read NBYTES into BUF from FD at the given position OFFSET without changing the file pointer. Return the number read or -1. */ ssize_t -pread (int fd, void *buf, size_t nbytes, off_t offset) +__pread (int fd, void *buf, size_t nbytes, off_t offset) { if (nbytes == 0) return 0; @@ -40,5 +40,6 @@ pread (int fd, void *buf, size_t nbytes, off_t offset) __set_errno (ENOSYS); return -1; } +weak_alias (__pread, pread) stub_warning (pread) #include <stub-tag.h> diff --git a/sysdeps/generic/pread64.c b/sysdeps/generic/pread64.c index fdf622250b..e1596038ac 100644 --- a/sysdeps/generic/pread64.c +++ b/sysdeps/generic/pread64.c @@ -22,7 +22,7 @@ /* Read NBYTES into BUF from FD at the given position OFFSET without changing the file pointer. Return the number read or -1. */ ssize_t -pread64 (int fd, void *buf, size_t nbytes, off64_t offset) +__pread64 (int fd, void *buf, size_t nbytes, off64_t offset) { if (nbytes == 0) return 0; @@ -40,5 +40,6 @@ pread64 (int fd, void *buf, size_t nbytes, off64_t offset) __set_errno (ENOSYS); return -1; } +weak_alias (__pread64, pread64) stub_warning (pread64) #include <stub-tag.h> diff --git a/sysdeps/generic/pwrite.c b/sysdeps/generic/pwrite.c index 48a1dc6089..8eec560c9d 100644 --- a/sysdeps/generic/pwrite.c +++ b/sysdeps/generic/pwrite.c @@ -22,7 +22,7 @@ /* Write NBYTES of BUF to FD at given position OFFSET without changing the file position. Return the number written, or -1. */ ssize_t -pwrite (int fd, const void *buf, size_t nbytes, off_t offset) +__pwrite (int fd, const void *buf, size_t nbytes, off_t offset) { if (nbytes == 0) return 0; @@ -40,5 +40,6 @@ pwrite (int fd, const void *buf, size_t nbytes, off_t offset) __set_errno (ENOSYS); return -1; } +weak_alias (__pwrite, pwrite) stub_warning (pwrite) #include <stub-tag.h> diff --git a/sysdeps/generic/pwrite64.c b/sysdeps/generic/pwrite64.c index df229f877f..d84b63576a 100644 --- a/sysdeps/generic/pwrite64.c +++ b/sysdeps/generic/pwrite64.c @@ -22,7 +22,7 @@ /* Write NBYTES of BUF to FD at given position OFFSET without changing the file position. Return the number written, or -1. */ ssize_t -pwrite64 (int fd, const void *buf, size_t nbytes, off64_t offset) +__pwrite64 (int fd, const void *buf, size_t nbytes, off64_t offset) { if (nbytes == 0) return 0; @@ -40,5 +40,6 @@ pwrite64 (int fd, const void *buf, size_t nbytes, off64_t offset) __set_errno (ENOSYS); return -1; } +weak_alias (__pwrite64, pwrite64) stub_warning (pwrite64) #include <stub-tag.h> diff --git a/sysdeps/i386/i486/bits/string.h b/sysdeps/i386/i486/bits/string.h index 80fcc48a2b..210bf7f745 100644 --- a/sysdeps/i386/i486/bits/string.h +++ b/sysdeps/i386/i486/bits/string.h @@ -979,12 +979,14 @@ __strchr_g (__const char *__s, int __c) } +#if defined __USE_BSD || defined __USE_XOPEN_EXTENDED /* Find the first occurrence of C in S. This is the BSD name. */ -#define _HAVE_STRING_ARCH_index 1 -#define index(s, c) \ +# define _HAVE_STRING_ARCH_index 1 +# define index(s, c) \ (__extension__ (__builtin_constant_p (c) \ ? __strchr_c (s, ((c) & 0xff) << 8) \ : __strchr_g (s, c))) +#endif /* Find the last occurrence of C in S. */ @@ -1075,12 +1077,14 @@ __strrchr_g (__const char *__s, int __c) #endif +#if defined __USE_BSD || defined __USE_XOPEN_EXTENDED /* Find the last occurrence of C in S. This is the BSD name. */ -#define _HAVE_STRING_ARCH_rindex 1 -#define rindex(s, c) \ +# define _HAVE_STRING_ARCH_rindex 1 +# define rindex(s, c) \ (__extension__ (__builtin_constant_p (c) \ ? __strrchr_c (s, ((c) & 0xff) << 8) \ : __strrchr_g (s, c))) +#endif /* Return the length of the initial segment of S which diff --git a/sysdeps/libm-ieee754/s_llrintl.c b/sysdeps/libm-ieee754/s_llrintl.c index 29fc3a300d..d3b9b12d76 100644 --- a/sysdeps/libm-ieee754/s_llrintl.c +++ b/sysdeps/libm-ieee754/s_llrintl.c @@ -34,7 +34,7 @@ long long int __llrintl (long double x) { int32_t se,j0; - u_int32_t i0, i1, i; + u_int32_t i0, i1; long long int result; volatile long double w; long double t; @@ -45,23 +45,11 @@ __llrintl (long double x) sx = (se >> 15) & 1; j0 = (se & 0x7fff) - 0x3fff; - if (j0 < 31) + if (j0 < (int32_t) (8 * sizeof (long long int))) { if (j0 < -1) return 0; - else - { - w = two63[sx] + x; - t = w - two63[sx]; - GET_LDOUBLE_WORDS (se, i0, i1, t); - j0 = (se & 0x7fff) - 0x3fff; - - result = i0 >> (31 - j0); - } - } - else if (j0 < (int32_t) (8 * sizeof (long long int))) - { - if (j0 >= 63) + else if (j0 >= 63) result = ((long long int) i0 << (j0 - 31)) | (i1 << (j0 - 63)); else { @@ -70,7 +58,10 @@ __llrintl (long double x) GET_LDOUBLE_WORDS (se, i0, i1, t); j0 = (se & 0x7fff) - 0x3fff; - result = ((long long int) i0 << (j0 - 31)) | (j >> (63 - j0)); + if (j0 < 31) + result = i0 >> (31 - j0); + else + result = ((long long int) i0 << (j0 - 31)) | (i1 >> (63 - j0)); } } else diff --git a/sysdeps/libm-ieee754/s_lrintl.c b/sysdeps/libm-ieee754/s_lrintl.c index 8607851669..5a41427f72 100644 --- a/sysdeps/libm-ieee754/s_lrintl.c +++ b/sysdeps/libm-ieee754/s_lrintl.c @@ -34,7 +34,7 @@ long int __lrintl (long double x) { int32_t se,j0; - u_int32_t i0,i1,i; + u_int32_t i0, i1; long int result; volatile long double w; long double t; @@ -70,7 +70,7 @@ __lrintl (long double x) GET_LDOUBLE_WORDS (se, i0, i1, t); j0 = (se & 0x7fff) - 0x3fff; - result = ((long int) i0 << (j0 - 31)) | (j >> (63 - j0)); + result = ((long int) i0 << (j0 - 31)) | (i1 >> (63 - j0)); } } else diff --git a/sysdeps/libm-ieee754/s_nextafterxf.c b/sysdeps/libm-ieee754/s_nextafterxf.c index 7e870805e2..a4726b41b8 100644 --- a/sysdeps/libm-ieee754/s_nextafterxf.c +++ b/sysdeps/libm-ieee754/s_nextafterxf.c @@ -25,7 +25,7 @@ static char rcsid[] = "$NetBSD: $"; #else float __nextafterxf(x,y) float x; - log double y; + long double y; #endif { int32_t hx,ix,iy; diff --git a/sysdeps/m68k/fpu/bits/mathinline.h b/sysdeps/m68k/fpu/bits/mathinline.h index 1e68ea00c0..c3ed76c0de 100644 --- a/sysdeps/m68k/fpu/bits/mathinline.h +++ b/sysdeps/m68k/fpu/bits/mathinline.h @@ -76,12 +76,16 @@ /* This is used when defining the functions themselves. Define them with __ names, and with `static inline' instead of `extern inline' so the bodies will always be used, never an external function call. */ -# define __m81_u(x) __CONCAT(__,x) -# define __m81_inline static __inline +#define __m81_u(x) __CONCAT(__,x) +#define __m81_inline static __inline #else -# define __m81_u(x) x -# define __m81_inline extern __inline -# define __M81_MATH_INLINES 1 +#define __m81_u(x) x +#ifdef __cplusplus +#define __m81_inline __inline +#else +#define __m81_inline extern __inline +#endif +#define __M81_MATH_INLINES 1 #endif /* Define a const math function. */ @@ -95,12 +99,12 @@ is the name of the fpu operation (without leading f). */ #if defined __USE_MISC || defined __USE_ISOC9X -# define __inline_mathop(func, op) \ +#define __inline_mathop(func, op) \ __inline_mathop1(double, func, op) \ __inline_mathop1(float, __CONCAT(func,f), op) \ __inline_mathop1(long double, __CONCAT(func,l), op) #else -# define __inline_mathop(func, op) \ +#define __inline_mathop(func, op) \ __inline_mathop1(double, func, op) #endif @@ -309,13 +313,19 @@ __m81_defun (int, __CONCAT(__signbit,s), (float_type __value)) \ } \ \ __m81_defun (float_type, __CONCAT(__scalbn,s), \ - (float_type __x, long int __n)) \ + (float_type __x, int __n)) \ { \ float_type __result; \ __asm ("fscale%.l %1, %0" : "=f" (__result) : "dmi" (__n), "0" (__x)); \ return __result; \ } \ \ +__m81_defun (float_type, __CONCAT(__scalbln,s), \ + (float_type __x, long int __n)) \ +{ \ + return __CONCAT(__scalbn,s) (__x, __n); \ +} \ + \ __m81_defun (float_type, __CONCAT(__nearbyint,s), (float_type __x)) \ { \ float_type __result; \ @@ -330,12 +340,26 @@ __m81_defun (float_type, __CONCAT(__nearbyint,s), (float_type __x)) \ return __result; \ } \ \ +__m81_defun (long int, __CONCAT(__lrint,s), (float_type __x)) \ +{ \ + long int __result; \ + __asm ("fmove%.l %1, %0" : "=dm" (__result) : "f" (__x)); \ + return __result; \ +} \ + \ __m81_inline void \ __m81_u(__CONCAT(__sincos,s))(float_type __x, float_type *__sinx, \ float_type *__cosx) \ { \ __asm ("fsincos%.x %2,%1:%0" \ : "=f" (*__sinx), "=f" (*__cosx) : "f" (__x)); \ +} \ + \ +__m81_inline float_type \ +__m81_u(__CONCAT(__fma,s))(float_type __x, float_type __y, \ + float_type __z) \ +{ \ + return (__x * __y) + __z; \ } /* This defines the three variants of the inline functions. */ @@ -344,17 +368,12 @@ __inline_functions (float,f) __inline_functions (long double,l) #undef __inline_functions -__m81_defun (long int, __lrint, (long double __x)) -{ - long int __result; - __asm ("fmove%.l %1, %0" : "=dm" (__result) : "f" (__x)); - return __result; -} - #if !defined __NO_MATH_INLINES && defined __OPTIMIZE__ /* Define inline versions of the user visible functions. */ +/* Note that there must be no whitespace before the argument passed for + NAME, to make token pasting work correctly with -traditional. */ #define __inline_forward_c(rettype, name, args1, args2) \ extern __inline rettype __attribute__((__const__)) \ name args1 \ @@ -375,7 +394,8 @@ __inline_forward_c(double,ceil, (double __x), (__x)) #ifdef __USE_MISC __inline_forward_c(int,isinf, (double __value), (__value)) __inline_forward_c(int,finite, (double __value), (__value)) -__inline_forward_c(double,scalbn, (double __x, long int __n), (__x, __n)) +__inline_forward_c(double,scalbn, (double __x, int __n), (__x, __n)) +__inline_forward_c(double,scalbln, (double __x, long int __n), (__x, __n)) #endif #if defined __USE_MISC || defined __USE_XOPEN #ifndef __USE_ISOC9X /* Conflict with macro of same name. */ @@ -384,6 +404,9 @@ __inline_forward_c(int,isnan, (double __value), (__value)) #endif #ifdef __USE_ISOC9X __inline_forward_c(double,nearbyint, (double __value), (__value)) +__inline_forward_c(long int,lrint, (double __value), (__value)) +__inline_forward_c(double,fma, (double __x, double __y, double __z), + (__x, __y, __z)) #endif #ifdef __USE_GNU __inline_forward(void,sincos, (double __x, double *__sinx, double *__cosx), @@ -399,11 +422,15 @@ __inline_forward_c(float,ceilf, (float __x), (__x)) #ifdef __USE_MISC __inline_forward_c(int,isinff, (float __value), (__value)) __inline_forward_c(int,finitef, (float __value), (__value)) -__inline_forward_c(float,scalbnf, (float __x, long int __n), (__x, __n)) +__inline_forward_c(float,scalbnf, (float __x, int __n), (__x, __n)) +__inline_forward_c(float,scalblnf, (float __x, long int __n), (__x, __n)) __inline_forward_c(int,isnanf, (float __value), (__value)) #endif #ifdef __USE_ISOC9X __inline_forward_c(float,nearbyintf, (float __value), (__value)) +__inline_forward_c(long int,lrintf, (float __value), (__value)) +__inline_forward_c(float,fmaf, (float __x, float __y, float __z), + (__x, __y, __z)) #endif #ifdef __USE_GNU __inline_forward(void,sincosf, (float __x, float *__sinx, float *__cosx), @@ -417,13 +444,17 @@ __inline_forward_c(long double,ceill, (long double __x), (__x)) #ifdef __USE_MISC __inline_forward_c(int,isinfl, (long double __value), (__value)) __inline_forward_c(int,finitel, (long double __value), (__value)) -__inline_forward_c(long double,scalbnl, (long double __x, long int __n), +__inline_forward_c(long double,scalbnl, (long double __x, int __n), (__x, __n)) +__inline_forward_c(long double,scalblnl, (long double __x, long int __n), (__x, __n)) __inline_forward_c(int,isnanl, (long double __value), (__value)) #endif #ifdef __USE_ISOC9X __inline_forward_c(long double,nearbyintl, (long double __value), (__value)) -__inline_forward_c(long int,lrint, (long double __value), (__value)) +__inline_forward_c(long int,lrintl, (long double __value), (__value)) +__inline_forward_c(long double,fmal, + (long double __x, long double __y, long double __z), + (__x, __y, __z)) #endif #ifdef __USE_GNU __inline_forward(void,sincosl, diff --git a/sysdeps/m68k/fpu/s_lrint.c b/sysdeps/m68k/fpu/s_lrint.c index a7044113af..511d28880c 100644 --- a/sysdeps/m68k/fpu/s_lrint.c +++ b/sysdeps/m68k/fpu/s_lrint.c @@ -22,10 +22,20 @@ #define __LIBC_M81_MATH_INLINES #include <math.h> +#ifndef suffix +#define suffix /*empty*/ +#endif +#ifndef float_type +#define float_type double +#endif + +#define CONCATX(a,b) __CONCAT(a,b) + long int -__lrint (long double x) +CONCATX(__lrint,suffix) (float_type x) { - return __m81_u(__lrint) (x); + return __m81_u(CONCATX(__lrint,suffix)) (x); } -weak_alias (__lrint, lrint) +#define weak_aliasx(a,b) weak_alias(a,b) +weak_aliasx (CONCATX(__lrint,suffix), CONCATX(lrint,suffix)) diff --git a/sysdeps/m68k/fpu/s_lrintf.c b/sysdeps/m68k/fpu/s_lrintf.c new file mode 100644 index 0000000000..44924cb82f --- /dev/null +++ b/sysdeps/m68k/fpu/s_lrintf.c @@ -0,0 +1,3 @@ +#define suffix f +#define float_type float +#include <s_lrint.c> diff --git a/sysdeps/m68k/fpu/s_lrintl.c b/sysdeps/m68k/fpu/s_lrintl.c new file mode 100644 index 0000000000..cd0bd23b8a --- /dev/null +++ b/sysdeps/m68k/fpu/s_lrintl.c @@ -0,0 +1,3 @@ +#define suffix l +#define float_type long double +#include <s_lrint.c> diff --git a/sysdeps/m68k/fpu/s_scalbln.c b/sysdeps/m68k/fpu/s_scalbln.c new file mode 100644 index 0000000000..1009713fbc --- /dev/null +++ b/sysdeps/m68k/fpu/s_scalbln.c @@ -0,0 +1,2 @@ +/* Nothing to do. This function is the same as scalbn. So we define an + alias. */ diff --git a/sysdeps/m68k/fpu/s_scalblnf.c b/sysdeps/m68k/fpu/s_scalblnf.c new file mode 100644 index 0000000000..5e558c3540 --- /dev/null +++ b/sysdeps/m68k/fpu/s_scalblnf.c @@ -0,0 +1,2 @@ +/* Nothing to do. This function is the same as scalbnf. So we define an + alias. */ diff --git a/sysdeps/m68k/fpu/s_scalblnl.c b/sysdeps/m68k/fpu/s_scalblnl.c new file mode 100644 index 0000000000..cda2ec11c8 --- /dev/null +++ b/sysdeps/m68k/fpu/s_scalblnl.c @@ -0,0 +1,2 @@ +/* Nothing to do. This function is the same as scalbnl. So we define an + alias. */ diff --git a/sysdeps/m68k/fpu/s_scalbn.c b/sysdeps/m68k/fpu/s_scalbn.c index d3ba27fa46..1b219ec108 100644 --- a/sysdeps/m68k/fpu/s_scalbn.c +++ b/sysdeps/m68k/fpu/s_scalbn.c @@ -17,10 +17,22 @@ Boston, MA 02111-1307, USA. */ #define __LIBC_M81_MATH_INLINES +#define scalbln __no_scalbln_decl +#define scalblnf __no_scalblnf_decl +#define scalblnl __no_scalblnl_decl +#define __scalbln __no__scalbln_decl +#define __scalblnf __no__scalblnf_decl +#define __scalblnl __no__scalblnl_decl #include <math.h> - -#ifndef FUNC -#define FUNC scalbn +#undef scalbln +#undef scalblnf +#undef scalblnl +#undef __scalbln +#undef __scalblnf +#undef __scalblnl + +#ifndef suffix +#define suffix /*empty*/ #endif #ifndef float_type #define float_type double @@ -29,12 +41,15 @@ #define __CONCATX(a,b) __CONCAT(a,b) float_type -__CONCATX(__,FUNC) (x, exp) +__CONCATX(__scalbn,suffix) (x, exp) float_type x; - long int exp; + int exp; { - return __m81_u(__CONCATX(__,FUNC))(x, exp); + return __m81_u(__CONCATX(__scalbn,suffix))(x, exp); } #define weak_aliasx(a,b) weak_alias(a,b) -weak_aliasx (__CONCATX(__,FUNC), FUNC) +#define strong_aliasx(a,b) strong_alias(a,b) +weak_aliasx (__CONCATX(__scalbn,suffix), __CONCATX(scalbn,suffix)) +strong_aliasx (__CONCATX(__scalbn,suffix), __CONCATX(__scalbln,suffix)) +weak_aliasx (__CONCATX(__scalbn,suffix), __CONCATX(scalbln,suffix)) diff --git a/sysdeps/m68k/fpu/s_scalbnf.c b/sysdeps/m68k/fpu/s_scalbnf.c index 33459718e9..547971836a 100644 --- a/sysdeps/m68k/fpu/s_scalbnf.c +++ b/sysdeps/m68k/fpu/s_scalbnf.c @@ -1,5 +1,3 @@ -#ifndef FUNC -#define FUNC scalbnf -#endif +#define suffix f #define float_type float #include <s_scalbn.c> diff --git a/sysdeps/m68k/fpu/s_scalbnl.c b/sysdeps/m68k/fpu/s_scalbnl.c index c6ad95079c..874bafb04b 100644 --- a/sysdeps/m68k/fpu/s_scalbnl.c +++ b/sysdeps/m68k/fpu/s_scalbnl.c @@ -1,5 +1,3 @@ -#ifndef FUNC -#define FUNC scalbnl -#endif +#define suffix l #define float_type long double #include <s_scalbn.c> diff --git a/sysdeps/m68k/sys/ucontext.h b/sysdeps/m68k/sys/ucontext.h new file mode 100644 index 0000000000..4776e7d821 --- /dev/null +++ b/sysdeps/m68k/sys/ucontext.h @@ -0,0 +1,108 @@ +/* Copyright (C) 1997 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 Library General Public License as + published by the Free Software Foundation; either version 2 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +/* System V/m68k ABI compliant context switching support. */ + +#ifndef _SYS_UCONTEXT_H +#define _SYS_UCONTEXT_H 1 + +#include <features.h> +#include <signal.h> + +/* Type for general register. */ +typedef int greg_t; + +/* Number of general registers. */ +#define NGREG 18 + +/* Container for all general registers. */ +typedef greg_t gregset_t[NGREG]; + +/* Number of each register is the `gregset_t' array. */ +enum +{ + R_D0 = 0, +#define R_D0 R_D0 + R_D1 = 1, +#define R_D1 R_D1 + R_D2 = 2, +#define R_D2 R_D2 + R_D3 = 3, +#define R_D3 R_D3 + R_D4 = 4, +#define R_D4 R_D4 + R_D5 = 5, +#define R_D5 R_D5 + R_D6 = 6, +#define R_D6 R_D6 + R_D7 = 7, +#define R_D7 R_D7 + R_A0 = 8, +#define R_A0 R_A0 + R_A1 = 9, +#define R_A1 R_A1 + R_A2 = 10, +#define R_A2 R_A2 + R_A3 = 11, +#define R_A3 R_A3 + R_A4 = 12, +#define R_A4 R_A4 + R_A5 = 13, +#define R_A5 R_A5 + R_A6 = 14, +#define R_A6 R_A6 + R_A7 = 15, +#define R_A7 R_A7 + R_SP = 15, +#define R_SP R_SP + R_PC = 16, +#define R_PC R_PC + R_PS = 17 +#define R_PS R_PS +}; + +/* Structure to describe FPU registers. */ +typedef struct fpregset +{ + int f_pcr; + int f_psr; + int f_fpiaddr; + int f_fpregs[8][3]; +} fpregset_t; + +/* Context to describe whole processor state. */ +typedef struct +{ + int version; + gregset_t gregs; +} mcontext_t; + +#define MCONTEXT_VERSION 1 + +/* Userlevel context. */ +typedef struct ucontext +{ + unsigned long int uc_flags; + struct ucontext *uc_links; + __sigset_t uc_sigmask; + stack_t uc_stack; + mcontext_t uc_mcontext; + long int uc_filler[201]; +} ucontext_t; + +#endif /* sys/ucontext.h */ diff --git a/sysdeps/posix/pread.c b/sysdeps/posix/pread.c index 300aabac65..22b8ca82bd 100644 --- a/sysdeps/posix/pread.c +++ b/sysdeps/posix/pread.c @@ -23,7 +23,7 @@ #include <unistd.h> ssize_t -pread (int fd, void *buf, size_t nbyte, off_t offset) +__pread (int fd, void *buf, size_t nbyte, off_t offset) { /* Since we must not change the file pointer preserve the value so that we can restore it later. */ @@ -54,3 +54,7 @@ pread (int fd, void *buf, size_t nbyte, off_t offset) return result; } + +#ifndef __pread +weak_alias (__pread, pread) +#endif diff --git a/sysdeps/posix/pread64.c b/sysdeps/posix/pread64.c new file mode 100644 index 0000000000..00b1f33bf2 --- /dev/null +++ b/sysdeps/posix/pread64.c @@ -0,0 +1,60 @@ +/* Read block from given position in file without changing file pointer. + POSIX version. + Copyright (C) 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include <errno.h> +#include <unistd.h> + +ssize_t +__pread64 (int fd, void *buf, size_t nbyte, off64_t offset) +{ + /* Since we must not change the file pointer preserve the value so that + we can restore it later. */ + int save_errno; + ssize_t result; + off64_t old_offset = lseek64 (fd, 0, SEEK_CUR); + if (old_offset == (off64_t) -1) + return -1; + + /* Set to wanted position. */ + if (lseek64 (fd, offset, SEEK_SET) == (off64_t) -1) + return -1; + + /* Write out the data. */ + result = read (fd, buf, nbyte); + + /* Now we have to restore the position. If this fails we have to + return this as an error. But if the writing also failed we + return this error. */ + save_errno = errno; + if (lseek64 (fd, old_offset, SEEK_SET) == (off64_t) -1) + { + if (result == -1) + __set_errno (save_errno); + return -1; + } + __set_errno (save_errno); + + return result; +} + +#ifndef __pread64 +weak_alias (__pread64, pread64) +#endif diff --git a/sysdeps/posix/pwrite.c b/sysdeps/posix/pwrite.c index 7c1ed45cca..65806a2e68 100644 --- a/sysdeps/posix/pwrite.c +++ b/sysdeps/posix/pwrite.c @@ -23,7 +23,7 @@ #include <unistd.h> ssize_t -pwrite (int fd, const void *buf, size_t nbyte, off_t offset) +__pwrite (int fd, const void *buf, size_t nbyte, off_t offset) { /* Since we must not change the file pointer preserve the value so that we can restore it later. */ @@ -54,3 +54,4 @@ pwrite (int fd, const void *buf, size_t nbyte, off_t offset) return result; } +weak_alias (__pwrite, pwrite) diff --git a/sysdeps/posix/pwrite64.c b/sysdeps/posix/pwrite64.c new file mode 100644 index 0000000000..4045ed4344 --- /dev/null +++ b/sysdeps/posix/pwrite64.c @@ -0,0 +1,59 @@ +/* Write block to given position in file without changing file pointer. + POSIX version. + Copyright (C) 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include <errno.h> +#include <unistd.h> + +ssize_t +__pwrite64 (int fd, const void *buf, size_t nbyte, off64_t offset) +{ + /* Since we must not change the file pointer preserve the value so that + we can restore it later. */ + int save_errno; + ssize_t result; + off64_t old_offset = lseek64 (fd, 0, SEEK_CUR); + if (old_offset == (off64_t) -1) + return -1; + + /* Set to wanted position. */ + if (lseek64 (fd, offset, SEEK_SET) == (off64_t) -1) + return -1; + + /* Write out the data. */ + result = write (fd, buf, nbyte); + + /* Now we have to restore the position. If this fails we have to + return this as an error. But if the writing also failed we + return this error. */ + save_errno = errno; + if (lseek64 (fd, old_offset, SEEK_SET) == (off64_t) -1) + { + if (result == -1) + __set_errno (save_errno); + return -1; + } + __set_errno (save_errno); + + return result; +} +#ifndef __pwrite64 +weak_alias (__pwrite64, pwrite64) +#endif diff --git a/sysdeps/powerpc/bits/fenv.h b/sysdeps/powerpc/bits/fenv.h index 8c26a2548f..9bb6600324 100644 --- a/sysdeps/powerpc/bits/fenv.h +++ b/sysdeps/powerpc/bits/fenv.h @@ -144,7 +144,7 @@ extern const fenv_t *__fe_nomask_env __P ((void)); # define FE_NOMASK_ENV (__fe_nomask_env ()) #endif -#ifdef __OPTIMIZE__ +#if defined __OPTIMIZE__ && !defined _SOFT_FLOAT /* Inline definition for fegetround. */ # define fegetround() \ (__extension__ ({ int __fegetround_result; \ @@ -175,4 +175,4 @@ extern const fenv_t *__fe_nomask_env __P ((void)); : : "i"(32 - __builtin_ffs (__excepts))); \ } else \ (feclearexcept) (__excepts); })) -#endif /* __OPTIMIZE__ */ +#endif /* __OPTIMIZE__ && !_SOFT_FLOAT */ diff --git a/sysdeps/powerpc/bits/mathinline.h b/sysdeps/powerpc/bits/mathinline.h index d7cabaf28b..24f186adf1 100644 --- a/sysdeps/powerpc/bits/mathinline.h +++ b/sysdeps/powerpc/bits/mathinline.h @@ -32,9 +32,9 @@ __sgn1 (double __x) { return __x >= 0.0 ? 1.0 : -1.0; } -#endif /* __NO_MATH_INLINES && __OPTIMZE__ */ +#endif /* !__NO_MATH_INLINES && __OPTIMIZE__ */ -#if __USE_ISOC9X +#if __USE_ISOC9X && !defined _SOFT_FLOAT # define __unordered_cmp(x, y) \ (__extension__ \ ({ __typeof__(x) __x = (x); __typeof__(y) __y = (y); \ @@ -48,6 +48,6 @@ __sgn1 (double __x) # define islessequal(x, y) ((__unordered_cmp (x, y) & 0xA) != 0) # define islessgreater(x, y) ((__unordered_cmp (x, y) & 0xC) != 0) # define isunordered(x, y) (__unordered_cmp (x, y) & 1) -#endif /* __USE_ISOC9X */ +#endif /* __USE_ISOC9X && !_SOFT_FLOAT */ #endif /* __GNUC__ */ diff --git a/sysdeps/powerpc/dl-machine.h b/sysdeps/powerpc/dl-machine.h index 6ab79e79ac..6857f214a9 100644 --- a/sysdeps/powerpc/dl-machine.h +++ b/sysdeps/powerpc/dl-machine.h @@ -243,8 +243,7 @@ _dl_prof_resolve: # ...unwind the stack frame, and jump to the PLT entry we updated. addi 1,1,48 bctr -0: - .size _dl_prof_resolve,0b-_dl_prof_resolve + .size _dl_prof_resolve,.-_dl_prof_resolve # Undo '.section text'. .previous "); @@ -741,7 +740,7 @@ elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc, } else if (rinfo == R_PPC_JMP_SLOT) { - elf_machine_fixup_plt (map, reloc, reloc_addr, finalvalue); + elf_machine_fixup_plt (map, reloc, reloc_addr, finaladdr); } else { diff --git a/sysdeps/sparc/sparc32/elf/start.S b/sysdeps/sparc/sparc32/elf/start.S index 8e01b30fc7..24715e68be 100644 --- a/sysdeps/sparc/sparc32/elf/start.S +++ b/sysdeps/sparc/sparc32/elf/start.S @@ -54,7 +54,7 @@ _start: argument info starts after one register window (16 words) past the SP. */ ld [%sp+22*4], %o0 add %sp, 23*4, %o1 - sll %o0, 4, %o2 + sll %o0, 2, %o2 add %o2, %o1, %o2 sethi %hi(__environ), %g2 add %o2, 4, %o2 diff --git a/sysdeps/unix/sysv/linux/Makefile b/sysdeps/unix/sysv/linux/Makefile index 4bfc3eb352..8db8094dc1 100644 --- a/sysdeps/unix/sysv/linux/Makefile +++ b/sysdeps/unix/sysv/linux/Makefile @@ -76,6 +76,10 @@ sysdep_headers += netinet/in_systm.h netinet/udp.h \ sys/socketvar.h endif +ifeq ($(subdir),posix) +sysdep_routines += s_pread64 s_pwrite64 +endif + # Don't compile the ctype glue code, since there is no old non-GNU C library. inhibit-glue = yes diff --git a/sysdeps/unix/sysv/linux/alpha/pread64.c b/sysdeps/unix/sysv/linux/alpha/pread64.c new file mode 100644 index 0000000000..b7f298dea8 --- /dev/null +++ b/sysdeps/unix/sysv/linux/alpha/pread64.c @@ -0,0 +1 @@ +/* Empty since the pread syscall is equivalent. */ diff --git a/sysdeps/unix/sysv/linux/alpha/pwrite64.c b/sysdeps/unix/sysv/linux/alpha/pwrite64.c new file mode 100644 index 0000000000..b7f298dea8 --- /dev/null +++ b/sysdeps/unix/sysv/linux/alpha/pwrite64.c @@ -0,0 +1 @@ +/* Empty since the pread syscall is equivalent. */ diff --git a/sysdeps/unix/sysv/linux/alpha/syscalls.list b/sysdeps/unix/sysv/linux/alpha/syscalls.list index 71407062fb..9e4cd39a8f 100644 --- a/sysdeps/unix/sysv/linux/alpha/syscalls.list +++ b/sysdeps/unix/sysv/linux/alpha/syscalls.list @@ -21,6 +21,8 @@ getpeername - getpeername 3 __getpeername getpeername getpriority - getpriority 2 __getpriority getpriority mmap - mmap 6 __mmap mmap llseek EXTRA lseek 3 llseek +pread EXTRA pread 4 __pread pread __pread64 pread64 +pwrite EXTRA pwrite 4 __pwrite pwrite __pwrite64 pwrite64 # these are actually common with the x86: fstatfs - fstatfs 2 __fstatfs fstatfs diff --git a/sysdeps/unix/sysv/linux/bits/socket.h b/sysdeps/unix/sysv/linux/bits/socket.h index 2a8d6ed004..8f859d2e3e 100644 --- a/sysdeps/unix/sysv/linux/bits/socket.h +++ b/sysdeps/unix/sysv/linux/bits/socket.h @@ -136,10 +136,10 @@ struct msghdr socklen_t msg_namelen; /* Length of address data. */ struct iovec *msg_iov; /* Vector of data to send/receive into. */ - int msg_iovlen; /* Number of elements in the vector. */ + size_t msg_iovlen; /* Number of elements in the vector. */ __ptr_t msg_control; /* Ancillary data (eg BSD filedesc passing). */ - socklen_t msg_controllen; /* Ancillary data buffer length. */ + size_t msg_controllen; /* Ancillary data buffer length. */ int msg_flags; /* Flags on received message. */ }; @@ -147,7 +147,7 @@ struct msghdr /* Structure used for storage of ancillary data object information. */ struct cmsghdr { - socklen_t cmsg_len; /* Length of data in cmsg_data plus length + size_t cmsg_len; /* Length of data in cmsg_data plus length of cmsghdr structure. */ int cmsg_level; /* Originating protocol. */ int cmsg_type; /* Protocol specific type. */ @@ -195,6 +195,16 @@ __cmsg_nxthdr (struct msghdr *__mhdr, struct cmsghdr *__cmsg) return (struct cmsghdr *) __p; } +/* Socket level message types. This must match the definitions in + <linux/socket.h>. */ +enum + { + SCM_RIGHTS = 0x01, /* Data array contains access rights. */ +#define SCM_RIGHTS SCM_RIGHTS + __SCM_CREDENTIALS = 0x02, /* Data array is `struct ucred'. */ + __SCM_CONNECT = 0x03 /* Data array is `struct scm_connect'. */ + }; + /* Get socket manipulation related informations from kernel headers. */ #include <asm/socket.h> diff --git a/sysdeps/unix/sysv/linux/net/if_arp.h b/sysdeps/unix/sysv/linux/net/if_arp.h index d784f0cfc7..80f4516344 100644 --- a/sysdeps/unix/sysv/linux/net/if_arp.h +++ b/sysdeps/unix/sysv/linux/net/if_arp.h @@ -69,7 +69,7 @@ struct arphdr /* ARP protocol HARDWARE identifiers. */ #define ARPHRD_NETROM 0 /* From KA9Q: NET/ROM pseudo. */ -#define ARPHRD_ETHER 1 /* Ethernet 10Mbps. */ +#define ARPHRD_ETHER 1 /* Ethernet 10/100Mbps. */ #define ARPHRD_EETHER 2 /* Experimental Ethernet. */ #define ARPHRD_AX25 3 /* AX.25 Level 2. */ #define ARPHRD_PRONET 4 /* PROnet token ring. */ @@ -92,6 +92,7 @@ struct arphdr #define ARPHRD_PPP 512 #define ARPHRD_HDLC 513 /* (Cisco) HDLC. */ #define ARPHRD_LAPB 516 /* LAPB. */ +#define ARPHRD_ASH 517 /* ASH. */ #define ARPHRD_TUNNEL 768 /* IPIP tunnel. */ #define ARPHRD_TUNNEL6 769 /* IPIP6 tunnel. */ diff --git a/sysdeps/unix/sysv/linux/net/if_packet.h b/sysdeps/unix/sysv/linux/net/if_packet.h new file mode 100644 index 0000000000..60155eeac3 --- /dev/null +++ b/sysdeps/unix/sysv/linux/net/if_packet.h @@ -0,0 +1,26 @@ +/* Definitions for use with Linux SOCK_PACKET sockets. + Copyright (C) 1997 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 Library General Public License as + published by the Free Software Foundation; either version 2 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#ifndef __IF_PACKET_H +#define __IF_PACKET_H + +/* For now we can just use the kernel definitions. */ +#include <linux/if_packet.h> + +#endif diff --git a/sysdeps/unix/sysv/linux/pread.c b/sysdeps/unix/sysv/linux/pread.c new file mode 100644 index 0000000000..eeb26eb663 --- /dev/null +++ b/sysdeps/unix/sysv/linux/pread.c @@ -0,0 +1,28 @@ +/* Copyright (C) 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include <unistd.h> + +ssize_t +__pread (int fd, void *buf, size_t nbytes, off_t offset) +{ + return __pread64 (fd, buf, nbytes, (off64_t) offset); +} + +weak_alias (__pread, pread) diff --git a/sysdeps/unix/sysv/linux/pread64.c b/sysdeps/unix/sysv/linux/pread64.c new file mode 100644 index 0000000000..e2505dbaa4 --- /dev/null +++ b/sysdeps/unix/sysv/linux/pread64.c @@ -0,0 +1,53 @@ +/* Copyright (C) 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include <errno.h> +#include <unistd.h> + +extern ssize_t __syscall_pread64 (int fd, void *buf, size_t count, + off_t offset_hi, off_t offset_lo); + +static ssize_t __emulate_pread64 (int fd, void *buf, size_t count, + off64_t offset) internal_function; + + +ssize_t +__pread64 (fd, buf, count, offset) + int fd; + void *buf; + size_t count; + off64_t offset; +{ + ssize_t result; + + /* First try the syscall. */ + result = __syscall_pread64 (fd, buf, count, (off_t) (offset >> 32), + (off_t) (offset & 0xffffffff)); + if (result == -1 && errno == ENOSYS) + /* No system call available. Use the emulation. */ + result = __emulate_pread64 (fd, buf, count, offset); + + return result; +} + +weak_alias (__pread64, pread64) + +#define __pread64(fd, buf, count, offset) \ + static internal_function __emulate_pread64 (fd, buf, count, offset) +#include <sysdeps/posix/pread64.c> diff --git a/sysdeps/unix/sysv/linux/pwrite.c b/sysdeps/unix/sysv/linux/pwrite.c new file mode 100644 index 0000000000..d8695db2a8 --- /dev/null +++ b/sysdeps/unix/sysv/linux/pwrite.c @@ -0,0 +1,28 @@ +/* Copyright (C) 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include <unistd.h> + +ssize_t +__pwrite (int fd, const void *buf, size_t nbytes, off_t offset) +{ + return __pwrite64 (fd, buf, nbytes, (off64_t) offset); +} + +weak_alias (__pwrite, pwrite) diff --git a/sysdeps/unix/sysv/linux/pwrite64.c b/sysdeps/unix/sysv/linux/pwrite64.c new file mode 100644 index 0000000000..f2b4bcbe4e --- /dev/null +++ b/sysdeps/unix/sysv/linux/pwrite64.c @@ -0,0 +1,53 @@ +/* Copyright (C) 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include <errno.h> +#include <unistd.h> + +extern ssize_t __syscall_pwrite64 (int fd, const void *buf, size_t count, + off_t offset_hi, off_t offset_lo); + +static ssize_t __emulate_pwrite64 (int fd, const void *buf, size_t count, + off64_t offset) internal_function; + + +ssize_t +__pwrite64 (fd, buf, count, offset) + int fd; + const void *buf; + size_t count; + off64_t offset; +{ + ssize_t result; + + /* First try the syscall. */ + result = __syscall_pwrite64 (fd, buf, count, (off_t) (offset >> 32), + (off_t) (offset & 0xffffffff)); + if (result == -1 && errno == ENOSYS) + /* No system call available. Use the emulation. */ + result = __emulate_pwrite64 (fd, buf, count, offset); + + return result; +} + +weak_alias (__pwrite64, pwrite64) + +#define __pwrite64(fd, buf, count, offset) \ + static internal_function __emulate_pwrite64 (fd, buf, count, offset) +#include <sysdeps/posix/pwrite64.c> diff --git a/sysdeps/unix/sysv/linux/s_pread64.c b/sysdeps/unix/sysv/linux/s_pread64.c new file mode 100644 index 0000000000..9c25a05e18 --- /dev/null +++ b/sysdeps/unix/sysv/linux/s_pread64.c @@ -0,0 +1,30 @@ +/* Copyright (C) 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include <errno.h> +#include <unistd.h> + +/* This file is used if no system call is available. */ +ssize_t +__syscall_pread64 (int fd, char *buf, size_t count, + off_t offset_hi, off_t offset_lo) +{ + __set_errno (ENOSYS); + return -1; +} diff --git a/sysdeps/unix/sysv/linux/s_pwrite64.c b/sysdeps/unix/sysv/linux/s_pwrite64.c new file mode 100644 index 0000000000..bed11fd8ee --- /dev/null +++ b/sysdeps/unix/sysv/linux/s_pwrite64.c @@ -0,0 +1,30 @@ +/* Copyright (C) 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include <errno.h> +#include <unistd.h> + +/* This file is used if no system call is available. */ +ssize_t +__syscall_pwrite64 (int fd, const char *buf, size_t count, + off_t offset_hi, off_t offset_lo) +{ + __set_errno (ENOSYS); + return -1; +} diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/init-first.h b/sysdeps/unix/sysv/linux/sparc/sparc32/init-first.h index 9bbe6bcdab..384c5c219b 100644 --- a/sysdeps/unix/sysv/linux/sparc/sparc32/init-first.h +++ b/sysdeps/unix/sysv/linux/sparc/sparc32/init-first.h @@ -76,12 +76,12 @@ cmp %g2, 0 beq 3f sethi %hi(__libc_multiple_libcs), %g3 - ld [%g4+%g2], %g2 + ld [%g2], %g2 subcc %g0, %g2, %g0 subx %g0, -1, %g2 3: or %g3, %lo(__libc_multiple_libcs), %g3 cmp %g2, 0 - st %g2, [%g3+%g4] + st %g2, [%g3] /* If so, argc et al are in %o0-%o2 already. Otherwise, load them. */ bnz " #INIT " nop diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/socket.S b/sysdeps/unix/sysv/linux/sparc/sparc32/socket.S index bdfc2fcc6d..4c65ac7f3c 100644 --- a/sysdeps/unix/sysv/linux/sparc/sparc32/socket.S +++ b/sysdeps/unix/sysv/linux/sparc/sparc32/socket.S @@ -23,6 +23,13 @@ #define P(a, b) P2(a, b) #define P2(a, b) a##b +#ifndef NARGS +#ifdef socket +#error NARGS not defined +#endif +#define NARGS 3 +#endif + .text /* The socket-oriented system calls are handled unusually in Linux. They are all gated through the single `socketcall' system call number. @@ -34,25 +41,36 @@ .globl P(__,socket) ENTRY (P(__,socket)) - mov SYS_ify(socketcall), %g1 /* System call number */ - /* Use ## so `socket' is a separate token that might be #define'd. */ - mov P(SOCKOP_,socket), %o0 /* Subcode is first arg to syscall. */ - mov %i0,%o1 /* args pointer is second arg to syscall */ + /* Drop up to 6 arguments (recvfrom) into the memory allocated by + the caller for varargs, since that's really what we have. */ + st %o0, [%sp + 68 + 0] + st %o1, [%sp + 68 + 4] +#if NARGS > 2 + st %o2, [%sp + 68 + 8] +#if NARGS > 3 + st %o3, [%sp + 68 + 12] +#if NARGS > 4 + st %o4, [%sp + 68 + 16] +#if NARGS > 5 + st %o5, [%sp + 68 + 20] +#endif +#endif +#endif +#endif + mov P(SOCKOP_,socket), %o0 /* arg 1: socket subfunction */ + add %sp, 68, %o1 /* arg 2: parameter block */ + LOADSYSCALL(socketcall) t 0x10 - bcc,a 1 - nop - save %sp,96,%sp - call __errno_location - nop - st %i0,[%o0] - restore + + bcs,a 1f + nop retl - mov -1,%o0 -1: - ret + nop + +1: SYSCALL_ERROR_HANDLER -PSEUDO_END (P(__,socket)) +END (P(__,socket)) weak_alias (P(__,socket), socket) diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/pread64.c b/sysdeps/unix/sysv/linux/sparc/sparc64/pread64.c new file mode 100644 index 0000000000..b7f298dea8 --- /dev/null +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/pread64.c @@ -0,0 +1 @@ +/* Empty since the pread syscall is equivalent. */ diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/pwrite64.c b/sysdeps/unix/sysv/linux/sparc/sparc64/pwrite64.c new file mode 100644 index 0000000000..b7f298dea8 --- /dev/null +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/pwrite64.c @@ -0,0 +1 @@ +/* Empty since the pread syscall is equivalent. */ diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/syscalls.list b/sysdeps/unix/sysv/linux/sparc/sparc64/syscalls.list index e5425e9a29..d0bee8fa07 100644 --- a/sysdeps/unix/sysv/linux/sparc/sparc64/syscalls.list +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/syscalls.list @@ -2,6 +2,8 @@ # Whee! 64-bit systems naturally implement llseek. llseek EXTRA lseek 3 llseek +pread EXTRA pread 4 __pread pread __pread64 pread64 +pwrite EXTRA pwrite 4 __pwrite pwrite __pwrite64 pwrite64 # Override select.S in parent directory: select - select 5 __select select diff --git a/sysdeps/unix/sysv/linux/sys/prctl.h b/sysdeps/unix/sysv/linux/sys/prctl.h new file mode 100644 index 0000000000..b5b4412fc4 --- /dev/null +++ b/sysdeps/unix/sysv/linux/sys/prctl.h @@ -0,0 +1,32 @@ +/* Copyright (C) 1997 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 Library General Public License as + published by the Free Software Foundation; either version 2 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#ifndef _SYS_PRCTL_H +#define _SYS_PRCTL_H 1 + +#include <features.h> +#include <linux/prctl.h> /* The magic values come from here */ + +__BEGIN_DECLS + +/* Control process execution. */ +extern int prctl __P ((int __option, ...)); + +__END_DECLS + +#endif /* sys/prctl.h */ diff --git a/sysdeps/unix/sysv/linux/syscalls.list b/sysdeps/unix/sysv/linux/syscalls.list index 6028a04aaf..a1fe445739 100644 --- a/sysdeps/unix/sysv/linux/syscalls.list +++ b/sysdeps/unix/sysv/linux/syscalls.list @@ -38,7 +38,9 @@ quotactl EXTRA quotactl 4 quotactl s_getdents EXTRA getdents 3 __getdents s_getpriority getpriority getpriority 2 __syscall_getpriority s_poll poll poll 3 __syscall_poll +s_pread64 EXTRA pread 5 __syscall_pread64 s_ptrace ptrace ptrace 4 __syscall_ptrace +s_pwrite64 EXTRA pwrite 5 __syscall_pwrite64 s_reboot EXTRA reboot 3 __syscall_reboot s_sigaction sigaction sigaction 3 __syscall_sigaction s_sigsuspend sigsuspend sigsuspend 3 __syscall_sigsuspend |