]>
Commit | Line | Data |
---|---|---|
7c673cae FG |
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 | * | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | * | |
12 | * --------------------------------------------------------------------------------- * | |
13 | * | 0h | 04h | 08h | 0ch | 010h | 014h | 018h | 01ch | * | |
14 | * --------------------------------------------------------------------------------- * | |
b32b8144 | 15 | * | fc_mxcsr|fc_x87_cw| fc_strg |fc_deallo| limit | base | fc_seh | EDI | * |
7c673cae FG |
16 | * --------------------------------------------------------------------------------- * |
17 | * --------------------------------------------------------------------------------- * | |
18 | * | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | * | |
19 | * --------------------------------------------------------------------------------- * | |
20 | * | 020h | 024h | 028h | 02ch | 030h | 034h | 038h | 03ch | * | |
21 | * --------------------------------------------------------------------------------- * | |
b32b8144 | 22 | * | ESI | EBX | EBP | EIP | to | data | EH NXT |SEH HNDLR| * |
7c673cae | 23 | * --------------------------------------------------------------------------------- * |
b32b8144 | 24 | **************************************************************************************/ |
7c673cae FG |
25 | |
26 | .file "jump_i386_ms_pe_gas.asm" | |
27 | .text | |
28 | .p2align 4,,15 | |
29 | .globl _jump_fcontext | |
30 | .def _jump_fcontext; .scl 2; .type 32; .endef | |
31 | _jump_fcontext: | |
b32b8144 FG |
32 | /* prepare stack */ |
33 | leal -0x2c(%esp), %esp | |
34 | ||
35 | #if !defined(BOOST_USE_TSX) | |
36 | /* save MMX control- and status-word */ | |
37 | stmxcsr (%esp) | |
38 | /* save x87 control-word */ | |
39 | fnstcw 0x4(%esp) | |
40 | #endif | |
7c673cae FG |
41 | |
42 | /* load NT_TIB */ | |
43 | movl %fs:(0x18), %edx | |
b32b8144 FG |
44 | /* load fiber local storage */ |
45 | movl 0x10(%edx), %eax | |
46 | movl %eax, 0x8(%esp) | |
47 | /* load current dealloction stack */ | |
48 | movl 0xe0c(%edx), %eax | |
49 | movl %eax, 0xc(%esp) | |
50 | /* load current stack limit */ | |
51 | movl 0x8(%edx), %eax | |
52 | movl %eax, 0x10(%esp) | |
53 | /* load current stack base */ | |
54 | movl 0x4(%edx), %eax | |
55 | movl %eax, 0x14(%esp) | |
7c673cae FG |
56 | /* load current SEH exception list */ |
57 | movl (%edx), %eax | |
b32b8144 | 58 | movl %eax, 0x18(%esp) |
7c673cae | 59 | |
b32b8144 FG |
60 | movl %edi, 0x1c(%esp) /* save EDI */ |
61 | movl %esi, 0x20(%esp) /* save ESI */ | |
62 | movl %ebx, 0x24(%esp) /* save EBX */ | |
63 | movl %ebp, 0x28(%esp) /* save EBP */ | |
7c673cae FG |
64 | |
65 | /* store ESP (pointing to context-data) in EAX */ | |
66 | movl %esp, %eax | |
67 | ||
b32b8144 FG |
68 | /* firstarg of jump_fcontext() == fcontext to jump to */ |
69 | movl 0x30(%esp), %ecx | |
70 | ||
71 | /* restore ESP (pointing to context-data) from ECX */ | |
7c673cae FG |
72 | movl %ecx, %esp |
73 | ||
b32b8144 FG |
74 | #if !defined(BOOST_USE_TSX) |
75 | /* restore MMX control- and status-word */ | |
76 | ldmxcsr (%esp) | |
77 | /* restore x87 control-word */ | |
78 | fldcw 0x4(%esp) | |
79 | #endif | |
7c673cae | 80 | |
b32b8144 FG |
81 | /* restore NT_TIB into EDX */ |
82 | movl %fs:(0x18), %edx | |
7c673cae | 83 | /* restore fiber local storage */ |
b32b8144 | 84 | movl 0x8(%esp), %ecx |
7c673cae | 85 | movl %ecx, 0x10(%edx) |
7c673cae | 86 | /* restore current deallocation stack */ |
b32b8144 | 87 | movl 0xc(%esp), %ecx |
7c673cae | 88 | movl %ecx, 0xe0c(%edx) |
7c673cae | 89 | /* restore current stack limit */ |
b32b8144 FG |
90 | movl 0x10(%esp), %ecx |
91 | movl %ecx, 0x8(%edx) | |
7c673cae | 92 | /* restore current stack base */ |
b32b8144 FG |
93 | movl 0x14(%esp), %ecx |
94 | movl %ecx, 0x4(%edx) | |
7c673cae | 95 | /* restore current SEH exception list */ |
b32b8144 | 96 | movl 0x18(%esp), %ecx |
7c673cae FG |
97 | movl %ecx, (%edx) |
98 | ||
b32b8144 FG |
99 | movl 0x2c(%esp), %ecx /* restore EIP */ |
100 | ||
101 | movl 0x1c(%esp), %edi /* restore EDI */ | |
102 | movl 0x20(%esp), %esi /* restore ESI */ | |
103 | movl 0x24(%esp), %ebx /* restore EBX */ | |
104 | movl 0x28(%esp), %ebp /* restore EBP */ | |
105 | ||
106 | /* prepare stack */ | |
107 | leal 0x30(%esp), %esp | |
7c673cae FG |
108 | |
109 | /* return transfer_t */ | |
110 | /* FCTX == EAX, DATA == EDX */ | |
b32b8144 | 111 | movl 0x34(%eax), %edx |
7c673cae FG |
112 | |
113 | /* jump to context */ | |
b32b8144 | 114 | jmp *%ecx |
7c673cae FG |
115 | |
116 | .section .drectve | |
117 | .ascii " -export:\"jump_fcontext\"" |