X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/f4535e718abfb666917bc68cf5fdee2c6f4894f7..5eeb3c843b60e9ba5e1a952ffe83df2a4d8f5fa0:/src/mc/mc_unw.cpp diff --git a/src/mc/mc_unw.cpp b/src/mc/mc_unw.cpp index 5b620dcfe8..7961ecdf1b 100644 --- a/src/mc/mc_unw.cpp +++ b/src/mc/mc_unw.cpp @@ -1,4 +1,4 @@ -/* 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 @@ -11,16 +11,20 @@ // We need this for the register indices: // #define _GNU_SOURCE -#include +#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 -#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; @@ -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 @@ -128,7 +154,7 @@ int UnwindContext::access_reg(unw_addr_space_t as, 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; @@ -166,7 +192,7 @@ int UnwindContext::get_proc_name(unw_addr_space_t as, { 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; @@ -210,7 +236,7 @@ void UnwindContext::clear() 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(); @@ -220,18 +246,17 @@ 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 // 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 }