i386: simplify sigreturn decoding
* signal.c (sys_sigreturn) [X86_64 || X32 || I386]: Do not define
i386_sigcontext_struct and i386_fpstate structures.
diff --git a/signal.c b/signal.c
index e9ce465..34b2946 100644
--- a/signal.c
+++ b/signal.c
@@ -740,66 +740,24 @@
return 0;
}
# endif
- struct i386_sigcontext_struct {
- uint16_t gs, __gsh;
- uint16_t fs, __fsh;
- uint16_t es, __esh;
- uint16_t ds, __dsh;
- uint32_t edi;
- uint32_t esi;
- uint32_t ebp;
- uint32_t esp;
- uint32_t ebx;
- uint32_t edx;
- uint32_t ecx;
- uint32_t eax;
- uint32_t trapno;
- uint32_t err;
- uint32_t eip;
- uint16_t cs, __csh;
- uint32_t eflags;
- uint32_t esp_at_signal;
- uint16_t ss, __ssh;
- uint32_t i387;
- uint32_t oldmask;
- uint32_t cr2;
- };
- struct i386_fpstate {
- uint32_t cw;
- uint32_t sw;
- uint32_t tag;
- uint32_t ipoff;
- uint32_t cssel;
- uint32_t dataoff;
- uint32_t datasel;
- uint8_t st[8][10]; /* 8*10 bytes: FP regs */
- uint16_t status;
- uint16_t magic;
- uint32_t fxsr_env[6];
- uint32_t mxcsr;
- uint32_t reserved;
- uint8_t stx[8][16]; /* 8*16 bytes: FP regs, each padded to 16 bytes */
- uint8_t xmm[8][16]; /* 8 XMM regs */
- uint32_t padding1[44];
- uint32_t padding2[12]; /* union with struct _fpx_sw_bytes */
- };
- struct {
- struct i386_sigcontext_struct sc;
- struct i386_fpstate fp;
- uint32_t extramask[1];
- } signal_stack;
- /* On i386, sc is followed on stack by struct fpstate
- * and after it an additional u32 extramask[1] which holds
+ /*
+ * On i386, sigcontext is followed on stack by struct fpstate
+ * and after it an additional u32 extramask which holds
* upper half of the mask.
*/
+ struct {
+ uint32_t struct_sigcontext_padding1[20];
+ uint32_t oldmask;
+ uint32_t struct_sigcontext_padding2;
+ uint32_t struct_fpstate_padding[156];
+ uint32_t extramask;
+ } frame;
tprints("{mask=");
- if (umove(tcp, *i386_esp_ptr, &signal_stack) < 0) {
+ if (umove(tcp, *i386_esp_ptr, &frame) < 0) {
tprintf("%#lx", (unsigned long) *i386_esp_ptr);
} else {
- uint32_t sigmask[2];
- sigmask[0] = signal_stack.sc.oldmask;
- sigmask[1] = signal_stack.extramask[0];
- tprintsigmask_addr("", sigmask);
+ uint32_t mask[2] = { frame.oldmask, frame.extramask };
+ tprintsigmask_addr("", mask);
}
tprints("}");
}