]> git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/context/src/asm/jump_i386_ms_pe_masm.asm
update sources to v12.2.3
[ceph.git] / ceph / src / boost / libs / context / src / asm / jump_i386_ms_pe_masm.asm
1
2 ; Copyright Oliver Kowalke 2009.
3 ; Distributed under the Boost Software License, Version 1.0.
4 ; (See accompanying file LICENSE_1_0.txt or copy at
5 ; http://www.boost.org/LICENSE_1_0.txt)
6
7 ; ---------------------------------------------------------------------------------
8 ; | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
9 ; ---------------------------------------------------------------------------------
10 ; | 0h | 04h | 08h | 0ch | 010h | 014h | 018h | 01ch |
11 ; ---------------------------------------------------------------------------------
12 ; | fc_mxcsr|fc_x87_cw| fc_strg |fc_deallo| limit | base | fc_seh | EDI |
13 ; ---------------------------------------------------------------------------------
14 ; ---------------------------------------------------------------------------------
15 ; | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 ; ---------------------------------------------------------------------------------
17 ; | 020h | 024h | 028h | 02ch | 030h | 034h | 038h | 03ch |
18 ; ---------------------------------------------------------------------------------
19 ; | ESI | EBX | EBP | EIP | to | data | EH NXT |SEH HNDLR|
20 ; ---------------------------------------------------------------------------------
21
22 .386
23 .XMM
24 .model flat, c
25 .code
26
27 jump_fcontext PROC BOOST_CONTEXT_EXPORT
28 ; prepare stack
29 lea esp, [esp-02ch]
30
31 IFNDEF BOOST_USE_TSX
32 ; save MMX control- and status-word
33 stmxcsr [esp]
34 ; save x87 control-word
35 fnstcw [esp+04h]
36 ENDIF
37
38 assume fs:nothing
39 ; load NT_TIB into ECX
40 mov edx, fs:[018h]
41 assume fs:error
42 ; load fiber local storage
43 mov eax, [edx+010h]
44 mov [esp+08h], eax
45 ; load current deallocation stack
46 mov eax, [edx+0e0ch]
47 mov [esp+0ch], eax
48 ; load current stack limit
49 mov eax, [edx+08h]
50 mov [esp+010h], eax
51 ; load current stack base
52 mov eax, [edx+04h]
53 mov [esp+014h], eax
54 ; load current SEH exception list
55 mov eax, [edx]
56 mov [esp+018h], eax
57
58 mov [esp+01ch], edi ; save EDI
59 mov [esp+020h], esi ; save ESI
60 mov [esp+024h], ebx ; save EBX
61 mov [esp+028h], ebp ; save EBP
62
63 ; store ESP (pointing to context-data) in EAX
64 mov eax, esp
65
66 ; firstarg of jump_fcontext() == fcontext to jump to
67 mov ecx, [esp+030h]
68
69 ; restore ESP (pointing to context-data) from ECX
70 mov esp, ecx
71
72 IFNDEF BOOST_USE_TSX
73 ; restore MMX control- and status-word
74 ldmxcsr [esp]
75 ; restore x87 control-word
76 fldcw [esp+04h]
77 ENDIF
78
79 assume fs:nothing
80 ; load NT_TIB into EDX
81 mov edx, fs:[018h]
82 assume fs:error
83 ; restore fiber local storage
84 mov ecx, [esp+08h]
85 mov [edx+010h], ecx
86 ; restore current deallocation stack
87 mov ecx, [esp+0ch]
88 mov [edx+0e0ch], ecx
89 ; restore current stack limit
90 mov ecx, [esp+010h]
91 mov [edx+08h], ecx
92 ; restore current stack base
93 mov ecx, [esp+014h]
94 mov [edx+04h], ecx
95 ; restore current SEH exception list
96 mov ecx, [esp+018h]
97 mov [edx], ecx
98
99 mov ecx, [esp+02ch] ; restore EIP
100
101 mov edi, [esp+01ch] ; restore EDI
102 mov esi, [esp+020h] ; restore ESI
103 mov ebx, [esp+024h] ; restore EBX
104 mov ebp, [esp+028h] ; restore EBP
105
106 ; prepare stack
107 lea esp, [esp+030h]
108
109 ; return transfer_t
110 ; FCTX == EAX, DATA == EDX
111 mov edx, [eax+034h]
112
113 ; jump to context
114 jmp ecx
115 jump_fcontext ENDP
116 END