blob: 75a6a68a0a5c1d814abd1d955d90b119c08b5fdd [file] [log] [blame]
!
! setjmp.S
!
! Basic setjmp/longjmp
!
! This code was based on the equivalent code in NetBSD
!
!
! The jmp_buf contains the following entries:
! sp
! fp
! pc
!
.text
.align 4
.global setjmp
.type setjmp, @function
setjmp:
stx %sp,[%o0+0] ! Callers stack pointer
stx %o7,[%o0+8] ! Return pc
stx %fp,[%o0+16] ! Frame pointer
retl ! Return
clr %o0 ! ...0
.size setjmp,.-setjmp
.globl longjmp
.type longjmp, @function
longjmp:
mov %o1, %g4 ! save return value
mov %o0, %g1 ! save target
ldx [%g1+16],%g5 ! get callers frame
1:
cmp %fp, %g5 ! compare against desired frame
bl,a 1b ! if below...
restore ! pop frame and loop
be,a 2f ! if there...
ldx [%g1+0],%o2 ! fetch return %sp
.Lbotch:
unimp 0 ! ... error ...
2:
cmp %o2, %sp ! %sp must not decrease
bl .Lbotch
nop
mov %o2, %sp ! it is OK, put it in place
ldx [%g1+8],%o3 ! fetch %pc
jmp %o3 + 8 ! if sucess...
mov %g4,%o0 ! return %g4
.size longjmp,.-longjmp