Skip to content

Commit 33bc25d

Browse files
authored
Adding GetTLSIndex cDAC implementation (#117587)
* adding GetTLSIndex cDAC implementation
1 parent 43d7609 commit 33bc25d

File tree

7 files changed

+41
-4
lines changed

7 files changed

+41
-4
lines changed

src/coreclr/debug/runtimeinfo/datadescriptor.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -968,6 +968,10 @@ CDAC_GLOBAL_POINTER(StringMethodTable, &::g_pStringClass)
968968
CDAC_GLOBAL_POINTER(SyncTableEntries, &::g_pSyncTable)
969969
CDAC_GLOBAL_POINTER(MiniMetaDataBuffAddress, &::g_MiniMetaDataBuffAddress)
970970
CDAC_GLOBAL_POINTER(MiniMetaDataBuffMaxSize, &::g_MiniMetaDataBuffMaxSize)
971+
CDAC_GLOBAL_POINTER(OffsetOfCurrentThreadInfo, &::g_offsetOfCurrentThreadInfo)
972+
#ifdef TARGET_WINDOWS
973+
CDAC_GLOBAL_POINTER(TlsIndexBase, &::_tls_index)
974+
#endif // TARGET_WINDOWS
971975
#ifdef STRESS_LOG
972976
CDAC_GLOBAL(StressLogEnabled, uint8, 1)
973977
CDAC_GLOBAL_POINTER(StressLog, &g_pStressLog)

src/coreclr/inc/dacvars.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,7 @@ DEFINE_DACVAR(PTR_SystemDomain, SystemDomain__m_pSystemDomain, SystemDomain::m_p
115115
DEFINE_DACVAR(DWORD, dac__g_debuggerWordTLSIndex, g_debuggerWordTLSIndex)
116116
#endif
117117
DEFINE_DACVAR(DWORD, dac__g_TlsIndex, g_TlsIndex)
118+
DEFINE_DACVAR(DWORD, dac__g_offsetOfCurrentThreadInfo, g_offsetOfCurrentThreadInfo)
118119

119120
#ifdef FEATURE_EH_FUNCLETS
120121
DEFINE_DACVAR(UNKNOWN_POINTER_TYPE, dac__g_pEHClass, ::g_pEHClass)

src/coreclr/vm/threads.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1142,13 +1142,13 @@ void InitThreadManager()
11421142
#ifndef TARGET_UNIX
11431143
_ASSERTE(GetThreadNULLOk() == NULL);
11441144

1145-
size_t offsetOfCurrentThreadInfo = Thread::GetOffsetOfThreadStatic(&t_CurrentThreadInfo);
1145+
g_offsetOfCurrentThreadInfo = (DWORD)Thread::GetOffsetOfThreadStatic(&t_CurrentThreadInfo);
11461146

1147-
_ASSERTE(offsetOfCurrentThreadInfo < 0x8000);
1147+
_ASSERTE(g_offsetOfCurrentThreadInfo < 0x8000);
11481148
_ASSERTE(_tls_index < 0x10000);
11491149

11501150
// Save t_CurrentThreadInfo location for debugger
1151-
SetIlsIndex((DWORD)(_tls_index + (offsetOfCurrentThreadInfo << 16) + 0x80000000));
1151+
SetIlsIndex((DWORD)(_tls_index + (g_offsetOfCurrentThreadInfo << 16) + 0x80000000));
11521152

11531153
_ASSERTE(g_TrapReturningThreads == 0);
11541154
#endif // !TARGET_UNIX

src/coreclr/vm/vars.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@ GPTR_IMPL(RCWCleanupList,g_pRCWCleanupList);
9393
GVAL_IMPL_INIT(DWORD, g_debuggerWordTLSIndex, TLS_OUT_OF_INDEXES);
9494
#endif
9595
GVAL_IMPL_INIT(DWORD, g_TlsIndex, TLS_OUT_OF_INDEXES);
96+
GVAL_IMPL_INIT(DWORD, g_offsetOfCurrentThreadInfo, 0);
9697

9798
MethodTable* g_pCastHelpers;
9899
#ifdef FEATURE_EH_FUNCLETS

src/coreclr/vm/vars.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -356,6 +356,7 @@ GPTR_DECL(MethodDesc, g_pObjectFinalizerMD);
356356
GVAL_DECL(DWORD, g_debuggerWordTLSIndex);
357357
#endif
358358
GVAL_DECL(DWORD, g_TlsIndex);
359+
GVAL_DECL(DWORD, g_offsetOfCurrentThreadInfo);
359360

360361
#ifdef FEATURE_EH_FUNCLETS
361362
GPTR_DECL(MethodTable, g_pEHClass);

src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Constants.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ public static class Globals
2727

2828
public const string MiniMetaDataBuffAddress = nameof(MiniMetaDataBuffAddress);
2929
public const string MiniMetaDataBuffMaxSize = nameof(MiniMetaDataBuffMaxSize);
30+
public const string OffsetOfCurrentThreadInfo = nameof(OffsetOfCurrentThreadInfo);
31+
public const string TlsIndexBase = nameof(TlsIndexBase);
3032

3133
public const string StressLogEnabled = nameof(StressLogEnabled);
3234
public const string StressLogHasModuleTable = nameof(StressLogHasModuleTable);

src/native/managed/cdac/mscordaccore_universal/Legacy/SOSDacImpl.cs

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1693,8 +1693,36 @@ int ISOSDacInterface.GetThreadStoreData(DacpThreadStoreData* data)
16931693
}
16941694

16951695
int ISOSDacInterface.GetTLSIndex(uint* pIndex)
1696-
=> _legacyImpl is not null ? _legacyImpl.GetTLSIndex(pIndex) : HResults.E_NOTIMPL;
1696+
{
1697+
if (pIndex == null)
1698+
return HResults.E_INVALIDARG;
16971699

1700+
int hr = HResults.S_OK;
1701+
try
1702+
{
1703+
uint TlsIndexBase = _target.Read<uint>(_target.ReadGlobalPointer(Constants.Globals.TlsIndexBase));
1704+
uint OffsetOfCurrentThreadInfo = _target.Read<uint>(_target.ReadGlobalPointer(Constants.Globals.OffsetOfCurrentThreadInfo));
1705+
uint CombinedTlsIndex = TlsIndexBase + (OffsetOfCurrentThreadInfo << 16) + 0x80000000;
1706+
*pIndex = CombinedTlsIndex;
1707+
}
1708+
catch (System.Exception ex)
1709+
{
1710+
hr = ex.HResult;
1711+
}
1712+
#if DEBUG
1713+
if (_legacyImpl is not null)
1714+
{
1715+
uint indexLocal;
1716+
int hrLocal = _legacyImpl.GetTLSIndex(&indexLocal);
1717+
Debug.Assert(hrLocal == hr, $"cDAC: {hr:x}, DAC: {hrLocal:x}");
1718+
if (hr == HResults.S_OK || hr == HResults.S_FALSE)
1719+
{
1720+
Debug.Assert(*pIndex == indexLocal);
1721+
}
1722+
}
1723+
#endif
1724+
return hr;
1725+
}
16981726
int ISOSDacInterface.GetUsefulGlobals(DacpUsefulGlobalsData* data)
16991727
{
17001728
if (data == null)

0 commit comments

Comments
 (0)