diff options
author | Mike Frysinger <vapier@gentoo.org> | 2006-08-23 23:20:30 +0000 |
---|---|---|
committer | Mike Frysinger <vapier@gentoo.org> | 2006-08-23 23:20:30 +0000 |
commit | 190da1cd0c221438c563b5b605ff811e9075e210 (patch) | |
tree | ca5177a27d154dfa08b85d678ce6e33ac0672522 /libc | |
parent | e0605c73da33c6f06b13c4bdf5cb42db97cd4b30 (diff) |
sync with psm: update errno handling to be the same on all arches
Diffstat (limited to 'libc')
20 files changed, 151 insertions, 106 deletions
diff --git a/libc/misc/internals/__errno_location.c b/libc/misc/internals/__errno_location.c index cd2a9c0eb..5a2af36fd 100644 --- a/libc/misc/internals/__errno_location.c +++ b/libc/misc/internals/__errno_location.c @@ -1,8 +1,16 @@ +/* + * Copyright (C) 2000-2006 Erik Andersen <andersen@uclibc.org> + * + * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball. + */ + #include <errno.h> #undef errno +extern int errno; libc_hidden_proto(errno) /* psm: moved to bits/errno.h: libc_hidden_proto(__errno_location) */ +libc_hidden_proto(__errno_location) int * weak_const_function __errno_location (void) { return &errno; diff --git a/libc/misc/internals/__h_errno_location.c b/libc/misc/internals/__h_errno_location.c index 96f51ae5c..10b7673e3 100644 --- a/libc/misc/internals/__h_errno_location.c +++ b/libc/misc/internals/__h_errno_location.c @@ -1,7 +1,14 @@ +/* + * Copyright (C) 2000-2006 Erik Andersen <andersen@uclibc.org> + * + * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball. + */ + #define __FORCE_GLIBC #include <features.h> #include <netdb.h> #undef h_errno +extern int h_errno; libc_hidden_proto(h_errno) diff --git a/libc/sysdeps/linux/alpha/bits/syscalls.h b/libc/sysdeps/linux/alpha/bits/syscalls.h index 3c227e643..561d4bf15 100644 --- a/libc/sysdeps/linux/alpha/bits/syscalls.h +++ b/libc/sysdeps/linux/alpha/bits/syscalls.h @@ -9,12 +9,12 @@ * programs. */ #include <bits/sysnum.h> -#ifndef __set_errno -# define __set_errno(val) (*__errno_location ()) = (val) -#endif - #ifndef __ASSEMBLER__ +#include <errno.h> + +#define SYS_ify(syscall_name) (__NR_##syscall_name) + #define _syscall_return(type) \ return (_sc_err ? __set_errno(_sc_ret), _sc_ret = -1L : 0), (type) _sc_ret diff --git a/libc/sysdeps/linux/arm/bits/syscalls.h b/libc/sysdeps/linux/arm/bits/syscalls.h index d25d1824e..b6cfc1f9b 100644 --- a/libc/sysdeps/linux/arm/bits/syscalls.h +++ b/libc/sysdeps/linux/arm/bits/syscalls.h @@ -9,19 +9,17 @@ * programs. */ #include <bits/sysnum.h> -#ifndef __set_errno -# define __set_errno(val) (*__errno_location ()) = (val) -#endif -#ifndef SYS_ify -# define SYS_ify(syscall_name) (__NR_##syscall_name) -#endif - /* Some of the sneaky macros in the code were taken from glibc-2.3.2/sysdeps/unix/sysv/linux/arm/sysdep.h */ #ifdef __ASSEMBLER__ + +#include <errno.h> + +#define SYS_ify(syscall_name) (__NR_##syscall_name) + /* Call a given syscall, with arguments loaded. For EABI, we must save and restore r7 for the syscall number. Unlike the DO_CALL macro in glibc, this macro does not load syscall arguments. */ diff --git a/libc/sysdeps/linux/bfin/bits/syscalls.h b/libc/sysdeps/linux/bfin/bits/syscalls.h index 475d193ce..2309f7f6d 100644 --- a/libc/sysdeps/linux/bfin/bits/syscalls.h +++ b/libc/sysdeps/linux/bfin/bits/syscalls.h @@ -9,15 +9,11 @@ * programs. */ #include <bits/sysnum.h> -#ifndef __set_errno -# define __set_errno(val) ((*__errno_location ()) = (val)) -#endif +#ifndef __ASSEMBLER__ -#ifndef SYS_ify -# define SYS_ify(syscall_name) (__NR_##syscall_name) -#endif +#include <errno.h> -#ifndef __ASSEMBLER__ +#define SYS_ify(syscall_name) (__NR_##syscall_name) /* user-visible error numbers are in the range -1 - -4095: see <asm-frv/errno.h> */ #if defined _LIBC && !defined __set_errno diff --git a/libc/sysdeps/linux/common/bits/errno.h b/libc/sysdeps/linux/common/bits/errno.h index 45a0ec0d1..78e8c6972 100644 --- a/libc/sysdeps/linux/common/bits/errno.h +++ b/libc/sysdeps/linux/common/bits/errno.h @@ -1,5 +1,5 @@ /* Error constants. Linux specific version. - Copyright (C) 1996, 1997, 1998, 1999, 2002 Free Software Foundation, Inc. + Copyright (C) 1996, 1997, 1998, 1999, 2005 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 @@ -19,35 +19,41 @@ #ifdef _ERRNO_H -#include <bits/errno_values.h> +# undef EDOM +# undef EILSEQ +# undef ERANGE +# include <bits/errno_values.h> -#ifndef ENOTSUP +/* Linux has no ENOTSUP error code. */ # define ENOTSUP EOPNOTSUPP -#endif -#ifndef ECANCELED -# define ECANCELED 125 -#endif - -#ifndef __ASSEMBLER__ +/* Older Linux versions also had no ECANCELED error code. */ +# ifndef ECANCELED +# define ECANCELED 125 +# endif -/* We now need a declaration of the `errno' variable. */ -extern int errno; +/* Support for error codes to support robust mutexes was added later, too. */ +# ifndef EOWNERDEAD +# define EOWNERDEAD 130 +# define ENOTRECOVERABLE 131 +# endif +# ifndef __ASSEMBLER__ /* Function to get address of global `errno' variable. */ extern int *__errno_location (void) __THROW __attribute__ ((__const__)); -# if defined _LIBC && ( defined IS_IN_libc || defined NOT_IN_libc ) -libc_hidden_proto(__errno_location) -/* We wouldn't need a special macro anymore but it is history. */ -# define __set_errno(val) ((errno) = (val)) -# endif /* _LIBC */ - -# ifdef __UCLIBC_HAS_THREADS__ +# ifdef __UCLIBC_HAS_THREADS__ /* When using threads, errno is a per-thread value. */ -# define errno (*__errno_location ()) -# endif - -#endif /* !__ASSEMBLER__ */ - +# define errno (*__errno_location ()) +# endif +# endif /* !__ASSEMBLER__ */ #endif /* _ERRNO_H */ + +#if !defined _ERRNO_H && defined __need_Emath +/* This is ugly but the kernel header is not clean enough. We must + define only the values EDOM, EILSEQ and ERANGE in case __need_Emath is + defined. */ +# define EDOM 33 /* Math argument out of domain of function. */ +# define EILSEQ 84 /* Illegal byte sequence. */ +# define ERANGE 34 /* Math result not representable. */ +#endif /* !_ERRNO_H && __need_Emath */ diff --git a/libc/sysdeps/linux/common/bits/syscalls.h b/libc/sysdeps/linux/common/bits/syscalls.h index e891af8e5..4895c4fa0 100644 --- a/libc/sysdeps/linux/common/bits/syscalls.h +++ b/libc/sysdeps/linux/common/bits/syscalls.h @@ -5,6 +5,4 @@ * forbidden. Don't do it. It is bad for you. */ - -#error You have not provided architecture specific _syscall[0-5] macros - +#error You have not provided architecture specific _syscall[0-6] macros diff --git a/libc/sysdeps/linux/common/bits/uClibc_errno.h b/libc/sysdeps/linux/common/bits/uClibc_errno.h new file mode 100644 index 000000000..9da9f8155 --- /dev/null +++ b/libc/sysdeps/linux/common/bits/uClibc_errno.h @@ -0,0 +1,46 @@ +/* + * Copyright (C) 2000-2006 Erik Andersen <andersen@uclibc.org> + * + * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball. + */ +#ifndef _BITS_UCLIBC_ERRNO_H +#define _BITS_UCLIBC_ERRNO_H 1 + +#ifdef IS_IN_rtld +# undef errno +# define errno _dl_errno +extern int _dl_errno; // attribute_hidden; +#elif defined __UCLIBC_HAS_THREADS__ +# include <tls.h> +# if USE___THREAD +# undef errno +# ifndef NOT_IN_libc +# define errno __libc_errno +# else +# define errno errno +# endif +extern __thread int errno __attribute_tls_model_ie; +# endif /* USE___THREAD */ +#endif /* IS_IN_rtld */ + +#define __set_errno(val) (errno = (val)) + +#ifndef __ASSEMBLER__ +extern int *__errno_location (void) __THROW __attribute__ ((__const__)) +# ifdef IS_IN_rtld + attribute_hidden +# endif +; +#include <tls.h> +#if USE___THREAD +libc_hidden_proto(__errno_location) +#endif + +/* We now need a declaration of the `errno' variable. */ +# ifndef __UCLIBC_HAS_THREADS__ +/*extern int errno;*/ +libc_hidden_proto(errno) +# endif +#endif /* !__ASSEMBLER__ */ + +#endif diff --git a/libc/sysdeps/linux/cris/bits/syscalls.h b/libc/sysdeps/linux/cris/bits/syscalls.h index ce68c04d4..8b74518ce 100644 --- a/libc/sysdeps/linux/cris/bits/syscalls.h +++ b/libc/sysdeps/linux/cris/bits/syscalls.h @@ -8,16 +8,11 @@ /* Include the __NR_<name> definitions. */ #include <bits/sysnum.h> -#if 0 -#ifndef __set_errno -#define __set_errno(val) (*__errno_location()) = (val) -#endif -#endif +#ifndef __ASSEMBLER__ -#undef SYS_ify -#define SYS_ify(syscall_name) (__NR_##syscall_name) +#include <errno.h> -#ifndef __ASSEMBLER__ +#define SYS_ify(syscall_name) (__NR_##syscall_name) #undef _syscall0 #define _syscall0(type,name) \ diff --git a/libc/sysdeps/linux/frv/bits/syscalls.h b/libc/sysdeps/linux/frv/bits/syscalls.h index 23219d602..fae1079bd 100644 --- a/libc/sysdeps/linux/frv/bits/syscalls.h +++ b/libc/sysdeps/linux/frv/bits/syscalls.h @@ -9,12 +9,12 @@ * programs. */ #include <bits/sysnum.h> -#ifndef SYS_ify -# define SYS_ify(syscall_name) (__NR_##syscall_name) -#endif - #ifndef __ASSEMBLER__ +#include <errno.h> + +#define SYS_ify(syscall_name) (__NR_##syscall_name) + /* user-visible error numbers are in the range -1 - -4095: see <asm-frv/errno.h> */ #if defined _LIBC && !defined __set_errno # define __syscall_return(type, res) \ diff --git a/libc/sysdeps/linux/hppa/bits/syscalls.h b/libc/sysdeps/linux/hppa/bits/syscalls.h index cb80138f5..365f5b4b1 100644 --- a/libc/sysdeps/linux/hppa/bits/syscalls.h +++ b/libc/sysdeps/linux/hppa/bits/syscalls.h @@ -9,12 +9,10 @@ * programs. */ #include <bits/sysnum.h> -#ifndef __set_errno -# define __set_errno(val) (*__errno_location ()) = (val) -#endif - #ifndef __ASSEMBLER__ +#include <errno.h> + #define SYS_ify(syscall_name) __NR_##syscall_name /* Assume all syscalls are done from PIC code just to be diff --git a/libc/sysdeps/linux/i386/bits/syscalls.h b/libc/sysdeps/linux/i386/bits/syscalls.h index 58475e3af..73f858521 100644 --- a/libc/sysdeps/linux/i386/bits/syscalls.h +++ b/libc/sysdeps/linux/i386/bits/syscalls.h @@ -4,8 +4,6 @@ # error "Never use <bits/syscalls.h> directly; include <sys/syscall.h> instead." #endif -#include <errno.h> - /* This includes the `__NR_<name>' syscall numbers taken from the Linux kernel * header files. It also defines the traditional `SYS_<name>' macros for older * programs. */ @@ -18,6 +16,10 @@ #ifndef __ASSEMBLER__ +#include <errno.h> + +#define SYS_ify(syscall_name) (__NR_##syscall_name) + /* We need some help from the assembler to generate optimal code. We define some macros here which later will be used. */ diff --git a/libc/sysdeps/linux/ia64/bits/syscalls.h b/libc/sysdeps/linux/ia64/bits/syscalls.h index c5da7d91f..666468a7a 100644 --- a/libc/sysdeps/linux/ia64/bits/syscalls.h +++ b/libc/sysdeps/linux/ia64/bits/syscalls.h @@ -31,17 +31,14 @@ * programs. */ #include <bits/sysnum.h> -#ifndef __set_errno -# define __set_errno(val) (*__errno_location ()) = (val) -#endif +#ifndef __ASSEMBLER__ +#include <errno.h> -#ifndef __ASSEMBLER__ +#define SYS_ify(syscall_name) (__NR_##syscall_name) #undef IA64_USE_NEW_STUB -#define SYS_ify(syscall_name) __NR_##syscall_name - /* taken from asm-ia64/break.h */ #define __IA64_BREAK_SYSCALL 0x100000 #define ___IA64_BREAK_SYSCALL "0x100000" diff --git a/libc/sysdeps/linux/mips/bits/syscalls.h b/libc/sysdeps/linux/mips/bits/syscalls.h index 7133d83e3..1987bbfb2 100644 --- a/libc/sysdeps/linux/mips/bits/syscalls.h +++ b/libc/sysdeps/linux/mips/bits/syscalls.h @@ -9,15 +9,12 @@ * programs. */ #include <bits/sysnum.h> -#ifndef __set_errno -# define __set_errno(val) (*__errno_location ()) = (val) -#endif -#ifndef SYS_ify -# define SYS_ify(syscall_name) (__NR_##syscall_name) -#endif - #ifndef __ASSEMBLER__ +#include <errno.h> + +#define SYS_ify(syscall_name) (__NR_##syscall_name) + #define __SYSCALL_CLOBBERS "$1", "$3", "$8", "$9", "$10", "$11", "$12", "$13", \ "$14", "$15", "$24", "$25", "memory" diff --git a/libc/sysdeps/linux/powerpc/bits/syscalls.h b/libc/sysdeps/linux/powerpc/bits/syscalls.h index e28c380ee..ae269b876 100644 --- a/libc/sysdeps/linux/powerpc/bits/syscalls.h +++ b/libc/sysdeps/linux/powerpc/bits/syscalls.h @@ -5,13 +5,13 @@ # error "Never use <bits/syscalls.h> directly; include <sys/syscall.h> instead." #endif -#include <errno.h> - /* This includes the `__NR_<name>' syscall numbers taken from the Linux kernel * header files. It also defines the traditional `SYS_<name>' macros for older * programs. */ #include <bits/sysnum.h> +#ifndef __ASSEMBLER__ + /* Define a macro which expands inline into the wrapper code for a system call. This use is for internal calls that do not need to handle errors normally. It will never touch errno. @@ -20,6 +20,10 @@ "sc; bnslr+" sequence) and CR (where only CR0.SO is clobbered to signal an error return status). */ +#include <errno.h> + +#define SYS_ify(syscall_name) (__NR_##syscall_name) + # undef INLINE_SYSCALL #if 1 # define INLINE_SYSCALL(name, nr, args...) \ @@ -164,5 +168,5 @@ type name(type1 arg1, type2 arg2, type3 arg3, type4 arg4, type5 arg5, type6 arg6 return (type) INLINE_SYSCALL(name, 6, arg1, arg2, arg3, arg4, arg5, arg6); \ } +#endif /* __ASSEMBLER__ */ #endif /* _BITS_SYSCALLS_H */ - diff --git a/libc/sysdeps/linux/sh/bits/syscalls.h b/libc/sysdeps/linux/sh/bits/syscalls.h index 55b227f71..83b20f63e 100644 --- a/libc/sysdeps/linux/sh/bits/syscalls.h +++ b/libc/sysdeps/linux/sh/bits/syscalls.h @@ -9,15 +9,12 @@ * programs. */ #include <bits/sysnum.h> -#ifndef __set_errno -# define __set_errno(val) (*__errno_location ()) = (val) -#endif -#ifndef SYS_ify -# define SYS_ify(syscall_name) (__NR_##syscall_name) -#endif - #ifndef __ASSEMBLER__ +#include <errno.h> + +#define SYS_ify(syscall_name) (__NR_##syscall_name) + /* user-visible error numbers are in the range -1 - -125: see <asm-sh/errno.h> */ #define __syscall_return(type, res) \ do { \ diff --git a/libc/sysdeps/linux/sh64/bits/syscalls.h b/libc/sysdeps/linux/sh64/bits/syscalls.h index e6190303a..9b4efc2e5 100644 --- a/libc/sysdeps/linux/sh64/bits/syscalls.h +++ b/libc/sysdeps/linux/sh64/bits/syscalls.h @@ -9,15 +9,12 @@ * programs. */ #include <bits/sysnum.h> -#ifndef __set_errno -# define __set_errno(val) (*__errno_location ()) = (val) -#endif -#ifndef SYS_ify -# define SYS_ify(syscall_name) (__NR_##syscall_name) -#endif - #ifndef __ASSEMBLER__ +#include <errno.h> + +#define SYS_ify(syscall_name) (__NR_##syscall_name) + /* user-visible error numbers are in the range -1 - -125: see <asm-sh64/errno.h> */ #define __syscall_return(type, res) \ do { \ diff --git a/libc/sysdeps/linux/sparc/bits/syscalls.h b/libc/sysdeps/linux/sparc/bits/syscalls.h index b8865d453..b0f953972 100644 --- a/libc/sysdeps/linux/sparc/bits/syscalls.h +++ b/libc/sysdeps/linux/sparc/bits/syscalls.h @@ -11,12 +11,12 @@ * programs. */ #include <bits/sysnum.h> -#ifndef __set_errno -# define __set_errno(val) (*__errno_location ()) = (val) -#endif - #ifndef __ASSEMBLER__ +#include <errno.h> + +#define SYS_ify(syscall_name) (__NR_##syscall_name) + #undef __SYSCALL_STRING #if __WORDSIZE == 32 # define __SYSCALL_STRING \ diff --git a/libc/sysdeps/linux/vax/bits/syscalls.h b/libc/sysdeps/linux/vax/bits/syscalls.h index caa62118d..f80b40539 100644 --- a/libc/sysdeps/linux/vax/bits/syscalls.h +++ b/libc/sysdeps/linux/vax/bits/syscalls.h @@ -9,13 +9,11 @@ * programs. */ #include <bits/sysnum.h> -#ifndef __set_errno -# define __set_errno(val) (*__errno_location())=(val) -#endif +#ifndef __ASSEMBLER__ -#ifndef SYS_ify -# define SYS_ify(syscall_name) (__NR_##syscall_name) -#endif +#include <errno.h> + +#define SYS_ify(syscall_name) (__NR_##syscall_name) #undef _syscall_return #define _syscall_return(type) \ @@ -261,4 +259,5 @@ type name (type1 arg1, \ _syscall_return (type); \ } +#endif /* __ASSEMBLER__ */ #endif /* _BITS_SYSCALLS_H */ diff --git a/libc/sysdeps/linux/x86_64/bits/syscalls.h b/libc/sysdeps/linux/x86_64/bits/syscalls.h index d44f637ac..afd97c0b0 100644 --- a/libc/sysdeps/linux/x86_64/bits/syscalls.h +++ b/libc/sysdeps/linux/x86_64/bits/syscalls.h @@ -9,10 +9,6 @@ * programs. */ #include <bits/sysnum.h> -#ifndef __set_errno -# define __set_errno(val) (*__errno_location ()) = (val) -#endif - /* Some of the sneaky macros in the code were taken from glibc-2.2.5/sysdeps/unix/sysv/linux/x86_64/sysdep.h @@ -20,6 +16,10 @@ #ifndef __ASSEMBLER__ +#include <errno.h> + +#define SYS_ify(syscall_name) (__NR_##syscall_name) + #undef _syscall0 #define _syscall0(type,name) \ type name(void) \ |