From: Matthieu Volat Date: Tue, 15 Nov 2016 20:02:45 +0000 (+0100) Subject: Add support to retrieve FreeBSD ucontext registers. X-Git-Tag: v3_14~140^2~4 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/5b1e785c03b2a7acacde1a0e13be7e5292981aae?hp=1810d57c2b26e27fc5e880e65fcc57f41345249e Add support to retrieve FreeBSD ucontext registers. Sadly, no universal method as it depend on the CPU and the system is free to implement whatever storage it see fit. Leave a terminating error message for the next system to get ported. --- diff --git a/src/mc/mc_unw.cpp b/src/mc/mc_unw.cpp index 5b620dcfe8..a48ab17720 100644 --- a/src/mc/mc_unw.cpp +++ b/src/mc/mc_unw.cpp @@ -14,7 +14,11 @@ #include // On x86_64, libunwind unw_context_t has the same layout as ucontext_t: +#include #include +#ifdef __FreeBSD__ +typedef register_t greg_t; +#endif #include @@ -93,6 +97,7 @@ void* UnwindContext::get_reg(unw_context_t* context, unw_regnum_t regnum) noexce #ifdef __x86_64 mcontext_t* mcontext = &context->uc_mcontext; switch (regnum) { +# ifdef __linux__ case UNW_X86_64_RAX: return &mcontext->gregs[REG_RAX]; case UNW_X86_64_RDX: return &mcontext->gregs[REG_RDX]; case UNW_X86_64_RCX: return &mcontext->gregs[REG_RCX]; @@ -110,6 +115,27 @@ void* UnwindContext::get_reg(unw_context_t* context, unw_regnum_t regnum) noexce case UNW_X86_64_R14: return &mcontext->gregs[REG_R14]; case UNW_X86_64_R15: return &mcontext->gregs[REG_R15]; case UNW_X86_64_RIP: return &mcontext->gregs[REG_RIP]; +# elif defined __FreeBSD__ + case UNW_X86_64_RAX: return &mcontext->mc_rax; + case UNW_X86_64_RDX: return &mcontext->mc_rdx; + case UNW_X86_64_RCX: return &mcontext->mc_rcx; + case UNW_X86_64_RBX: return &mcontext->mc_rbx; + case UNW_X86_64_RSI: return &mcontext->mc_rsi; + case UNW_X86_64_RDI: return &mcontext->mc_rdi; + case UNW_X86_64_RBP: return &mcontext->mc_rbp; + case UNW_X86_64_RSP: return &mcontext->mc_rsp; + case UNW_X86_64_R8: return &mcontext->mc_r8; + case UNW_X86_64_R9: return &mcontext->mc_r9; + case UNW_X86_64_R10: return &mcontext->mc_r10; + case UNW_X86_64_R11: return &mcontext->mc_r11; + case UNW_X86_64_R12: return &mcontext->mc_r12; + case UNW_X86_64_R13: return &mcontext->mc_r13; + case UNW_X86_64_R14: return &mcontext->mc_r14; + case UNW_X86_64_R15: return &mcontext->mc_r15; + case UNW_X86_64_RIP: return &mcontext->mc_rip; +# else +# error "Unable to get register from ucontext, please add your case" +# endif default: return nullptr; } #else @@ -220,6 +246,7 @@ void UnwindContext::initialize(simgrid::mc::Process* process, unw_context_t* c) // Take a copy of the context for our own purpose: this->unwindContext_ = *c; #if SIMGRID_PROCESSOR_x86_64 || SIMGRID_PROCESSOR_i686 +# ifdef __linux__ // On x86_64, ucontext_t contains a pointer to itself for FP registers. // We don't really need support for FR registers as they are caller saved // and probably never use those fields as libunwind-x86_64 does not read @@ -229,6 +256,7 @@ void UnwindContext::initialize(simgrid::mc::Process* process, unw_context_t* c) // Let's ignore this and see what happens: this->unwindContext_.uc_mcontext.fpregs = nullptr; +# endif #else // Do we need to do any fixup like this? #error Target CPU type is not handled.