31 lines
808 B
ArmAsm
31 lines
808 B
ArmAsm
.global psetjmp
|
|
.type psetjmp,@function
|
|
psetjmp:
|
|
mov %rbx,(%rdi) /* rdi is jmp_buf, move registers onto it */
|
|
mov %rbp,8(%rdi)
|
|
mov %r12,16(%rdi)
|
|
mov %r13,24(%rdi)
|
|
mov %r14,32(%rdi)
|
|
mov %r15,40(%rdi)
|
|
lea 8(%rsp),%rdx /* this is our rsp WITHOUT current ret addr */
|
|
mov %rdx,48(%rdi)
|
|
mov (%rsp),%rdx /* save return addr ptr for new rip */
|
|
mov %rdx,56(%rdi)
|
|
xor %eax,%eax /* always return 0 */
|
|
ret
|
|
|
|
.global plongjmp
|
|
.type plongjmp,@function
|
|
plongjmp:
|
|
xor %eax,%eax
|
|
cmp $1,%esi /* CF = val ? 0 : 1 */
|
|
adc %esi,%eax /* eax = val + !val */
|
|
mov (%rdi),%rbx /* rdi is the jmp_buf, restore regs from it */
|
|
mov 8(%rdi),%rbp
|
|
mov 16(%rdi),%r12
|
|
mov 24(%rdi),%r13
|
|
mov 32(%rdi),%r14
|
|
mov 40(%rdi),%r15
|
|
mov 48(%rdi),%rsp
|
|
jmp *56(%rdi)
|