Module: xenomai-forge Branch: master Commit: 6a1c985bea61f7caad5a142b4238780ecdfb001d URL: http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=6a1c985bea61f7caad5a142b4238780ecdfb001d
Author: Philippe Gerum <r...@xenomai.org> Date: Mon Jun 4 08:52:41 2012 +0200 x86: fix mayday support in 32bit+SEP mode The mayday syscall (__xn_sys_mayday) will not return to its caller, but rather to the runaway code originally preempted by the mayday event, once the faulty thread is relaxed. For this reason, we have to fix up the user stack pointer before returning from the mayday syscall handler, to discard the data pushed onto the stack by the sysenter prologue in vDSO to kick __xn_sys_mayday. This bug is only seen on x86_32 when SYSENTER is enabled, because we won't get any data pushed onto the user stack for issuing __xn_sys_mayday in long mode, or whenever a legacy int80 syscall is used. We do the fix up simply by restoring the original ESP before returning from the mayday syscall handler, which will do the right thing when SEP is enabled, or lead to a nop otherwise. --- include/asm-x86/bits/shadow_32.h | 2 ++ include/asm-x86/system_32.h | 1 + 2 files changed, 3 insertions(+), 0 deletions(-) diff --git a/include/asm-x86/bits/shadow_32.h b/include/asm-x86/bits/shadow_32.h index 12a2996..a682f87 100644 --- a/include/asm-x86/bits/shadow_32.h +++ b/include/asm-x86/bits/shadow_32.h @@ -120,6 +120,7 @@ static inline void xnarch_handle_mayday(struct xnarchtcb *tcb, struct pt_regs *regs, unsigned long tramp) { + tcb->mayday.esp = regs->sp; tcb->mayday.eip = regs->ip; tcb->mayday.eax = regs->ax; regs->ip = tramp; @@ -130,6 +131,7 @@ static inline void xnarch_fixup_mayday(struct xnarchtcb *tcb, { regs->ip = tcb->mayday.eip; regs->ax = tcb->mayday.eax; + regs->sp = tcb->mayday.esp; } #endif /* !_XENO_ASM_X86_BITS_SHADOW_32_H */ diff --git a/include/asm-x86/system_32.h b/include/asm-x86/system_32.h index 491fb60..5176d27 100644 --- a/include/asm-x86/system_32.h +++ b/include/asm-x86/system_32.h @@ -51,6 +51,7 @@ typedef struct xnarchtcb { /* Per-thread arch-dependent block */ struct { unsigned long eip; unsigned long eax; + unsigned long esp; } mayday; /* User mode side */ _______________________________________________ Xenomai-git mailing list Xenomai-git@xenomai.org http://www.xenomai.org/mailman/listinfo/xenomai-git