53 lines
802 B
ArmAsm
53 lines
802 B
ArmAsm
|
# setjmp/longjmp for m32r. The jmpbuf looks like this:
|
||
|
#
|
||
|
# Register jmpbuf offset
|
||
|
# reserved 0x00
|
||
|
# R8 0x04
|
||
|
# R9 0x08
|
||
|
# R10 0x0c
|
||
|
# R11 0x10
|
||
|
# R12 0x14
|
||
|
# R13 (FP) 0x18
|
||
|
# R14 (LR) 0x1c
|
||
|
# R15 (SP) 0x20
|
||
|
# reserved 0x24
|
||
|
|
||
|
.text
|
||
|
.global setjmp
|
||
|
setjmp:
|
||
|
;addi r0, #-4 ; commented out as first word is reserved
|
||
|
;st r1, @+r0
|
||
|
st r8, @+r0
|
||
|
st r9, @+r0
|
||
|
st r10, @+r0
|
||
|
st r11, @+r0
|
||
|
st r12, @+r0
|
||
|
st r13, @+r0
|
||
|
st r14, @+r0
|
||
|
st r15, @+r0
|
||
|
|
||
|
# Return 0 to caller.
|
||
|
ldi r0, #0
|
||
|
jmp lr
|
||
|
|
||
|
.global longjmp
|
||
|
longjmp:
|
||
|
addi r0, #4 ; first word is reserved
|
||
|
;ld r1, @r0+
|
||
|
ld r8, @r0+
|
||
|
ld r9, @r0+
|
||
|
ld r10, @r0+
|
||
|
ld r11, @r0+
|
||
|
ld r12, @r0+
|
||
|
ld r13, @r0+
|
||
|
ld r2, @r0+ ; return address
|
||
|
ld r15, @r0+
|
||
|
|
||
|
# If caller attempted to return 0, return 1 instead.
|
||
|
|
||
|
mv r0, r1
|
||
|
bnez r0, .Lnonzero
|
||
|
ldi r0, #1
|
||
|
.Lnonzero:
|
||
|
jmp r2
|