From c72fc23843906e2571e817a62c94cee15648b7dc Mon Sep 17 00:00:00 2001 From: Rich Felker Date: Fri, 23 Nov 2012 14:35:25 -0500 Subject: sigcontext/mcontext cleanup for arch-specific bits with these changes, the members/types of mcontext_t and related stuff should closely match the glibc definitions. unlike glibc, however, the definitions here avoid using typedefs as much as possible and work directly with the underlying types, to minimize namespace pollution from signal.h in the default (_BSD_SOURCE) profile. this is a first step in improving compatibility with applications which poke at context/register information -- mainly debuggers, trace utilities, etc. additional definitions in ucontext.h and other headers may be needed later. if feature test macros are used to request a conforming namespace, mcontext_t is replaced with an opaque structure of the equivalent size and alignment; conforming programs cannot examine its contents anyway. --- arch/i386/bits/signal.h | 48 ++++++++++++++++++++++++++---------------------- 1 file changed, 26 insertions(+), 22 deletions(-) (limited to 'arch/i386/bits/signal.h') diff --git a/arch/i386/bits/signal.h b/arch/i386/bits/signal.h index 498dd1cc..3caadea2 100644 --- a/arch/i386/bits/signal.h +++ b/arch/i386/bits/signal.h @@ -1,17 +1,34 @@ #if defined(_POSIX_SOURCE) || defined(_POSIX_C_SOURCE) \ || defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) || defined(_BSD_SOURCE) -struct __fpstate { - unsigned long __x[7]; - unsigned char __y[80]; - unsigned long __z; +#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE) +struct _fpstate { + unsigned long cw, sw, tag, ipoff, cssel, dataoff, datasel; + struct { + unsigned short significand[4], exponent; + } _st[8]; + unsigned long status; }; - +struct sigcontext { + unsigned short gs, __gsh, fs, __fsh, es, __esh, ds, __dsh; + unsigned long edi, esi, ebp, esp, ebx, edx, ecx, eax; + unsigned long trapno, err, eip; + unsigned short cs, __csh; + unsigned long eflags, esp_at_signal; + unsigned short ss, __ssh; + struct _fpstate *fpstate; + unsigned long oldmask, cr2; +}; +typedef struct { + unsigned gregs[19]; + struct _fpstate *fpregs; + unsigned long oldmask, cr2; +} mcontext_t; +#else typedef struct { - unsigned long __gregs[19]; - void *__fpregs; - unsigned long __oldmask, __cr2; + unsigned __space[22]; } mcontext_t; +#endif typedef struct __ucontext { unsigned long uc_flags; @@ -19,7 +36,7 @@ typedef struct __ucontext { stack_t uc_stack; mcontext_t uc_mcontext; sigset_t uc_sigmask; - struct __fpstate __fpregs_mem; + unsigned long __fpregs_mem[28]; } ucontext_t; #define SA_NOCLDSTOP 1 @@ -31,19 +48,6 @@ typedef struct __ucontext { #define SA_RESETHAND 0x80000000 #define SA_RESTORER 0x04000000 -#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE) -struct sigcontext { - unsigned short gs, __gsh, fs, __fsh, es, __esh, ds, __dsh; - unsigned long edi, esi, ebp, esp, ebx, edx, ecx, eax; - unsigned long trapno, err, eip; - unsigned short cs, __csh; - unsigned long eflags, esp_at_signal; - unsigned short ss, __ssh; - struct __fpstate *fpstate; - unsigned long oldmask, cr2; -}; -#endif - #endif #define SIGHUP 1 -- cgit v1.2.1