2025-03-24 17:46:26 +01:00

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