diff options
Diffstat (limited to 'src/vm/amd64/ExternalMethodFixupThunk.asm')
-rw-r--r-- | src/vm/amd64/ExternalMethodFixupThunk.asm | 107 |
1 files changed, 107 insertions, 0 deletions
diff --git a/src/vm/amd64/ExternalMethodFixupThunk.asm b/src/vm/amd64/ExternalMethodFixupThunk.asm new file mode 100644 index 0000000000..6c43762fd9 --- /dev/null +++ b/src/vm/amd64/ExternalMethodFixupThunk.asm @@ -0,0 +1,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 |