Message ID | alpine.DEB.2.20.1706201753090.29540@digraph.polyomino.org.uk |
---|---|
State | New |
Headers | show |
Ping. This patch <https://sourceware.org/ml/libc-alpha/2017-06/msg00946.html> is pending review.
On 06/20/2017 01:53 PM, Joseph Myers wrote: > This patch continues 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. I'm concerned that this may be a step too far in the direction of POSIX conformance at the expense of existing code: specifically, existing code that assumes that struct sigcontext and mcontext_t are "compatible" types (in the C-standardese sense), not just structures with the same set of members. The most _obvious_ ways this would show up are passing 'mcontext_t *' values to functions taking 'struct sigcontext *' arguments, or using structure assignment to copy between the two, both of which should cause compile failures; but there could be other problems (aliasing, perhaps), that only show up at runtime. struct sigcontext is legacy BSD; I might actually feel better about a patch that completely removed it (in favor of having <signal.h> define mcontext_t under __USE_MISC if it doesn't already, which I believe we are allowed to do, if only by the blanket _t reservation), as that would be guaranteed to cause compile-time failures for all affected code. If we go this route, the same change should be made to kernel-provided UAPI headers. Independent of that, this is finicky enough and has enough kernel-interface implications that I think it had better have architecture maintainer reviews for, at least, all architectures where you copied the contents of struct sigcontext into the definition of mcontext_t. zw
On Mon, 26 Jun 2017, Zack Weinberg wrote: > Independent of that, this is finicky enough and has enough > kernel-interface implications that I think it had better have > architecture maintainer reviews for, at least, all architectures where > you copied the contents of struct sigcontext into the definition of > mcontext_t. Ping of <https://sourceware.org/ml/libc-alpha/2017-06/msg00946.html> for architecture maintainers for aarch64, alpha, hppa, ia64, microblaze, tile.
On Mon, 26 Jun 2017, Zack Weinberg wrote: > I'm concerned that this may be a step too far in the direction of POSIX > conformance at the expense of existing code: specifically, existing code > that assumes that struct sigcontext and mcontext_t are "compatible" > types (in the C-standardese sense), not just structures with the same > set of members. The most _obvious_ ways this would show up are passing > 'mcontext_t *' values to functions taking 'struct sigcontext *' > arguments, or using structure assignment to copy between the two, both > of which should cause compile failures; but there could be other > problems (aliasing, perhaps), that only show up at runtime. Any such assumptions would already not work on x86_64 / x86, where mcontext_t is not struct sigcontext. For that reason, I don't think such issues are particularly likely, especially any that don't show up at compile time.
On 06/27/2017 07:41 AM, Joseph Myers wrote: > On Mon, 26 Jun 2017, Zack Weinberg wrote: > >> I'm concerned that this may be a step too far in the direction of POSIX >> conformance at the expense of existing code: specifically, existing code >> that assumes that struct sigcontext and mcontext_t are "compatible" >> types (in the C-standardese sense), not just structures with the same >> set of members. The most _obvious_ ways this would show up are passing >> 'mcontext_t *' values to functions taking 'struct sigcontext *' >> arguments, or using structure assignment to copy between the two, both >> of which should cause compile failures; but there could be other >> problems (aliasing, perhaps), that only show up at runtime. > > Any such assumptions would already not work on x86_64 / x86, where > mcontext_t is not struct sigcontext. For that reason, I don't think such > issues are particularly likely, especially any that don't show up at > compile time. I agree with Joseph. At first glance it looks like they are not compatible on sh5, mips, sparc, m68k, x86/x86_64, nios2, s390/s390x, and power. On hppa, ia64, arm, alpha, aarch64, and tile, they do have a `typedef struct sigcontext mcontext_t;` which would make this work. That's a 50/50 chance of it working. I would cleanup bug 21457.
On Tue, 27 Jun 2017, Carlos O'Donell wrote: > On hppa, ia64, arm, alpha, aarch64, and tile, they do have a > `typedef struct sigcontext mcontext_t;` which would make this work. And microblaze (using sysdeps/generic/sys/ucontext.h before this patch), for which my architecture maintainer ping bounced.
On 20/06/17 18:53, Joseph Myers wrote: > This patch continues 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). > i think glibc c++ abi stability is more important in practice than posix namespace rules. > diff --git a/sysdeps/unix/sysv/linux/aarch64/sys/ucontext.h b/sysdeps/unix/sysv/linux/aarch64/sys/ucontext.h > index 4f602fc..90d0c42 100644 > --- a/sysdeps/unix/sysv/linux/aarch64/sys/ucontext.h > +++ b/sysdeps/unix/sysv/linux/aarch64/sys/ucontext.h > @@ -24,10 +24,15 @@ > #include <features.h> > > #include <bits/types/sigset_t.h> > -#include <bits/sigcontext.h> this may break software that rely on declarations from asm/sigcontext.h to be visible in sys/ucontext.h (e.g. struct fpsimd_context ?), but i don't know if this is actually the case. > #include <bits/types/stack_t.h> > > #ifdef __USE_MISC > +# define __ctx(fld) fld > +#else > +# define __ctx(fld) __ ## fld > +#endif > + > +#ifdef __USE_MISC > # include <sys/procfs.h> > > > @@ -44,7 +49,15 @@ typedef elf_fpregset_t fpregset_t; > the core registers; coprocessor registers get saved elsewhere > (e.g. in uc_regspace, or somewhere unspecified on the stack > during non-RT signal handlers). */ > -typedef struct sigcontext mcontext_t; > +typedef struct > + { > + unsigned long long int __ctx(fault_address); > + unsigned long long int __ctx(regs)[31]; > + unsigned long long int __ctx(sp); > + unsigned long long int __ctx(pc); > + unsigned long long int __ctx(pstate); > + unsigned char __glibc_reserved1[4096] __attribute__ ((__aligned__ (16))); > + } mcontext_t; > i find the c++ abi break problematic. i would not expect mcontext_t to be common argument in c++ code, but it's a moderately dangerous change, while the status quo is not too bad. > /* Userlevel context. */ > typedef struct ucontext_t > @@ -56,4 +69,6 @@ typedef struct ucontext_t > mcontext_t uc_mcontext; > } ucontext_t; > > +#undef __ctx > + > #endif /* sys/ucontext.h */ > diff --git a/sysdeps/unix/sysv/linux/aarch64/ucontext_i.sym b/sysdeps/unix/sysv/linux/aarch64/ucontext_i.sym > index ab3930c..479bdda 100644 > --- a/sysdeps/unix/sysv/linux/aarch64/ucontext_i.sym > +++ b/sysdeps/unix/sysv/linux/aarch64/ucontext_i.sym > @@ -38,7 +38,7 @@ oX0 mcontext (regs) > oSP mcontext (sp) > oPC mcontext (pc) > oPSTATE mcontext (pstate) > -oEXTENSION mcontext (__reserved) > +oEXTENSION mcontext (__glibc_reserved1) > > #define fpsimd_context(member) offsetof (struct fpsimd_context, member) >
On Tue, 27 Jun 2017, Szabolcs Nagy wrote: > > diff --git a/sysdeps/unix/sysv/linux/aarch64/sys/ucontext.h b/sysdeps/unix/sysv/linux/aarch64/sys/ucontext.h > > index 4f602fc..90d0c42 100644 > > --- a/sysdeps/unix/sysv/linux/aarch64/sys/ucontext.h > > +++ b/sysdeps/unix/sysv/linux/aarch64/sys/ucontext.h > > @@ -24,10 +24,15 @@ > > #include <features.h> > > > > #include <bits/types/sigset_t.h> > > -#include <bits/sigcontext.h> > > this may break software that rely on declarations from > asm/sigcontext.h to be visible in sys/ucontext.h (e.g. > struct fpsimd_context ?), but i don't know if this is > actually the case. They can of course include <signal.h> (or <asm/sigcontext.h> directly). It's possible to keep the include, conditioned on __USE_MISC, just not clear that's worthwhile. > i find the c++ abi break problematic. > > i would not expect mcontext_t to be common argument > in c++ code, but it's a moderately dangerous change, > while the status quo is not too bad. For some previous patches in this series, changing stack_t and ucontext_t, Florian checked there were no affected mangled names in Fedora, as evidence for such problems being rare. Such a check might be worthwhile here (remembering that what is being looked for is architecture-specific, but on x86_64 / x86 the mangled name is already mcontext_t and would not change because there aren't namespace issues there).
On 27/06/17 16:11, Joseph Myers wrote: > On Tue, 27 Jun 2017, Szabolcs Nagy wrote: > >>> diff --git a/sysdeps/unix/sysv/linux/aarch64/sys/ucontext.h b/sysdeps/unix/sysv/linux/aarch64/sys/ucontext.h >>> index 4f602fc..90d0c42 100644 >>> --- a/sysdeps/unix/sysv/linux/aarch64/sys/ucontext.h >>> +++ b/sysdeps/unix/sysv/linux/aarch64/sys/ucontext.h >>> @@ -24,10 +24,15 @@ >>> #include <features.h> >>> >>> #include <bits/types/sigset_t.h> >>> -#include <bits/sigcontext.h> >> >> this may break software that rely on declarations from >> asm/sigcontext.h to be visible in sys/ucontext.h (e.g. >> struct fpsimd_context ?), but i don't know if this is >> actually the case. > > They can of course include <signal.h> (or <asm/sigcontext.h> directly). > It's possible to keep the include, conditioned on __USE_MISC, just not > clear that's worthwhile. > i didn't know signal.h already includes sigcontext.h, then the change is ok. >> i find the c++ abi break problematic. >> >> i would not expect mcontext_t to be common argument >> in c++ code, but it's a moderately dangerous change, >> while the status quo is not too bad. > > For some previous patches in this series, changing stack_t and ucontext_t, > Florian checked there were no affected mangled names in Fedora, as > evidence for such problems being rare. Such a check might be worthwhile > here (remembering that what is being looked for is architecture-specific, > but on x86_64 / x86 the mangled name is already mcontext_t and would not > change because there aren't namespace issues there). > Florian, if you can check, then please do.
On 06/27/2017 05:27 PM, Szabolcs Nagy wrote: >> For some previous patches in this series, changing stack_t and ucontext_t, >> Florian checked there were no affected mangled names in Fedora, as >> evidence for such problems being rare. Such a check might be worthwhile >> here (remembering that what is being looked for is architecture-specific, >> but on x86_64 / x86 the mangled name is already mcontext_t and would not >> change because there aren't namespace issues there). >> > > Florian, if you can check, then please do. What's the old mangled name I would have to look for? sigcontext? Thanks, Florian
On Tue, 27 Jun 2017, Florian Weimer wrote: > On 06/27/2017 05:27 PM, Szabolcs Nagy wrote: > > >> For some previous patches in this series, changing stack_t and ucontext_t, > >> Florian checked there were no affected mangled names in Fedora, as > >> evidence for such problems being rare. Such a check might be worthwhile > >> here (remembering that what is being looked for is architecture-specific, > >> but on x86_64 / x86 the mangled name is already mcontext_t and would not > >> change because there aren't namespace issues there). > >> > > > > Florian, if you can check, then please do. > > What's the old mangled name I would have to look for? sigcontext? On x86_64 and x86, it's mcontext_t (and won't change). On AArch64, it's sigcontext.
On 06/27/2017 05:56 PM, Joseph Myers wrote: > On Tue, 27 Jun 2017, Florian Weimer wrote: > >> On 06/27/2017 05:27 PM, Szabolcs Nagy wrote: >> >>>> For some previous patches in this series, changing stack_t and ucontext_t, >>>> Florian checked there were no affected mangled names in Fedora, as >>>> evidence for such problems being rare. Such a check might be worthwhile >>>> here (remembering that what is being looked for is architecture-specific, >>>> but on x86_64 / x86 the mangled name is already mcontext_t and would not >>>> change because there aren't namespace issues there). >>>> >>> >>> Florian, if you can check, then please do. >> >> What's the old mangled name I would have to look for? sigcontext? > > On x86_64 and x86, it's mcontext_t (and won't change). On AArch64, it's > sigcontext. Only one package is affected, the Dolphin emulator (we have version 5.0 in Fedora). It uses SContext as typedef for mcontext_t. All symbols are definitions, and there are no references. I assume they are all accidental exports, so this program would not be affected by the mangling change. Singular (a “Computer Algebra System for polynomial computations”) uses a sigcontext type as well, but again only in a definition. But this happens on i386 (where it even brings its own definition) and x86-64, and mcontext_t is not used, so it's not related. I don't know if the harmless mangling change within Dolphin should be considered a blocker. Probably not. But in general, I agree with the sentiment that POSIX conformance is usually not sufficient grounds for ABI breakage (or deviation from kernel-defined data structure layouts). Thanks, Florian
On Mon, 26 Jun 2017, Joseph Myers wrote: > On Mon, 26 Jun 2017, Zack Weinberg wrote: > > > Independent of that, this is finicky enough and has enough > > kernel-interface implications that I think it had better have > > architecture maintainer reviews for, at least, all architectures where > > you copied the contents of struct sigcontext into the definition of > > mcontext_t. > > Ping of <https://sourceware.org/ml/libc-alpha/2017-06/msg00946.html> for > architecture maintainers for aarch64, alpha, hppa, ia64, microblaze, tile. Ping again, both architecture-maintainer and general patch. (Note email to the microblaze maintainer bounced.) All the other fixes for this bug are now in, so this patch allows 11 of the 13 miscellaneous conform/ XFAILs to be removed (and the other two are just ordinary bugs about the details of what's exposed for particular old standard versions).
On 29/06/17 20:51, Joseph Myers wrote: > On Mon, 26 Jun 2017, Joseph Myers wrote: > >> On Mon, 26 Jun 2017, Zack Weinberg wrote: >> >>> Independent of that, this is finicky enough and has enough >>> kernel-interface implications that I think it had better have >>> architecture maintainer reviews for, at least, all architectures where >>> you copied the contents of struct sigcontext into the definition of >>> mcontext_t. >> >> Ping of <https://sourceware.org/ml/libc-alpha/2017-06/msg00946.html> for >> architecture maintainers for aarch64, alpha, hppa, ia64, microblaze, tile. > > Ping again, both architecture-maintainer and general patch. (Note email > to the microblaze maintainer bounced.) All the other fixes for this bug > are now in, so this patch allows 11 of the 13 miscellaneous conform/ > XFAILs to be removed (and the other two are just ordinary bugs about the > details of what's exposed for particular old standard versions). > the patch is ok for aarch64. otoh i heard from a qemu maintainer that the ucontext change broke qemu and valgrind as well (they used struct ucontext somewhere) and it's not clear why these changes are so important to break code.
On 6/29/2017 3:51 PM, Joseph Myers wrote: > On Mon, 26 Jun 2017, Joseph Myers wrote: > >> On Mon, 26 Jun 2017, Zack Weinberg wrote: >> >>> Independent of that, this is finicky enough and has enough >>> kernel-interface implications that I think it had better have >>> architecture maintainer reviews for, at least, all architectures where >>> you copied the contents of struct sigcontext into the definition of >>> mcontext_t. >> Ping for >> architecture maintainers for aarch64, alpha, hppa, ia64, microblaze, tile. > Ping again, both architecture-maintainer and general patch. (Note email > to the microblaze maintainer bounced.) All the other fixes for this bug > are now in, so this patch allows 11 of the 13 miscellaneous conform/ > XFAILs to be removed (and the other two are just ordinary bugs about the > details of what's exposed for particular old standard versions). The tile architecture version looks good to me.
diff --git a/NEWS b/NEWS index e263385..2444bc4 100644 --- a/NEWS +++ b/NEWS @@ -96,6 +96,10 @@ Version 2.26 fpregset_t type no longer has the name struct fpu. This changes the C++ name mangling for interfaces involving those types. +* The mcontext_t type is no longer the same as struct sigcontext. On + platforms where it was previously the same, this changes the C++ name + mangling for interfaces involving this type. + * The synchronization that pthread_spin_unlock performs has been changed to now be equivalent to a C11 atomic store with release memory order to the spin lock's memory location. This ensures correct synchronization diff --git a/conform/Makefile b/conform/Makefile index 9ec41c7..3f1e5f9 100644 --- a/conform/Makefile +++ b/conform/Makefile @@ -163,17 +163,6 @@ test-xfail-XOPEN2K8/ndbm.h/conform = yes # Unsorted expected failures. test-xfail-XPG42/signal.h/conform = yes test-xfail-XPG42/sys/wait.h/conform = yes -test-xfail-XPG42/ucontext.h/conform = yes -test-xfail-UNIX98/signal.h/conform = yes -test-xfail-UNIX98/sys/wait.h/conform = yes -test-xfail-UNIX98/ucontext.h/conform = yes -test-xfail-XOPEN2K/signal.h/conform = yes -test-xfail-XOPEN2K/sys/wait.h/conform = yes -test-xfail-XOPEN2K/ucontext.h/conform = yes -test-xfail-POSIX2008/signal.h/conform = yes -test-xfail-POSIX2008/sys/wait.h/conform = yes -test-xfail-XOPEN2K8/signal.h/conform = yes -test-xfail-XOPEN2K8/sys/wait.h/conform = yes conformtest-cc-flags = -I../include $(+sysdep-includes) $(sysincludes) -I.. # conformtest-xfail-conds may be set by a sysdeps Makefile fragment to diff --git a/sysdeps/arm/sys/ucontext.h b/sysdeps/arm/sys/ucontext.h index 464a353..7bf208f 100644 --- a/sysdeps/arm/sys/ucontext.h +++ b/sysdeps/arm/sys/ucontext.h @@ -23,7 +23,6 @@ #include <features.h> #include <bits/types/sigset_t.h> -#include <bits/sigcontext.h> #include <bits/types/stack_t.h> diff --git a/sysdeps/generic/sys/ucontext.h b/sysdeps/generic/sys/ucontext.h index e4679d3..9a67791 100644 --- a/sysdeps/generic/sys/ucontext.h +++ b/sysdeps/generic/sys/ucontext.h @@ -17,7 +17,9 @@ <http://www.gnu.org/licenses/>. */ /* This file's definitions suffice for any platform where all - the machine-specific state is described in `struct sigcontext'. */ + the machine-specific state is described in `struct sigcontext', but + use of struct sigcontext does not conform to POSIX namespace + requirements. */ #ifndef _SYS_UCONTEXT_H #define _SYS_UCONTEXT_H 1 diff --git a/sysdeps/i386/sys/ucontext.h b/sysdeps/i386/sys/ucontext.h index be8c7e5..782fa30 100644 --- a/sysdeps/i386/sys/ucontext.h +++ b/sysdeps/i386/sys/ucontext.h @@ -23,7 +23,6 @@ #include <features.h> #include <bits/types/sigset_t.h> -#include <bits/sigcontext.h> #include <bits/types/stack_t.h> diff --git a/sysdeps/m68k/sys/ucontext.h b/sysdeps/m68k/sys/ucontext.h index 00c4af4..6e511e4 100644 --- a/sysdeps/m68k/sys/ucontext.h +++ b/sysdeps/m68k/sys/ucontext.h @@ -23,7 +23,6 @@ #include <features.h> #include <bits/types/sigset_t.h> -#include <bits/sigcontext.h> #include <bits/types/stack_t.h> diff --git a/sysdeps/mips/sys/ucontext.h b/sysdeps/mips/sys/ucontext.h index d69656b..5a6be03 100644 --- a/sysdeps/mips/sys/ucontext.h +++ b/sysdeps/mips/sys/ucontext.h @@ -22,8 +22,8 @@ #include <features.h> +#include <bits/types.h> #include <bits/types/sigset_t.h> -#include <bits/sigcontext.h> #include <bits/types/stack_t.h> #include <sgidefs.h> diff --git a/sysdeps/unix/sysv/linux/aarch64/sys/ucontext.h b/sysdeps/unix/sysv/linux/aarch64/sys/ucontext.h index 4f602fc..90d0c42 100644 --- a/sysdeps/unix/sysv/linux/aarch64/sys/ucontext.h +++ b/sysdeps/unix/sysv/linux/aarch64/sys/ucontext.h @@ -24,10 +24,15 @@ #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 + +#ifdef __USE_MISC # include <sys/procfs.h> @@ -44,7 +49,15 @@ typedef elf_fpregset_t fpregset_t; the core registers; coprocessor registers get saved elsewhere (e.g. in uc_regspace, or somewhere unspecified on the stack during non-RT signal handlers). */ -typedef struct sigcontext mcontext_t; +typedef struct + { + unsigned long long int __ctx(fault_address); + unsigned long long int __ctx(regs)[31]; + unsigned long long int __ctx(sp); + unsigned long long int __ctx(pc); + unsigned long long int __ctx(pstate); + unsigned char __glibc_reserved1[4096] __attribute__ ((__aligned__ (16))); + } mcontext_t; /* Userlevel context. */ typedef struct ucontext_t @@ -56,4 +69,6 @@ typedef struct ucontext_t mcontext_t uc_mcontext; } ucontext_t; +#undef __ctx + #endif /* sys/ucontext.h */ diff --git a/sysdeps/unix/sysv/linux/aarch64/ucontext_i.sym b/sysdeps/unix/sysv/linux/aarch64/ucontext_i.sym index ab3930c..479bdda 100644 --- a/sysdeps/unix/sysv/linux/aarch64/ucontext_i.sym +++ b/sysdeps/unix/sysv/linux/aarch64/ucontext_i.sym @@ -38,7 +38,7 @@ oX0 mcontext (regs) oSP mcontext (sp) oPC mcontext (pc) oPSTATE mcontext (pstate) -oEXTENSION mcontext (__reserved) +oEXTENSION mcontext (__glibc_reserved1) #define fpsimd_context(member) offsetof (struct fpsimd_context, member) diff --git a/sysdeps/unix/sysv/linux/alpha/sys/ucontext.h b/sysdeps/unix/sysv/linux/alpha/sys/ucontext.h index bf95205..4711277 100644 --- a/sysdeps/unix/sysv/linux/alpha/sys/ucontext.h +++ b/sysdeps/unix/sysv/linux/alpha/sys/ucontext.h @@ -21,10 +21,15 @@ #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 + /* Type for general register. */ typedef long int greg_t; @@ -51,7 +56,27 @@ typedef fpreg_t fpregset_t[__NFPREG]; /* A machine context is exactly a sigcontext. */ -typedef struct sigcontext mcontext_t; +typedef struct + { + long int __ctx(sc_onstack); + long int __ctx(sc_mask); + long int __ctx(sc_pc); + long int __ctx(sc_ps); + long int __ctx(sc_regs)[32]; + long int __ctx(sc_ownedfp); + long int __ctx(sc_fpregs)[32]; + unsigned long int __ctx(sc_fpcr); + unsigned long int __ctx(sc_fp_control); + unsigned long int __glibc_reserved1, __glibc_reserved2; + unsigned long int __ctx(sc_ssize); + char *__ctx(sc_sbase); + unsigned long int __ctx(sc_traparg_a0); + unsigned long int __ctx(sc_traparg_a1); + unsigned long int __ctx(sc_traparg_a2); + unsigned long int __ctx(sc_fp_trap_pc); + unsigned long int __ctx(sc_fp_trigger_sum); + unsigned long int __ctx(sc_fp_trigger_inst); + } mcontext_t; /* Userlevel context. */ typedef struct ucontext_t @@ -64,4 +89,6 @@ typedef struct ucontext_t sigset_t uc_sigmask; } ucontext_t; +#undef __ctx + #endif /* sys/ucontext.h */ diff --git a/sysdeps/unix/sysv/linux/alpha/ucontext-offsets.sym b/sysdeps/unix/sysv/linux/alpha/ucontext-offsets.sym index f95ff75..9e86f8a 100644 --- a/sysdeps/unix/sysv/linux/alpha/ucontext-offsets.sym +++ b/sysdeps/unix/sysv/linux/alpha/ucontext-offsets.sym @@ -7,12 +7,12 @@ UC_OSF_SIGMASK offsetof (ucontext_t, __uc_osf_sigmask) UC_STACK offsetof (ucontext_t, uc_stack) UC_SIGCTX offsetof (ucontext_t, uc_mcontext) UC_SIGMASK offsetof (ucontext_t, uc_sigmask) -SC_REGS offsetof (struct sigcontext, sc_regs) -SC_FPREGS offsetof (struct sigcontext, sc_fpregs) -SC_PC offsetof (struct sigcontext, sc_pc) -SC_PS offsetof (struct sigcontext, sc_ps) -SC_FPCRS offsetof (struct sigcontext, sc_fpcr) -SC_MASK offsetof (struct sigcontext, sc_mask) -SC_FPCR offsetof (struct sigcontext, sc_fpcr) +SC_REGS offsetof (mcontext_t, sc_regs) +SC_FPREGS offsetof (mcontext_t, sc_fpregs) +SC_PC offsetof (mcontext_t, sc_pc) +SC_PS offsetof (mcontext_t, sc_ps) +SC_FPCRS offsetof (mcontext_t, sc_fpcr) +SC_MASK offsetof (mcontext_t, sc_mask) +SC_FPCR offsetof (mcontext_t, sc_fpcr) SS_SP offsetof (stack_t, ss_sp) SS_SIZE offsetof (stack_t, ss_size) diff --git a/sysdeps/unix/sysv/linux/arm/sys/ucontext.h b/sysdeps/unix/sysv/linux/arm/sys/ucontext.h index 1083d66..b166f2c 100644 --- a/sysdeps/unix/sysv/linux/arm/sys/ucontext.h +++ b/sysdeps/unix/sysv/linux/arm/sys/ucontext.h @@ -23,11 +23,16 @@ #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 + +#ifdef __USE_MISC typedef int greg_t; /* Number of general registers. */ @@ -98,7 +103,30 @@ typedef struct _libc_fpstate fpregset_t; the core registers; coprocessor registers get saved elsewhere (e.g. in uc_regspace, or somewhere unspecified on the stack during non-RT signal handlers). */ -typedef struct sigcontext mcontext_t; +typedef struct + { + unsigned long int __ctx(trap_no); + unsigned long int __ctx(error_code); + unsigned long int __ctx(oldmask); + unsigned long int __ctx(arm_r0); + unsigned long int __ctx(arm_r1); + unsigned long int __ctx(arm_r2); + unsigned long int __ctx(arm_r3); + unsigned long int __ctx(arm_r4); + unsigned long int __ctx(arm_r5); + unsigned long int __ctx(arm_r6); + unsigned long int __ctx(arm_r7); + unsigned long int __ctx(arm_r8); + unsigned long int __ctx(arm_r9); + unsigned long int __ctx(arm_r10); + unsigned long int __ctx(arm_fp); + unsigned long int __ctx(arm_ip); + unsigned long int __ctx(arm_sp); + unsigned long int __ctx(arm_lr); + unsigned long int __ctx(arm_pc); + unsigned long int __ctx(arm_cpsr); + unsigned long int __ctx(fault_address); + } mcontext_t; /* Userlevel context. */ typedef struct ucontext_t @@ -111,4 +139,6 @@ typedef struct ucontext_t unsigned long uc_regspace[128] __attribute__((__aligned__(8))); } ucontext_t; +#undef __ctx + #endif /* sys/ucontext.h */ diff --git a/sysdeps/unix/sysv/linux/hppa/sys/ucontext.h b/sysdeps/unix/sysv/linux/hppa/sys/ucontext.h index 2fd7e91..d463368 100644 --- a/sysdeps/unix/sysv/linux/hppa/sys/ucontext.h +++ b/sysdeps/unix/sysv/linux/hppa/sys/ucontext.h @@ -23,11 +23,16 @@ #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 + +#ifdef __USE_MISC /* Type for general register. */ typedef unsigned long int greg_t; @@ -52,7 +57,15 @@ typedef struct fpregset #endif /* Context to describe whole processor state. */ -typedef struct sigcontext mcontext_t; +typedef struct + { + unsigned long int __ctx(sc_flags); + unsigned long int __ctx(sc_gr)[32]; + unsigned long long int __ctx(sc_fr)[32]; + unsigned long int __ctx(sc_iasq)[2]; + unsigned long int __ctx(sc_iaoq)[2]; + unsigned long int __ctx(sc_sar); + } mcontext_t; /* Userlevel context. */ typedef struct ucontext_t @@ -64,4 +77,6 @@ typedef struct ucontext_t sigset_t uc_sigmask; } ucontext_t; +#undef __ctx + #endif /* sys/ucontext.h */ diff --git a/sysdeps/unix/sysv/linux/ia64/makecontext.c b/sysdeps/unix/sysv/linux/ia64/makecontext.c index 299f9a8..cb98e7c 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 943e68a..ac3e3c8 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 afe54fb..4847f2d 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 c77e6dc..c718f87 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 9cd686c..8929e09 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 */ diff --git a/sysdeps/unix/sysv/linux/m68k/sys/ucontext.h b/sysdeps/unix/sysv/linux/m68k/sys/ucontext.h index 1f807b5..7a92ab3 100644 --- a/sysdeps/unix/sysv/linux/m68k/sys/ucontext.h +++ b/sysdeps/unix/sysv/linux/m68k/sys/ucontext.h @@ -23,7 +23,6 @@ #include <features.h> #include <bits/types/sigset_t.h> -#include <bits/sigcontext.h> #include <bits/types/stack_t.h> diff --git a/sysdeps/unix/sysv/linux/microblaze/sys/ucontext.h b/sysdeps/unix/sysv/linux/microblaze/sys/ucontext.h new file mode 100644 index 0000000..ea87330 --- /dev/null +++ b/sysdeps/unix/sysv/linux/microblaze/sys/ucontext.h @@ -0,0 +1,92 @@ +/* Data structures for user-level context switching. MicroBlaze version. + Copyright (C) 1997-2017 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/>. */ + +#ifndef _SYS_UCONTEXT_H +#define _SYS_UCONTEXT_H 1 + +#include <features.h> + +#include <bits/types/sigset_t.h> +#include <bits/types/stack_t.h> + + +#ifdef __USE_MISC +# define __ctx(fld) fld +#else +# define __ctx(fld) __ ## fld +#endif + +typedef struct + { + struct + { + unsigned long int __ctx(r0); + unsigned long int __ctx(r1); + unsigned long int __ctx(r2); + unsigned long int __ctx(r3); + unsigned long int __ctx(r4); + unsigned long int __ctx(r5); + unsigned long int __ctx(r6); + unsigned long int __ctx(r7); + unsigned long int __ctx(r8); + unsigned long int __ctx(r9); + unsigned long int __ctx(r10); + unsigned long int __ctx(r11); + unsigned long int __ctx(r12); + unsigned long int __ctx(r13); + unsigned long int __ctx(r14); + unsigned long int __ctx(r15); + unsigned long int __ctx(r16); + unsigned long int __ctx(r17); + unsigned long int __ctx(r18); + unsigned long int __ctx(r19); + unsigned long int __ctx(r20); + unsigned long int __ctx(r21); + unsigned long int __ctx(r22); + unsigned long int __ctx(r23); + unsigned long int __ctx(r24); + unsigned long int __ctx(r25); + unsigned long int __ctx(r26); + unsigned long int __ctx(r27); + unsigned long int __ctx(r28); + unsigned long int __ctx(r29); + unsigned long int __ctx(r30); + unsigned long int __ctx(r31); + unsigned long int __ctx(pc); + unsigned long int __ctx(msr); + unsigned long int __ctx(ear); + unsigned long int __ctx(esr); + unsigned long int __ctx(fsr); + int __ctx(pt_mode); + } __ctx(regs); + unsigned long int __ctx(oldmask); + } mcontext_t; + +/* Userlevel context. */ +typedef struct ucontext_t + { + unsigned long int uc_flags; + struct ucontext_t *uc_link; + stack_t uc_stack; + mcontext_t uc_mcontext; + sigset_t uc_sigmask; + } ucontext_t; + +#undef __ctx + +#endif /* sys/ucontext.h */ diff --git a/sysdeps/unix/sysv/linux/mips/sys/ucontext.h b/sysdeps/unix/sysv/linux/mips/sys/ucontext.h index d17aa71..dac5751 100644 --- a/sysdeps/unix/sysv/linux/mips/sys/ucontext.h +++ b/sysdeps/unix/sysv/linux/mips/sys/ucontext.h @@ -22,7 +22,6 @@ #include <features.h> #include <bits/types/sigset_t.h> -#include <bits/sigcontext.h> #include <bits/types/stack_t.h> #include <sgidefs.h> diff --git a/sysdeps/unix/sysv/linux/nios2/sys/ucontext.h b/sysdeps/unix/sysv/linux/nios2/sys/ucontext.h index 09e473c..5ddae7f 100644 --- a/sysdeps/unix/sysv/linux/nios2/sys/ucontext.h +++ b/sysdeps/unix/sysv/linux/nios2/sys/ucontext.h @@ -24,7 +24,6 @@ #include <features.h> #include <bits/types/sigset_t.h> -#include <bits/sigcontext.h> #include <bits/types/stack_t.h> diff --git a/sysdeps/unix/sysv/linux/powerpc/sys/ucontext.h b/sysdeps/unix/sysv/linux/powerpc/sys/ucontext.h index 54fe9df..26b032c 100644 --- a/sysdeps/unix/sysv/linux/powerpc/sys/ucontext.h +++ b/sysdeps/unix/sysv/linux/powerpc/sys/ucontext.h @@ -20,7 +20,6 @@ #include <features.h> -#include <bits/sigcontext.h> #include <bits/types/sigset_t.h> #include <bits/types/stack_t.h> diff --git a/sysdeps/unix/sysv/linux/s390/sys/ucontext.h b/sysdeps/unix/sysv/linux/s390/sys/ucontext.h index d6bf4d8..368ea9d 100644 --- a/sysdeps/unix/sysv/linux/s390/sys/ucontext.h +++ b/sysdeps/unix/sysv/linux/s390/sys/ucontext.h @@ -22,7 +22,6 @@ #include <features.h> #include <bits/types/sigset_t.h> -#include <bits/sigcontext.h> #include <bits/types/stack_t.h> diff --git a/sysdeps/unix/sysv/linux/sh/sys/ucontext.h b/sysdeps/unix/sysv/linux/sh/sys/ucontext.h index 2f42d3a..53691b5 100644 --- a/sysdeps/unix/sysv/linux/sh/sys/ucontext.h +++ b/sysdeps/unix/sysv/linux/sh/sys/ucontext.h @@ -23,7 +23,6 @@ #include <features.h> #include <bits/types/sigset_t.h> -#include <bits/sigcontext.h> #include <bits/types/stack_t.h> diff --git a/sysdeps/unix/sysv/linux/sparc/sys/ucontext.h b/sysdeps/unix/sysv/linux/sparc/sys/ucontext.h index 9932ed4..126d844 100644 --- a/sysdeps/unix/sysv/linux/sparc/sys/ucontext.h +++ b/sysdeps/unix/sysv/linux/sparc/sys/ucontext.h @@ -21,7 +21,6 @@ #include <features.h> #include <bits/types/sigset_t.h> -#include <bits/sigcontext.h> #include <bits/types/stack_t.h> #include <bits/wordsize.h> diff --git a/sysdeps/unix/sysv/linux/tile/sys/ucontext.h b/sysdeps/unix/sysv/linux/tile/sys/ucontext.h index fcbe3ff..aac020c 100644 --- a/sysdeps/unix/sysv/linux/tile/sys/ucontext.h +++ b/sysdeps/unix/sysv/linux/tile/sys/ucontext.h @@ -22,10 +22,15 @@ #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 + +#ifdef __USE_MISC /* Get register type and register names. */ # include <arch/abi.h> @@ -56,8 +61,28 @@ enum }; #endif +#define __need_int_reg_t +#include <arch/abi.h> + /* A machine context is exactly a sigcontext. */ -typedef struct sigcontext mcontext_t; +typedef struct + { + __extension__ union + { + __uint_reg_t __ctx(gregs)[56]; + __extension__ struct + { + __uint_reg_t __ctx(__gregs)[53]; + __uint_reg_t __ctx(tp); + __uint_reg_t __ctx(sp); + __uint_reg_t __ctx(lr); + }; + }; + __uint_reg_t __ctx(pc); + __uint_reg_t __ctx(ics); + __uint_reg_t __ctx(faultnum); + __uint_reg_t __glibc_reserved1[5]; + } mcontext_t; /* Userlevel context. */ typedef struct ucontext_t @@ -69,4 +94,6 @@ typedef struct ucontext_t sigset_t uc_sigmask; } ucontext_t; +#undef __ctx + #endif /* sys/ucontext.h */ diff --git a/sysdeps/unix/sysv/linux/x86/sys/ucontext.h b/sysdeps/unix/sysv/linux/x86/sys/ucontext.h index f4f5c94..5d8050a 100644 --- a/sysdeps/unix/sysv/linux/x86/sys/ucontext.h +++ b/sysdeps/unix/sysv/linux/x86/sys/ucontext.h @@ -20,8 +20,8 @@ #include <features.h> +#include <bits/types.h> #include <bits/types/sigset_t.h> -#include <bits/sigcontext.h> #include <bits/types/stack_t.h>