#include <asm/ptrace.h>
#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) \
#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)
#include <mach/mach_port.h>
#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