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__ */
 |