Ticket #7262: boost-mingw.patch
File boost-mingw.patch, 35.0 KB (added by , 10 years ago) |
---|
-
libs/context/build/Jamfile.v2
old new 282 284 ; 283 285 284 286 alias asm_context_sources 287 : asm/make_i386_ms_pe_gas.S 288 asm/jump_i386_ms_pe_gas.S 289 dummy.cpp 290 : <address-model>32 291 <architecture>x86 292 <binary-format>pe 293 <target-os>windows 294 <toolset>gcc 295 ; 296 297 alias asm_context_sources 285 298 : asm/make_i386_ms_pe_masm.asm 286 299 asm/jump_i386_ms_pe_masm.asm 287 300 dummy.cpp … … 379 392 ; 380 393 381 394 alias asm_context_sources 395 : asm/make_x86_64_ms_pe_gas.S 396 asm/jump_x86_64_ms_pe_gas.S 397 dummy.cpp 398 : <address-model>64 399 <architecture>x86 400 <binary-format>pe 401 <target-os>windows 402 <toolset>gcc 403 ; 404 405 alias asm_context_sources 382 406 : asm/make_x86_64_ms_pe_masm.asm 383 407 asm/jump_x86_64_ms_pe_masm.asm 384 408 dummy.cpp -
libs/context/src/asm/make_i386_ms_pe_gas.S
old new 1 /* 2 Copyright Oliver Kowalke 2009. 3 Copyright Thomas Sailer 2013. 4 Distributed under the Boost Software License, Version 1.0. 5 (See accompanying file LICENSE_1_0.txt or copy at 6 http://www.boost.org/LICENSE_1_0.txt) 7 */ 8 9 /******************************************************************** 10 * * 11 * -------------------------------------------------------------- * 12 * | 0 | 1 | 2 | 3 | 4 | 5 | * 13 * -------------------------------------------------------------- * 14 * | 0h | 04h | 08h | 0ch | 010h | 014h | * 15 * -------------------------------------------------------------- * 16 * | EDI | ESI | EBX | EBP | ESP | EIP | * 17 * -------------------------------------------------------------- * 18 * -------------------------------------------------------------- * 19 * | 6 | 7 | 8 | | * 20 * -------------------------------------------------------------- * 21 * | 018h | 01ch | 020h | | * 22 * -------------------------------------------------------------- * 23 * | sp | size | limit | | * 24 * -------------------------------------------------------------- * 25 * -------------------------------------------------------------- * 26 * | 9 | | * 27 * -------------------------------------------------------------- * 28 * | 024h | | * 29 * -------------------------------------------------------------- * 30 * |fc_execpt| | * 31 * -------------------------------------------------------------- * 32 * -------------------------------------------------------------- * 33 * | 10 | | * 34 * -------------------------------------------------------------- * 35 * | 028h | | * 36 * -------------------------------------------------------------- * 37 * |fc_strage| | * 38 * -------------------------------------------------------------- * 39 * -------------------------------------------------------------- * 40 * | 11 | 12 | | * 41 * -------------------------------------------------------------- * 42 * | 02ch | 030h | | * 43 * -------------------------------------------------------------- * 44 * | fc_mxcsr|fc_x87_cw| | * 45 * -------------------------------------------------------------- * 46 * * 47 * *****************************************************************/ 48 49 .file "make_i386_ms_pe_gas.S" 50 .text 51 .p2align 4,,15 52 .globl _make_fcontext 53 .def _make_fcontext; .scl 2; .type 32; .endef 54 _make_fcontext: 55 movl 0x04(%esp), %eax /* load 1. arg of make_fcontext, pointer to context stack (base) */ 56 leal -0x34(%eax),%eax /* reserve space for fcontext_t at top of context stack */ 57 58 /* shift address in EAX to lower 16 byte boundary */ 59 /* == pointer to fcontext_t and address of context stack */ 60 andl $-16, %eax 61 62 movl 0x04(%esp), %ecx /* load 1. arg of make_fcontext, pointer to context stack (base) */ 63 movl %ecx, 0x18(%eax) /* save address of context stack (base) in fcontext_t */ 64 movl 0x08(%esp), %edx /* load 2. arg of make_fcontext, context stack size */ 65 movl %edx, 0x1c(%eax) /* save context stack size in fcontext_t */ 66 negl %edx /* negate stack size for LEA instruction (== substraction) */ 67 leal (%ecx,%edx),%ecx /* compute bottom address of context stack (limit) */ 68 movl %ecx, 0x20(%eax) /* save address of context stack (limit) in fcontext_t */ 69 movl 0x0c(%esp), %ecx /* load 3. arg of make_fcontext, pointer to context function */ 70 movl %ecx, 0x14(%eax) /* save address of context function in fcontext_t */ 71 72 stmxcsr 0x02c(%eax) /* save MMX control word */ 73 fnstcw 0x030(%eax) /* save x87 control word */ 74 75 leal -0x1c(%eax),%edx /* reserve space for last frame and seh on context stack, (ESP - 0x4) % 16 == 0 */ 76 movl %edx, 0x10(%eax) /* save address in EDX as stack pointer for context function */ 77 78 movl $finish, %ecx /* abs address of finish */ 79 movl %ecx, (%edx) /* save address of finish as return address for context function */ 80 /* entered after context function returns */ 81 82 /* traverse current seh chain to get the last exception handler installed by Windows */ 83 /* note that on Windows Server 2008 and 2008 R2, SEHOP is activated by default */ 84 /* the exception handler chain is tested for the presence of ntdll.dll!FinalExceptionHandler */ 85 /* at its end by RaiseException all seh andlers are disregarded if not present and the */ 86 /* program is aborted */ 87 movl %fs:(0x18), %ecx /* load NT_TIB into ECX */ 88 89 walk: 90 movl (%ecx), %edx /* load 'next' member of current SEH into EDX */ 91 incl %edx /* test if 'next' of current SEH is last (== 0xffffffff) */ 92 jz found 93 decl %edx 94 xchgl %ecx, %edx /* exchange content; ECX contains address of next SEH */ 95 jmp walk /* inspect next SEH */ 96 97 found: 98 movl 0x04(%ecx), %ecx /* load 'handler' member of SEH == address of last SEH handler installed by Windows */ 99 movl 0x10(%eax), %edx /* load address of stack pointer for context function */ 100 movl %ecx, 0x18(%edx) /* save address in ECX as SEH handler for context */ 101 movl $0xffffffff,%ecx /* set ECX to -1 */ 102 movl %ecx, 0x14(%edx) /* save ECX as next SEH item */ 103 leal 0x14(%edx), %ecx /* load address of next SEH item */ 104 movl %ecx, 0x24(%eax) /* save next SEH */ 105 106 ret 107 108 finish: 109 /* ESP points to same address as ESP on entry of context function + 0x4 */ 110 xorl %eax, %eax 111 movl %eax, (%esp) /* exit code is zero */ 112 call __exit /* exit application */ 113 hlt 114 115 .def __exit; .scl 2; .type 32; .endef /* standard C library function */ -
libs/context/src/asm/jump_i386_ms_pe_gas.S
old new 1 /* 2 Copyright Oliver Kowalke 2009. 3 Copyright Thomas Sailer 2013. 4 Distributed under the Boost Software License, Version 1.0. 5 (See accompanying file LICENSE_1_0.txt or copy at 6 http://www.boost.org/LICENSE_1_0.txt) 7 */ 8 9 /******************************************************************** 10 * * 11 * -------------------------------------------------------------- * 12 * | 0 | 1 | 2 | 3 | 4 | 5 | * 13 * -------------------------------------------------------------- * 14 * | 0h | 04h | 08h | 0ch | 010h | 014h | * 15 * -------------------------------------------------------------- * 16 * | EDI | ESI | EBX | EBP | ESP | EIP | * 17 * -------------------------------------------------------------- * 18 * -------------------------------------------------------------- * 19 * | 6 | 7 | 8 | | * 20 * -------------------------------------------------------------- * 21 * | 018h | 01ch | 020h | | * 22 * -------------------------------------------------------------- * 23 * | sp | size | limit | | * 24 * -------------------------------------------------------------- * 25 * -------------------------------------------------------------- * 26 * | 9 | | * 27 * -------------------------------------------------------------- * 28 * | 024h | | * 29 * -------------------------------------------------------------- * 30 * |fc_execpt| | * 31 * -------------------------------------------------------------- * 32 * -------------------------------------------------------------- * 33 * | 10 | | * 34 * -------------------------------------------------------------- * 35 * | 028h | | * 36 * -------------------------------------------------------------- * 37 * |fc_strage| | * 38 * -------------------------------------------------------------- * 39 * -------------------------------------------------------------- * 40 * | 11 | 12 | | * 41 * -------------------------------------------------------------- * 42 * | 02ch | 030h | | * 43 * -------------------------------------------------------------- * 44 * | fc_mxcsr|fc_x87_cw| | * 45 * -------------------------------------------------------------- * 46 * * 47 * *****************************************************************/ 48 49 .file "jump_i386_ms_pe_gas.S" 50 .text 51 .p2align 4,,15 52 .globl _jump_fcontext 53 .def _jump_fcontext; .scl 2; .type 32; .endef 54 _jump_fcontext: 55 movl 0x04(%esp), %ecx /* load address of the first fcontext_t arg */ 56 movl %edi, (%ecx) /* save EDI */ 57 movl %esi, 0x04(%ecx) /* save ESI */ 58 movl %ebx, 0x08(%ecx) /* save EBX */ 59 movl %ebp, 0x0c(%ecx) /* save EBP */ 60 61 movl %fs:(0x18), %edx /* load NT_TIB */ 62 movl (%edx), %eax /* load current SEH exception list */ 63 movl %eax, 0x24(%ecx) /* save current exception list */ 64 movl 0x04(%edx), %eax /* load current stack base */ 65 movl %eax, 0x18(%ecx) /* save current stack base */ 66 movl 0x08(%edx), %eax /* load current stack limit */ 67 movl %eax, 0x20(%ecx) /* save current stack limit */ 68 movl 0x10(%edx), %eax /* load fiber local storage */ 69 movl %eax, 0x28(%ecx) /* save fiber local storage */ 70 71 leal 0x04(%esp), %eax /* exclude the return address */ 72 movl %eax, 0x10(%ecx) /* save as stack pointer */ 73 movl (%esp), %eax /* load return address */ 74 movl %eax, 0x14(%ecx) /* save return address */ 75 76 movl 0x08(%esp), %edx /* load address of the second fcontext_t arg */ 77 movl (%edx), %edi /* restore EDI */ 78 movl 0x04(%edx), %esi /* restore ESI */ 79 movl 0x08(%edx), %ebx /* restore EBX */ 80 movl 0x0c(%edx), %ebp /* restore EBP */ 81 82 movl 0x10(%esp), %eax /* check if fpu enve preserving was requested */ 83 testl %eax, %eax 84 je 1f 85 86 stmxcsr 0x2c(%ecx) /* save MMX control word */ 87 fnstcw 0x30(%ecx) /* save x87 control word */ 88 ldmxcsr 0x2c(%edx) /* restore MMX control word */ 89 fldcw 0x30(%edx) /* restore x87 control word */ 90 1: 91 movl %edx, %ecx 92 movl %fs:(0x18), %edx /* load NT_TIB */ 93 movl 0x24(%ecx), %eax /* load SEH exception list */ 94 movl %eax, (%edx) /* restore next SEH item */ 95 movl 0x18(%ecx), %eax /* load stack base */ 96 movl %eax, 0x04(%edx) /* restore stack base */ 97 movl 0x20(%ecx), %eax /* load stack limit */ 98 movl %eax, 0x08(%edx) /* restore stack limit */ 99 movl 0x28(%ecx), %eax /* load fiber local storage */ 100 movl %eax, 0x10(%edx) /* restore fiber local storage */ 101 102 movl 0x0c(%esp), %eax /* use third arg as return value after jump */ 103 104 movl 0x10(%ecx), %esp /* restore ESP */ 105 movl %eax, 0x04(%esp) /* use third arg as first arg in context function */ 106 movl 0x14(%ecx), %ecx /* fetch the address to return to */ 107 108 jmp *%ecx /* indirect jump to context */ -
libs/context/src/asm/make_x86_64_ms_pe_gas.S
old new 1 /* 2 Copyright Oliver Kowalke 2009. 3 Copyright Thomas Sailer 2013. 4 Distributed under the Boost Software License, Version 1.0. 5 (See accompanying file LICENSE_1_0.txt or copy at 6 http://www.boost.org/LICENSE_1_0.txt) 7 */ 8 9 /**************************************************************************************** 10 * * 11 * ---------------------------------------------------------------------------------- * 12 * | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | * 13 * ---------------------------------------------------------------------------------- * 14 * | 0x0 | 0x4 | 0x8 | 0xc | 0x10 | 0x14 | 0x18 | 0x1c | * 15 * ---------------------------------------------------------------------------------- * 16 * | R12 | R13 | R14 | R15 | * 17 * ---------------------------------------------------------------------------------- * 18 * ---------------------------------------------------------------------------------- * 19 * | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | * 20 * ---------------------------------------------------------------------------------- * 21 * | 0x20 | 0x24 | 0x28 | 0x2c | 0x30 | 0x34 | 0x38 | 0x3c | * 22 * ---------------------------------------------------------------------------------- * 23 * | RDI | RSI | RBX | RBP | * 24 * ---------------------------------------------------------------------------------- * 25 * ---------------------------------------------------------------------------------- * 26 * | 16 | 17 | 18 | 19 | | * 27 * ---------------------------------------------------------------------------------- * 28 * | 0x40 | 0x44 | 0x48 | 0x4c | | * 29 * ---------------------------------------------------------------------------------- * 30 * | RSP | RIP | | * 31 * ---------------------------------------------------------------------------------- * 32 * ---------------------------------------------------------------------------------- * 33 * | 20 | 21 | 22 | 23 | 24 | 25 | | * 34 * ---------------------------------------------------------------------------------- * 35 * | 0x50 | 0x54 | 0x58 | 0x5c | 0x60 | 0x64 | | * 36 * ---------------------------------------------------------------------------------- * 37 * | sp | size | limit | | * 38 * ---------------------------------------------------------------------------------- * 39 * ---------------------------------------------------------------------------------- * 40 * | 26 | 27 | | * 41 * ---------------------------------------------------------------------------------- * 42 * | 0x68 | 0x6c | | * 43 * ---------------------------------------------------------------------------------- * 44 * | fbr_strg | | * 45 * ---------------------------------------------------------------------------------- * 46 * ---------------------------------------------------------------------------------- * 47 * | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | * 48 * ---------------------------------------------------------------------------------- * 49 * | 0x70 | 0x74 | 0x78 | 0x7c | 0x80 | 0x84 | 0x88 | 0x8c | * 50 * ---------------------------------------------------------------------------------- * 51 * | fc_mxcsr|fc_x87_cw| fc_xmm | SEE registers (XMM6-XMM15) | * 52 * ---------------------------------------------------------------------------------- * 53 * ---------------------------------------------------------------------------------- * 54 * | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | * 55 * ---------------------------------------------------------------------------------- * 56 * | 0x90 | 0x94 | 0x98 | 0x9c | 0xa0 | 0xa4 | 0xa8 | 0xac | * 57 * ---------------------------------------------------------------------------------- * 58 * | SEE registers (XMM6-XMM15) | * 59 * ---------------------------------------------------------------------------------- * 60 * ---------------------------------------------------------------------------------- * 61 * | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | * 62 * ---------------------------------------------------------------------------------- * 63 * | 0xb0 | 0xb4 | 0xb8 | 0xbc | 0xc0 | 0xc4 | 0xc8 | 0xcc | * 64 * ---------------------------------------------------------------------------------- * 65 * | SEE registers (XMM6-XMM15) | * 66 * ---------------------------------------------------------------------------------- * 67 * ---------------------------------------------------------------------------------- * 68 * | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | * 69 * ---------------------------------------------------------------------------------- * 70 * | 0xd0 | 0xd4 | 0xd8 | 0xdc | 0xe0 | 0xe4 | 0xe8 | 0xec | * 71 * ---------------------------------------------------------------------------------- * 72 * | SEE registers (XMM6-XMM15) | * 73 * ---------------------------------------------------------------------------------- * 74 * ---------------------------------------------------------------------------------- * 75 * | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | * 76 * ---------------------------------------------------------------------------------- * 77 * | 0xf0 | 0xf4 | 0xf8 | 0xfc | 0x100 | 0x104 | 0x108 | 0x10c | * 78 * ---------------------------------------------------------------------------------- * 79 * | SEE registers (XMM6-XMM15) | * 80 * ---------------------------------------------------------------------------------- * 81 * ---------------------------------------------------------------------------------- * 82 * | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | * 83 * ---------------------------------------------------------------------------------- * 84 * | 0x110 | 0x114 | 0x118 | 0x11c | 0x120 | 0x124 | 0x128 | 0x12c | * 85 * ---------------------------------------------------------------------------------- * 86 * | SEE registers (XMM6-XMM15) | * 87 * ---------------------------------------------------------------------------------- * 88 * * 89 * *************************************************************************************/ 90 91 .file "make_x86_64_ms_pe_gas.S" 92 .text 93 .p2align 4,,15 94 .globl make_fcontext 95 .def make_fcontext; .scl 2; .type 32; .endef 96 .seh_proc make_fcontext 97 make_fcontext: 98 .seh_endprologue 99 leaq -0x130(%rcx),%rax /* reserve space for fcontext_t at top of context stack */ 100 101 /* shift address in RAX to lower 16 byte boundary */ 102 /* == pointer to fcontext_t and address of context stack */ 103 andq $-16, %rax 104 105 movq %r8, 0x48(%rax) /* save address of context function in fcontext_t */ 106 movq %rdx, 0x58(%rax) /* save context stack size in fcontext_t */ 107 movq %rcx, 0x50(%rax) /* save address of context stack pointer (base) in fcontext_t */ 108 109 negq %rdx /* negate stack size for LEA instruction (== substraction) */ 110 leaq (%rcx,%rdx),%rcx /* compute bottom address of context stack (limit) */ 111 movq %rcx, 0x60(%rax) /* save bottom address of context stack (limit) in fcontext_t */ 112 113 stmxcsr 0x70(%rax) /* save MMX control and status word */ 114 fnstcw 0x74(%rax) /* save x87 control word */ 115 116 leaq -0x28(%rax),%rdx /* reserve 32byte shadow space + return address on stack, (RSP - 0x8) % 16 == 0 */ 117 movq %rdx, 0x40(%rax) /* save address in RDX as stack pointer for context function */ 118 119 leaq finish(%rip),%rcx /* compute abs address of label finish */ 120 movq %rcx,(%rdx) /* save address of finish as return address for context function */ 121 /* entered after context function returns */ 122 123 ret 124 125 finish: 126 /* RSP points to same address as RSP on entry of context function + 0x8 */ 127 xorq %rcx, %rcx /* exit code is zero */ 128 call _exit /* exit application */ 129 hlt 130 .seh_endproc 131 132 .def _exit; .scl 2; .type 32; .endef /* standard C library function */ -
libs/context/src/asm/jump_x86_64_ms_pe_gas.S
old new 1 /* 2 Copyright Oliver Kowalke 2009. 3 Copyright Thomas Sailer 2013. 4 Distributed under the Boost Software License, Version 1.0. 5 (See accompanying file LICENSE_1_0.txt or copy at 6 http://www.boost.org/LICENSE_1_0.txt) 7 */ 8 9 /**************************************************************************************** 10 * * 11 * ---------------------------------------------------------------------------------- * 12 * | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | * 13 * ---------------------------------------------------------------------------------- * 14 * | 0x0 | 0x4 | 0x8 | 0xc | 0x10 | 0x14 | 0x18 | 0x1c | * 15 * ---------------------------------------------------------------------------------- * 16 * | R12 | R13 | R14 | R15 | * 17 * ---------------------------------------------------------------------------------- * 18 * ---------------------------------------------------------------------------------- * 19 * | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | * 20 * ---------------------------------------------------------------------------------- * 21 * | 0x20 | 0x24 | 0x28 | 0x2c | 0x30 | 0x34 | 0x38 | 0x3c | * 22 * ---------------------------------------------------------------------------------- * 23 * | RDI | RSI | RBX | RBP | * 24 * ---------------------------------------------------------------------------------- * 25 * ---------------------------------------------------------------------------------- * 26 * | 16 | 17 | 18 | 19 | | * 27 * ---------------------------------------------------------------------------------- * 28 * | 0x40 | 0x44 | 0x48 | 0x4c | | * 29 * ---------------------------------------------------------------------------------- * 30 * | RSP | RIP | | * 31 * ---------------------------------------------------------------------------------- * 32 * ---------------------------------------------------------------------------------- * 33 * | 20 | 21 | 22 | 23 | 24 | 25 | | * 34 * ---------------------------------------------------------------------------------- * 35 * | 0x50 | 0x54 | 0x58 | 0x5c | 0x60 | 0x64 | | * 36 * ---------------------------------------------------------------------------------- * 37 * | sp | size | limit | | * 38 * ---------------------------------------------------------------------------------- * 39 * ---------------------------------------------------------------------------------- * 40 * | 26 | 27 | | * 41 * ---------------------------------------------------------------------------------- * 42 * | 0x68 | 0x6c | | * 43 * ---------------------------------------------------------------------------------- * 44 * | fbr_strg | | * 45 * ---------------------------------------------------------------------------------- * 46 * ---------------------------------------------------------------------------------- * 47 * | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | * 48 * ---------------------------------------------------------------------------------- * 49 * | 0x70 | 0x74 | 0x78 | 0x7c | 0x80 | 0x84 | 0x88 | 0x8c | * 50 * ---------------------------------------------------------------------------------- * 51 * | fc_mxcsr|fc_x87_cw| fc_xmm | SEE registers (XMM6-XMM15) | * 52 * ---------------------------------------------------------------------------------- * 53 * ---------------------------------------------------------------------------------- * 54 * | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | * 55 * ---------------------------------------------------------------------------------- * 56 * | 0x90 | 0x94 | 0x98 | 0x9c | 0xa0 | 0xa4 | 0xa8 | 0xac | * 57 * ---------------------------------------------------------------------------------- * 58 * | SEE registers (XMM6-XMM15) | * 59 * ---------------------------------------------------------------------------------- * 60 * ---------------------------------------------------------------------------------- * 61 * | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | * 62 * ---------------------------------------------------------------------------------- * 63 * | 0xb0 | 0xb4 | 0xb8 | 0xbc | 0xc0 | 0xc4 | 0xc8 | 0xcc | * 64 * ---------------------------------------------------------------------------------- * 65 * | SEE registers (XMM6-XMM15) | * 66 * ---------------------------------------------------------------------------------- * 67 * ---------------------------------------------------------------------------------- * 68 * | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | * 69 * ---------------------------------------------------------------------------------- * 70 * | 0xd0 | 0xd4 | 0xd8 | 0xdc | 0xe0 | 0xe4 | 0xe8 | 0xec | * 71 * ---------------------------------------------------------------------------------- * 72 * | SEE registers (XMM6-XMM15) | * 73 * ---------------------------------------------------------------------------------- * 74 * ---------------------------------------------------------------------------------- * 75 * | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | * 76 * ---------------------------------------------------------------------------------- * 77 * | 0xf0 | 0xf4 | 0xf8 | 0xfc | 0x100 | 0x104 | 0x108 | 0x10c | * 78 * ---------------------------------------------------------------------------------- * 79 * | SEE registers (XMM6-XMM15) | * 80 * ---------------------------------------------------------------------------------- * 81 * ---------------------------------------------------------------------------------- * 82 * | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | * 83 * ---------------------------------------------------------------------------------- * 84 * | 0x110 | 0x114 | 0x118 | 0x11c | 0x120 | 0x124 | 0x128 | 0x12c | * 85 * ---------------------------------------------------------------------------------- * 86 * | SEE registers (XMM6-XMM15) | * 87 * ---------------------------------------------------------------------------------- * 88 * * 89 * *************************************************************************************/ 90 91 .file "jump_x86_64_ms_pe_gas.S" 92 .text 93 .p2align 4,,15 94 .globl jump_fcontext 95 .def jump_fcontext; .scl 2; .type 32; .endef 96 .seh_proc jump_fcontext 97 jump_fcontext: 98 .seh_endprologue 99 movq %r12, (%rcx) /* save R12 */ 100 movq %r13, 0x08(%rcx) /* save R13 */ 101 movq %r14, 0x10(%rcx) /* save R14 */ 102 movq %r15, 0x18(%rcx) /* save R15 */ 103 movq %rdi, 0x20(%rcx) /* save RDI */ 104 movq %rsi, 0x28(%rcx) /* save RSI */ 105 movq %rbx, 0x30(%rcx) /* save RBX */ 106 movq %rbp, 0x38(%rcx) /* save RBP */ 107 108 movq %gs:(0x30), %r10 /* load NT_TIB */ 109 movq 0x08(%r10), %rax /* load current stack base */ 110 movq %rax, 0x50(%rcx) /* save current stack base */ 111 movq 0x10(%r10), %rax /* load current stack limit */ 112 movq %rax, 0x60(%rcx) /* save current stack limit */ 113 movq 0x18(%r10), %rax /* load fiber local storage */ 114 movq %rax, 0x68(%rcx) /* save fiber local storage */ 115 116 testq %r9, %r9 117 je 1f 118 119 stmxcsr 0x70(%rcx) /* save MMX control and status word */ 120 fnstcw 0x74(%rcx) /* save x87 control word */ 121 /* save XMM storage */ 122 /* save start address of SSE register block in R10 */ 123 leaq 0x90(%rcx), %r10 124 /* shift address in R10 to lower 16 byte boundary */ 125 /* == pointer to SEE register block */ 126 andq $-16, %r10 127 128 movaps %xmm6, (%r10) 129 movaps %xmm7, 0x10(%r10) 130 movaps %xmm8, 0x20(%r10) 131 movaps %xmm9, 0x30(%r10) 132 movaps %xmm10, 0x40(%r10) 133 movaps %xmm11, 0x50(%r10) 134 movaps %xmm12, 0x60(%r10) 135 movaps %xmm13, 0x70(%r10) 136 movaps %xmm14, 0x80(%r10) 137 movaps %xmm15, 0x90(%r10) 138 139 ldmxcsr 0x70(%rdx) /* restore MMX control and status word */ 140 fldcw 0x74(%rdx) /* restore x87 control word */ 141 /* restore XMM storage */ 142 /* save start address of SSE register block in R10 */ 143 leaq 0x90(%rdx), %r10 144 /* shift address in R10 to lower 16 byte boundary */ 145 /* == pointer to SEE register block */ 146 andq $-16, %r10 147 148 movaps (%r10), %xmm6 149 movaps 0x10(%r10), %xmm7 150 movaps 0x20(%r10), %xmm8 151 movaps 0x30(%r10), %xmm9 152 movaps 0x40(%r10), %xmm10 153 movaps 0x50(%r10), %xmm11 154 movaps 0x60(%r10), %xmm12 155 movaps 0x70(%r10), %xmm13 156 movaps 0x80(%r10), %xmm14 157 movaps 0x90(%r10), %xmm15 158 159 1: 160 leaq 0x08(%rsp), %rax /* exclude the return address */ 161 movq %rax, 0x40(%rcx) /* save as stack pointer */ 162 movq (%rsp), %rax /* load return address */ 163 movq %rax, 0x48(%rcx) /* save return address */ 164 165 movq (%rdx), %r12 /* restore R12 */ 166 movq 0x08(%rdx), %r13 /* restore R13 */ 167 movq 0x10(%rdx), %r14 /* restore R14 */ 168 movq 0x18(%rdx), %r15 /* restore R15 */ 169 movq 0x20(%rdx), %rdi /* restore RDI */ 170 movq 0x28(%rdx), %rsi /* restore RSI */ 171 movq 0x30(%rdx), %rbx /* restore RBX */ 172 movq 0x38(%rdx), %rbp /* restore RBP */ 173 174 movq %gs:(0x30), %r10 /* load NT_TIB */ 175 movq 0x50(%rdx), %rax /* load stack base */ 176 movq %rax, 0x08(%r10) /* restore stack base */ 177 movq 0x60(%rdx), %rax /* load stack limit */ 178 movq %rax, 0x10(%r10) /* restore stack limit */ 179 movq 0x68(%rdx), %rax /* load fiber local storage */ 180 movq %rax, 0x18(%r10) /* restore fiber local storage */ 181 182 movq 0x40(%rdx), %rsp /* restore RSP */ 183 movq 0x48(%rdx), %r10 /* fetch the address to returned to */ 184 185 movq %r8, %rax /* use third arg as return value after jump */ 186 movq %r8, %rcx /* use third arg as first arg in context function */ 187 188 jmp *%r10 /* indirect jump to caller */ 189 .seh_endproc