diff options
author | Joseph Myers <joseph@codesourcery.com> | 2017-08-30 22:02:04 +0000 |
---|---|---|
committer | Joseph Myers <joseph@codesourcery.com> | 2017-08-30 22:02:04 +0000 |
commit | 4fa9b3bfe6759c82beb4b043a54a3598ca467289 (patch) | |
tree | 0ea79808d3ccd29e28b254e6b6cfcd0c01b835cb /sysdeps/unix/sysv/linux/ia64 | |
parent | dynarray: Set errno on overflow-induced allocation failure (diff) | |
download | glibc-4fa9b3bfe6759c82beb4b043a54a3598ca467289.tar.gz glibc-4fa9b3bfe6759c82beb4b043a54a3598ca467289.tar.bz2 glibc-4fa9b3bfe6759c82beb4b043a54a3598ca467289.zip |
Fix mcontext_t sigcontext namespace (bug 21457).
This patch completes the ucontext.h namespace fixes by fixing issues
related to the use of struct sigcontext as mcontext_t, and inclusion
of <bits/sigcontext.h> even when struct sigcontext is not so used.
Inclusion of <bits/sigcontext.h> by <sys/ucontext.h> is removed; the
way to get the sigcontext structure is by including <signal.h> (in a
context where __USE_MISC is defined); the sysdeps/generic version of
sys/ucontext.h keeps the inclusion by necessity, with a comment about
how this is not namespace-clean, but the only configuration that used
it, MicroBlaze, gets its own version of the header in this patch.
Where mcontext_t was typedefed to struct sigcontext, the contents of
struct sigcontext are inserted (with appropriate namespace handling to
prefix fields with __ when __USE_MISC is not defined); review should
check that this has been done correctly in each case, whether the
definition of struct sigcontext comes from glibc headers or from the
Linux kernel. This changes C++ name mangling on affected
architectures (which do not include x86_64/x86).
Tested for x86_64, and with build-many-glibcs.py.
2017-08-14 Joseph Myers <joseph@codesourcery.com>
[BZ #21457]
* sysdeps/arm/sys/ucontext.h: Do not include <bits/sigcontext.h>.
* sysdeps/generic/sys/ucontext.h: Add comment about use of struct
sigcontext and namespace requirements.
* sysdeps/i386/sys/ucontext.h: Do not include <bits/sigcontext.h>.
* sysdeps/m68k/sys/ucontext.h: Likewise.
* sysdeps/mips/sys/ucontext.h: Likewise. Include <bits/types.h>.
* sysdeps/unix/sysv/linux/aarch64/sys/ucontext.h: Do not include
<bits/sigcontext.h>.
(__ctx): Define earlier.
(mcontext_t): Define structure contents rather than using struct
sigcontext.
* sysdeps/unix/sysv/linux/aarch64/ucontext_i.sym (oEXTENSION): Use
__glibc_reserved1 instead of __reserved.
* sysdeps/unix/sysv/linux/alpha/sys/ucontext.h: Do not include
<bits/sigcontext.h>.
(__ctx): Define earlier.
(mcontext_t): Define structure contents rather than using struct
sigcontext.
* sysdeps/unix/sysv/linux/alpha/ucontext-offsets.sym: Use
mcontext_t instead of struct sigcontext.
* sysdeps/unix/sysv/linux/arm/sys/ucontext.h: Do not include
<bits/sigcontext.h>.
(__ctx): Define earlier.
(mcontext_t): Define structure contents rather than using struct
sigcontext.
* sysdeps/unix/sysv/linux/hppa/sys/ucontext.h: Do not include
<bits/sigcontext.h>.
(__ctx): Define earlier.
(mcontext_t): Define structure contents rather than using struct
sigcontext.
* sysdeps/unix/sysv/linux/ia64/makecontext.c (__makecontext): Use
mcontext_t instead of struct sigcontext.
* sysdeps/unix/sysv/linux/ia64/sigcontext-offsets.sym: Use
mcontext_t instead of struct sigcontext.
* sysdeps/unix/sysv/linux/ia64/sys/ucontext.h: Do not include
<bits/sigcontext.h>.
(__ctx): New macro.
(struct __ia64_fpreg_mcontext): New type.
(mcontext_t): Define structure contents rather than using struct
sigcontext.
(_SC_GR0_OFFSET): Use mcontext_t instead of struct sigcontext.
(uc_sigmask): Define using __ctx.
(uc_stack): Likewise.
* sysdeps/unix/sysv/linux/ia64/sys/procfs.h: Include
<bits/sigcontext.h>.
* sysdeps/unix/sysv/linux/ia64/sys/ptrace.h: Likewise.
* sysdeps/unix/sysv/linux/m68k/sys/ucontext.h: Do not include
<bits/sigcontext.h>.
* sysdeps/unix/sysv/linux/microblaze/sys/ucontext.h: New file.
* sysdeps/unix/sysv/linux/mips/sys/ucontext.h: Do not include
<bits/sigcontext.h>.
* sysdeps/unix/sysv/linux/nios2/sys/ucontext.h: Do not include
<bits/sigcontext.h>.
* sysdeps/unix/sysv/linux/powerpc/sys/ucontext.h: Do not include
<bits/sigcontext.h>.
* sysdeps/unix/sysv/linux/s390/sys/ucontext.h: Do not include
<bits/sigcontext.h>.
* sysdeps/unix/sysv/linux/sh/sys/ucontext.h: Do not include
<bits/sigcontext.h>.
* sysdeps/unix/sysv/linux/sparc/sys/ucontext.h: Do not include
<bits/sigcontext.h>.
* sysdeps/unix/sysv/linux/tile/sys/ucontext.h: Do not include
<bits/sigcontext.h>.
(__ctx): Define earlier.
(mcontext_t): Define structure contents rather than using struct
sigcontext.
* sysdeps/unix/sysv/linux/x86/sys/ucontext.h: Do not include
<bits/sigcontext.h>. Include <bits/types.h>.
* conform/Makefile (test-xfail-XPG42/signal.h/conform): Remove.
(test-xfail-XPG42/sys/wait.h/conform): Likewise.
(test-xfail-XPG42/ucontext.h/conform): Likewise.
(test-xfail-UNIX98/signal.h/conform): Likewise.
(test-xfail-UNIX98/sys/wait.h/conform): Likewise.
(test-xfail-UNIX98/ucontext.h/conform): Likewise.
(test-xfail-XOPEN2K/signal.h/conform): Likewise.
(test-xfail-XOPEN2K/sys/wait.h/conform): Likewise.
(test-xfail-XOPEN2K/ucontext.h/conform): Likewise.
(test-xfail-POSIX2008/signal.h/conform): Likewise.
(test-xfail-POSIX2008/sys/wait.h/conform): Likewise.
(test-xfail-XOPEN2K8/signal.h/conform): Likewise.
(test-xfail-XOPEN2K8/sys/wait.h/conform): Likewise.
Diffstat (limited to 'sysdeps/unix/sysv/linux/ia64')
-rw-r--r-- | sysdeps/unix/sysv/linux/ia64/makecontext.c | 2 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/ia64/sigcontext-offsets.sym | 24 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/ia64/sys/procfs.h | 1 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/ia64/sys/ptrace.h | 1 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/ia64/sys/ucontext.h | 53 |
5 files changed, 61 insertions, 20 deletions
diff --git a/sysdeps/unix/sysv/linux/ia64/makecontext.c b/sysdeps/unix/sysv/linux/ia64/makecontext.c index 299f9a85ae..cb98e7cb13 100644 --- a/sysdeps/unix/sysv/linux/ia64/makecontext.c +++ b/sysdeps/unix/sysv/linux/ia64/makecontext.c @@ -40,7 +40,7 @@ do { \ void __makecontext (ucontext_t *ucp, void (*func) (void), int argc, ...) { - struct sigcontext *sc = &ucp->uc_mcontext; + mcontext_t *sc = &ucp->uc_mcontext; extern void __start_context (ucontext_t *link, long gp, ...); unsigned long stack_start, stack_end; va_list ap; diff --git a/sysdeps/unix/sysv/linux/ia64/sigcontext-offsets.sym b/sysdeps/unix/sysv/linux/ia64/sigcontext-offsets.sym index 943e68a667..ac3e3c8dea 100644 --- a/sysdeps/unix/sysv/linux/ia64/sigcontext-offsets.sym +++ b/sysdeps/unix/sysv/linux/ia64/sigcontext-offsets.sym @@ -2,15 +2,15 @@ #include <sys/ucontext.h> -- -SC_NAT offsetof (struct sigcontext, sc_nat) -SC_BSP offsetof (struct sigcontext, sc_ar_bsp) -SC_RNAT offsetof (struct sigcontext, sc_ar_rnat) -SC_UNAT offsetof (struct sigcontext, sc_ar_unat) -SC_FPSR offsetof (struct sigcontext, sc_ar_fpsr) -SC_PFS offsetof (struct sigcontext, sc_ar_pfs) -SC_LC offsetof (struct sigcontext, sc_ar_lc) -SC_PR offsetof (struct sigcontext, sc_pr) -SC_BR offsetof (struct sigcontext, sc_br) -SC_GR offsetof (struct sigcontext, sc_gr) -SC_FR offsetof (struct sigcontext, sc_fr) -SC_MASK offsetof (struct sigcontext, sc_mask) +SC_NAT offsetof (mcontext_t, sc_nat) +SC_BSP offsetof (mcontext_t, sc_ar_bsp) +SC_RNAT offsetof (mcontext_t, sc_ar_rnat) +SC_UNAT offsetof (mcontext_t, sc_ar_unat) +SC_FPSR offsetof (mcontext_t, sc_ar_fpsr) +SC_PFS offsetof (mcontext_t, sc_ar_pfs) +SC_LC offsetof (mcontext_t, sc_ar_lc) +SC_PR offsetof (mcontext_t, sc_pr) +SC_BR offsetof (mcontext_t, sc_br) +SC_GR offsetof (mcontext_t, sc_gr) +SC_FR offsetof (mcontext_t, sc_fr) +SC_MASK offsetof (mcontext_t, sc_mask) diff --git a/sysdeps/unix/sysv/linux/ia64/sys/procfs.h b/sysdeps/unix/sysv/linux/ia64/sys/procfs.h index afe54fbd53..4847f2d59b 100644 --- a/sysdeps/unix/sysv/linux/ia64/sys/procfs.h +++ b/sysdeps/unix/sysv/linux/ia64/sys/procfs.h @@ -27,6 +27,7 @@ #include <sys/time.h> #include <sys/types.h> #include <sys/ucontext.h> +#include <bits/sigcontext.h> #include <sys/user.h> __BEGIN_DECLS diff --git a/sysdeps/unix/sysv/linux/ia64/sys/ptrace.h b/sysdeps/unix/sysv/linux/ia64/sys/ptrace.h index 681dc8913a..9de2f9431b 100644 --- a/sysdeps/unix/sysv/linux/ia64/sys/ptrace.h +++ b/sysdeps/unix/sysv/linux/ia64/sys/ptrace.h @@ -21,6 +21,7 @@ #include <features.h> #include <sys/ucontext.h> +#include <bits/sigcontext.h> #include <bits/types.h> __BEGIN_DECLS diff --git a/sysdeps/unix/sysv/linux/ia64/sys/ucontext.h b/sysdeps/unix/sysv/linux/ia64/sys/ucontext.h index 9cd686c40c..8929e093a0 100644 --- a/sysdeps/unix/sysv/linux/ia64/sys/ucontext.h +++ b/sysdeps/unix/sysv/linux/ia64/sys/ucontext.h @@ -21,24 +21,63 @@ #include <features.h> #include <bits/types/sigset_t.h> -#include <bits/sigcontext.h> #include <bits/types/stack_t.h> +#ifdef __USE_MISC +# define __ctx(fld) fld +#else +# define __ctx(fld) __ ## fld +#endif + /* * These are here mostly for backwards compatibility with older Unices. - * IA-64 Linux does not distinguish between "struct sigcontext" and + * IA-64 Linux does not distinguish between "mcontext_t" and * "ucontext_t" as all the necessary info is inside the former. */ -typedef struct sigcontext mcontext_t; +struct __ia64_fpreg_mcontext + { + union + { + unsigned long __ctx(bits)[2]; + } __ctx(u); + } __attribute__ ((__aligned__ (16))); + +typedef struct + { + unsigned long int __ctx(sc_flags); + unsigned long int __ctx(sc_nat); + stack_t __ctx(sc_stack); + unsigned long int __ctx(sc_ip); + unsigned long int __ctx(sc_cfm); + unsigned long int __ctx(sc_um); + unsigned long int __ctx(sc_ar_rsc); + unsigned long int __ctx(sc_ar_bsp); + unsigned long int __ctx(sc_ar_rnat); + unsigned long int __ctx(sc_ar_ccv); + unsigned long int __ctx(sc_ar_unat); + unsigned long int __ctx(sc_ar_fpsr); + unsigned long int __ctx(sc_ar_pfs); + unsigned long int __ctx(sc_ar_lc); + unsigned long int __ctx(sc_pr); + unsigned long int __ctx(sc_br)[8]; + unsigned long int __ctx(sc_gr)[32]; + struct __ia64_fpreg_mcontext __ctx(sc_fr)[128]; + unsigned long int __ctx(sc_rbs_base); + unsigned long int __ctx(sc_loadrs); + unsigned long int __ctx(sc_ar25); + unsigned long int __ctx(sc_ar26); + unsigned long int __ctx(sc_rsvd)[12]; + unsigned long int __ctx(sc_mask); + } mcontext_t; #if __GNUC_PREREQ (3, 5) # define _SC_GR0_OFFSET \ - __builtin_offsetof (struct sigcontext, sc_gr[0]) + __builtin_offsetof (mcontext_t, __ctx(sc_gr)[0]) #elif defined __GNUC__ # define _SC_GR0_OFFSET \ - (((char *) &((struct sigcontext *) 0)->sc_gr[0]) - (char *) 0) + (((char *) &((mcontext_t *) 0)->__ctx(sc_gr)[0]) - (char *) 0) #else # define _SC_GR0_OFFSET 0xc8 /* pray that this is correct... */ #endif @@ -60,8 +99,8 @@ typedef struct ucontext_t ucontext_t; #define uc_mcontext _u._mc -#define uc_sigmask _u._mc.sc_mask -#define uc_stack _u._mc.sc_stack +#define uc_sigmask _u._mc.__ctx(sc_mask) +#define uc_stack _u._mc.__ctx(sc_stack) #define uc_link _u._uc._link #endif /* sys/ucontext.h */ |