]>
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 "ontop_i386_ms_pe_gas.asm" | |
27 | .text | |
28 | .p2align 4,,15 | |
f67539c2 TL |
29 | |
30 | /* mark as using no unregistered SEH handlers */ | |
31 | .globl @feat.00 | |
32 | .def @feat.00; .scl 3; .type 0; .endef | |
33 | .set @feat.00, 1 | |
34 | ||
7c673cae FG |
35 | .globl _ontop_fcontext |
36 | .def _ontop_fcontext; .scl 2; .type 32; .endef | |
37 | _ontop_fcontext: | |
b32b8144 FG |
38 | /* prepare stack */ |
39 | leal -0x2c(%esp), %esp | |
40 | ||
41 | #if !defined(BOOST_USE_TSX) | |
42 | /* save MMX control- and status-word */ | |
43 | stmxcsr (%esp) | |
44 | /* save x87 control-word */ | |
45 | fnstcw 0x4(%esp) | |
46 | #endif | |
7c673cae FG |
47 | |
48 | /* load NT_TIB */ | |
49 | movl %fs:(0x18), %edx | |
b32b8144 FG |
50 | /* load fiber local storage */ |
51 | movl 0x10(%edx), %eax | |
52 | movl %eax, 0x8(%esp) | |
53 | /* load current dealloction stack */ | |
54 | movl 0xe0c(%edx), %eax | |
55 | movl %eax, 0xc(%esp) | |
56 | /* load current stack limit */ | |
57 | movl 0x8(%edx), %eax | |
58 | movl %eax, 0x10(%esp) | |
59 | /* load current stack base */ | |
60 | movl 0x4(%edx), %eax | |
61 | movl %eax, 0x14(%esp) | |
7c673cae FG |
62 | /* load current SEH exception list */ |
63 | movl (%edx), %eax | |
b32b8144 | 64 | movl %eax, 0x18(%esp) |
7c673cae | 65 | |
b32b8144 FG |
66 | movl %edi, 0x1c(%esp) /* save EDI */ |
67 | movl %esi, 0x20(%esp) /* save ESI */ | |
68 | movl %ebx, 0x24(%esp) /* save EBX */ | |
69 | movl %ebp, 0x28(%esp) /* save EBP */ | |
7c673cae | 70 | |
b32b8144 | 71 | /* store ESP (pointing to context-data) in ECX */ |
7c673cae FG |
72 | movl %esp, %ecx |
73 | ||
74 | /* first arg of ontop_fcontext() == fcontext to jump to */ | |
b32b8144 | 75 | movl 0x30(%esp), %eax |
7c673cae FG |
76 | |
77 | /* pass parent fcontext_t */ | |
b32b8144 | 78 | movl %ecx, 0x30(%eax) |
7c673cae FG |
79 | |
80 | /* second arg of ontop_fcontext() == data to be transferred */ | |
b32b8144 | 81 | movl 0x34(%esp), %ecx |
7c673cae FG |
82 | |
83 | /* pass data */ | |
b32b8144 | 84 | movl %ecx, 0x34(%eax) |
7c673cae FG |
85 | |
86 | /* third arg of ontop_fcontext() == ontop-function */ | |
b32b8144 | 87 | movl 0x38(%esp), %ecx |
7c673cae FG |
88 | |
89 | /* restore ESP (pointing to context-data) from EDX */ | |
90 | movl %eax, %esp | |
91 | ||
b32b8144 FG |
92 | #if !defined(BOOST_USE_TSX) |
93 | /* restore MMX control- and status-word */ | |
94 | ldmxcsr (%esp) | |
95 | /* restore x87 control-word */ | |
96 | fldcw 0x4(%esp) | |
97 | #endif | |
7c673cae | 98 | |
b32b8144 FG |
99 | /* restore NT_TIB into EDX */ |
100 | movl %fs:(0x18), %edx | |
7c673cae | 101 | /* restore fiber local storage */ |
b32b8144 | 102 | movl 0x8(%esp), %eax |
7c673cae | 103 | movl %eax, 0x10(%edx) |
7c673cae | 104 | /* restore current deallocation stack */ |
b32b8144 | 105 | movl 0xc(%esp), %eax |
7c673cae | 106 | movl %eax, 0xe0c(%edx) |
7c673cae | 107 | /* restore current stack limit */ |
b32b8144 | 108 | movl 0x10(%esp), %eax |
7c673cae | 109 | movl %eax, 0x08(%edx) |
7c673cae | 110 | /* restore current stack base */ |
b32b8144 | 111 | movl 0x14(%esp), %eax |
7c673cae | 112 | movl %eax, 0x04(%edx) |
7c673cae | 113 | /* restore current SEH exception list */ |
b32b8144 | 114 | movl 0x18(%esp), %eax |
7c673cae FG |
115 | movl %eax, (%edx) |
116 | ||
b32b8144 FG |
117 | movl 0x1c(%esp), %edi /* restore EDI */ |
118 | movl 0x20(%esp), %esi /* restore ESI */ | |
119 | movl 0x24(%esp), %ebx /* restore EBX */ | |
120 | movl 0x28(%esp), %ebp /* restore EBP */ | |
121 | ||
122 | /* prepare stack */ | |
123 | leal 0x2c(%esp), %esp | |
124 | ||
125 | /* keep return-address on stack */ | |
7c673cae FG |
126 | |
127 | /* jump to context */ | |
128 | jmp *%ecx | |
129 | ||
130 | .section .drectve | |
f67539c2 | 131 | .ascii " -export:\"_ontop_fcontext\"" |