use qemu primitives to perform gdb rw (#71)
This commit is contained in:
parent
ddbe5be01f
commit
538e6b02c3
21
cpu-target.c
21
cpu-target.c
@ -47,9 +47,13 @@
|
|||||||
|
|
||||||
//// --- Begin LibAFL code ---
|
//// --- Begin LibAFL code ---
|
||||||
|
|
||||||
|
#include "exec/gdbstub.h"
|
||||||
|
|
||||||
#include "libafl/exit.h"
|
#include "libafl/exit.h"
|
||||||
#include "libafl/hook.h"
|
#include "libafl/hook.h"
|
||||||
|
|
||||||
|
int gdb_write_register(CPUState *cpu, uint8_t *mem_buf, int reg);
|
||||||
|
|
||||||
static __thread GByteArray *libafl_qemu_mem_buf = NULL;
|
static __thread GByteArray *libafl_qemu_mem_buf = NULL;
|
||||||
|
|
||||||
target_ulong libafl_page_from_addr(target_ulong addr);
|
target_ulong libafl_page_from_addr(target_ulong addr);
|
||||||
@ -128,29 +132,26 @@ int libafl_qemu_cpu_index(CPUState* cpu)
|
|||||||
|
|
||||||
int libafl_qemu_write_reg(CPUState* cpu, int reg, uint8_t* val)
|
int libafl_qemu_write_reg(CPUState* cpu, int reg, uint8_t* val)
|
||||||
{
|
{
|
||||||
CPUClass *cc = CPU_GET_CLASS(cpu);
|
return gdb_write_register(cpu, val, reg);
|
||||||
if (reg < cc->gdb_num_core_regs) {
|
|
||||||
return cc->gdb_write_register(cpu, val, reg);
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int libafl_qemu_read_reg(CPUState* cpu, int reg, uint8_t* val)
|
int libafl_qemu_read_reg(CPUState* cpu, int reg, uint8_t* val)
|
||||||
{
|
{
|
||||||
|
int len;
|
||||||
|
|
||||||
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);
|
||||||
}
|
}
|
||||||
|
|
||||||
CPUClass *cc = CPU_GET_CLASS(cpu);
|
|
||||||
if (reg < cc->gdb_num_core_regs) {
|
|
||||||
g_byte_array_set_size(libafl_qemu_mem_buf, 0);
|
g_byte_array_set_size(libafl_qemu_mem_buf, 0);
|
||||||
int len = cc->gdb_read_register(cpu, libafl_qemu_mem_buf, reg);
|
|
||||||
|
len = gdb_read_register(cpu, libafl_qemu_mem_buf, reg);
|
||||||
|
|
||||||
if (len > 0) {
|
if (len > 0) {
|
||||||
memcpy(val, libafl_qemu_mem_buf->data, len);
|
memcpy(val, libafl_qemu_mem_buf->data, len);
|
||||||
}
|
}
|
||||||
|
|
||||||
return len;
|
return len;
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int libafl_qemu_num_regs(CPUState* cpu)
|
int libafl_qemu_num_regs(CPUState* cpu)
|
||||||
|
@ -533,7 +533,12 @@ int gdb_read_register(CPUState *cpu, GByteArray *buf, int reg)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int gdb_write_register(CPUState *cpu, uint8_t *mem_buf, int reg)
|
|
||||||
|
//// --- Begin LibAFL code ---
|
||||||
|
int gdb_write_register(CPUState *cpu, uint8_t *mem_buf, int reg);
|
||||||
|
/* static */
|
||||||
|
//// --- End LibAFL code ---
|
||||||
|
int gdb_write_register(CPUState *cpu, uint8_t *mem_buf, int reg)
|
||||||
{
|
{
|
||||||
CPUClass *cc = CPU_GET_CLASS(cpu);
|
CPUClass *cc = CPU_GET_CLASS(cpu);
|
||||||
GDBRegisterState *r;
|
GDBRegisterState *r;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user