57 lines
1.2 KiB
ArmAsm
57 lines
1.2 KiB
ArmAsm
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL )
|
|
|
|
.text
|
|
|
|
/* Must match jmp_buf structure layout */
|
|
.struct 0
|
|
env_x19_x20: .quad 0, 0
|
|
env_x21_x22: .quad 0, 0
|
|
env_x23_x24: .quad 0, 0
|
|
env_x25_x26: .quad 0, 0
|
|
env_x27_x28: .quad 0, 0
|
|
env_x29_x30: .quad 0, 0
|
|
env_sp: .quad 0
|
|
.previous
|
|
|
|
/*
|
|
* Save stack context for non-local goto
|
|
*/
|
|
.globl setjmp
|
|
.type setjmp, %function
|
|
setjmp:
|
|
/* Store registers */
|
|
stp x19, x20, [x0, #env_x19_x20]
|
|
stp x21, x22, [x0, #env_x21_x22]
|
|
stp x23, x24, [x0, #env_x23_x24]
|
|
stp x25, x26, [x0, #env_x25_x26]
|
|
stp x27, x28, [x0, #env_x27_x28]
|
|
stp x29, x30, [x0, #env_x29_x30]
|
|
mov x16, sp
|
|
str x16, [x0, #env_sp]
|
|
/* Return 0 when returning as setjmp() */
|
|
mov x0, #0
|
|
ret
|
|
.size setjmp, . - setjmp
|
|
|
|
/*
|
|
* Non-local jump to a saved stack context
|
|
*/
|
|
.globl longjmp
|
|
.type longjmp, %function
|
|
longjmp:
|
|
/* Restore registers */
|
|
ldp x19, x20, [x0, #env_x19_x20]
|
|
ldp x21, x22, [x0, #env_x21_x22]
|
|
ldp x23, x24, [x0, #env_x23_x24]
|
|
ldp x25, x26, [x0, #env_x25_x26]
|
|
ldp x27, x28, [x0, #env_x27_x28]
|
|
ldp x29, x30, [x0, #env_x29_x30]
|
|
ldr x16, [x0, #env_sp]
|
|
mov sp, x16
|
|
/* Force result to non-zero */
|
|
cmp w1, #0
|
|
csinc w0, w1, w1, ne
|
|
/* Return to setjmp() caller */
|
|
br x30
|
|
.size longjmp, . - longjmp
|