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