Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
move surf::As to s4u::As
[simgrid.git] / src / mc / mc_unw.h
1 /* Copyright (c) 2015. The SimGrid Team.
2  * All rights reserved.                                                     */
3
4 /* This program is free software; you can redistribute it and/or modify it
5  * under the terms of the license (GNU LGPL) which comes with this package. */
6
7 #ifndef SIMGRID_MC_UNW_H
8 #define SIMGRID_MC_UNW_H
9
10 /** \file
11  *  Libunwind implementation for the model-checker
12  *
13  *  Libunwind provides an pluggable stack unwinding API: the way the current
14  *  registers and memory is accessed, the way unwinding informations is found
15  *  is pluggable.
16  *
17  *  This component implements the libunwind API for he model-checker:
18  *
19  *    * reading memory from a simgrid::mc::AddressSpace*;
20  *
21  *    * reading stack registers from a saved snapshot (context).
22  *
23  *  Parts of the libunwind information fetching is currently handled by the
24  *  standard `libunwind` implementations (either the local one or the ptrace one)
25  *  because parsing `.eh_frame` section is not fun and `libdw` does not help
26  *  much here.
27  */
28
29 #include <xbt/base.h>
30
31 #include <libunwind.h>
32
33 #include "src/mc/Process.hpp"
34
35 SG_BEGIN_DECL()
36
37 // ***** Libunwind namespace
38
39 /** Virtual table for our `libunwind-process_vm_readv` implementation.
40  *
41  *  This implementation reuse most the code of `libunwind-ptrace` but
42  *  does not use ptrace() to read the target process memory by
43  *  `process_vm_readv()` or `/dev/${pid}/mem` if possible.
44  *
45  *  Does not support any MC-specific behaviour (privatisation, snapshots)
46  *  and `ucontext_t`.
47  *
48  *  It works with `void*` contexts allocated with `_UPT_create(pid)`.
49  */
50 extern XBT_PRIVATE unw_accessors_t mc_unw_vmread_accessors;
51
52 /** Virtual table for our `libunwind` implementation
53  *
54  *  Stack unwinding on a `simgrid::mc::Process*` (for memory, unwinding information)
55  *  and `ucontext_t` (for processor registers).
56  *
57  *  It works with the `s_mc_unw_context_t` context.
58  */
59 extern XBT_PRIVATE unw_accessors_t mc_unw_accessors;
60
61 // ***** Libunwind context
62
63 /** A `libunwind` context
64  */
65 typedef struct XBT_PRIVATE s_mc_unw_context {
66   simgrid::mc::AddressSpace* address_space;
67   simgrid::mc::Process*       process;
68   unw_context_t      context;
69 } s_mc_unw_context_t, *mc_unw_context_t;
70
71 /** Initialises an already allocated context */
72 XBT_PRIVATE int mc_unw_init_context(
73   mc_unw_context_t context, simgrid::mc::Process* process, unw_context_t* c);
74
75 // ***** Libunwind cursor
76
77 /** Initialises a `libunwind` cursor */
78 XBT_PRIVATE int mc_unw_init_cursor(unw_cursor_t *cursor, mc_unw_context_t context);
79
80 SG_END_DECL()
81
82 #endif