diff options
Diffstat (limited to 'lib/libc/i386/gen/setjmp.S')
-rw-r--r-- | lib/libc/i386/gen/setjmp.S | 30 |
1 files changed, 18 insertions, 12 deletions
diff --git a/lib/libc/i386/gen/setjmp.S b/lib/libc/i386/gen/setjmp.S index 0dfdde9..e70879a 100644 --- a/lib/libc/i386/gen/setjmp.S +++ b/lib/libc/i386/gen/setjmp.S @@ -56,15 +56,19 @@ ENTRY(setjmp) PIC_PROLOGUE - pushl $0 + movl 4(%esp),%ecx + leal 28(%ecx), %eax + pushl %eax /* (sigset_t*)oset */ + pushl $0 /* (sigset_t*)set */ + pushl $1 /* SIG_BLOCK */ #ifdef _THREAD_SAFE - call PIC_PLT(CNAME(_thread_sys_sigblock)) + call PIC_PLT(CNAME(_thread_sys_sigprocmask)) #else - call PIC_PLT(CNAME(sigblock)) + call PIC_PLT(CNAME(sigprocmask)) #endif - popl %edx + addl $12,%esp PIC_EPILOGUE - movl 4(%esp),%ecx + movl 4(%esp),%ecx movl 0(%esp),%edx movl %edx, 0(%ecx) movl %ebx, 4(%ecx) @@ -72,21 +76,23 @@ ENTRY(setjmp) movl %ebp,12(%ecx) movl %esi,16(%ecx) movl %edi,20(%ecx) - movl %eax,24(%ecx) - fnstcw 28(%ecx) + fnstcw 24(%ecx) xorl %eax,%eax ret ENTRY(longjmp) movl 4(%esp),%edx PIC_PROLOGUE - pushl 24(%edx) + pushl $0 /* (sigset_t*)oset */ + leal 28(%edx), %eax + pushl %eax /* (sigset_t*)set */ + pushl $3 /* SIG_SETMASK */ #ifdef _THREAD_SAFE - call PIC_PLT(CNAME(_thread_sys_sigsetmask)) + call PIC_PLT(CNAME(_thread_sys_sigprocmask)) #else - call PIC_PLT(CNAME(sigsetmask)) /* XXX this is not reentrant */ + call PIC_PLT(CNAME(sigprocmask)) #endif - popl %eax + addl $12,%esp PIC_EPILOGUE movl 4(%esp),%edx movl 8(%esp),%eax @@ -97,7 +103,7 @@ ENTRY(longjmp) movl 16(%edx),%esi movl 20(%edx),%edi fninit - fldcw 28(%edx) + fldcw 24(%edx) testl %eax,%eax jnz 1f incl %eax |