!
! 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
