-/* Copyright (c) 2015. The SimGrid Team.
+/* Copyright (c) 2015-2018. The SimGrid Team.
* All rights reserved. */
/* This program is free software; you can redistribute it and/or modify it
// We need this for the register indices:
// #define _GNU_SOURCE
-#include <string.h>
+#include <cstring>
// 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>
-#include "src/mc/Process.hpp"
-#include "src/mc/mc_unw.h"
#include "src/mc/Frame.hpp"
+#include "src/mc/mc_unw.hpp"
+#include "src/mc/remote/RemoteClient.hpp"
using simgrid::mc::remote;
#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];
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
if (write)
return -UNW_EREADONLYREG;
greg_t* preg = (greg_t*) get_reg(context, regnum);
- if (!preg)
+ if (not preg)
return -UNW_EBADREG;
*valp = *preg;
return 0;
{
simgrid::mc::UnwindContext* context = (simgrid::mc::UnwindContext*) arg;
simgrid::mc::Frame* frame = context->process_->find_function(remote(addr));
- if (!frame)
+ if (not frame)
return - UNW_ENOINFO;
*offp = (unw_word_t) frame->range.begin() - addr;
process_ = nullptr;
}
-void UnwindContext::initialize(simgrid::mc::Process* process, unw_context_t* c)
+void UnwindContext::initialize(simgrid::mc::RemoteClient* process, unw_context_t* c)
{
clear();
// 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
// FP registers from the unw_context_t
- // but we fix the pointer in order to avoid dangling pointers:
- // context->context_.uc_mcontext.fpregs = &(context->context.__fpregs_mem);
-
// 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.
+# error Target CPU type is not handled.
#endif
}