summaryrefslogtreecommitdiff
path: root/src/vm/i386/PInvokeStubs.asm
blob: 7295c568e75432614c1282d568d7340ff591cc90 (plain)
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