From: Jan Vorlicek Date: Wed, 8 Apr 2015 11:15:32 +0000 (+0200) Subject: Refactor context register access in seh-unwind.cpp X-Git-Tag: accepted/tizen/base/20180629.140029~6873^2 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=deb93573e834ce7c3e88ec8660e3a3da3be441af;p=platform%2Fupstream%2Fcoreclr.git Refactor context register access in seh-unwind.cpp This change refactors the native context register access to use the MCREG_xxx macros so that it can compile on FreeBSD too. --- diff --git a/src/pal/src/arch/i386/context.cpp b/src/pal/src/arch/i386/context.cpp index 5ac1905..d749f87 100644 --- a/src/pal/src/arch/i386/context.cpp +++ b/src/pal/src/arch/i386/context.cpp @@ -53,195 +53,6 @@ extern void CONTEXT_CaptureContext(LPCONTEXT lpContext); #include #endif // HAVE_PT_REGS -#if HAVE_GREGSET_T - -#ifdef BIT64 -#define MCREG_Rbx(mc) ((mc).gregs[REG_RBX]) -#define MCREG_Rcx(mc) ((mc).gregs[REG_RCX]) -#define MCREG_Rdx(mc) ((mc).gregs[REG_RDX]) -#define MCREG_Rsi(mc) ((mc).gregs[REG_RSI]) -#define MCREG_Rdi(mc) ((mc).gregs[REG_RDI]) -#define MCREG_Rbp(mc) ((mc).gregs[REG_RBP]) -#define MCREG_Rax(mc) ((mc).gregs[REG_RAX]) -#define MCREG_Rip(mc) ((mc).gregs[REG_RIP]) -#define MCREG_Rsp(mc) ((mc).gregs[REG_RSP]) -#define MCREG_SegCs(mc) ((mc).gregs[REG_CSGSFS]) -#define MCREG_R8(mc) ((mc).gregs[REG_R8]) -#define MCREG_R9(mc) ((mc).gregs[REG_R9]) -#define MCREG_R10(mc) ((mc).gregs[REG_R10]) -#define MCREG_R11(mc) ((mc).gregs[REG_R11]) -#define MCREG_R12(mc) ((mc).gregs[REG_R12]) -#define MCREG_R13(mc) ((mc).gregs[REG_R13]) -#define MCREG_R14(mc) ((mc).gregs[REG_R14]) -#define MCREG_R15(mc) ((mc).gregs[REG_R15]) - -#define FPREG_Xmm(uc, index) *(M128A*)&((uc)->__fpregs_mem._xmm[index]) - -#define FPREG_St(uc, index) *(M128A*)&((uc)->__fpregs_mem._st[index]) - -#define FPREG_ControlWord(uc) ((uc)->__fpregs_mem.cwd) -#define FPREG_StatusWord(uc) ((uc)->__fpregs_mem.swd) -#define FPREG_TagWord(uc) ((uc)->__fpregs_mem.ftw) -#define FPREG_ErrorOffset(uc) *(DWORD*)&((uc)->__fpregs_mem.rip) -#define FPREG_ErrorSelector(uc) *(((WORD*)&((uc)->__fpregs_mem.rip)) + 2) -#define FPREG_DataOffset(uc) *(DWORD*)&((uc)->__fpregs_mem.rdp) -#define FPREG_DataSelector(uc) *(((WORD*)&((uc)->__fpregs_mem.rdp)) + 2) -#define FPREG_MxCsr(uc) ((uc)->__fpregs_mem.mxcsr) -#define FPREG_MxCsr_Mask(uc) ((uc)->__fpregs_mem.mxcr_mask) - -#else // BIT64 - -#define MCREG_Ebx(mc) ((mc).gregs[REG_EBX]) -#define MCREG_Ecx(mc) ((mc).gregs[REG_ECX]) -#define MCREG_Edx(mc) ((mc).gregs[REG_EDX]) -#define MCREG_Esi(mc) ((mc).gregs[REG_ESI]) -#define MCREG_Edi(mc) ((mc).gregs[REG_EDI]) -#define MCREG_Ebp(mc) ((mc).gregs[REG_EBP]) -#define MCREG_Eax(mc) ((mc).gregs[REG_EAX]) -#define MCREG_Eip(mc) ((mc).gregs[REG_EIP]) -#define MCREG_Esp(mc) ((mc).gregs[REG_ESP]) -#define MCREG_SegCs(mc) ((mc).gregs[REG_CS]) -#define MCREG_SegSs(mc) ((mc).gregs[REG_SS]) - -#endif // BIT64 - -#define MCREG_EFlags(mc) ((mc).gregs[REG_EFL]) - -#else // HAVE_GREGSET_T - -#ifdef BIT64 - -// For FreeBSD, as found in x86/ucontext.h -#define MCREG_Rbp(mc) ((mc).mc_rbp) -#define MCREG_Rip(mc) ((mc).mc_rip) -#define MCREG_Rsp(mc) ((mc).mc_rsp) -#define MCREG_Rsi(mc) ((mc).mc_rsi) -#define MCREG_Rdi(mc) ((mc).mc_rdi) -#define MCREG_Rbx(mc) ((mc).mc_rbx) -#define MCREG_Rdx(mc) ((mc).mc_rdx) -#define MCREG_Rcx(mc) ((mc).mc_rcx) -#define MCREG_Rax(mc) ((mc).mc_rax) -#define MCREG_R8(mc) ((mc).mc_r8) -#define MCREG_R9(mc) ((mc).mc_r9) -#define MCREG_R10(mc) ((mc).mc_r10) -#define MCREG_R11(mc) ((mc).mc_r11) -#define MCREG_R12(mc) ((mc).mc_r12) -#define MCREG_R13(mc) ((mc).mc_r13) -#define MCREG_R14(mc) ((mc).mc_r14) -#define MCREG_R15(mc) ((mc).mc_r15) -#define MCREG_EFlags(mc) ((mc).mc_rflags) -#define MCREG_SegCs(mc) ((mc).mc_cs) - -#else // BIT64 - -#define MCREG_Ebx(mc) ((mc).mc_ebx) -#define MCREG_Ecx(mc) ((mc).mc_ecx) -#define MCREG_Edx(mc) ((mc).mc_edx) -#define MCREG_Esi(mc) ((mc).mc_esi) -#define MCREG_Edi(mc) ((mc).mc_edi) -#define MCREG_Ebp(mc) ((mc).mc_ebp) -#define MCREG_Eax(mc) ((mc).mc_eax) -#define MCREG_Eip(mc) ((mc).mc_eip) -#define MCREG_SegCs(mc) ((mc).mc_cs) -#define MCREG_EFlags(mc) ((mc).mc_eflags) -#define MCREG_Esp(mc) ((mc).mc_esp) -#define MCREG_SegSs(mc) ((mc).mc_ss) - -#endif // BIT64 - -#endif // HAVE_GREGSET_T - - -#if HAVE_PT_REGS - -#ifdef BIT64 -#define PTREG_Rbx(ptreg) ((ptreg).rbx) -#define PTREG_Rcx(ptreg) ((ptreg).rcx) -#define PTREG_Rdx(ptreg) ((ptreg).rdx) -#define PTREG_Rsi(ptreg) ((ptreg).rsi) -#define PTREG_Rdi(ptreg) ((ptreg).rdi) -#define PTREG_Rbp(ptreg) ((ptreg).rbp) -#define PTREG_Rax(ptreg) ((ptreg).rax) -#define PTREG_Rip(ptreg) ((ptreg).rip) -#define PTREG_SegCs(ptreg) ((ptreg).cs) -#define PTREG_SegSs(ptreg) ((ptreg).ss) -#define PTREG_Rsp(ptreg) ((ptreg).rsp) -#define PTREG_R8(ptreg) ((ptreg).r8) -#define PTREG_R9(ptreg) ((ptreg).r9) -#define PTREG_R10(ptreg) ((ptreg).r10) -#define PTREG_R11(ptreg) ((ptreg).r11) -#define PTREG_R12(ptreg) ((ptreg).r12) -#define PTREG_R13(ptreg) ((ptreg).r13) -#define PTREG_R14(ptreg) ((ptreg).r14) -#define PTREG_R15(ptreg) ((ptreg).r15) - -#else // BIT64 - -#define PTREG_Ebx(ptreg) ((ptreg).ebx) -#define PTREG_Ecx(ptreg) ((ptreg).ecx) -#define PTREG_Edx(ptreg) ((ptreg).edx) -#define PTREG_Esi(ptreg) ((ptreg).esi) -#define PTREG_Edi(ptreg) ((ptreg).edi) -#define PTREG_Ebp(ptreg) ((ptreg).ebp) -#define PTREG_Eax(ptreg) ((ptreg).eax) -#define PTREG_Eip(ptreg) ((ptreg).eip) -#define PTREG_SegCs(ptreg) ((ptreg).xcs) -#define PTREG_SegSs(ptreg) ((ptreg).xss) -#define PTREG_Esp(ptreg) ((ptreg).esp) - -#endif // BIT64 - - -#define PTREG_EFlags(ptreg) ((ptreg).eflags) - -#endif // HAVE_PT_REGS - - - -#if HAVE_BSD_REGS_T - -#ifdef BIT64 - -#define BSDREG_Rbx(reg) ((reg).r_rbx) -#define BSDREG_Rcx(reg) ((reg).r_rcx) -#define BSDREG_Rdx(reg) ((reg).r_rdx) -#define BSDREG_Rsi(reg) ((reg).r_rsi) -#define BSDREG_Rdi(reg) ((reg).r_rdi) -#define BSDREG_Rbp(reg) ((reg).r_rbp) -#define BSDREG_Rax(reg) ((reg).r_rax) -#define BSDREG_Rip(reg) ((reg).r_rip) -#define BSDREG_SegCs(reg) ((reg).r_cs) -#define BSDREG_SegSs(reg) ((reg).r_ss) -#define BSDREG_Rsp(reg) ((reg).r_rsp) -#define BSDREG_R8(reg) ((reg).r_r8) -#define BSDREG_R9(reg) ((reg).r_r9) -#define BSDREG_R10(reg) ((reg).r_r10) -#define BSDREG_R11(reg) ((reg).r_r11) -#define BSDREG_R12(reg) ((reg).r_r12) -#define BSDREG_R13(reg) ((reg).r_r13) -#define BSDREG_R14(reg) ((reg).r_r14) -#define BSDREG_R15(reg) ((reg).r_r15) -#define BSDREG_EFlags(reg) ((reg).r_rflags) - -#else // BIT64 - -#define BSDREG_Ebx(reg) ((reg).r_ebx) -#define BSDREG_Ecx(reg) ((reg).r_ecx) -#define BSDREG_Edx(reg) ((reg).r_edx) -#define BSDREG_Esi(reg) ((reg).r_esi) -#define BSDREG_Edi(reg) ((reg).r_edi) -#define BSDREG_Ebp(reg) ((reg).r_ebp) -#define BSDREG_Eax(reg) ((reg).r_eax) -#define BSDREG_Eip(reg) ((reg).r_eip) -#define BSDREG_SegCs(reg) ((reg).r_cs) -#define BSDREG_EFlags(reg) ((reg).r_eflags) -#define BSDREG_Esp(reg) ((reg).r_esp) -#define BSDREG_SegSs(reg) ((reg).r_ss) - -#endif // BIT64 - -#endif // HAVE_BSD_REGS_T - #ifdef BIT64 #define ASSIGN_CONTROL_REGS \ ASSIGN_REG(Rbp) \ diff --git a/src/pal/src/exception/seh-unwind.cpp b/src/pal/src/exception/seh-unwind.cpp index 8d9a06b..22742d1 100644 --- a/src/pal/src/exception/seh-unwind.cpp +++ b/src/pal/src/exception/seh-unwind.cpp @@ -39,20 +39,26 @@ Abstract: #if HAVE_LIBUNWIND_H #if UNWIND_CONTEXT_IS_UCONTEXT_T -static void WinContextToUnwindContext(CONTEXT *winContext, unw_context_t *unwContext) -{ + #if defined(_AMD64_) - unwContext->uc_mcontext.gregs[REG_RIP] = winContext->Rip; - unwContext->uc_mcontext.gregs[REG_RSP] = winContext->Rsp; - unwContext->uc_mcontext.gregs[REG_RBP] = winContext->Rbp; - unwContext->uc_mcontext.gregs[REG_RBX] = winContext->Rbx; - unwContext->uc_mcontext.gregs[REG_R12] = winContext->R12; - unwContext->uc_mcontext.gregs[REG_R13] = winContext->R13; - unwContext->uc_mcontext.gregs[REG_R14] = winContext->R14; - unwContext->uc_mcontext.gregs[REG_R15] = winContext->R15; -#else +#define ASSIGN_UNWIND_REGS \ + ASSIGN_REG(Rip) \ + ASSIGN_REG(Rsp) \ + ASSIGN_REG(Rbp) \ + ASSIGN_REG(Rbx) \ + ASSIGN_REG(R12) \ + ASSIGN_REG(R13) \ + ASSIGN_REG(R14) \ + ASSIGN_REG(R15) +#else // _AMD64_ #error unsupported architecture -#endif +#endif // _AMD64_ + +static void WinContextToUnwindContext(CONTEXT *winContext, unw_context_t *unwContext) +{ +#define ASSIGN_REG(reg) MCREG_##reg(unwContext->uc_mcontext) = winContext->reg; + ASSIGN_UNWIND_REGS +#undef ASSIGN_REG } #else static void WinContextToUnwindCursor(CONTEXT *winContext, unw_cursor_t *cursor) diff --git a/src/pal/src/include/pal/context.h b/src/pal/src/include/pal/context.h index c8c9dc0..0f5e67b 100644 --- a/src/pal/src/include/pal/context.h +++ b/src/pal/src/include/pal/context.h @@ -45,6 +45,195 @@ typedef ucontext_t native_context_t; #include #endif // !HAVE_MACH_EXCEPTIONS else +#if HAVE_GREGSET_T + +#ifdef BIT64 +#define MCREG_Rbx(mc) ((mc).gregs[REG_RBX]) +#define MCREG_Rcx(mc) ((mc).gregs[REG_RCX]) +#define MCREG_Rdx(mc) ((mc).gregs[REG_RDX]) +#define MCREG_Rsi(mc) ((mc).gregs[REG_RSI]) +#define MCREG_Rdi(mc) ((mc).gregs[REG_RDI]) +#define MCREG_Rbp(mc) ((mc).gregs[REG_RBP]) +#define MCREG_Rax(mc) ((mc).gregs[REG_RAX]) +#define MCREG_Rip(mc) ((mc).gregs[REG_RIP]) +#define MCREG_Rsp(mc) ((mc).gregs[REG_RSP]) +#define MCREG_SegCs(mc) ((mc).gregs[REG_CSGSFS]) +#define MCREG_R8(mc) ((mc).gregs[REG_R8]) +#define MCREG_R9(mc) ((mc).gregs[REG_R9]) +#define MCREG_R10(mc) ((mc).gregs[REG_R10]) +#define MCREG_R11(mc) ((mc).gregs[REG_R11]) +#define MCREG_R12(mc) ((mc).gregs[REG_R12]) +#define MCREG_R13(mc) ((mc).gregs[REG_R13]) +#define MCREG_R14(mc) ((mc).gregs[REG_R14]) +#define MCREG_R15(mc) ((mc).gregs[REG_R15]) + +#define FPREG_Xmm(uc, index) *(M128A*)&((uc)->__fpregs_mem._xmm[index]) + +#define FPREG_St(uc, index) *(M128A*)&((uc)->__fpregs_mem._st[index]) + +#define FPREG_ControlWord(uc) ((uc)->__fpregs_mem.cwd) +#define FPREG_StatusWord(uc) ((uc)->__fpregs_mem.swd) +#define FPREG_TagWord(uc) ((uc)->__fpregs_mem.ftw) +#define FPREG_ErrorOffset(uc) *(DWORD*)&((uc)->__fpregs_mem.rip) +#define FPREG_ErrorSelector(uc) *(((WORD*)&((uc)->__fpregs_mem.rip)) + 2) +#define FPREG_DataOffset(uc) *(DWORD*)&((uc)->__fpregs_mem.rdp) +#define FPREG_DataSelector(uc) *(((WORD*)&((uc)->__fpregs_mem.rdp)) + 2) +#define FPREG_MxCsr(uc) ((uc)->__fpregs_mem.mxcsr) +#define FPREG_MxCsr_Mask(uc) ((uc)->__fpregs_mem.mxcr_mask) + +#else // BIT64 + +#define MCREG_Ebx(mc) ((mc).gregs[REG_EBX]) +#define MCREG_Ecx(mc) ((mc).gregs[REG_ECX]) +#define MCREG_Edx(mc) ((mc).gregs[REG_EDX]) +#define MCREG_Esi(mc) ((mc).gregs[REG_ESI]) +#define MCREG_Edi(mc) ((mc).gregs[REG_EDI]) +#define MCREG_Ebp(mc) ((mc).gregs[REG_EBP]) +#define MCREG_Eax(mc) ((mc).gregs[REG_EAX]) +#define MCREG_Eip(mc) ((mc).gregs[REG_EIP]) +#define MCREG_Esp(mc) ((mc).gregs[REG_ESP]) +#define MCREG_SegCs(mc) ((mc).gregs[REG_CS]) +#define MCREG_SegSs(mc) ((mc).gregs[REG_SS]) + +#endif // BIT64 + +#define MCREG_EFlags(mc) ((mc).gregs[REG_EFL]) + +#else // HAVE_GREGSET_T + +#ifdef BIT64 + + // For FreeBSD, as found in x86/ucontext.h +#define MCREG_Rbp(mc) ((mc).mc_rbp) +#define MCREG_Rip(mc) ((mc).mc_rip) +#define MCREG_Rsp(mc) ((mc).mc_rsp) +#define MCREG_Rsi(mc) ((mc).mc_rsi) +#define MCREG_Rdi(mc) ((mc).mc_rdi) +#define MCREG_Rbx(mc) ((mc).mc_rbx) +#define MCREG_Rdx(mc) ((mc).mc_rdx) +#define MCREG_Rcx(mc) ((mc).mc_rcx) +#define MCREG_Rax(mc) ((mc).mc_rax) +#define MCREG_R8(mc) ((mc).mc_r8) +#define MCREG_R9(mc) ((mc).mc_r9) +#define MCREG_R10(mc) ((mc).mc_r10) +#define MCREG_R11(mc) ((mc).mc_r11) +#define MCREG_R12(mc) ((mc).mc_r12) +#define MCREG_R13(mc) ((mc).mc_r13) +#define MCREG_R14(mc) ((mc).mc_r14) +#define MCREG_R15(mc) ((mc).mc_r15) +#define MCREG_EFlags(mc) ((mc).mc_rflags) +#define MCREG_SegCs(mc) ((mc).mc_cs) + +#else // BIT64 + +#define MCREG_Ebx(mc) ((mc).mc_ebx) +#define MCREG_Ecx(mc) ((mc).mc_ecx) +#define MCREG_Edx(mc) ((mc).mc_edx) +#define MCREG_Esi(mc) ((mc).mc_esi) +#define MCREG_Edi(mc) ((mc).mc_edi) +#define MCREG_Ebp(mc) ((mc).mc_ebp) +#define MCREG_Eax(mc) ((mc).mc_eax) +#define MCREG_Eip(mc) ((mc).mc_eip) +#define MCREG_SegCs(mc) ((mc).mc_cs) +#define MCREG_EFlags(mc) ((mc).mc_eflags) +#define MCREG_Esp(mc) ((mc).mc_esp) +#define MCREG_SegSs(mc) ((mc).mc_ss) + +#endif // BIT64 + +#endif // HAVE_GREGSET_T + + +#if HAVE_PT_REGS + +#ifdef BIT64 +#define PTREG_Rbx(ptreg) ((ptreg).rbx) +#define PTREG_Rcx(ptreg) ((ptreg).rcx) +#define PTREG_Rdx(ptreg) ((ptreg).rdx) +#define PTREG_Rsi(ptreg) ((ptreg).rsi) +#define PTREG_Rdi(ptreg) ((ptreg).rdi) +#define PTREG_Rbp(ptreg) ((ptreg).rbp) +#define PTREG_Rax(ptreg) ((ptreg).rax) +#define PTREG_Rip(ptreg) ((ptreg).rip) +#define PTREG_SegCs(ptreg) ((ptreg).cs) +#define PTREG_SegSs(ptreg) ((ptreg).ss) +#define PTREG_Rsp(ptreg) ((ptreg).rsp) +#define PTREG_R8(ptreg) ((ptreg).r8) +#define PTREG_R9(ptreg) ((ptreg).r9) +#define PTREG_R10(ptreg) ((ptreg).r10) +#define PTREG_R11(ptreg) ((ptreg).r11) +#define PTREG_R12(ptreg) ((ptreg).r12) +#define PTREG_R13(ptreg) ((ptreg).r13) +#define PTREG_R14(ptreg) ((ptreg).r14) +#define PTREG_R15(ptreg) ((ptreg).r15) + +#else // BIT64 + +#define PTREG_Ebx(ptreg) ((ptreg).ebx) +#define PTREG_Ecx(ptreg) ((ptreg).ecx) +#define PTREG_Edx(ptreg) ((ptreg).edx) +#define PTREG_Esi(ptreg) ((ptreg).esi) +#define PTREG_Edi(ptreg) ((ptreg).edi) +#define PTREG_Ebp(ptreg) ((ptreg).ebp) +#define PTREG_Eax(ptreg) ((ptreg).eax) +#define PTREG_Eip(ptreg) ((ptreg).eip) +#define PTREG_SegCs(ptreg) ((ptreg).xcs) +#define PTREG_SegSs(ptreg) ((ptreg).xss) +#define PTREG_Esp(ptreg) ((ptreg).esp) + +#endif // BIT64 + + +#define PTREG_EFlags(ptreg) ((ptreg).eflags) + +#endif // HAVE_PT_REGS + + + +#if HAVE_BSD_REGS_T + +#ifdef BIT64 + +#define BSDREG_Rbx(reg) ((reg).r_rbx) +#define BSDREG_Rcx(reg) ((reg).r_rcx) +#define BSDREG_Rdx(reg) ((reg).r_rdx) +#define BSDREG_Rsi(reg) ((reg).r_rsi) +#define BSDREG_Rdi(reg) ((reg).r_rdi) +#define BSDREG_Rbp(reg) ((reg).r_rbp) +#define BSDREG_Rax(reg) ((reg).r_rax) +#define BSDREG_Rip(reg) ((reg).r_rip) +#define BSDREG_SegCs(reg) ((reg).r_cs) +#define BSDREG_SegSs(reg) ((reg).r_ss) +#define BSDREG_Rsp(reg) ((reg).r_rsp) +#define BSDREG_R8(reg) ((reg).r_r8) +#define BSDREG_R9(reg) ((reg).r_r9) +#define BSDREG_R10(reg) ((reg).r_r10) +#define BSDREG_R11(reg) ((reg).r_r11) +#define BSDREG_R12(reg) ((reg).r_r12) +#define BSDREG_R13(reg) ((reg).r_r13) +#define BSDREG_R14(reg) ((reg).r_r14) +#define BSDREG_R15(reg) ((reg).r_r15) +#define BSDREG_EFlags(reg) ((reg).r_rflags) + +#else // BIT64 + +#define BSDREG_Ebx(reg) ((reg).r_ebx) +#define BSDREG_Ecx(reg) ((reg).r_ecx) +#define BSDREG_Edx(reg) ((reg).r_edx) +#define BSDREG_Esi(reg) ((reg).r_esi) +#define BSDREG_Edi(reg) ((reg).r_edi) +#define BSDREG_Ebp(reg) ((reg).r_ebp) +#define BSDREG_Eax(reg) ((reg).r_eax) +#define BSDREG_Eip(reg) ((reg).r_eip) +#define BSDREG_SegCs(reg) ((reg).r_cs) +#define BSDREG_EFlags(reg) ((reg).r_eflags) +#define BSDREG_Esp(reg) ((reg).r_esp) +#define BSDREG_SegSs(reg) ((reg).r_ss) + +#endif // BIT64 + +#endif // HAVE_BSD_REGS_T + /*++ Function : CONTEXT_CaptureContext