47 lines
793 B
ArmAsm
47 lines
793 B
ArmAsm
.global setjmp
|
|
.global longjmp
|
|
|
|
.global _setjmp
|
|
.global _longjmp
|
|
|
|
.section .text
|
|
// args:
|
|
// %rdi -- __jmp_buf *env
|
|
setjmp:
|
|
_setjmp:
|
|
movq %rbx, 0(%rdi)
|
|
movq %rbp, 8(%rdi)
|
|
movq %r12, 16(%rdi)
|
|
movq %r13, 24(%rdi)
|
|
movq %r14, 32(%rdi)
|
|
movq %r15, 40(%rdi)
|
|
// Calculate return stack and rip
|
|
leaq 8(%rsp), %rax
|
|
movq %rax, 48(%rdi)
|
|
movq (%rsp), %rax
|
|
movq %rax, 56(%rdi)
|
|
|
|
movq $0, %rax
|
|
ret
|
|
|
|
// args:
|
|
// %rdi -- __jmp_buf *env
|
|
// %rsi -- int val
|
|
longjmp:
|
|
_longjmp:
|
|
// Restore registers
|
|
movq 0(%rdi), %rbx
|
|
movq 8(%rdi), %rbp
|
|
movq 16(%rdi), %r12
|
|
movq 24(%rdi), %r13
|
|
movq 32(%rdi), %r14
|
|
movq 40(%rdi), %r15
|
|
movq 48(%rdi), %rsp
|
|
movq 56(%rdi), %rax
|
|
pushq %rax
|
|
|
|
// Setup return value
|
|
movq %rsi, %rax
|
|
|
|
ret
|