summaryrefslogtreecommitdiffstats
path: root/lib/libc/sparc64
diff options
context:
space:
mode:
authorjake <jake@FreeBSD.org>2001-12-29 06:39:53 +0000
committerjake <jake@FreeBSD.org>2001-12-29 06:39:53 +0000
commit3483475ed5ea148d110ee8ea49a6579296ea2ba2 (patch)
treec653f54bb627b8782c1208b78605864ffaa5394c /lib/libc/sparc64
parent56db29dc1a8d78739b3ab72e816aa13a682c0651 (diff)
downloadFreeBSD-src-3483475ed5ea148d110ee8ea49a6579296ea2ba2.zip
FreeBSD-src-3483475ed5ea148d110ee8ea49a6579296ea2ba2.tar.gz
Add .register directives for gcc3.
Adapt to jmpbuf no longer being a ucontext_t. Restore the context "by hand" in longjmp and call sigprocmask, instead of just using sigreturn.
Diffstat (limited to 'lib/libc/sparc64')
-rw-r--r--lib/libc/sparc64/gen/setjmp.S55
1 files changed, 42 insertions, 13 deletions
diff --git a/lib/libc/sparc64/gen/setjmp.S b/lib/libc/sparc64/gen/setjmp.S
index 8b5ae71..c96bc42 100644
--- a/lib/libc/sparc64/gen/setjmp.S
+++ b/lib/libc/sparc64/gen/setjmp.S
@@ -54,6 +54,9 @@
#include "assym.s"
+ .register %g2,#ignore
+ .register %g3,#ignore
+
/*
* C library -- setjmp, longjmp
*
@@ -65,25 +68,51 @@
*/
ENTRY(setjmp)
- save %sp, -CCFSZ, %sp
- stx %i6, [%i0 + UC_MC + MC_O6]
- add %i7, 8, %o0
- stx %o0, [%i0 + UC_MC + MC_TPC]
- add %i7, 12, %o0
- stx %o0, [%i0 + UC_MC + MC_TNPC]
+ save %sp, -CCFSZ, %sp
+ mov SIG_BLOCK, %o0
clr %o1
call CNAME(sigprocmask)
- add %i0, UC_SIGMASK, %o2
- ret
- restore %g0, 0, %o0
+ add %i0, _JB_SIGMASK, %o2
+ restore
+ stx %sp, [%o0 + _JB_SP]
+ stx %o7, [%o0 + _JB_PC]
+ stx %fp, [%o0 + _JB_FP]
+ retl
+ clr %o0
END(setjmp)
.weak CNAME(longjmp)
.set CNAME(longjmp),CNAME(__longjmp)
ENTRY(__longjmp)
- mov 1, %o2
- movrnz %o1, %o1, %o2
- call CNAME(sigreturn)
- stx %o2, [%o0 + UC_MC + MC_O0]
+ save %sp, -CCFSZ, %sp
+ mov SIG_SETMASK, %o0
+ add %i0, _JB_SIGMASK, %o1
+ call CNAME(sigprocmask)
+ clr %o2
+ restore
+ mov 1, %g1
+ movrnz %o1, %o1, %g1
+ mov %o0, %g2
+ ldx [%g2 + _JB_FP], %g3
+1: cmp %fp, %g3
+ bl,a 1b
+ restore
+ be,a 2f
+ ldx [%g2 + _JB_SP], %o0
+
+.Lbotch:
+ call CNAME(longjmperror)
+ nop
+ call CNAME(abort)
+ nop
illtrap
+
+2: cmp %o0, %sp
+ bge,a 3f
+ mov %o0, %sp
+ b,a .Lbotch
+ nop
+3: ldx [%g2 + _JB_PC], %o7
+ retl
+ mov %g1, %o0
END(__longjmp)
OpenPOWER on IntegriCloud