70 lines
1.5 KiB
NASM
Executable file
70 lines
1.5 KiB
NASM
Executable file
; We do not use Microsoft's implementation because its longjmp unwinds
|
|
; the stack to support C++ destructors, and the stack frames generated
|
|
; by Chez Scheme do not have the required information for this to work
|
|
; properly.
|
|
; See https://docs.microsoft.com/en-us/cpp/build/x64-calling-convention
|
|
|
|
.code
|
|
|
|
S_setjmp proc
|
|
; store nonvolatile registers & control words
|
|
mov [rcx], rbx
|
|
mov [rcx+08h], rbp
|
|
mov [rcx+10h], rdi
|
|
mov [rcx+18h], rsi
|
|
mov [rcx+20h], rsp
|
|
mov [rcx+28h], r12
|
|
mov [rcx+30h], r13
|
|
mov [rcx+38h], r14
|
|
mov [rcx+40h], r15
|
|
stmxcsr [rcx+48h]
|
|
fnstcw [rcx+4ch]
|
|
movdqu [rcx+50h], xmm6
|
|
movdqu [rcx+60h], xmm7
|
|
movdqu [rcx+70h], xmm8
|
|
movdqu [rcx+80h], xmm9
|
|
movdqu [rcx+90h], xmm10
|
|
movdqu [rcx+0a0h], xmm11
|
|
movdqu [rcx+0b0h], xmm12
|
|
movdqu [rcx+0c0h], xmm13
|
|
movdqu [rcx+0d0h], xmm14
|
|
movdqu [rcx+0e0h], xmm15
|
|
; store return address
|
|
mov rax, [rsp]
|
|
mov [rcx+0f0h], rax
|
|
xor eax, eax
|
|
ret
|
|
S_setjmp endp
|
|
|
|
S_longjmp proc
|
|
; restore nonvolatile registers & control words
|
|
mov rbx, [rcx]
|
|
mov rbp, [rcx+08h]
|
|
mov rdi, [rcx+10h]
|
|
mov rsi, [rcx+18h]
|
|
mov rsp, [rcx+20h]
|
|
mov r12, [rcx+28h]
|
|
mov r13, [rcx+30h]
|
|
mov r14, [rcx+38h]
|
|
mov r15, [rcx+40h]
|
|
ldmxcsr [rcx+48h]
|
|
fldcw [rcx+4ch]
|
|
movdqu xmm6, [rcx+50h]
|
|
movdqu xmm7, [rcx+60h]
|
|
movdqu xmm8, [rcx+70h]
|
|
movdqu xmm9, [rcx+80h]
|
|
movdqu xmm10, [rcx+90h]
|
|
movdqu xmm11, [rcx+0a0h]
|
|
movdqu xmm12, [rcx+0b0h]
|
|
movdqu xmm13, [rcx+0c0h]
|
|
movdqu xmm14, [rcx+0d0h]
|
|
movdqu xmm15, [rcx+0e0h]
|
|
; restore return address
|
|
mov rax, [rcx+0f0h]
|
|
mov [rsp], rax
|
|
mov rax, rdx
|
|
ret
|
|
S_longjmp endp
|
|
|
|
end
|