diff options
Diffstat (limited to 'newlib/libc/sys/sparc64/sigsetjmp.S')
-rw-r--r-- | newlib/libc/sys/sparc64/sigsetjmp.S | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/newlib/libc/sys/sparc64/sigsetjmp.S b/newlib/libc/sys/sparc64/sigsetjmp.S new file mode 100644 index 0000000..7751e5f --- /dev/null +++ b/newlib/libc/sys/sparc64/sigsetjmp.S @@ -0,0 +1,77 @@ +! This file is called sigsetjmp.s because that is what V8 uses. +! We do not define sigsetjmp() or setlongjmp() yet. +! Solaris has setjmp/longjmp in setjmp.o. Move this stuff there. + +#include <sys/syscallasm.h> + + TEXT_SECTION + ALIGN (4) + +#ifdef __svr4__ + + GLOBAL (ASM_SYMBOL (setjmp)) + .proc 04 +ASM_SYMBOL (setjmp): + + clr [%o0] + stx %sp,[%o0+8] + add %o7,8,%g1 + stx %g1,[%o0+16] + retl + mov %g0,%o0 + + GLOBAL (ASM_SYMBOL (longjmp)) + .proc 04 +ASM_SYMBOL (longjmp): + + flushw ! flush register windows + sub %sp,136,%sp + ldx [%o0+8],%fp + ldx [%o0+16],%g1 + tst %o1 + bne L0 + sub %g1,8,%o7 + mov 1,%o1 +L0: + retl + restore %o1,0,%o0 + +#else + + GLOBAL (ASM_SYMBOL (setjmp)) + .proc 04 +ASM_SYMBOL (setjmp): + save %sp,-136,%sp + or %g0,%g0,%o0 ! %o0 = 0 + or %g0,0x6d,%g1 ! %g1 = 0x6d (syscall number) + ta SYSCALL_TRAP + stw %o0,[%i0+4] ! save result at [%i0+4] (sigmask?) + add %fp,-8,%o1 ! %o1 -> tmp 8 byte buffer + or %g0,%g0,%o0 ! %o0 = 0 + or %g0,0x70,%g1 ! %g1 = 0x70 (syscall number) + ta SYSCALL_TRAP + lduw [%fp-4],%g1 ! %g1 = onsstack? + stw %fp,[%i0+8] ! save %fp at [%i0+8] + stw %g1,[%i0+0] ! save ? at [%i0+8] + add %i7,8,%g1 ! %g1 = return address + stw %g1,[%i0+12] ! save return address at [%i0+12] + add %g1,4,%g1 ! %g1 = nPC + stw %g1,[%i0+16] ! save nPC at [%i0+16] + stw %g0,[%i0+20] + stw %g0,[%i0+24] + stw %g0,[%i0+32] + jmpl %i7+8,%g0 + restore %g0,0,%o0 + + GLOBAL (ASM_SYMBOL (longjmp)) + .proc 04 +ASM_SYMBOL (longjmp): + orcc %g0,%o1,%g0 ! return val == 0 ? + be,a L1 ! branch if 0 + or %g0,1,%o1 ! make it 1 (executed if branch taken) +L1: + or %g0,0x8b,%g1 ! set syscall 0x8b + stw %o1,[%o0+28] ! save return val for restoration + ta SYSCALL_TRAP + +#endif /* ! __svr4__ */ |