1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
|
; Licensed to the .NET Foundation under one or more agreements.
; The .NET Foundation licenses this file to you under the MIT license.
; See the LICENSE file in the project root for more information.
; ***********************************************************************
; File: PInvokeStubs.asm
;
; ***********************************************************************
;
; *** NOTE: If you make changes to this file, propagate the changes to
; PInvokeStubs.s in this directory
; This contains JITinterface routines that are 100% x86 assembly
.586
.model flat
include asmconstants.inc
include asmmacros.inc
option casemap:none
.code
extern _s_gsCookie:DWORD
extern ??_7InlinedCallFrame@@6B@:DWORD
extern _g_TrapReturningThreads:DWORD
extern @JIT_PInvokeEndRarePath@0:proc
.686P
.XMM
;
; in:
; InlinedCallFrame (ecx) = pointer to the InlinedCallFrame data, including the GS cookie slot (GS cookie right
; before actual InlinedCallFrame data)
;
;
_JIT_PInvokeBegin@4 PROC public
mov eax, dword ptr [_s_gsCookie]
mov dword ptr [ecx], eax
add ecx, SIZEOF_GSCookie
;; set first slot to the value of InlinedCallFrame::`vftable' (checked by runtime code)
lea eax,[??_7InlinedCallFrame@@6B@]
mov dword ptr [ecx], eax
mov dword ptr [ecx + InlinedCallFrame__m_Datum], 0
mov eax, esp
add eax, 4
mov dword ptr [ecx + InlinedCallFrame__m_pCallSiteSP], eax
mov dword ptr [ecx + InlinedCallFrame__m_pCalleeSavedFP], ebp
mov eax, [esp]
mov dword ptr [ecx + InlinedCallFrame__m_pCallerReturnAddress], eax
;; edx = GetThread(). Trashes eax
INLINE_GETTHREAD edx, eax
;; pFrame->m_Next = pThread->m_pFrame;
mov eax, dword ptr [edx + Thread_m_pFrame]
mov dword ptr [ecx + Frame__m_Next], eax
;; pThread->m_pFrame = pFrame;
mov dword ptr [edx + Thread_m_pFrame], ecx
;; pThread->m_fPreemptiveGCDisabled = 0
mov dword ptr [edx + Thread_m_fPreemptiveGCDisabled], 0
ret
_JIT_PInvokeBegin@4 ENDP
;
; in:
; InlinedCallFrame (ecx) = pointer to the InlinedCallFrame data, including the GS cookie slot (GS cookie right
; before actual InlinedCallFrame data)
;
;
_JIT_PInvokeEnd@4 PROC public
add ecx, SIZEOF_GSCookie
;; edx = GetThread(). Trashes eax
INLINE_GETTHREAD edx, eax
;; ecx = pFrame
;; edx = pThread
;; pThread->m_fPreemptiveGCDisabled = 1
mov dword ptr [edx + Thread_m_fPreemptiveGCDisabled], 1
;; Check return trap
cmp [_g_TrapReturningThreads], 0
jnz RarePath
;; pThread->m_pFrame = pFrame->m_Next
mov eax, dword ptr [ecx + Frame__m_Next]
mov dword ptr [edx + Thread_m_pFrame], eax
ret
RarePath:
jmp @JIT_PInvokeEndRarePath@0
_JIT_PInvokeEnd@4 ENDP
end
|