Fix mcontext_t sigcontext namespace (bug 21457)
Commit Message
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).
This patch is relative to a tree with
<https://sourceware.org/ml/libc-alpha/2017-06/msg00498.html> (pending
review) applied (fixed as noted in
<https://sourceware.org/ml/libc-alpha/2017-06/msg00752.html>),
although the dependencies are fairly trivial. The XFAIL removals (11
of the 13 miscellaneous conform/ XFAILs) also depend on
<https://sourceware.org/ml/libc-alpha/2017-06/msg00812.html> and
<https://sourceware.org/ml/libc-alpha/2017-06/msg00875.html> (pending
review) to avoid various architecture-specific failures appearing.
Tested for x86_64, and with build-many-glibcs.py.
2017-06-20 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): New macro.
(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): New macro.
(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): New macro.
(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): New macro.
(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): New macro.
(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/ucontext.h/conform): Remove.
(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.
Comments
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.
@@ -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
@@ -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
@@ -23,7 +23,6 @@
#include <features.h>
#include <bits/types/sigset_t.h>
-#include <bits/sigcontext.h>
#include <bits/types/stack_t.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
@@ -23,7 +23,6 @@
#include <features.h>
#include <bits/types/sigset_t.h>
-#include <bits/sigcontext.h>
#include <bits/types/stack_t.h>
@@ -23,7 +23,6 @@
#include <features.h>
#include <bits/types/sigset_t.h>
-#include <bits/sigcontext.h>
#include <bits/types/stack_t.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>
@@ -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 */
@@ -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)
@@ -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 */
@@ -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)
@@ -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 */
@@ -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 */
@@ -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;
@@ -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)
@@ -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
@@ -21,6 +21,7 @@
#include <features.h>
#include <sys/ucontext.h>
+#include <bits/sigcontext.h>
#include <bits/types.h>
__BEGIN_DECLS
@@ -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 */
@@ -23,7 +23,6 @@
#include <features.h>
#include <bits/types/sigset_t.h>
-#include <bits/sigcontext.h>
#include <bits/types/stack_t.h>
new file mode 100644
@@ -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 */
@@ -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>
@@ -24,7 +24,6 @@
#include <features.h>
#include <bits/types/sigset_t.h>
-#include <bits/sigcontext.h>
#include <bits/types/stack_t.h>
@@ -20,7 +20,6 @@
#include <features.h>
-#include <bits/sigcontext.h>
#include <bits/types/sigset_t.h>
#include <bits/types/stack_t.h>
@@ -22,7 +22,6 @@
#include <features.h>
#include <bits/types/sigset_t.h>
-#include <bits/sigcontext.h>
#include <bits/types/stack_t.h>
@@ -23,7 +23,6 @@
#include <features.h>
#include <bits/types/sigset_t.h>
-#include <bits/sigcontext.h>
#include <bits/types/stack_t.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>
@@ -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 */
@@ -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>