@@ -67,6 +67,8 @@ typedef struct riscv32_regs {
67
67
#define RV32_MATCH_BEFORE 0x00000000U
68
68
#define RV32_MATCH_AFTER 0x00040000U
69
69
70
+ static ssize_t riscv32_reg_read (target_s * target , uint32_t c , void * data , size_t max );
71
+ static ssize_t riscv32_reg_write (target_s * target , uint32_t c , const void * data , size_t max );
70
72
static void riscv32_regs_read (target_s * target , void * data );
71
73
static void riscv32_regs_write (target_s * target , const void * data );
72
74
static void riscv32_mem_read (target_s * target , void * dest , target_addr_t src , size_t len );
@@ -83,6 +85,8 @@ bool riscv32_probe(target_s *const target)
83
85
target -> regs_size = sizeof (riscv32_regs_s );
84
86
target -> regs_read = riscv32_regs_read ;
85
87
target -> regs_write = riscv32_regs_write ;
88
+ target -> reg_write = riscv32_reg_write ;
89
+ target -> reg_read = riscv32_reg_read ;
86
90
target -> mem_read = riscv32_mem_read ;
87
91
target -> mem_write = riscv32_mem_write ;
88
92
@@ -133,6 +137,41 @@ static void riscv32_regs_write(target_s *const target, const void *const data)
133
137
riscv_csr_write (hart , RV_DPC , & regs -> pc );
134
138
}
135
139
140
+ static inline ssize_t riscv32_bool_to_4 (const bool ret )
141
+ {
142
+ return ret ? 4 : -1 ;
143
+ }
144
+
145
+ static ssize_t riscv32_reg_read (target_s * target , const uint32_t reg , void * data , const size_t max )
146
+ {
147
+ if (max != 4 )
148
+ return -1 ;
149
+ /* Grab the hart structure */
150
+ riscv_hart_s * const hart = riscv_hart_struct (target );
151
+ if (reg < 32 )
152
+ return riscv32_bool_to_4 (riscv_csr_read (hart , RV_GPR_BASE + reg , data ));
153
+ if (reg == 32 )
154
+ return riscv32_bool_to_4 (riscv_csr_read (hart , RV_DPC , data ));
155
+ if (reg >= RV_CSR_GDB_OFFSET )
156
+ return riscv32_bool_to_4 (riscv_csr_read (hart , reg - RV_CSR_GDB_OFFSET , data ));
157
+ return -1 ;
158
+ }
159
+
160
+ static ssize_t riscv32_reg_write (target_s * const target , const uint32_t reg , const void * data , const size_t max )
161
+ {
162
+ if (max != 4 )
163
+ return -1 ;
164
+ /* Grab the hart structure */
165
+ riscv_hart_s * const hart = riscv_hart_struct (target );
166
+ if (reg < 32 )
167
+ return riscv32_bool_to_4 (riscv_csr_write (hart , RV_GPR_BASE + reg , data ));
168
+ if (reg == 32 )
169
+ return riscv32_bool_to_4 (riscv_csr_write (hart , RV_DPC , data ));
170
+ if (reg >= RV_CSR_GDB_OFFSET )
171
+ return riscv32_bool_to_4 (riscv_csr_write (hart , reg - RV_CSR_GDB_OFFSET , data ));
172
+ return -1 ;
173
+ }
174
+
136
175
/* Takes in data from abstract command arg0 and, based on the access width, unpacks it to dest */
137
176
void riscv32_unpack_data (void * const dest , const uint32_t data , const uint8_t access_width )
138
177
{
0 commit comments