about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--arch/i386/bits/signal.h34
-rw-r--r--arch/x86_64/bits/signal.h32
-rw-r--r--include/ucontext.h23
3 files changed, 69 insertions, 20 deletions
diff --git a/arch/i386/bits/signal.h b/arch/i386/bits/signal.h
index 8827efda..60a0bb5b 100644
--- a/arch/i386/bits/signal.h
+++ b/arch/i386/bits/signal.h
@@ -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;
diff --git a/arch/x86_64/bits/signal.h b/arch/x86_64/bits/signal.h
index 64ece19b..73b01284 100644
--- a/arch/x86_64/bits/signal.h
+++ b/arch/x86_64/bits/signal.h
@@ -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;
diff --git a/include/ucontext.h b/include/ucontext.h
index 96c27cb7..cd6d223e 100644
--- a/include/ucontext.h
+++ b/include/ucontext.h
@@ -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, ...);