Skip to content

Commit 1f6b690

Browse files
Move UMEntryThunk to StubPrecode infrastructure (#112460)
* Move UMEntryThunk to StubPrecode infrastructure - Use the StubPrecode logic to create UMEntryThunk instances - Allocate them all on the Global LoaderAllocator - Unify the creation of UMEntryThunks between the C++/CLI fixup generation path and the delegate creation path - Remove ThunkHeapStubManager as it is now subsumed by RangeSectionStubManager - Tweak code paths around all of this so that we don't have unnecessary indirections (This change will add 2 memory loads to the UMEntryThunk path on x86/x64, but that should be fairly immaterial compared to the cost of an actual reverse p/invoke)
1 parent 7cfe5e3 commit 1f6b690

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

53 files changed

+401
-1064
lines changed

src/coreclr/debug/daccess/daccess.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5825,7 +5825,7 @@ ClrDataAccess::RawGetMethodName(
58255825
{
58265826
// Try to find matching precode entrypoint
58275827
Precode* pPrecode = Precode::GetPrecodeFromEntryPoint(alignedAddress, TRUE);
5828-
if (pPrecode != NULL)
5828+
if (pPrecode != NULL && pPrecode->GetType() != PRECODE_UMENTRY_THUNK)
58295829
{
58305830
methodDesc = pPrecode->GetMethodDesc();
58315831
if (methodDesc != NULL)

src/coreclr/debug/daccess/request.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1783,7 +1783,6 @@ ClrDataAccess::GetModuleData(CLRDATA_ADDRESS addr, struct DacpModuleData *Module
17831783
ModuleData->dwModuleIndex = 0; // CoreCLR no longer has this concept
17841784
ModuleData->dwTransientFlags = pModule->m_dwTransientFlags;
17851785
ModuleData->LoaderAllocator = HOST_CDADDR(pModule->m_loaderAllocator);
1786-
ModuleData->ThunkHeap = HOST_CDADDR(pModule->m_pThunkHeap);
17871786

17881787
EX_TRY
17891788
{

src/coreclr/debug/runtimeinfo/datadescriptor.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -223,7 +223,6 @@ CDAC_TYPE_FIELD(Module, /*pointer*/, Assembly, cdac_data<Module>::Assembly)
223223
CDAC_TYPE_FIELD(Module, /*pointer*/, Base, cdac_data<Module>::Base)
224224
CDAC_TYPE_FIELD(Module, /*uint32*/, Flags, cdac_data<Module>::Flags)
225225
CDAC_TYPE_FIELD(Module, /*pointer*/, LoaderAllocator, cdac_data<Module>::LoaderAllocator)
226-
CDAC_TYPE_FIELD(Module, /*pointer*/, ThunkHeap, cdac_data<Module>::ThunkHeap)
227226
CDAC_TYPE_FIELD(Module, /*pointer*/, DynamicMetadata, cdac_data<Module>::DynamicMetadata)
228227
CDAC_TYPE_FIELD(Module, /*pointer*/, Path, cdac_data<Module>::Path)
229228
CDAC_TYPE_FIELD(Module, /*pointer*/, FileName, cdac_data<Module>::FileName)
@@ -493,7 +492,7 @@ CDAC_TYPE_END(PlatformMetadata)
493492

494493
CDAC_TYPE_BEGIN(StubPrecodeData)
495494
CDAC_TYPE_INDETERMINATE(StubPrecodeData)
496-
CDAC_TYPE_FIELD(StubPrecodeData, /*pointer*/, MethodDesc, offsetof(StubPrecodeData, MethodDesc))
495+
CDAC_TYPE_FIELD(StubPrecodeData, /*pointer*/, MethodDesc, offsetof(StubPrecodeData, SecretParam))
497496
CDAC_TYPE_FIELD(StubPrecodeData, /*uint8*/, Type, offsetof(StubPrecodeData, Type))
498497
CDAC_TYPE_END(StubPrecodeData)
499498

src/coreclr/inc/CrstTypes.def

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -175,9 +175,6 @@ End
175175
Crst DbgTransport
176176
End
177177

178-
Crst DelegateToFPtrHash
179-
End
180-
181178
Crst GenericDictionaryExpansion
182179
AcquiredBefore PinnedHeapHandleTable IbcProfile LoaderHeap SystemDomainDelayedUnloadList UniqueStack
183180
End

src/coreclr/inc/crsttypes_generated.h

Lines changed: 81 additions & 84 deletions
Original file line numberDiff line numberDiff line change
@@ -38,88 +38,87 @@ enum CrstType
3838
CrstDebuggerHeapLock = 20,
3939
CrstDebuggerJitInfo = 21,
4040
CrstDebuggerMutex = 22,
41-
CrstDelegateToFPtrHash = 23,
42-
CrstDynamicIL = 24,
43-
CrstDynamicMT = 25,
44-
CrstEtwTypeLogHash = 26,
45-
CrstEventPipe = 27,
46-
CrstEventStore = 28,
47-
CrstException = 29,
48-
CrstExecutableAllocatorLock = 30,
49-
CrstFCall = 31,
50-
CrstFrozenObjectHeap = 32,
51-
CrstFuncPtrStubs = 33,
52-
CrstFusionAppCtx = 34,
53-
CrstGCCover = 35,
54-
CrstGenericDictionaryExpansion = 36,
55-
CrstGlobalStrLiteralMap = 37,
56-
CrstHandleTable = 38,
57-
CrstIbcProfile = 39,
58-
CrstIJWFixupData = 40,
59-
CrstIJWHash = 41,
60-
CrstILStubGen = 42,
61-
CrstInlineTrackingMap = 43,
62-
CrstInstMethodHashTable = 44,
63-
CrstInterop = 45,
64-
CrstInteropData = 46,
65-
CrstIsJMCMethod = 47,
66-
CrstISymUnmanagedReader = 48,
67-
CrstJit = 49,
68-
CrstJitInlineTrackingMap = 50,
69-
CrstJitPatchpoint = 51,
70-
CrstJumpStubCache = 52,
71-
CrstLeafLock = 53,
72-
CrstListLock = 54,
73-
CrstLoaderAllocator = 55,
74-
CrstLoaderAllocatorReferences = 56,
75-
CrstLoaderHeap = 57,
76-
CrstManagedObjectWrapperMap = 58,
77-
CrstMethodDescBackpatchInfoTracker = 59,
78-
CrstMethodTableExposedObject = 60,
79-
CrstModule = 61,
80-
CrstModuleLookupTable = 62,
81-
CrstMulticoreJitHash = 63,
82-
CrstMulticoreJitManager = 64,
83-
CrstNativeImageEagerFixups = 65,
84-
CrstNativeImageLoad = 66,
85-
CrstNotifyGdb = 67,
86-
CrstPEImage = 68,
87-
CrstPendingTypeLoadEntry = 69,
88-
CrstPerfMap = 70,
89-
CrstPgoData = 71,
90-
CrstPinnedByrefValidation = 72,
91-
CrstPinnedHeapHandleTable = 73,
92-
CrstProfilerGCRefDataFreeList = 74,
93-
CrstProfilingAPIStatus = 75,
94-
CrstRCWCache = 76,
95-
CrstRCWCleanupList = 77,
96-
CrstReadyToRunEntryPointToMethodDescMap = 78,
97-
CrstReflection = 79,
98-
CrstReJITGlobalRequest = 80,
99-
CrstRetThunkCache = 81,
100-
CrstSigConvert = 82,
101-
CrstSingleUseLock = 83,
102-
CrstStressLog = 84,
103-
CrstStubCache = 85,
104-
CrstStubDispatchCache = 86,
105-
CrstSyncBlockCache = 87,
106-
CrstSyncHashLock = 88,
107-
CrstSystemDomain = 89,
108-
CrstSystemDomainDelayedUnloadList = 90,
109-
CrstThreadIdDispenser = 91,
110-
CrstThreadLocalStorageLock = 92,
111-
CrstThreadStore = 93,
112-
CrstTieredCompilation = 94,
113-
CrstTypeEquivalenceMap = 95,
114-
CrstTypeIDMap = 96,
115-
CrstUMEntryThunkCache = 97,
116-
CrstUMEntryThunkFreeListLock = 98,
117-
CrstUniqueStack = 99,
118-
CrstUnresolvedClassLock = 100,
119-
CrstUnwindInfoTableLock = 101,
120-
CrstVSDIndirectionCellLock = 102,
121-
CrstWrapperTemplate = 103,
122-
kNumberOfCrstTypes = 104
41+
CrstDynamicIL = 23,
42+
CrstDynamicMT = 24,
43+
CrstEtwTypeLogHash = 25,
44+
CrstEventPipe = 26,
45+
CrstEventStore = 27,
46+
CrstException = 28,
47+
CrstExecutableAllocatorLock = 29,
48+
CrstFCall = 30,
49+
CrstFrozenObjectHeap = 31,
50+
CrstFuncPtrStubs = 32,
51+
CrstFusionAppCtx = 33,
52+
CrstGCCover = 34,
53+
CrstGenericDictionaryExpansion = 35,
54+
CrstGlobalStrLiteralMap = 36,
55+
CrstHandleTable = 37,
56+
CrstIbcProfile = 38,
57+
CrstIJWFixupData = 39,
58+
CrstIJWHash = 40,
59+
CrstILStubGen = 41,
60+
CrstInlineTrackingMap = 42,
61+
CrstInstMethodHashTable = 43,
62+
CrstInterop = 44,
63+
CrstInteropData = 45,
64+
CrstIsJMCMethod = 46,
65+
CrstISymUnmanagedReader = 47,
66+
CrstJit = 48,
67+
CrstJitInlineTrackingMap = 49,
68+
CrstJitPatchpoint = 50,
69+
CrstJumpStubCache = 51,
70+
CrstLeafLock = 52,
71+
CrstListLock = 53,
72+
CrstLoaderAllocator = 54,
73+
CrstLoaderAllocatorReferences = 55,
74+
CrstLoaderHeap = 56,
75+
CrstManagedObjectWrapperMap = 57,
76+
CrstMethodDescBackpatchInfoTracker = 58,
77+
CrstMethodTableExposedObject = 59,
78+
CrstModule = 60,
79+
CrstModuleLookupTable = 61,
80+
CrstMulticoreJitHash = 62,
81+
CrstMulticoreJitManager = 63,
82+
CrstNativeImageEagerFixups = 64,
83+
CrstNativeImageLoad = 65,
84+
CrstNotifyGdb = 66,
85+
CrstPEImage = 67,
86+
CrstPendingTypeLoadEntry = 68,
87+
CrstPerfMap = 69,
88+
CrstPgoData = 70,
89+
CrstPinnedByrefValidation = 71,
90+
CrstPinnedHeapHandleTable = 72,
91+
CrstProfilerGCRefDataFreeList = 73,
92+
CrstProfilingAPIStatus = 74,
93+
CrstRCWCache = 75,
94+
CrstRCWCleanupList = 76,
95+
CrstReadyToRunEntryPointToMethodDescMap = 77,
96+
CrstReflection = 78,
97+
CrstReJITGlobalRequest = 79,
98+
CrstRetThunkCache = 80,
99+
CrstSigConvert = 81,
100+
CrstSingleUseLock = 82,
101+
CrstStressLog = 83,
102+
CrstStubCache = 84,
103+
CrstStubDispatchCache = 85,
104+
CrstSyncBlockCache = 86,
105+
CrstSyncHashLock = 87,
106+
CrstSystemDomain = 88,
107+
CrstSystemDomainDelayedUnloadList = 89,
108+
CrstThreadIdDispenser = 90,
109+
CrstThreadLocalStorageLock = 91,
110+
CrstThreadStore = 92,
111+
CrstTieredCompilation = 93,
112+
CrstTypeEquivalenceMap = 94,
113+
CrstTypeIDMap = 95,
114+
CrstUMEntryThunkCache = 96,
115+
CrstUMEntryThunkFreeListLock = 97,
116+
CrstUniqueStack = 98,
117+
CrstUnresolvedClassLock = 99,
118+
CrstUnwindInfoTableLock = 100,
119+
CrstVSDIndirectionCellLock = 101,
120+
CrstWrapperTemplate = 102,
121+
kNumberOfCrstTypes = 103
123122
};
124123

125124
#endif // __CRST_TYPES_INCLUDED
@@ -153,7 +152,6 @@ int g_rgCrstLevelMap[] =
153152
0, // CrstDebuggerHeapLock
154153
3, // CrstDebuggerJitInfo
155154
12, // CrstDebuggerMutex
156-
0, // CrstDelegateToFPtrHash
157155
0, // CrstDynamicIL
158156
9, // CrstDynamicMT
159157
0, // CrstEtwTypeLogHash
@@ -262,7 +260,6 @@ LPCSTR g_rgCrstNameMap[] =
262260
"CrstDebuggerHeapLock",
263261
"CrstDebuggerJitInfo",
264262
"CrstDebuggerMutex",
265-
"CrstDelegateToFPtrHash",
266263
"CrstDynamicIL",
267264
"CrstDynamicMT",
268265
"CrstEtwTypeLogHash",

src/coreclr/inc/dacvars.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,6 @@ DEFINE_DACVAR(VMHELPDEF *, dac__hlpDynamicFuncTable, ::hlpDynamicFuncTable)
9191
DEFINE_DACVAR(PTR_StubManager, StubManager__g_pFirstManager, StubManager::g_pFirstManager)
9292
DEFINE_DACVAR(PTR_PrecodeStubManager, PrecodeStubManager__g_pManager, PrecodeStubManager::g_pManager)
9393
DEFINE_DACVAR(PTR_StubLinkStubManager, StubLinkStubManager__g_pManager, StubLinkStubManager::g_pManager)
94-
DEFINE_DACVAR(PTR_ThunkHeapStubManager, ThunkHeapStubManager__g_pManager, ThunkHeapStubManager::g_pManager)
9594
DEFINE_DACVAR(PTR_JumpStubStubManager, JumpStubStubManager__g_pManager, JumpStubStubManager::g_pManager)
9695
DEFINE_DACVAR(PTR_RangeSectionStubManager, RangeSectionStubManager__g_pManager, RangeSectionStubManager::g_pManager)
9796
DEFINE_DACVAR(PTR_VirtualCallStubManagerManager, VirtualCallStubManagerManager__g_pManager, VirtualCallStubManagerManager::g_pManager)

src/coreclr/inc/vptr_list.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ VPTR_CLASS(ReflectionModule)
2424
VPTR_CLASS(PrecodeStubManager)
2525
VPTR_CLASS(StubLinkStubManager)
2626
VPTR_CLASS(ThePreStubManager)
27-
VPTR_CLASS(ThunkHeapStubManager)
2827
VPTR_CLASS(VirtualCallStubManager)
2928
VPTR_CLASS(VirtualCallStubManagerManager)
3029
VPTR_CLASS(JumpStubStubManager)

src/coreclr/vm/amd64/asmconstants.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -526,8 +526,8 @@ ASMCONSTANTS_C_ASSERT(FixupPrecodeData__PrecodeFixupThunk == offsetof(FixupPreco
526526
#define StubPrecodeData__Target 0x08
527527
ASMCONSTANTS_C_ASSERT(StubPrecodeData__Target == offsetof(StubPrecodeData, Target))
528528

529-
#define StubPrecodeData__MethodDesc 0x00
530-
ASMCONSTANTS_C_ASSERT(StubPrecodeData__MethodDesc == offsetof(StubPrecodeData, MethodDesc))
529+
#define StubPrecodeData__SecretParam 0x00
530+
ASMCONSTANTS_C_ASSERT(StubPrecodeData__SecretParam == offsetof(StubPrecodeData, SecretParam))
531531

532532
#define CallCountingStubData__RemainingCallCountCell 0x00
533533
ASMCONSTANTS_C_ASSERT(CallCountingStubData__RemainingCallCountCell == offsetof(CallCountingStubData, RemainingCallCountCell))

src/coreclr/vm/amd64/cgenamd64.cpp

Lines changed: 0 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -553,77 +553,6 @@ void emitJump(LPBYTE pBufferRX, LPBYTE pBufferRW, LPVOID target)
553553
_ASSERTE(DbgIsExecutable(pBufferRX, 12));
554554
}
555555

556-
void UMEntryThunkCode::Encode(UMEntryThunkCode *pEntryThunkCodeRX, BYTE* pTargetCode, void* pvSecretParam)
557-
{
558-
CONTRACTL
559-
{
560-
NOTHROW;
561-
GC_NOTRIGGER;
562-
MODE_ANY;
563-
}
564-
CONTRACTL_END;
565-
566-
// padding // CC CC CC CC
567-
// mov r10, pUMEntryThunk // 49 ba xx xx xx xx xx xx xx xx // METHODDESC_REGISTER
568-
// mov rax, pJmpDest // 48 b8 xx xx xx xx xx xx xx xx // need to ensure this imm64 is qword aligned
569-
// TAILJMP_RAX // 48 FF E0
570-
571-
#ifdef _DEBUG
572-
m_padding[0] = X86_INSTR_INT3;
573-
m_padding[1] = X86_INSTR_INT3;
574-
m_padding[2] = X86_INSTR_INT3;
575-
m_padding[3] = X86_INSTR_INT3;
576-
#endif // _DEBUG
577-
m_movR10[0] = REX_PREFIX_BASE | REX_OPERAND_SIZE_64BIT | REX_OPCODE_REG_EXT;
578-
m_movR10[1] = 0xBA;
579-
m_uet = pvSecretParam;
580-
m_movRAX[0] = REX_PREFIX_BASE | REX_OPERAND_SIZE_64BIT;
581-
m_movRAX[1] = 0xB8;
582-
m_execstub = pTargetCode;
583-
m_jmpRAX[0] = REX_PREFIX_BASE | REX_OPERAND_SIZE_64BIT;
584-
m_jmpRAX[1] = 0xFF;
585-
m_jmpRAX[2] = 0xE0;
586-
587-
_ASSERTE(DbgIsExecutable(&pEntryThunkCodeRX->m_movR10[0], &pEntryThunkCodeRX->m_jmpRAX[3]-&pEntryThunkCodeRX->m_movR10[0]));
588-
FlushInstructionCache(GetCurrentProcess(),pEntryThunkCodeRX,sizeof(UMEntryThunkCode));
589-
}
590-
591-
void UMEntryThunkCode::Poison()
592-
{
593-
CONTRACTL
594-
{
595-
NOTHROW;
596-
GC_NOTRIGGER;
597-
MODE_ANY;
598-
}
599-
CONTRACTL_END;
600-
601-
ExecutableWriterHolder<UMEntryThunkCode> thunkWriterHolder(this, sizeof(UMEntryThunkCode));
602-
UMEntryThunkCode *pThisRW = thunkWriterHolder.GetRW();
603-
604-
pThisRW->m_execstub = (BYTE *)UMEntryThunk::ReportViolation;
605-
606-
pThisRW->m_movR10[0] = REX_PREFIX_BASE | REX_OPERAND_SIZE_64BIT;
607-
#ifdef _WIN32
608-
// mov rcx, pUMEntryThunk // 48 b9 xx xx xx xx xx xx xx xx
609-
pThisRW->m_movR10[1] = 0xB9;
610-
#else
611-
// mov rdi, pUMEntryThunk // 48 bf xx xx xx xx xx xx xx xx
612-
pThisRW->m_movR10[1] = 0xBF;
613-
#endif
614-
615-
ClrFlushInstructionCache(&m_movR10[0], &m_jmpRAX[3]-&m_movR10[0], /* hasCodeExecutedBefore */ true);
616-
}
617-
618-
UMEntryThunk* UMEntryThunk::Decode(LPVOID pCallback)
619-
{
620-
LIMITED_METHOD_CONTRACT;
621-
622-
UMEntryThunkCode *pThunkCode = (UMEntryThunkCode*)((BYTE*)pCallback - UMEntryThunkCode::GetEntryPointOffset());
623-
624-
return (UMEntryThunk*)pThunkCode->m_uet;
625-
}
626-
627556
INT32 rel32UsingJumpStub(INT32 UNALIGNED * pRel32, PCODE target, MethodDesc *pMethod,
628557
LoaderAllocator *pLoaderAllocator /* = NULL */, bool throwOnOutOfMemoryWithinRange /*= true*/)
629558
{

src/coreclr/vm/amd64/cgencpu.h

Lines changed: 0 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -505,43 +505,6 @@ inline PCODE decodeBackToBackJump(PCODE pCode)
505505
extern "C" void setFPReturn(int fpSize, INT64 retVal);
506506
extern "C" void getFPReturn(int fpSize, INT64 *retval);
507507

508-
509-
#include <pshpack1.h>
510-
struct DECLSPEC_ALIGN(8) UMEntryThunkCode
511-
{
512-
// padding // CC CC CC CC
513-
// mov r10, pUMEntryThunk // 49 ba xx xx xx xx xx xx xx xx // METHODDESC_REGISTER
514-
// mov rax, pJmpDest // 48 b8 xx xx xx xx xx xx xx xx // need to ensure this imm64 is qword aligned
515-
// TAILJMP_RAX // 48 FF E0
516-
517-
BYTE m_padding[4];
518-
BYTE m_movR10[2]; // MOV R10,
519-
LPVOID m_uet; // pointer to start of this structure
520-
BYTE m_movRAX[2]; // MOV RAX,
521-
DECLSPEC_ALIGN(8)
522-
const BYTE* m_execstub; // pointer to destination code // ensure this is qword aligned
523-
BYTE m_jmpRAX[3]; // JMP RAX
524-
BYTE m_padding2[5];
525-
526-
void Encode(UMEntryThunkCode *pEntryThunkCodeRX, BYTE* pTargetCode, void* pvSecretParam);
527-
void Poison();
528-
529-
LPCBYTE GetEntryPoint() const
530-
{
531-
LIMITED_METHOD_CONTRACT;
532-
533-
return (LPCBYTE)&m_movR10;
534-
}
535-
536-
static int GetEntryPointOffset()
537-
{
538-
LIMITED_METHOD_CONTRACT;
539-
540-
return offsetof(UMEntryThunkCode, m_movR10);
541-
}
542-
};
543-
#include <poppack.h>
544-
545508
struct HijackArgs
546509
{
547510
#ifndef FEATURE_MULTIREG_RETURN

src/coreclr/vm/amd64/thunktemplates.S

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ STUB_PAGE_SIZE = 16384
1111
#define DATA_SLOT(stub, field) C_FUNC(stub##Code) + STUB_PAGE_SIZE + stub##Data__##field
1212

1313
LEAF_ENTRY StubPrecodeCode, _TEXT
14-
mov r10, [rip + DATA_SLOT(StubPrecode, MethodDesc)]
14+
mov r10, [rip + DATA_SLOT(StubPrecode, SecretParam)]
1515
jmp [rip + DATA_SLOT(StubPrecode, Target)]
1616
LEAF_END_MARKED StubPrecodeCode, _TEXT
1717

src/coreclr/vm/amd64/thunktemplates.asm

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ DATA_SLOT macro stub, field
1212
endm
1313

1414
LEAF_ENTRY StubPrecodeCode, _TEXT
15-
mov r10, QWORD PTR [DATA_SLOT(StubPrecode, MethodDesc)]
15+
mov r10, QWORD PTR [DATA_SLOT(StubPrecode, SecretParam)]
1616
jmp QWORD PTR [DATA_SLOT(StubPrecode, Target)]
1717
LEAF_END_MARKED StubPrecodeCode, _TEXT
1818

0 commit comments

Comments
 (0)