summaryrefslogtreecommitdiffstats
path: root/lib/libc/amd64/gen/setjmp.S
diff options
context:
space:
mode:
Diffstat (limited to 'lib/libc/amd64/gen/setjmp.S')
-rw-r--r--lib/libc/amd64/gen/setjmp.S30
1 files changed, 18 insertions, 12 deletions
diff --git a/lib/libc/amd64/gen/setjmp.S b/lib/libc/amd64/gen/setjmp.S
index 0dfdde9..e70879a 100644
--- a/lib/libc/amd64/gen/setjmp.S
+++ b/lib/libc/amd64/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
OpenPOWER on IntegriCloud