From 2b5e4bfcff875571b2813a9494de8b2e4c56120e Mon Sep 17 00:00:00 2001 From: Romain Malmain Date: Mon, 13 Jan 2025 11:11:56 +0100 Subject: [PATCH] Fix wrong number of registers (#98) * fix num regs in case it's stored in xml file --- libafl/cpu.c | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/libafl/cpu.c b/libafl/cpu.c index 55b699c45e..e951d3a165 100644 --- a/libafl/cpu.c +++ b/libafl/cpu.c @@ -19,6 +19,7 @@ int gdb_write_register(CPUState* cpu, uint8_t* mem_buf, int reg); static __thread GByteArray* libafl_qemu_mem_buf = NULL; +static __thread int num_regs = 0; #ifdef CONFIG_USER_ONLY static __thread CPUArchState* libafl_qemu_env; @@ -133,8 +134,22 @@ int libafl_qemu_read_reg(CPUState* cpu, int reg, uint8_t* val) int libafl_qemu_num_regs(CPUState* cpu) { - CPUClass* cc = CPU_GET_CLASS(cpu); - return cc->gdb_num_core_regs; + if (!num_regs) { + CPUClass* cc = CPU_GET_CLASS(cpu); + + if (cc->gdb_num_core_regs) { + num_regs = cc->gdb_num_core_regs; + } else { + const GDBFeature *feature = gdb_find_static_feature(cc->gdb_core_xml_file); + + g_assert(feature); + g_assert(feature->num_regs > 0); + + num_regs = feature->num_regs; + } + } + + return num_regs; } void libafl_flush_jit(void)