From b952d5fbe2a2f78dcb7d104af0ebe60e26219e00 Mon Sep 17 00:00:00 2001 From: Austin Wise Date: Sun, 22 Jan 2023 19:10:27 -0800 Subject: [PATCH 1/7] [NativeAOT] correctly initalize CONTEXT before failing fast --- src/coreclr/nativeaot/Runtime/EHHelpers.cpp | 11 ++++++- src/coreclr/nativeaot/Runtime/PalRedhawk.h | 31 +++++++++++++++++-- .../nativeaot/Runtime/unix/PalRedhawkUnix.cpp | 10 ++++++ .../Runtime/windows/PalRedhawkMinWin.cpp | 21 +++++++++++++ 4 files changed, 70 insertions(+), 3 deletions(-) diff --git a/src/coreclr/nativeaot/Runtime/EHHelpers.cpp b/src/coreclr/nativeaot/Runtime/EHHelpers.cpp index 507cb074046a91..912538229cab4a 100644 --- a/src/coreclr/nativeaot/Runtime/EHHelpers.cpp +++ b/src/coreclr/nativeaot/Runtime/EHHelpers.cpp @@ -91,9 +91,18 @@ COOP_PINVOKE_HELPER(int32_t, RhGetModuleFileName, (HANDLE moduleHandle, _Out_ co COOP_PINVOKE_HELPER(void, RhpCopyContextFromExInfo, (void * pOSContext, int32_t cbOSContext, PAL_LIMITED_CONTEXT * pPalContext)) { - UNREFERENCED_PARAMETER(cbOSContext); ASSERT((size_t)cbOSContext >= sizeof(CONTEXT)); + memset(pOSContext, 0, cbOSContext); CONTEXT* pContext = (CONTEXT *)pOSContext; + +#ifndef HOST_WASM + if (TryPopulateControlSegmentRegisters(pContext)) + { + pContext->ContextFlags |= CONTEXT_CONTROL; + } + pContext->ContextFlags |= CONTEXT_INTEGER; +#endif + #if defined(UNIX_AMD64_ABI) pContext->Rip = pPalContext->IP; pContext->Rsp = pPalContext->Rsp; diff --git a/src/coreclr/nativeaot/Runtime/PalRedhawk.h b/src/coreclr/nativeaot/Runtime/PalRedhawk.h index 007b3914415f01..633f7cf60cf22f 100644 --- a/src/coreclr/nativeaot/Runtime/PalRedhawk.h +++ b/src/coreclr/nativeaot/Runtime/PalRedhawk.h @@ -112,6 +112,11 @@ struct FILETIME #ifdef HOST_AMD64 +#define CONTEXT_AMD64 0x00100000L + +#define CONTEXT_CONTROL (CONTEXT_AMD64 | 0x00000001L) +#define CONTEXT_INTEGER (CONTEXT_AMD64 | 0x00000002L) + typedef struct DECLSPEC_ALIGN(16) _XSAVE_FORMAT { uint16_t ControlWord; uint16_t StatusWord; @@ -224,6 +229,11 @@ typedef struct DECLSPEC_ALIGN(16) _CONTEXT { } CONTEXT, *PCONTEXT; #elif defined(HOST_ARM) +#define CONTEXT_ARM 0x00200000L + +#define CONTEXT_CONTROL (CONTEXT_ARM | 0x1L) +#define CONTEXT_INTEGER (CONTEXT_ARM | 0x2L) + #define ARM_MAX_BREAKPOINTS 8 #define ARM_MAX_WATCHPOINTS 1 @@ -267,6 +277,12 @@ typedef struct DECLSPEC_ALIGN(8) _CONTEXT { } CONTEXT, *PCONTEXT; #elif defined(HOST_X86) + +#define CONTEXT_i386 0x00010000L + +#define CONTEXT_CONTROL (CONTEXT_i386 | 0x00000001L) // SS:SP, CS:IP, FLAGS, BP +#define CONTEXT_INTEGER (CONTEXT_i386 | 0x00000002L) // AX, BX, CX, DX, SI, DI + #define SIZE_OF_80387_REGISTERS 80 #define MAXIMUM_SUPPORTED_EXTENSION 512 @@ -321,6 +337,11 @@ typedef struct _CONTEXT { #elif defined(HOST_ARM64) +#define CONTEXT_ARM64 0x00400000L + +#define CONTEXT_CONTROL (CONTEXT_ARM64 | 0x1L) +#define CONTEXT_INTEGER (CONTEXT_ARM64 | 0x2L) + // Specify the number of breakpoints and watchpoints that the OS // will track. Architecturally, ARM64 supports up to 16. In practice, // however, almost no one implements more than 4 of each. @@ -466,8 +487,6 @@ typedef enum _EXCEPTION_DISPOSITION { //#endif // !DACCESS_COMPILE #endif // !_INC_WINDOWS - - #ifndef DACCESS_COMPILE #ifndef _INC_WINDOWS @@ -596,6 +615,14 @@ REDHAWK_PALIMPORT bool REDHAWK_PALAPI PalGetCompleteThreadContext(HANDLE hThread REDHAWK_PALIMPORT bool REDHAWK_PALAPI PalSetThreadContext(HANDLE hThread, _Out_ CONTEXT * pCtx); 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 plateform 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 int32_t REDHAWK_PALAPI PalGetProcessCpuCount(); // Retrieves the entire range of memory dedicated to the calling thread's stack. This does diff --git a/src/coreclr/nativeaot/Runtime/unix/PalRedhawkUnix.cpp b/src/coreclr/nativeaot/Runtime/unix/PalRedhawkUnix.cpp index 55ad31c82d886a..934026c43ab9c3 100644 --- a/src/coreclr/nativeaot/Runtime/unix/PalRedhawkUnix.cpp +++ b/src/coreclr/nativeaot/Runtime/unix/PalRedhawkUnix.cpp @@ -1100,6 +1100,16 @@ extern "C" int32_t _stricmp(const char *string1, const char *string2) return strcasecmp(string1, string2); } +REDHAWK_PALIMPORT bool REDHAWK_PALAPI TryPopulateControlSegmentRegisters(CONTEXT* pContext) +{ +#if defined(TARGET_X86) || defined(TARGET_AMD64) + // TODO: attempt to fill in SegCs and SegSs + return false; +#else + return true; +#endif +} + uint32_t g_RhNumberOfProcessors; REDHAWK_PALEXPORT int32_t PalGetProcessCpuCount() diff --git a/src/coreclr/nativeaot/Runtime/windows/PalRedhawkMinWin.cpp b/src/coreclr/nativeaot/Runtime/windows/PalRedhawkMinWin.cpp index 20238e87501d5e..6d0639c0eebd96 100644 --- a/src/coreclr/nativeaot/Runtime/windows/PalRedhawkMinWin.cpp +++ b/src/coreclr/nativeaot/Runtime/windows/PalRedhawkMinWin.cpp @@ -437,6 +437,27 @@ REDHAWK_PALEXPORT void REDHAWK_PALAPI PalRestoreContext(CONTEXT * pCtx) RtlRestoreContext(pCtx, NULL); } +REDHAWK_PALIMPORT bool REDHAWK_PALAPI TryPopulateControlSegmentRegisters(CONTEXT* pContext) +{ +#if defined(TARGET_X86) || defined(TARGET_AMD64) + HANDLE hThread = GetCurrentThread(); + + CONTEXT ctx; + memset(&ctx, 0, sizeof(ctx)); + ctx.ContextFlags = CONTEXT_CONTROL; + + if (!GetThreadContext(hThread, &ctx)) + { + return false; + } + + pContext->SegCs = ctx.SegCs; + pContext->SegSs = ctx.SegSs; +#endif //defined(TARGET_X86) || defined(TARGET_AMD64) + + return true; +} + static PalHijackCallback g_pHijackCallback; REDHAWK_PALEXPORT UInt32_BOOL REDHAWK_PALAPI PalRegisterHijackCallback(_In_ PalHijackCallback callback) From e779cca022d2c9dab133f68c01d5c532c74e06ba Mon Sep 17 00:00:00 2001 From: Austin Wise Date: Fri, 27 Jan 2023 11:24:56 -0800 Subject: [PATCH 2/7] Switch from using GetThreadContext to RtlCaptureContext. --- .../nativeaot/Runtime/windows/PalRedhawkMinWin.cpp | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/src/coreclr/nativeaot/Runtime/windows/PalRedhawkMinWin.cpp b/src/coreclr/nativeaot/Runtime/windows/PalRedhawkMinWin.cpp index 6d0639c0eebd96..16680f8d8f1d67 100644 --- a/src/coreclr/nativeaot/Runtime/windows/PalRedhawkMinWin.cpp +++ b/src/coreclr/nativeaot/Runtime/windows/PalRedhawkMinWin.cpp @@ -440,16 +440,9 @@ REDHAWK_PALEXPORT void REDHAWK_PALAPI PalRestoreContext(CONTEXT * pCtx) REDHAWK_PALIMPORT bool REDHAWK_PALAPI TryPopulateControlSegmentRegisters(CONTEXT* pContext) { #if defined(TARGET_X86) || defined(TARGET_AMD64) - HANDLE hThread = GetCurrentThread(); - CONTEXT ctx; - memset(&ctx, 0, sizeof(ctx)); - ctx.ContextFlags = CONTEXT_CONTROL; - if (!GetThreadContext(hThread, &ctx)) - { - return false; - } + RtlCaptureContext(&ctx); pContext->SegCs = ctx.SegCs; pContext->SegSs = ctx.SegSs; From 5f4ca4cd64b3b7dc1fbf5ec974a10cc39bc91735 Mon Sep 17 00:00:00 2001 From: Austin Wise Date: Fri, 27 Jan 2023 11:29:27 -0800 Subject: [PATCH 3/7] Add a better explination of why the function is unimplmented on Unix. --- src/coreclr/nativeaot/Runtime/unix/PalRedhawkUnix.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/coreclr/nativeaot/Runtime/unix/PalRedhawkUnix.cpp b/src/coreclr/nativeaot/Runtime/unix/PalRedhawkUnix.cpp index 934026c43ab9c3..c525bd9e2b2006 100644 --- a/src/coreclr/nativeaot/Runtime/unix/PalRedhawkUnix.cpp +++ b/src/coreclr/nativeaot/Runtime/unix/PalRedhawkUnix.cpp @@ -1103,7 +1103,8 @@ extern "C" int32_t _stricmp(const char *string1, const char *string2) REDHAWK_PALIMPORT bool REDHAWK_PALAPI TryPopulateControlSegmentRegisters(CONTEXT* pContext) { #if defined(TARGET_X86) || defined(TARGET_AMD64) - // TODO: attempt to fill in SegCs and SegSs + // 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; From 8971146b461f105561bd5c735c7f7a5e56878ac0 Mon Sep 17 00:00:00 2001 From: Austin Wise Date: Fri, 27 Jan 2023 12:32:59 -0800 Subject: [PATCH 4/7] Update src/coreclr/nativeaot/Runtime/PalRedhawk.h Co-authored-by: Vladimir Sadov --- src/coreclr/nativeaot/Runtime/PalRedhawk.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/coreclr/nativeaot/Runtime/PalRedhawk.h b/src/coreclr/nativeaot/Runtime/PalRedhawk.h index 633f7cf60cf22f..9c1cdedf604693 100644 --- a/src/coreclr/nativeaot/Runtime/PalRedhawk.h +++ b/src/coreclr/nativeaot/Runtime/PalRedhawk.h @@ -618,7 +618,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 plateform has no such registers or +// 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); From 55915c58d274ab58c57e85a45a3c6f850a61bd4d Mon Sep 17 00:00:00 2001 From: Austin Wise Date: Tue, 31 Jan 2023 09:40:49 -0800 Subject: [PATCH 5/7] Respond to feedback: unconditionally set CONTEXT_CONTROL --- src/coreclr/nativeaot/Runtime/EHHelpers.cpp | 14 +++++++------- src/coreclr/nativeaot/Runtime/PalRedhawk.h | 7 +++---- .../nativeaot/Runtime/unix/PalRedhawkUnix.cpp | 5 +---- .../nativeaot/Runtime/windows/PalRedhawkMinWin.cpp | 4 +--- 4 files changed, 12 insertions(+), 18 deletions(-) diff --git a/src/coreclr/nativeaot/Runtime/EHHelpers.cpp b/src/coreclr/nativeaot/Runtime/EHHelpers.cpp index 912538229cab4a..92121e37fa88ea 100644 --- a/src/coreclr/nativeaot/Runtime/EHHelpers.cpp +++ b/src/coreclr/nativeaot/Runtime/EHHelpers.cpp @@ -95,15 +95,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; @@ -115,6 +111,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; @@ -127,6 +124,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; @@ -135,6 +133,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; @@ -148,6 +147,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 diff --git a/src/coreclr/nativeaot/Runtime/PalRedhawk.h b/src/coreclr/nativeaot/Runtime/PalRedhawk.h index 9c1cdedf604693..43e9db47992c8f 100644 --- a/src/coreclr/nativeaot/Runtime/PalRedhawk.h +++ b/src/coreclr/nativeaot/Runtime/PalRedhawk.h @@ -487,6 +487,8 @@ typedef enum _EXCEPTION_DISPOSITION { //#endif // !DACCESS_COMPILE #endif // !_INC_WINDOWS + + #ifndef DACCESS_COMPILE #ifndef _INC_WINDOWS @@ -618,10 +620,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(); diff --git a/src/coreclr/nativeaot/Runtime/unix/PalRedhawkUnix.cpp b/src/coreclr/nativeaot/Runtime/unix/PalRedhawkUnix.cpp index c525bd9e2b2006..af0ba99e4380c3 100644 --- a/src/coreclr/nativeaot/Runtime/unix/PalRedhawkUnix.cpp +++ b/src/coreclr/nativeaot/Runtime/unix/PalRedhawkUnix.cpp @@ -1100,14 +1100,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 } diff --git a/src/coreclr/nativeaot/Runtime/windows/PalRedhawkMinWin.cpp b/src/coreclr/nativeaot/Runtime/windows/PalRedhawkMinWin.cpp index 16680f8d8f1d67..d1119264588898 100644 --- a/src/coreclr/nativeaot/Runtime/windows/PalRedhawkMinWin.cpp +++ b/src/coreclr/nativeaot/Runtime/windows/PalRedhawkMinWin.cpp @@ -437,7 +437,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; @@ -447,8 +447,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; From 89b4ef1d59c4615be940853df522a6ad0390c668 Mon Sep 17 00:00:00 2001 From: Austin Wise Date: Tue, 31 Jan 2023 10:04:22 -0800 Subject: [PATCH 6/7] Respond to feedback: consolidate setting of ContextFlags. --- src/coreclr/nativeaot/Runtime/EHHelpers.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/coreclr/nativeaot/Runtime/EHHelpers.cpp b/src/coreclr/nativeaot/Runtime/EHHelpers.cpp index 92121e37fa88ea..47f1fac93444e0 100644 --- a/src/coreclr/nativeaot/Runtime/EHHelpers.cpp +++ b/src/coreclr/nativeaot/Runtime/EHHelpers.cpp @@ -92,14 +92,18 @@ COOP_PINVOKE_HELPER(int32_t, RhGetModuleFileName, (HANDLE moduleHandle, _Out_ co COOP_PINVOKE_HELPER(void, RhpCopyContextFromExInfo, (void * pOSContext, int32_t cbOSContext, PAL_LIMITED_CONTEXT * pPalContext)) { ASSERT((size_t)cbOSContext >= sizeof(CONTEXT)); + +#ifndef HOST_WASM + memset(pOSContext, 0, cbOSContext); CONTEXT* pContext = (CONTEXT *)pOSContext; // 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; + +#if defined(UNIX_AMD64_ABI) pContext->Rip = pPalContext->IP; pContext->Rsp = pPalContext->Rsp; pContext->Rbp = pPalContext->Rbp; @@ -111,7 +115,6 @@ 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; @@ -124,7 +127,6 @@ 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; @@ -133,7 +135,6 @@ 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; @@ -147,7 +148,6 @@ 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 @@ -165,11 +165,11 @@ COOP_PINVOKE_HELPER(void, RhpCopyContextFromExInfo, (void * pOSContext, int32_t pContext->Sp = pPalContext->SP; pContext->Lr = pPalContext->LR; pContext->Pc = pPalContext->IP; -#elif defined(HOST_WASM) - // No registers, no work to do yet #else #error Not Implemented for this architecture -- RhpCopyContextFromExInfo #endif + +#endif // !HOST_WASM } #if defined(HOST_AMD64) || defined(HOST_ARM) || defined(HOST_X86) || defined(HOST_ARM64) From 628a023917c78ef67b524ba444be7bcc2219b334 Mon Sep 17 00:00:00 2001 From: Austin Wise Date: Tue, 31 Jan 2023 10:07:54 -0800 Subject: [PATCH 7/7] On second thought, don't add a second layer of ifdef nesting. --- src/coreclr/nativeaot/Runtime/EHHelpers.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/coreclr/nativeaot/Runtime/EHHelpers.cpp b/src/coreclr/nativeaot/Runtime/EHHelpers.cpp index 47f1fac93444e0..10c9906f5a0835 100644 --- a/src/coreclr/nativeaot/Runtime/EHHelpers.cpp +++ b/src/coreclr/nativeaot/Runtime/EHHelpers.cpp @@ -92,16 +92,17 @@ COOP_PINVOKE_HELPER(int32_t, RhGetModuleFileName, (HANDLE moduleHandle, _Out_ co COOP_PINVOKE_HELPER(void, RhpCopyContextFromExInfo, (void * pOSContext, int32_t cbOSContext, PAL_LIMITED_CONTEXT * pPalContext)) { ASSERT((size_t)cbOSContext >= sizeof(CONTEXT)); + CONTEXT* pContext = (CONTEXT *)pOSContext; #ifndef HOST_WASM memset(pOSContext, 0, cbOSContext); - CONTEXT* pContext = (CONTEXT *)pOSContext; + pContext->ContextFlags = CONTEXT_CONTROL | CONTEXT_INTEGER; // Fill in CONTEXT_CONTROL registers that were not captured in PAL_LIMITED_CONTEXT. PopulateControlSegmentRegisters(pContext); - pContext->ContextFlags = CONTEXT_CONTROL | CONTEXT_INTEGER; +#endif // !HOST_WASM #if defined(UNIX_AMD64_ABI) pContext->Rip = pPalContext->IP; @@ -165,11 +166,11 @@ COOP_PINVOKE_HELPER(void, RhpCopyContextFromExInfo, (void * pOSContext, int32_t pContext->Sp = pPalContext->SP; pContext->Lr = pPalContext->LR; pContext->Pc = pPalContext->IP; +#elif defined(HOST_WASM) + // No registers, no work to do yet #else #error Not Implemented for this architecture -- RhpCopyContextFromExInfo #endif - -#endif // !HOST_WASM } #if defined(HOST_AMD64) || defined(HOST_ARM) || defined(HOST_X86) || defined(HOST_ARM64)