fastjmp_x86.asm (3546B)
1 ; SPDX-FileCopyrightText: 2021 Connor McLaughlin <stenzek@gmail.com> 2 ; SPDX-License-Identifier: (GPL-3.0 OR CC-BY-NC-ND-4.0) 3 4 IFDEF _M_X86_32 5 6 ; ----------------------------------------- 7 ; 32-bit X86 8 ; ----------------------------------------- 9 .386 10 .model flat 11 12 _TEXT SEGMENT 13 14 PUBLIC @fastjmp_set@4 15 PUBLIC @fastjmp_jmp@8 16 17 ; void fastjmp_set(fastjmp_buf*) 18 @fastjmp_set@4 PROC 19 mov eax, dword ptr [esp] 20 mov edx, esp ; fixup stack pointer, so it doesn't include the call to fastjmp_set 21 add edx, 4 22 mov dword ptr [ecx], eax ; actually eip 23 mov dword ptr [ecx + 4], ebx 24 mov dword ptr [ecx + 8], edx ; actually esp 25 mov dword ptr [ecx + 12], ebp 26 mov dword ptr [ecx + 16], esi 27 mov dword ptr [ecx + 20], edi 28 xor eax, eax 29 ret 30 @fastjmp_set@4 ENDP 31 32 ; void __fastcall fastjmp_jmp(fastjmp_buf*, int) 33 @fastjmp_jmp@8 PROC 34 mov eax, edx ; return code 35 mov edx, dword ptr [ecx + 0] 36 mov ebx, dword ptr [ecx + 4] 37 mov esp, dword ptr [ecx + 8] 38 mov ebp, dword ptr [ecx + 12] 39 mov esi, dword ptr [ecx + 16] 40 mov edi, dword ptr [ecx + 20] 41 jmp edx 42 @fastjmp_jmp@8 ENDP 43 44 _TEXT ENDS 45 46 ENDIF ; _M_X86_32 47 48 IFDEF _M_X86_64 49 50 ; ----------------------------------------- 51 ; 64-bit X86 52 ; ----------------------------------------- 53 _TEXT SEGMENT 54 55 PUBLIC fastjmp_set 56 PUBLIC fastjmp_jmp 57 58 ; void fastjmp_set(fastjmp_buf*) 59 fastjmp_set PROC 60 mov rax, qword ptr [rsp] 61 mov rdx, rsp ; fixup stack pointer, so it doesn't include the call to fastjmp_set 62 add rdx, 8 63 mov qword ptr [rcx], rax ; actually rip 64 mov qword ptr [rcx + 8], rbx 65 mov qword ptr [rcx + 16], rdx ; actually rsp 66 mov qword ptr [rcx + 24], rbp 67 mov qword ptr [rcx + 32], rsi 68 mov qword ptr [rcx + 40], rdi 69 mov qword ptr [rcx + 48], r12 70 mov qword ptr [rcx + 56], r13 71 mov qword ptr [rcx + 64], r14 72 mov qword ptr [rcx + 72], r15 73 movaps xmmword ptr [rcx + 80], xmm6 74 movaps xmmword ptr [rcx + 96], xmm7 75 movaps xmmword ptr [rcx + 112], xmm8 76 add rcx, 112 ; split to two batches to fit displacement in a single byte 77 movaps xmmword ptr [rcx + 16], xmm9 78 movaps xmmword ptr [rcx + 32], xmm10 79 movaps xmmword ptr [rcx + 48], xmm11 80 movaps xmmword ptr [rcx + 64], xmm12 81 movaps xmmword ptr [rcx + 80], xmm13 82 movaps xmmword ptr [rcx + 96], xmm14 83 movaps xmmword ptr [rcx + 112], xmm15 84 xor eax, eax 85 ret 86 fastjmp_set ENDP 87 88 ; void fastjmp_jmp(fastjmp_buf*, int) 89 fastjmp_jmp PROC 90 mov eax, edx ; return code 91 mov rdx, qword ptr [rcx + 0] ; actually rip 92 mov rbx, qword ptr [rcx + 8] 93 mov rsp, qword ptr [rcx + 16] 94 mov rbp, qword ptr [rcx + 24] 95 mov rsi, qword ptr [rcx + 32] 96 mov rdi, qword ptr [rcx + 40] 97 mov r12, qword ptr [rcx + 48] 98 mov r13, qword ptr [rcx + 56] 99 mov r14, qword ptr [rcx + 64] 100 mov r15, qword ptr [rcx + 72] 101 movaps xmm6, xmmword ptr [rcx + 80] 102 movaps xmm7, xmmword ptr [rcx + 96] 103 movaps xmm8, xmmword ptr [rcx + 112] 104 add rcx, 112 ; split to two batches to fit displacement in a single byte 105 movaps xmm9, xmmword ptr [rcx + 16] 106 movaps xmm10, xmmword ptr [rcx + 32] 107 movaps xmm11, xmmword ptr [rcx + 48] 108 movaps xmm12, xmmword ptr [rcx + 64] 109 movaps xmm13, xmmword ptr [rcx + 80] 110 movaps xmm14, xmmword ptr [rcx + 96] 111 movaps xmm15, xmmword ptr [rcx + 112] 112 jmp rdx 113 fastjmp_jmp ENDP 114 115 _TEXT ENDS 116 117 ENDIF ; _M_X86_64 118 119 END