summaryrefslogtreecommitdiff
path: root/src/vm/amd64/ExternalMethodFixupThunk.asm
blob: 6c43762fd92af8401bd760bee5e24416754eb1fd (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
; 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.

include <AsmMacros.inc>
include AsmConstants.inc

    extern  ExternalMethodFixupWorker:proc
    extern  ProcessCLRException:proc
    extern  VirtualMethodFixupWorker:proc

ifdef FEATURE_READYTORUN
    extern DynamicHelperWorker:proc
endif

;============================================================================================
;; EXTERN_C VOID __stdcall ExternalMethodFixupStub()

NESTED_ENTRY ExternalMethodFixupStub, _TEXT, ProcessCLRException

        PROLOG_WITH_TRANSITION_BLOCK 0, 8, rdx

        lea             rcx, [rsp + __PWTB_TransitionBlock] ; pTransitionBlock
        sub             rdx, 5                              ; pThunk
        mov             r8, 0                               ; sectionIndex
        mov             r9, 0                               ; pModule

        call            ExternalMethodFixupWorker

        EPILOG_WITH_TRANSITION_BLOCK_TAILCALL
PATCH_LABEL ExternalMethodFixupPatchLabel
        TAILJMP_RAX

NESTED_END ExternalMethodFixupStub, _TEXT


ifdef FEATURE_READYTORUN

NESTED_ENTRY DelayLoad_MethodCall, _TEXT

        PROLOG_WITH_TRANSITION_BLOCK 0, 10h, r8, r9

        lea     rcx, [rsp + __PWTB_TransitionBlock] ; pTransitionBlock
        mov     rdx, rax                            ; pIndirection

        call            ExternalMethodFixupWorker

        EPILOG_WITH_TRANSITION_BLOCK_TAILCALL

        ; Share the patch label
        jmp ExternalMethodFixupPatchLabel

NESTED_END DelayLoad_MethodCall, _TEXT

;============================================================================================

DYNAMICHELPER macro frameFlags, suffix

NESTED_ENTRY DelayLoad_Helper&suffix, _TEXT

        PROLOG_WITH_TRANSITION_BLOCK 8h, 10h, r8, r9

        mov     qword ptr [rsp + SIZEOF_MAX_OUTGOING_ARGUMENT_HOMES], frameFlags
        lea     rcx, [rsp + __PWTB_TransitionBlock] ; pTransitionBlock
        mov     rdx, rax                            ; pIndirection

        call    DynamicHelperWorker

        test    rax,rax
        jnz     @F

        mov     rax, [rsp + __PWTB_ArgumentRegisters] ; The result is stored in the argument area of the transition block

        EPILOG_WITH_TRANSITION_BLOCK_RETURN

@@:
        EPILOG_WITH_TRANSITION_BLOCK_TAILCALL
        TAILJMP_RAX

NESTED_END DelayLoad_Helper&suffix, _TEXT

    endm

DYNAMICHELPER DynamicHelperFrameFlags_Default
DYNAMICHELPER DynamicHelperFrameFlags_ObjectArg, _Obj
DYNAMICHELPER <DynamicHelperFrameFlags_ObjectArg OR DynamicHelperFrameFlags_ObjectArg2>, _ObjObj

endif ; FEATURE_READYTORUN

;============================================================================================
;; EXTERN_C VOID __stdcall VirtualMethodFixupStub()

NESTED_ENTRY VirtualMethodFixupStub, _TEXT, ProcessCLRException

        PROLOG_WITH_TRANSITION_BLOCK 0, 8, rdx

        lea             rcx, [rsp + __PWTB_TransitionBlock] ; pTransitionBlock
        sub             rdx, 5                              ; pThunk
        call            VirtualMethodFixupWorker

        EPILOG_WITH_TRANSITION_BLOCK_TAILCALL
PATCH_LABEL VirtualMethodFixupPatchLabel
        TAILJMP_RAX

NESTED_END VirtualMethodFixupStub, _TEXT

        end