Fallback on start cpustate when current_cpu is null

This commit is contained in:
Andrea Fioraldi 2021-10-04 10:42:37 +02:00
parent 78936b7cc7
commit 048ae77625
2 changed files with 15 additions and 4 deletions

11
cpu.c
View File

@ -63,6 +63,8 @@ struct libafl_hook {
struct libafl_hook* libafl_qemu_hooks = NULL; struct libafl_hook* libafl_qemu_hooks = NULL;
CPUArchState *libafl_qemu_env;
void libafl_helper_table_add(TCGHelperInfo* info); void libafl_helper_table_add(TCGHelperInfo* info);
static GByteArray *libafl_qemu_mem_buf = NULL; static GByteArray *libafl_qemu_mem_buf = NULL;
@ -78,9 +80,12 @@ int libafl_qemu_remove_hook(uint64_t addr);
int libafl_qemu_write_reg(int reg, uint8_t* val) int libafl_qemu_write_reg(int reg, uint8_t* val)
{ {
CPUState *cpu = current_cpu; CPUState *cpu = current_cpu;
if (!cpu) {
cpu = env_cpu(libafl_qemu_env);
if (!cpu) { if (!cpu) {
return 0; return 0;
} }
}
CPUClass *cc = CPU_GET_CLASS(cpu); CPUClass *cc = CPU_GET_CLASS(cpu);
if (reg < cc->gdb_num_core_regs) { if (reg < cc->gdb_num_core_regs) {
@ -92,9 +97,12 @@ int libafl_qemu_write_reg(int reg, uint8_t* val)
int libafl_qemu_read_reg(int reg, uint8_t* val) int libafl_qemu_read_reg(int reg, uint8_t* val)
{ {
CPUState *cpu = current_cpu; CPUState *cpu = current_cpu;
if (!cpu) {
cpu = env_cpu(libafl_qemu_env);
if (!cpu) { if (!cpu) {
return 0; return 0;
} }
}
if (libafl_qemu_mem_buf == NULL) { if (libafl_qemu_mem_buf == NULL) {
libafl_qemu_mem_buf = g_byte_array_sized_new(64); libafl_qemu_mem_buf = g_byte_array_sized_new(64);
@ -115,9 +123,12 @@ int libafl_qemu_read_reg(int reg, uint8_t* val)
int libafl_qemu_num_regs(void) int libafl_qemu_num_regs(void)
{ {
CPUState *cpu = current_cpu; CPUState *cpu = current_cpu;
if (!cpu) {
cpu = env_cpu(libafl_qemu_env);
if (!cpu) { if (!cpu) {
return 0; return 0;
} }
}
CPUClass *cc = CPU_GET_CLASS(cpu); CPUClass *cc = CPU_GET_CLASS(cpu);
return cc->gdb_num_core_regs; return cc->gdb_num_core_regs;

View File

@ -630,7 +630,7 @@ uint64_t libafl_load_addr(void);
int libafl_qemu_main(void); int libafl_qemu_main(void);
int libafl_qemu_run(void); int libafl_qemu_run(void);
static CPUArchState *libafl_qemu_env; extern CPUArchState *libafl_qemu_env;
struct image_info libafl_image_info; struct image_info libafl_image_info;