diff --git a/cpu-target.c b/cpu-target.c index 4347488cb3..3d72581f9a 100644 --- a/cpu-target.c +++ b/cpu-target.c @@ -53,6 +53,128 @@ #include "libafl/syx-snapshot/device-save.h" #endif +void libafl_flush_jit(void); + +extern int libafl_restoring_devices; + +/* +void* libafl_qemu_g2h(CPUState *cpu, target_ulong x); +target_ulong libafl_qemu_h2g(CPUState *cpu, void* x); + +void* libafl_qemu_g2h(CPUState *cpu, target_ulong x) +{ + return g2h(cpu, x); +} + +target_ulong libafl_qemu_h2g(CPUState *cpu, void* x) +{ + return h2g(cpu, x); +} +*/ + +target_ulong libafl_page_from_addr(target_ulong addr) { + return addr & TARGET_PAGE_MASK; +} + +CPUState* libafl_qemu_get_cpu(int cpu_index) +{ + CPUState *cpu; + CPU_FOREACH(cpu) { + if (cpu->cpu_index == cpu_index) + return cpu; + } + return NULL; +} + +int libafl_qemu_num_cpus(void) +{ + CPUState *cpu; + int num = 0; + CPU_FOREACH(cpu) { + num++; + } + return num; +} + +CPUState* libafl_qemu_current_cpu(void) +{ +#ifndef CONFIG_USER_ONLY + if (current_cpu == NULL) { + return libafl_last_exit_cpu(); + } +#endif + return current_cpu; +} + +int libafl_qemu_cpu_index(CPUState* cpu) +{ + if (cpu) return cpu->cpu_index; + return -1; +} + +int libafl_qemu_write_reg(CPUState* cpu, int reg, uint8_t* val) +{ + return gdb_write_register(cpu, val, reg); +} + +int libafl_qemu_read_reg(CPUState* cpu, int reg, uint8_t* val) +{ + int len; + + if (libafl_qemu_mem_buf == NULL) { + libafl_qemu_mem_buf = g_byte_array_sized_new(64); + } + + g_byte_array_set_size(libafl_qemu_mem_buf, 0); + + len = gdb_read_register(cpu, libafl_qemu_mem_buf, reg); + + if (len > 0) { + memcpy(val, libafl_qemu_mem_buf->data, len); + } + + return len; +} + +int libafl_qemu_num_regs(CPUState* cpu) +{ + CPUClass *cc = CPU_GET_CLASS(cpu); + return cc->gdb_num_core_regs; +} + +#ifdef TARGET_ARM +// use-case: get the user-stack pointer and return addr from at an isr-return +#include "target/arm/cpu.h" +#include "target/arm/internals.h" + +int libafl_qemu_read_user_sp_unchecked(CPUState* cpu); +int libafl_qemu_read_user_sp_unchecked(CPUState* cpu) { + CPUARMState *env = cpu_env(cpu); + return env->v7m.other_sp; +} + +#endif + +#ifndef CONFIG_USER_ONLY +hwaddr libafl_qemu_current_paging_id(CPUState* cpu) +{ + CPUClass* cc = CPU_GET_CLASS(cpu); + if (cc->sysemu_ops && cc->sysemu_ops->get_paging_id) { + return cc->sysemu_ops->get_paging_id(cpu); + } else { + return 0; + } +} +#endif + +void libafl_flush_jit(void) +{ + CPUState *cpu; + CPU_FOREACH(cpu) { + tb_flush(cpu); + } +} + //// --- End LibAFL code --- #ifndef CONFIG_USER_ONLY