75 lines
1.9 KiB
C
75 lines
1.9 KiB
C
#include "qemu/osdep.h"
|
|
#include "qemu.h"
|
|
#include "loader.h"
|
|
|
|
#include "libafl/user.h"
|
|
|
|
extern abi_ulong target_brk, initial_target_brk;
|
|
|
|
static struct image_info libafl_image_info;
|
|
|
|
static struct libafl_qemu_sig_ctx libafl_qemu_sig_ctx = {0};
|
|
|
|
// if true, target crashes will issue an exit request and return to harness.
|
|
// if false, target crahes will raise the appropriate signal.
|
|
static bool libafl_return_on_crash = false;
|
|
|
|
void host_signal_handler(int host_sig, siginfo_t* info, void* puc);
|
|
|
|
void libafl_qemu_native_signal_handler(int host_sig, siginfo_t* info, void* puc)
|
|
{
|
|
host_signal_handler(host_sig, info, puc);
|
|
}
|
|
|
|
void libafl_set_in_target_signal_ctx(void)
|
|
{
|
|
libafl_qemu_sig_ctx.in_qemu_sig_hdlr = true;
|
|
libafl_qemu_sig_ctx.is_target_signal = true;
|
|
}
|
|
|
|
void libafl_set_in_host_signal_ctx(void)
|
|
{
|
|
libafl_qemu_sig_ctx.in_qemu_sig_hdlr = true;
|
|
libafl_qemu_sig_ctx.is_target_signal = false;
|
|
}
|
|
|
|
void libafl_unset_in_signal_ctx(void)
|
|
{
|
|
libafl_qemu_sig_ctx.in_qemu_sig_hdlr = false;
|
|
}
|
|
|
|
struct libafl_qemu_sig_ctx* libafl_qemu_signal_context(void)
|
|
{
|
|
return &libafl_qemu_sig_ctx;
|
|
}
|
|
|
|
uint64_t libafl_load_addr(void) { return libafl_image_info.load_addr; }
|
|
|
|
struct image_info* libafl_get_image_info(void) { return &libafl_image_info; }
|
|
|
|
uint64_t libafl_get_brk(void) { return (uint64_t)target_brk; }
|
|
|
|
uint64_t libafl_get_initial_brk(void) { return (uint64_t)initial_target_brk; }
|
|
|
|
uint64_t libafl_set_brk(uint64_t new_brk)
|
|
{
|
|
uint64_t old_brk = (uint64_t)target_brk;
|
|
target_brk = (abi_ulong)new_brk;
|
|
return old_brk;
|
|
}
|
|
|
|
void libafl_set_return_on_crash(bool return_on_crash)
|
|
{
|
|
libafl_return_on_crash = return_on_crash;
|
|
}
|
|
|
|
bool libafl_get_return_on_crash(void) { return libafl_return_on_crash; }
|
|
|
|
#ifdef AS_LIB
|
|
void libafl_qemu_init(int argc, char** argv)
|
|
{
|
|
// main function in usermode has an env parameter but is unused in practice.
|
|
_libafl_qemu_user_init(argc, argv, NULL);
|
|
}
|
|
#endif
|