@@ -155,6 +155,13 @@ bool riscv_virt2phys_mode_is_sw(const struct target *target)
155155 return r -> virt2phys_mode == RISCV_VIRT2PHYS_MODE_SW ;
156156}
157157
158+ bool riscv_virt2phys_mode_is_off (const struct target * target )
159+ {
160+ assert (target );
161+ RISCV_INFO (r );
162+ return r -> virt2phys_mode == RISCV_VIRT2PHYS_MODE_OFF ;
163+ }
164+
158165const char * riscv_virt2phys_mode_to_str (riscv_virt2phys_mode_t mode )
159166{
160167 assert (mode == RISCV_VIRT2PHYS_MODE_OFF
@@ -3145,7 +3152,7 @@ static int riscv_address_translate(struct target *target,
31453152 .increment = 4 ,
31463153 .count = (1 << info -> pte_shift ) / 4 ,
31473154 };
3148- int retval = r -> access_memory (target , args );
3155+ int retval = r -> access_memory (target , args , /* is_virtual */ false );
31493156 if (retval != ERROR_OK )
31503157 return ERROR_FAIL ;
31513158
@@ -3389,7 +3396,7 @@ static int riscv_read_phys_memory(struct target *target, target_addr_t phys_addr
33893396 .increment = size ,
33903397 };
33913398 RISCV_INFO (r );
3392- return r -> access_memory (target , args );
3399+ return r -> access_memory (target , args , /* is_virtual */ false );
33933400}
33943401
33953402static int riscv_write_phys_memory (struct target * target , target_addr_t phys_address ,
@@ -3404,7 +3411,7 @@ static int riscv_write_phys_memory(struct target *target, target_addr_t phys_add
34043411 };
34053412
34063413 RISCV_INFO (r );
3407- return r -> access_memory (target , args );
3414+ return r -> access_memory (target , args , /* is_virtual */ false );
34083415}
34093416
34103417static int riscv_rw_memory (struct target * target , const riscv_mem_access_args_t args )
@@ -3418,14 +3425,20 @@ static int riscv_rw_memory(struct target *target, const riscv_mem_access_args_t
34183425 return ERROR_OK ;
34193426 }
34203427
3428+ RISCV_INFO (r );
3429+ if (riscv_virt2phys_mode_is_off (target ))
3430+ return r -> access_memory (target , args , /* is_virtual */ false);
3431+
34213432 int mmu_enabled ;
34223433 int result = riscv_mmu (target , & mmu_enabled );
34233434 if (result != ERROR_OK )
34243435 return result ;
34253436
3426- RISCV_INFO (r );
34273437 if (!mmu_enabled )
3428- return r -> access_memory (target , args );
3438+ return r -> access_memory (target , args , /* is_virtual */ false);
3439+
3440+ if (riscv_virt2phys_mode_is_hw (target ))
3441+ return r -> access_memory (target , args , /* is_virtual */ true);
34293442
34303443 result = check_virt_memory_access (target , args .address ,
34313444 args .size , args .count , is_write );
@@ -3457,7 +3470,8 @@ static int riscv_rw_memory(struct target *target, const riscv_mem_access_args_t
34573470 else
34583471 current_access .read_buffer += current_count * args .size ;
34593472
3460- result = r -> access_memory (target , current_access );
3473+ result = r -> access_memory (target ,
3474+ current_access , /* is_virtual */ false);
34613475 if (result != ERROR_OK )
34623476 return result ;
34633477
@@ -5228,7 +5242,9 @@ COMMAND_HANDLER(handle_repeat_read)
52285242 .count = count ,
52295243 .increment = 0 ,
52305244 };
5231- int result = r -> access_memory (target , args );
5245+ /* TODO: Add a command parameter that enables
5246+ * choosing between virtual and physical access */
5247+ int result = r -> access_memory (target , args , /* is_virtual */ false);
52325248 if (result == ERROR_OK ) {
52335249 target_handle_md_output (cmd , target , address , size , count , buffer ,
52345250 false);
@@ -5611,7 +5627,7 @@ static const struct command_registration riscv_exec_command_handlers[] = {
56115627 .handler = handle_repeat_read ,
56125628 .mode = COMMAND_ANY ,
56135629 .usage = "count address [size=4]" ,
5614- .help = "Repeatedly read the value at address."
5630+ .help = "Repeatedly read the value at physical address."
56155631 },
56165632 {
56175633 .name = "set_command_timeout_sec" ,
0 commit comments