57 lines
1.1 KiB
ArmAsm
57 lines
1.1 KiB
ArmAsm
/*
|
|
* setjmp.S
|
|
* setjmp/longjmp for x86_64 MontaukOS
|
|
* Copyright (c) 2026 Daniel Hammer
|
|
*
|
|
* jmp_buf layout (8 x uint64_t):
|
|
* [0] = rbx
|
|
* [1] = rbp
|
|
* [2] = r12
|
|
* [3] = r13
|
|
* [4] = r14
|
|
* [5] = r15
|
|
* [6] = rsp (after return from setjmp)
|
|
* [7] = rip (return address)
|
|
*/
|
|
|
|
.text
|
|
|
|
.global setjmp
|
|
.type setjmp, @function
|
|
setjmp:
|
|
/* rdi = jmp_buf */
|
|
mov %rbx, (%rdi)
|
|
mov %rbp, 8(%rdi)
|
|
mov %r12, 16(%rdi)
|
|
mov %r13, 24(%rdi)
|
|
mov %r14, 32(%rdi)
|
|
mov %r15, 40(%rdi)
|
|
/* rsp as it will be after we return (pop return address) */
|
|
lea 8(%rsp), %rax
|
|
mov %rax, 48(%rdi)
|
|
/* return address */
|
|
mov (%rsp), %rax
|
|
mov %rax, 56(%rdi)
|
|
/* return 0 */
|
|
xor %eax, %eax
|
|
ret
|
|
|
|
.global longjmp
|
|
.type longjmp, @function
|
|
longjmp:
|
|
/* rdi = jmp_buf, esi = val */
|
|
mov %esi, %eax
|
|
/* longjmp(buf, 0) must return 1 */
|
|
test %eax, %eax
|
|
jnz 1f
|
|
inc %eax
|
|
1:
|
|
mov (%rdi), %rbx
|
|
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)
|