diff --git a/include/libafl/utils.h b/include/libafl/utils.h new file mode 100644 index 0000000000..0da201fce5 --- /dev/null +++ b/include/libafl/utils.h @@ -0,0 +1,7 @@ +#pragma once + +#include "qemu/osdep.h" + +#ifndef CONFIG_USER_ONLY +uint8_t* libafl_paddr2host(CPUState* cpu, hwaddr addr, bool is_write); +#endif diff --git a/libafl/meson.build b/libafl/meson.build index 8151b01e1b..938dfa41a7 100644 --- a/libafl/meson.build +++ b/libafl/meson.build @@ -1,7 +1,8 @@ specific_ss.add(files( 'exit.c', 'hook.c', - 'jit.c' + 'jit.c', + 'utils.c', )) specific_ss.add(when: 'CONFIG_SOFTMMU', if_true: [files( diff --git a/libafl/utils.c b/libafl/utils.c new file mode 100644 index 0000000000..95036410cb --- /dev/null +++ b/libafl/utils.c @@ -0,0 +1,24 @@ +#include "qemu/osdep.h" + +#ifndef CONFIG_USER_ONLY +#include "exec/memory.h" +#include "qemu/rcu.h" +#include "cpu.h" + +#include "libafl/utils.h" + +uint8_t* libafl_paddr2host(CPUState* cpu, hwaddr addr, bool is_write) +{ + if (addr == -1) { + return NULL; + } + + hwaddr xlat; + MemoryRegion* mr; + WITH_RCU_READ_LOCK_GUARD() { + mr = address_space_translate(cpu->as, addr, &xlat, NULL, is_write, MEMTXATTRS_UNSPECIFIED); + } + + return qemu_map_ram_ptr(mr->ram_block, xlat); +} +#endif \ No newline at end of file