mirror of
https://github.com/autc04/Retro68.git
synced 2024-11-28 05:51:04 +00:00
78 lines
1.6 KiB
ArmAsm
78 lines
1.6 KiB
ArmAsm
! 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__ */
|