X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/bc48db087894fd960073b3120cebf90e6b2f8c02..c9680266ff5262307dd726d248c4e965cacc8e21:/src/mc/mc_unw_vmread.cpp diff --git a/src/mc/mc_unw_vmread.cpp b/src/mc/mc_unw_vmread.cpp index 29b015be8f..148a2f5995 100644 --- a/src/mc/mc_unw_vmread.cpp +++ b/src/mc/mc_unw_vmread.cpp @@ -11,10 +11,9 @@ #include #include +#include "src/mc/Process.hpp" #include "src/mc/mc_unw.h" -extern "C" { - /** \file * Libunwind namespace implementation using process_vm_readv. *. @@ -23,9 +22,9 @@ extern "C" { /** Partial structure of libunwind-ptrace context in order to get the PID * - * The context type for libunwind-race is an opaque type. We need to get the - * PID which is the first field. This is a hack which might break if the - * libunwind-ptrace structure changes. + * HACK, The context type for libunwind-race is an opaque type. + * We need to get the PID which is the first field. This is a hack + * which might break if the libunwind-ptrace structure changes. */ struct _UPT_info { pid_t pid; @@ -101,16 +100,42 @@ static int access_mem(const unw_addr_space_t as, return _UPT_access_mem(as, addr, valp, write, arg); } -unw_accessors_t mc_unw_vmread_accessors = - { - &_UPT_find_proc_info, - &_UPT_put_unwind_info, - &_UPT_get_dyn_info_list_addr, - &access_mem, - &_UPT_access_reg, - &_UPT_access_fpreg, - &_UPT_resume, - &_UPT_get_proc_name - }; +namespace simgrid { +namespace unw { + +/** Virtual table for our `libunwind-process_vm_readv` implementation. + * + * This implementation reuse most the code of `libunwind-ptrace` but + * does not use ptrace() to read the target process memory by + * `process_vm_readv()` or `/dev/${pid}/mem` if possible. + * + * Does not support any MC-specific behaviour (privatization, snapshots) + * and `ucontext_t`. + * + * It works with `void*` contexts allocated with `_UPT_create(pid)`. + */ +// TODO, we could get rid of this if we properly stop the model-checked +// process before reading the memory. +static unw_accessors_t accessors = { + &_UPT_find_proc_info, + &_UPT_put_unwind_info, + &_UPT_get_dyn_info_list_addr, + &access_mem, + &_UPT_access_reg, + &_UPT_access_fpreg, + &_UPT_resume, + &_UPT_get_proc_name +}; + +unw_addr_space_t create_addr_space() +{ + return unw_create_addr_space(&accessors, BYTE_ORDER); +} + +void* create_context(unw_addr_space_t as, pid_t pid) +{ + return _UPT_create(pid); +} } +}