# # From: Bodo Stroesser # # It's wrong to pop a fixed number of words from stack before # calling sigreturn, as the number depends on what code is generated # by the compiler for the start of stub_segv_handler(). # What we need is esp containing the address of sigcontext. So we # explicitly load that pointer into esp. # # Signed-off-by: Bodo Stroesser Index: linux-2.6.12-rc4/arch/um/sys-i386/stub_segv.c =================================================================== --- linux-2.6.12-rc4.orig/arch/um/sys-i386/stub_segv.c 2005-07-14 13:15:53.364847980 +0200 +++ linux-2.6.12-rc4/arch/um/sys-i386/stub_segv.c 2005-07-14 13:36:02.980002269 +0200 @@ -22,10 +22,10 @@ stub_segv_handler(int sig) __asm__("movl %0, %%eax ; int $0x80": : "g" (__NR_getpid)); __asm__("movl %%eax, %%ebx ; movl %0, %%eax ; movl %1, %%ecx ;" "int $0x80": : "g" (__NR_kill), "g" (SIGUSR1)); - /* Pop the frame pointer and return address since we need to leave + /* Load pointer to sigcontext into esp, since we need to leave * the stack in its original form when we do the sigreturn here, by * hand. */ - __asm__("popl %%eax ; popl %%eax ; popl %%eax ; movl %0, %%eax ; " - "int $0x80" : : "g" (__NR_sigreturn)); + __asm__("mov %0,%%esp ; movl %1, %%eax ; " + "int $0x80" : : "a" (sc), "g" (__NR_sigreturn)); }