Skip to content

Commit 468a956

Browse files
committed
Implement memory write and register write
The `mini-gdbstub` library supports the functionality to write register and write memory now. After this PR, `rv32emu` is enabled to do those commands that will try to write register and memory, e.g. the `load` command.
1 parent e985dfb commit 468a956

File tree

2 files changed

+21
-1
lines changed

2 files changed

+21
-1
lines changed

src/gdbstub.c

+20
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,16 @@ static size_t rv_read_reg(void *args, int regno)
1818
return -1;
1919
}
2020

21+
static void rv_write_reg(void *args, int regno, size_t data)
22+
{
23+
struct riscv_t *rv = (struct riscv_t *) args;
24+
if (regno < 32) {
25+
rv_set_reg(rv, regno, data);
26+
} else if (regno == 32) {
27+
rv_set_pc(rv, data);
28+
}
29+
}
30+
2131
static void rv_read_mem(void *args, size_t addr, size_t len, void *val)
2232
{
2333
struct riscv_t *rv = (struct riscv_t *) args;
@@ -26,6 +36,14 @@ static void rv_read_mem(void *args, size_t addr, size_t len, void *val)
2636
*((uint8_t *) val + i) = rv->io.mem_read_b(rv, addr + i);
2737
}
2838

39+
static void rv_write_mem(void *args, size_t addr, size_t len, void *val)
40+
{
41+
struct riscv_t *rv = (struct riscv_t *) args;
42+
43+
for (size_t i = 0; i < len; i++)
44+
rv->io.mem_write_b(rv, addr + i, *((uint8_t *) val + i));
45+
}
46+
2947
static gdb_action_t rv_cont(void *args)
3048
{
3149
struct riscv_t *rv = (struct riscv_t *) args;
@@ -69,7 +87,9 @@ static bool rv_del_bp(void *args, size_t addr, bp_type_t type)
6987

7088
const struct target_ops gdbstub_ops = {
7189
.read_reg = rv_read_reg,
90+
.write_reg = rv_write_reg,
7291
.read_mem = rv_read_mem,
92+
.write_mem = rv_write_mem,
7393
.cont = rv_cont,
7494
.stepi = rv_stepi,
7595
.set_bp = rv_set_bp,

0 commit comments

Comments
 (0)