From 81c66f7b604d4776581f6bcc5057b74a89b856d3 Mon Sep 17 00:00:00 2001 From: SaeHie Park Date: Thu, 24 Nov 2016 18:43:00 +0900 Subject: [PATCH] [x86/Linux] Fix unsupported architecture in seh-unwind.cpp (dotnet/coreclr#8262) Fix compile error for x86/Linux - add ASSIGN_UNWIND_REGS in seh-unwind.cpp for x86 - add CONTEXT_EXCEPTION_ACTIVE in pal.h for x86 - add CONTEXT_XSTATE in pal.h for x86 Commit migrated from https://github.com/dotnet/coreclr/commit/f85bf7cdf194c6d87aca6a3d3f741db92f2a642e --- src/coreclr/src/pal/inc/pal.h | 7 ++++++ src/coreclr/src/pal/src/exception/seh-unwind.cpp | 27 ++++++++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/src/coreclr/src/pal/inc/pal.h b/src/coreclr/src/pal/inc/pal.h index 93323eb..3576057 100644 --- a/src/coreclr/src/pal/inc/pal.h +++ b/src/coreclr/src/pal/inc/pal.h @@ -1831,6 +1831,13 @@ QueueUserAPC( #define MAXIMUM_SUPPORTED_EXTENSION 512 +#define CONTEXT_XSTATE (CONTEXT_i386 | 0x40L) + +#define CONTEXT_EXCEPTION_ACTIVE 0x8000000L +#define CONTEXT_SERVICE_ACTIVE 0x10000000L +#define CONTEXT_EXCEPTION_REQUEST 0x40000000L +#define CONTEXT_EXCEPTION_REPORTING 0x80000000L + typedef struct _FLOATING_SAVE_AREA { DWORD ControlWord; DWORD StatusWord; diff --git a/src/coreclr/src/pal/src/exception/seh-unwind.cpp b/src/coreclr/src/pal/src/exception/seh-unwind.cpp index 6f552bd..fa2f109 100644 --- a/src/coreclr/src/pal/src/exception/seh-unwind.cpp +++ b/src/coreclr/src/pal/src/exception/seh-unwind.cpp @@ -73,6 +73,14 @@ Abstract: ASSIGN_REG(X26) \ ASSIGN_REG(X27) \ ASSIGN_REG(X28) +#elif defined(_X86_) +#define ASSIGN_UNWIND_REGS \ + ASSIGN_REG(Eip) \ + ASSIGN_REG(Esp) \ + ASSIGN_REG(Ebp) \ + ASSIGN_REG(Ebx) \ + ASSIGN_REG(Esi) \ + ASSIGN_REG(Edi) #else #error unsupported architecture #endif @@ -122,6 +130,13 @@ static void WinContextToUnwindCursor(CONTEXT *winContext, unw_cursor_t *cursor) unw_set_reg(cursor, UNW_X86_64_R13, winContext->R13); unw_set_reg(cursor, UNW_X86_64_R14, winContext->R14); unw_set_reg(cursor, UNW_X86_64_R15, winContext->R15); +#elif defined(_X86_) + unw_set_reg(cursor, UNW_REG_IP, winContext->Eip); + unw_set_reg(cursor, UNW_REG_SP, winContext->Esp); + unw_set_reg(cursor, UNW_X86_EBP, winContext->Ebp); + unw_set_reg(cursor, UNW_X86_EBX, winContext->Ebx); + unw_set_reg(cursor, UNW_X86_ESI, winContext->Esi); + unw_set_reg(cursor, UNW_X86_EDI, winContext->Edi); #endif } #endif @@ -137,6 +152,13 @@ static void UnwindContextToWinContext(unw_cursor_t *cursor, CONTEXT *winContext) unw_get_reg(cursor, UNW_X86_64_R13, (unw_word_t *) &winContext->R13); unw_get_reg(cursor, UNW_X86_64_R14, (unw_word_t *) &winContext->R14); unw_get_reg(cursor, UNW_X86_64_R15, (unw_word_t *) &winContext->R15); +#elif defined(_X86_) + unw_get_reg(cursor, UNW_REG_IP, (unw_word_t *) &winContext->Eip); + unw_get_reg(cursor, UNW_REG_SP, (unw_word_t *) &winContext->Esp); + unw_get_reg(cursor, UNW_X86_EBP, (unw_word_t *) &winContext->Ebp); + unw_get_reg(cursor, UNW_X86_EBX, (unw_word_t *) &winContext->Ebx); + unw_get_reg(cursor, UNW_X86_ESI, (unw_word_t *) &winContext->Esi); + unw_get_reg(cursor, UNW_X86_EDI, (unw_word_t *) &winContext->Edi); #elif defined(_ARM_) unw_get_reg(cursor, UNW_REG_SP, (unw_word_t *) &winContext->Sp); unw_get_reg(cursor, UNW_REG_IP, (unw_word_t *) &winContext->Pc); @@ -196,6 +218,11 @@ static void GetContextPointers(unw_cursor_t *cursor, unw_context_t *unwContext, GetContextPointer(cursor, unwContext, UNW_X86_64_R13, &contextPointers->R13); GetContextPointer(cursor, unwContext, UNW_X86_64_R14, &contextPointers->R14); GetContextPointer(cursor, unwContext, UNW_X86_64_R15, &contextPointers->R15); +#elif defined(_X86_) + GetContextPointer(cursor, unwContext, UNW_X86_EBX, &contextPointers->Ebx); + GetContextPointer(cursor, unwContext, UNW_X86_EBP, &contextPointers->Ebp); + GetContextPointer(cursor, unwContext, UNW_X86_ESI, &contextPointers->Esi); + GetContextPointer(cursor, unwContext, UNW_X86_EDI, &contextPointers->Edi); #elif defined(_ARM_) GetContextPointer(cursor, unwContext, UNW_ARM_R4, &contextPointers->R4); GetContextPointer(cursor, unwContext, UNW_ARM_R5, &contextPointers->R5); -- 2.7.4