Arion 1.0.2-alpha
A high-performance C++ framework for emulating executable binaries.
 
Loading...
Searching...
No Matches
signal_manager.hpp
Go to the documentation of this file.
1#ifndef ARION_SIGNAL_MANAGER_HPP
2#define ARION_SIGNAL_MANAGER_HPP
3
6#include <arion/unicorn/unicorn.h>
7#include <map>
8#include <memory>
9
10namespace arion
11{
12
13class Arion;
14
17{
18 private:
20 std::weak_ptr<Arion> arion;
22 std::map<int, std::shared_ptr<struct arion_lnx_type::ksigaction>> sighandlers;
24 std::map<pid_t, pid_t> sigwait_list;
26 std::unique_ptr<std::map<REG, RVAL>> ucontext_regs;
28 static std::map<int, std::string> signals;
35 static void intr_hook(std::shared_ptr<Arion> arion, uint32_t intno, void *user_data);
46 static bool invalid_memory_hook(std::shared_ptr<Arion> arion, uc_mem_type access, uint64_t addr, int size,
47 int64_t val, void *user_data);
54 static bool invalid_insn_hook(std::shared_ptr<Arion> arion, void *user_data);
61 bool handle_sighandler(pid_t source_pid, int signo);
66 void handle_sigchld(pid_t source_pid);
67
68 public:
74 static std::unique_ptr<SignalManager> initialize(std::weak_ptr<Arion> arion);
79 SignalManager(std::weak_ptr<Arion> arion);
85 void print_signal(std::shared_ptr<Arion> arion, std::string sig_name);
91 void handle_signal(pid_t source_pid, int signo);
98 void wait_for_sig(pid_t target_tid, pid_t source_pid, ADDR wait_status_addr);
104 bool has_sighandler(int signo);
110 std::shared_ptr<struct arion_lnx_type::ksigaction> get_sighandler(int signo);
116 void set_sighandler(int signo, std::shared_ptr<struct arion_lnx_type::ksigaction> sighandler);
121 bool sigreturn();
122};
123
124}; // namespace arion
125
126#endif // ARION_SIGNAL_MANAGER_HPP
This class manages signal handling within an Arion emulation session.
Definition signal_manager.hpp:17
static std::unique_ptr< SignalManager > initialize(std::weak_ptr< Arion > arion)
void handle_signal(pid_t source_pid, int signo)
static void intr_hook(std::shared_ptr< Arion > arion, uint32_t intno, void *user_data)
static bool invalid_insn_hook(std::shared_ptr< Arion > arion, void *user_data)
std::weak_ptr< Arion > arion
The Arion instance associated with this instance.
Definition signal_manager.hpp:20
std::map< int, std::shared_ptr< struct arion_lnx_type::ksigaction > > sighandlers
A map identifying a ksigaction structure given its associated signal number.
Definition signal_manager.hpp:22
std::shared_ptr< struct arion_lnx_type::ksigaction > get_sighandler(int signo)
bool has_sighandler(int signo)
static bool invalid_memory_hook(std::shared_ptr< Arion > arion, uc_mem_type access, uint64_t addr, int size, int64_t val, void *user_data)
static std::map< int, std::string > signals
A map identifying a signal description string given its signal number.
Definition signal_manager.hpp:28
std::map< pid_t, pid_t > sigwait_list
A map identifying a process (ID) given the process (ID) it is waiting for.
Definition signal_manager.hpp:24
void print_signal(std::shared_ptr< Arion > arion, std::string sig_name)
SignalManager(std::weak_ptr< Arion > arion)
void set_sighandler(int signo, std::shared_ptr< struct arion_lnx_type::ksigaction > sighandler)
void handle_sigchld(pid_t source_pid)
std::unique_ptr< std::map< REG, RVAL > > ucontext_regs
A map identifying a saved register value to be restored, given the Unicorn register it is associated ...
Definition signal_manager.hpp:26
void wait_for_sig(pid_t target_tid, pid_t source_pid, ADDR wait_status_addr)
bool handle_sighandler(pid_t source_pid, int signo)
Definition arch_x86-64.hpp:11
uint64_t ADDR
Identifies a memory address.
Definition global_defs.hpp:36