From 094a2e8d1d46f373577c0d5a494547e0ed563f40 Mon Sep 17 00:00:00 2001 From: Steve MacLean Date: Thu, 19 Apr 2018 12:22:10 -0400 Subject: [PATCH] [Arm64/Linux] Fix GenericPInvokeCalliHelper (#17659) --- src/jit/target.h | 4 ++-- src/vm/amd64/PInvokeStubs.asm | 8 -------- src/vm/amd64/pinvokestubs.S | 8 -------- src/vm/arm64/PInvokeStubs.asm | 4 ++-- src/vm/arm64/pinvokestubs.S | 5 ++--- src/vm/dllimport.cpp | 28 +++------------------------- tests/arm64/corefx_test_exclusions.txt | 1 - 7 files changed, 9 insertions(+), 49 deletions(-) diff --git a/src/jit/target.h b/src/jit/target.h index 15f4693..9c64045 100644 --- a/src/jit/target.h +++ b/src/jit/target.h @@ -1746,8 +1746,8 @@ typedef unsigned short regPairNoSmall; // arm: need 12 bits #define RBM_PINVOKE_COOKIE_PARAM RBM_R15 // GenericPInvokeCalliHelper unmanaged target Parameter - #define REG_PINVOKE_TARGET_PARAM REG_R14 - #define RBM_PINVOKE_TARGET_PARAM RBM_R14 + #define REG_PINVOKE_TARGET_PARAM REG_R12 + #define RBM_PINVOKE_TARGET_PARAM RBM_R12 // IL stub's secret MethodDesc parameter (JitFlags::JIT_FLAG_PUBLISH_SECRET_PARAM) #define REG_SECRET_STUB_PARAM REG_R12 diff --git a/src/vm/amd64/PInvokeStubs.asm b/src/vm/amd64/PInvokeStubs.asm index 4801697..7255fa2 100644 --- a/src/vm/amd64/PInvokeStubs.asm +++ b/src/vm/amd64/PInvokeStubs.asm @@ -32,14 +32,6 @@ LEAF_ENTRY GenericPInvokeCalliHelper, _TEXT jz GenericPInvokeCalliGenILStub ; - ; We need to distinguish between a MethodDesc* and an unmanaged target in PInvokeStubForHost(). - ; The way we do this is to shift the managed target to the left by one bit and then set the - ; least significant bit to 1. This works because MethodDesc* are always 8-byte aligned. - ; - shl PINVOKE_CALLI_TARGET_REGISTER, 1 - or PINVOKE_CALLI_TARGET_REGISTER, 1 - - ; ; jump to existing IL stub ; jmp rax diff --git a/src/vm/amd64/pinvokestubs.S b/src/vm/amd64/pinvokestubs.S index 49697e1..dad668a 100644 --- a/src/vm/amd64/pinvokestubs.S +++ b/src/vm/amd64/pinvokestubs.S @@ -25,14 +25,6 @@ LEAF_ENTRY GenericPInvokeCalliHelper, _TEXT jz C_FUNC(GenericPInvokeCalliGenILStub) // - // We need to distinguish between a MethodDesc* and an unmanaged target in PInvokeStubForHost(). - // The way we do this is to shift the managed target to the left by one bit and then set the - // least significant bit to 1. This works because MethodDesc* are always 8-byte aligned. - // - shl PINVOKE_CALLI_TARGET_REGISTER, 1 - or PINVOKE_CALLI_TARGET_REGISTER, 1 - - // // jump to existing IL stub // jmp rax diff --git a/src/vm/arm64/PInvokeStubs.asm b/src/vm/arm64/PInvokeStubs.asm index afe2fb4..e21151e 100644 --- a/src/vm/arm64/PInvokeStubs.asm +++ b/src/vm/arm64/PInvokeStubs.asm @@ -124,9 +124,9 @@ __PInvokeGenStubFuncName SETS "$__PInvokeGenStubFuncName":CC:"_RetBuffArg" ; ; in: ; x15 = VASigCookie* -; x14 = Unmanaged target +; x12 = Unmanaged target ; - PINVOKE_STUB GenericPInvokeCalli, x15, x14, {true} + PINVOKE_STUB GenericPInvokeCalli, x15, x12, {true} ; ------------------------------------------------------------------ ; VarargPInvokeStub_RetBuffArg & VarargPInvokeGenILStub_RetBuffArg diff --git a/src/vm/arm64/pinvokestubs.S b/src/vm/arm64/pinvokestubs.S index 00d64b4..f13d2da 100644 --- a/src/vm/arm64/pinvokestubs.S +++ b/src/vm/arm64/pinvokestubs.S @@ -32,7 +32,6 @@ // if null goto stub generation cbz x9, LOCAL_LABEL(\__PInvokeStubFuncName\()_0) - EPILOG_BRANCH_REG x9 LOCAL_LABEL(\__PInvokeStubFuncName\()_0): @@ -96,9 +95,9 @@ PINVOKE_STUB VarargPInvokeStub, VarargPInvokeGenILStub, VarargPInvokeStubWorker, // // in: // x15 = VASigCookie* -// x14 = Unmanaged target +// x12 = Unmanaged target // -PINVOKE_STUB GenericPInvokeCalliHelper, GenericPInvokeCalliGenILStub, GenericPInvokeCalliStubWorker, x15, x14, 1 +PINVOKE_STUB GenericPInvokeCalliHelper, GenericPInvokeCalliGenILStub, GenericPInvokeCalliStubWorker, x15, x12, 1 // ------------------------------------------------------------------ // VarargPInvokeStub_RetBuffArg & VarargPInvokeGenILStub_RetBuffArg diff --git a/src/vm/dllimport.cpp b/src/vm/dllimport.cpp index 5b51ee3..c0f7d1f 100644 --- a/src/vm/dllimport.cpp +++ b/src/vm/dllimport.cpp @@ -2253,31 +2253,9 @@ void NDirectStubLinker::DoNDirect(ILCodeStream *pcsEmit, DWORD dwStubFlags, Meth // if we ever NGEN CALLI stubs, this would have to be done differently _ASSERTE(!SF_IsNGENedStub(dwStubFlags)); -#ifndef CROSSGEN_COMPILE - -#ifdef _TARGET_X86_ - - { - // for managed-to-unmanaged CALLI that requires marshaling, the target is passed - // as the secret argument to the stub by GenericPInvokeCalliHelper (asmhelpers.asm) - EmitLoadStubContext(pcsEmit, dwStubFlags); - } - - -#else // _TARGET_X86_ - - { - // the secret arg has been shifted to left and ORed with 1 (see code:GenericPInvokeCalliHelper) - EmitLoadStubContext(pcsEmit, dwStubFlags); -#ifndef _TARGET_ARM_ - pcsEmit->EmitLDC(1); - pcsEmit->EmitSHR_UN(); -#endif - } - -#endif // _TARGET_X86_ - -#endif // CROSSGEN_COMPILE + // for managed-to-unmanaged CALLI that requires marshaling, the target is passed + // as the secret argument to the stub by GenericPInvokeCalliHelper (asmhelpers.asm) + EmitLoadStubContext(pcsEmit, dwStubFlags); } else #ifdef FEATURE_COMINTEROP diff --git a/tests/arm64/corefx_test_exclusions.txt b/tests/arm64/corefx_test_exclusions.txt index 1d5f55f..6b00a58 100644 --- a/tests/arm64/corefx_test_exclusions.txt +++ b/tests/arm64/corefx_test_exclusions.txt @@ -1,4 +1,3 @@ Invariant.Tests System.Diagnostics.Process.Tests -System.Reflection.Emit.ILGeneration.Tests System.ValueTuple.Tests -- 2.7.4