Files
jsix/src/libraries/libc/setjmp/setjmp.s
Justin C. Miller 05c1361283 [libc] Implement setjmp/longjmp
Add a very simple setjmp/longjmp implementation. No destructors or other
cleanup is handled.
2024-08-08 19:31:20 -07:00

77 lines
1.5 KiB
ArmAsm

; This file is part of the C standard library for the jsix operating
; system.
;
; This Source Code Form is subject to the terms of the Mozilla Public
; License, v. 2.0. If a copy of the MPL was not distributed with this
; file, You can obtain one at https://mozilla.org/MPL/2.0/.
struc JMPBUF
.rbx: resq 1
.rsp: resq 1
.rbp: resq 1
.r12: resq 1
.r13: resq 1
.r14: resq 1
.r15: resq 1
.retaddr: resq 1
.mxcsr: resd 1
.fcw: resw 1
endstruc
global setjmp: function (setjmp.end - setjmp)
setjmp:
push rbp
mov rbp, rsp
mov rax, [rsp + 8]
mov [rdi + JMPBUF.retaddr], rax
mov [rdi + JMPBUF.rbx], rbx
mov [rdi + JMPBUF.rsp], rsp
mov [rdi + JMPBUF.rbp], rbp
mov [rdi + JMPBUF.r12], r12
mov [rdi + JMPBUF.r13], r13
mov [rdi + JMPBUF.r14], r14
mov [rdi + JMPBUF.r15], r15
stmxcsr [rdi + JMPBUF.mxcsr]
fnstcw [rdi + JMPBUF.fcw]
mov rax, 0 ; actual setjmp returns 0
pop rbp
ret
.end:
global longjmp: function (longjmp.end - longjmp)
longjmp:
push rbp
mov rbp, rsp
mov rbx, [rdi + JMPBUF.rbx]
mov rbp, [rdi + JMPBUF.rbp]
mov r12, [rdi + JMPBUF.r12]
mov r13, [rdi + JMPBUF.r13]
mov r14, [rdi + JMPBUF.r14]
mov r15, [rdi + JMPBUF.r15]
ldmxcsr [rdi + JMPBUF.mxcsr]
fnclex
fldcw [rdi + JMPBUF.fcw]
mov rsp, [rdi + JMPBUF.rsp]
mov rax, rsi
cmp rax, 0
jne .done
mov rax, 1
.done:
pop rbp
ret
.end: