Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Add support to retrieve FreeBSD ucontext registers.
[simgrid.git] / src / mc / mc_unw.cpp
index 1a6fa90..a48ab17 100644 (file)
 #include <string.h>
 
 // On x86_64, libunwind unw_context_t has the same layout as ucontext_t:
+#include <sys/types.h>
 #include <sys/ucontext.h>
+#ifdef __FreeBSD__
+typedef register_t greg_t;
+#endif
 
 #include <libunwind.h>
 
@@ -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
@@ -201,7 +227,7 @@ unw_accessors_t UnwindContext::accessors = {
 
 unw_addr_space_t UnwindContext::createUnwindAddressSpace()
 {
-  return unw_create_addr_space(&UnwindContext::accessors, __BYTE_ORDER);
+  return unw_create_addr_space(&UnwindContext::accessors, BYTE_ORDER);
 }
 
 void UnwindContext::clear()
@@ -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.