@@ -18,6 +18,18 @@ static size_t rv_read_reg(void *args, int regno)
18
18
return -1 ;
19
19
}
20
20
21
+ static void rv_write_reg (void * args , int regno , size_t data )
22
+ {
23
+ if (unlikely (regno > 32 ))
24
+ return ;
25
+
26
+ struct riscv_t * rv = (struct riscv_t * ) args ;
27
+ if (regno == 32 )
28
+ rv_set_pc (rv , data );
29
+ else
30
+ rv_set_reg (rv , regno , data );
31
+ }
32
+
21
33
static void rv_read_mem (void * args , size_t addr , size_t len , void * val )
22
34
{
23
35
struct riscv_t * rv = (struct riscv_t * ) args ;
@@ -26,6 +38,14 @@ static void rv_read_mem(void *args, size_t addr, size_t len, void *val)
26
38
* ((uint8_t * ) val + i ) = rv -> io .mem_read_b (rv , addr + i );
27
39
}
28
40
41
+ static void rv_write_mem (void * args , size_t addr , size_t len , void * val )
42
+ {
43
+ struct riscv_t * rv = (struct riscv_t * ) args ;
44
+
45
+ for (size_t i = 0 ; i < len ; i ++ )
46
+ rv -> io .mem_write_b (rv , addr + i , * ((uint8_t * ) val + i ));
47
+ }
48
+
29
49
static gdb_action_t rv_cont (void * args )
30
50
{
31
51
struct riscv_t * rv = (struct riscv_t * ) args ;
@@ -69,7 +89,9 @@ static bool rv_del_bp(void *args, size_t addr, bp_type_t type)
69
89
70
90
const struct target_ops gdbstub_ops = {
71
91
.read_reg = rv_read_reg ,
92
+ .write_reg = rv_write_reg ,
72
93
.read_mem = rv_read_mem ,
94
+ .write_mem = rv_write_mem ,
73
95
.cont = rv_cont ,
74
96
.stepi = rv_stepi ,
75
97
.set_bp = rv_set_bp ,
0 commit comments