support the ugly and deprecated ucontext and sigcontext header stuff...
authorRich Felker <dalias@aerifal.cx>
Sat, 19 Feb 2011 03:03:03 +0000 (22:03 -0500)
committerRich Felker <dalias@aerifal.cx>
Sat, 19 Feb 2011 03:03:03 +0000 (22:03 -0500)
only the structures, not the functions from ucontext.h, are supported
at this point. the main goal of this commit is to make modern gcc with
dwarf2 unwinding build without errors.

honestly, it probably doesn't matter how we define these as long as
they have members with the right names to prevent errors while
compiling libgcc. the only time they will be used is for propagating
exceptions across signal-handler boundaries, which invokes undefined
behavior anyway. but as-is, they're probably correct and may be useful
to various low-level applications dealing with virtualization, jit
code generation, and so on...

arch/i386/bits/signal.h
arch/x86_64/bits/signal.h
include/ucontext.h

index 8827efda082c6cb48bf02ec0e61a0cd75435ef49..60a0bb5b3504fd1841c4e66dd2b1374cef4741e0 100644 (file)
@@ -1,6 +1,40 @@
 #if defined(_POSIX_SOURCE) || defined(_POSIX_C_SOURCE) \
  || defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE)
 
+struct __fpstate {
+       unsigned long __x[7];
+       unsigned char __y[80];
+       unsigned long __z;
+};
+
+typedef struct {
+       unsigned long __gregs[19];
+       void *__fpregs;
+       unsigned long __oldmask, __cr2;
+} mcontext_t;
+
+typedef struct __ucontext {
+       unsigned long uc_flags;
+       struct __ucontext *uc_link;
+       stack_t uc_stack;
+       mcontext_t uc_mcontext;
+       sigset_t uc_sigmask;
+       struct __fpstate __fpregs_mem;
+} ucontext_t;
+
+#ifdef _GNU_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
+
 struct __siginfo
 {
        int si_signo;
index 64ece19b946a8e5b37423ca0d356a231c9bbbfd5..73b0128404fa9de7c5a6b4baf19e2d0b9b78c4e3 100644 (file)
@@ -1,6 +1,38 @@
 #if defined(_POSIX_SOURCE) || defined(_POSIX_C_SOURCE) \
  || defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE)
 
+struct __fpstate {
+       unsigned long __x[4];
+       unsigned char __y[384];
+       unsigned long __z[12];
+};
+
+typedef struct {
+       unsigned long __gregs[23];
+       void *__fpregs;
+       unsigned long __reserved1[8];
+} mcontext_t;
+
+typedef struct __ucontext {
+       unsigned long uc_flags;
+       struct __ucontext *uc_link;
+       stack_t uc_stack;
+       mcontext_t uc_mcontext;
+       sigset_t uc_sigmask;
+       struct __fpstate __fpregs_mem;
+} ucontext_t;
+
+#ifdef _GNU_SOURCE
+struct sigcontext {
+       unsigned long r8, r9, r10, r11, r12, r13, r14, r15;
+       unsigned long rdi, rsi, rbp, rbx, rdx, rax, rcx, rsp, rip, eflags;
+       unsigned short cs, gs, fs, __pad0;
+       unsigned long err, trapno, oldmask, cr2;
+       struct __fpstate *fpstate;
+       unsigned long __reserved1[8];
+};
+#endif
+
 struct __siginfo
 {
        int si_signo;
index 96c27cb7acf6b78ab8bad16b0229bc7d9ab68d43..cd6d223ec115578f80d2e6fb4aa27b9b53938b0d 100644 (file)
@@ -6,26 +6,9 @@ extern "C" {
 
 #include <signal.h>
 
-struct __fpstate {
-       unsigned long __x[7];
-       unsigned char __y[80];
-       unsigned long __z;
-};
-
-typedef struct {
-       unsigned long __gregs[19];
-       void *__fpregs;
-       unsigned long __oldmask, __cr2;
-} mcontext_t;
-
-typedef struct ucontext {
-       unsigned long uc_flags;
-       struct ucontext *uc_link;
-       stack_t uc_stack;
-       mcontext_t uc_mcontext;
-       sigset_t uc_sigmask;
-       struct __fpstate __fpregs_mem;
-} ucontext_t;
+#ifdef _GNU_SOURCE
+#define ucontext __ucontext
+#endif
 
 int  getcontext(ucontext_t *);
 void makecontext(ucontext_t *, void (*)(void), int, ...);