Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Respond to feedback: unconditionally set CONTEXT_CONTROL
  • Loading branch information
AustinWise committed Jan 31, 2023
commit 5f2ba0da32a3c3cb9daece0e6cf651e4e98ee625
14 changes: 7 additions & 7 deletions src/coreclr/nativeaot/Runtime/EHHelpers.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -94,15 +94,11 @@ COOP_PINVOKE_HELPER(void, RhpCopyContextFromExInfo, (void * pOSContext, int32_t
memset(pOSContext, 0, cbOSContext);
CONTEXT* pContext = (CONTEXT *)pOSContext;

#ifndef HOST_WASM
if (TryPopulateControlSegmentRegisters(pContext))
{
pContext->ContextFlags |= CONTEXT_CONTROL;
}
pContext->ContextFlags |= CONTEXT_INTEGER;
#endif
// Fill in CONTEXT_CONTROL registers that were not captured in PAL_LIMITED_CONTEXT.
PopulateControlSegmentRegisters(pContext);

#if defined(UNIX_AMD64_ABI)
pContext->ContextFlags = CONTEXT_CONTROL | CONTEXT_INTEGER;
pContext->Rip = pPalContext->IP;
pContext->Rsp = pPalContext->Rsp;
pContext->Rbp = pPalContext->Rbp;
Expand All @@ -114,6 +110,7 @@ COOP_PINVOKE_HELPER(void, RhpCopyContextFromExInfo, (void * pOSContext, int32_t
pContext->R14 = pPalContext->R14;
pContext->R15 = pPalContext->R15;
#elif defined(HOST_AMD64)
pContext->ContextFlags = CONTEXT_CONTROL | CONTEXT_INTEGER;
pContext->Rip = pPalContext->IP;
pContext->Rsp = pPalContext->Rsp;
pContext->Rbp = pPalContext->Rbp;
Expand All @@ -126,6 +123,7 @@ COOP_PINVOKE_HELPER(void, RhpCopyContextFromExInfo, (void * pOSContext, int32_t
pContext->R14 = pPalContext->R14;
pContext->R15 = pPalContext->R15;
#elif defined(HOST_X86)
pContext->ContextFlags = CONTEXT_CONTROL | CONTEXT_INTEGER;
pContext->Eip = pPalContext->IP;
pContext->Esp = pPalContext->Rsp;
pContext->Ebp = pPalContext->Rbp;
Expand All @@ -134,6 +132,7 @@ COOP_PINVOKE_HELPER(void, RhpCopyContextFromExInfo, (void * pOSContext, int32_t
pContext->Eax = pPalContext->Rax;
pContext->Ebx = pPalContext->Rbx;
#elif defined(HOST_ARM)
pContext->ContextFlags = CONTEXT_CONTROL | CONTEXT_INTEGER;
pContext->R0 = pPalContext->R0;
pContext->R4 = pPalContext->R4;
pContext->R5 = pPalContext->R5;
Expand All @@ -147,6 +146,7 @@ COOP_PINVOKE_HELPER(void, RhpCopyContextFromExInfo, (void * pOSContext, int32_t
pContext->Lr = pPalContext->LR;
pContext->Pc = pPalContext->IP;
#elif defined(HOST_ARM64)
pContext->ContextFlags = CONTEXT_CONTROL | CONTEXT_INTEGER;
pContext->X0 = pPalContext->X0;
pContext->X1 = pPalContext->X1;
// TODO: Copy registers X2-X7 when we start supporting HVA's
Expand Down
7 changes: 3 additions & 4 deletions src/coreclr/nativeaot/Runtime/PalRedhawk.h
Original file line number Diff line number Diff line change
Expand Up @@ -505,6 +505,8 @@ typedef enum _EXCEPTION_DISPOSITION {
//#endif // !DACCESS_COMPILE
#endif // !_INC_WINDOWS



#ifndef DACCESS_COMPILE
#ifndef _INC_WINDOWS

Expand Down Expand Up @@ -636,10 +638,7 @@ REDHAWK_PALIMPORT void REDHAWK_PALAPI PalRestoreContext(CONTEXT * pCtx);
// For platforms that have segment registers in the CONTEXT_CONTROL set that
// are not saved in PAL_LIMITED_CONTEXT, this captures them from the current
// thread and saves them in `pContext`.
// This function returns true if the current platform has no such registers or
// if the registers are successfully saved in `pContext`.
// Other false is returned.
REDHAWK_PALIMPORT bool REDHAWK_PALAPI TryPopulateControlSegmentRegisters(CONTEXT* pContext);
REDHAWK_PALIMPORT void REDHAWK_PALAPI PopulateControlSegmentRegisters(CONTEXT* pContext);

REDHAWK_PALIMPORT int32_t REDHAWK_PALAPI PalGetProcessCpuCount();

Expand Down
5 changes: 1 addition & 4 deletions src/coreclr/nativeaot/Runtime/unix/PalRedhawkUnix.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1068,14 +1068,11 @@ extern "C" int32_t _stricmp(const char *string1, const char *string2)
return strcasecmp(string1, string2);
}

REDHAWK_PALIMPORT bool REDHAWK_PALAPI TryPopulateControlSegmentRegisters(CONTEXT* pContext)
REDHAWK_PALIMPORT void REDHAWK_PALAPI PopulateControlSegmentRegisters(CONTEXT* pContext)
{
#if defined(TARGET_X86) || defined(TARGET_AMD64)
// Currently the CONTEXT is only used on Windows for RaiseFailFastException.
// So we punt on filling in SegCs and SegSs for now.
return false;
#else
return true;
#endif
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -446,7 +446,7 @@ REDHAWK_PALEXPORT void REDHAWK_PALAPI PalRestoreContext(CONTEXT * pCtx)
RtlRestoreContext(pCtx, NULL);
}

REDHAWK_PALIMPORT bool REDHAWK_PALAPI TryPopulateControlSegmentRegisters(CONTEXT* pContext)
REDHAWK_PALIMPORT void REDHAWK_PALAPI PopulateControlSegmentRegisters(CONTEXT* pContext)
{
#if defined(TARGET_X86) || defined(TARGET_AMD64)
CONTEXT ctx;
Expand All @@ -456,8 +456,6 @@ REDHAWK_PALIMPORT bool REDHAWK_PALAPI TryPopulateControlSegmentRegisters(CONTEXT
pContext->SegCs = ctx.SegCs;
pContext->SegSs = ctx.SegSs;
#endif //defined(TARGET_X86) || defined(TARGET_AMD64)

return true;
}

static PalHijackCallback g_pHijackCallback;
Expand Down