@@ -3490,11 +3490,39 @@ typedef enum {
34903490 SKIPPED, "skipped (dm target select failed)") \
34913491 MEM_ACCESS_RESULT_HANDLER(MEM_ACCESS_SKIPPED_FENCE_EXEC_FAILED, \
34923492 SKIPPED, "skipped (fence execution failed)") \
3493+ MEM_ACCESS_RESULT_HANDLER(MEM_ACCESS_SKIPPED_SYSBUS_ACCESS_FAILED, \
3494+ SKIPPED, "skipped (sysbus access failed)") \
3495+ MEM_ACCESS_RESULT_HANDLER(MEM_ACCESS_SKIPPED_REG_SAVE_FAILED, \
3496+ SKIPPED, "skipped (register save failed)") \
3497+ MEM_ACCESS_RESULT_HANDLER(MEM_ACCESS_SKIPPED_UNKNOWN_SYSBUS_VERSION, \
3498+ SKIPPED, "skipped (unknown sysbus version)") \
3499+ MEM_ACCESS_RESULT_HANDLER(MEM_ACCESS_SKIPPED_PROGRAM_WRITE_FAILED, \
3500+ SKIPPED, "skipped (program write failed)") \
3501+ MEM_ACCESS_RESULT_HANDLER(MEM_ACCESS_SKIPPED_PROGBUF_FILL_FAILED, \
3502+ SKIPPED, "skipped (progbuf fill failed)") \
3503+ MEM_ACCESS_RESULT_HANDLER(MEM_ACCESS_SKIPPED_WRITE_ABSTRACT_ARG_FAILED, \
3504+ SKIPPED, "skipped (abstract command argument write failed)") \
3505+ MEM_ACCESS_RESULT_HANDLER(MEM_ACCESS_SKIPPED_PRIV_MOD_FAILED, \
3506+ SKIPPED, "skipped (privilege modification failed)") \
34933507 MEM_ACCESS_RESULT_HANDLER(MEM_ACCESS_FAILED, FAILED, "failed") \
34943508 MEM_ACCESS_RESULT_HANDLER(MEM_ACCESS_FAILED_DM_ACCESS_FAILED, \
34953509 FAILED, "failed (DM register access failed)") \
34963510 MEM_ACCESS_RESULT_HANDLER(MEM_ACCESS_FAILED_PRIV_MOD_FAILED, \
3497- FAILED, "failed (privilege modification failed)")
3511+ FAILED, "failed (privilege modification failed)") \
3512+ MEM_ACCESS_RESULT_HANDLER(MEM_ACCESS_FAILED_REG_READ_FAILED, \
3513+ FAILED, "failed (register read failed)") \
3514+ MEM_ACCESS_RESULT_HANDLER(MEM_ACCESS_FAILED_PROGBUF_STARTUP_FAILED, \
3515+ FAILED, "failed (progbuf startup failed)") \
3516+ MEM_ACCESS_RESULT_HANDLER(MEM_ACCESS_FAILED_PROGBUF_INNER_FAILED, \
3517+ FAILED, "failed (progbuf inner failed)") \
3518+ MEM_ACCESS_RESULT_HANDLER(MEM_ACCESS_FAILED_PROGBUF_TEARDOWN_FAILED, \
3519+ FAILED, "failed (progbuf teardown failed)") \
3520+ MEM_ACCESS_RESULT_HANDLER(MEM_ACCESS_FAILED_EXECUTE_ABSTRACT_FAILED, \
3521+ FAILED, "failed (execute abstract failed)") \
3522+ MEM_ACCESS_RESULT_HANDLER(MEM_ACCESS_FAILED_NO_FORWARD_PROGRESS, \
3523+ FAILED, "failed (no forward progress)") \
3524+ MEM_ACCESS_RESULT_HANDLER(MEM_ACCESS_FAILED_FENCE_EXEC_FAILED, \
3525+ FAILED, "failed (fence execution failed)") \
34983526
34993527
35003528#define MEM_ACCESS_RESULT_HANDLER (name , kind , msg ) name,
@@ -4203,17 +4231,17 @@ static int read_word_from_dm_data_regs(struct target *target,
42034231 return result ;
42044232}
42054233
4206- static int read_word_from_s1 (struct target * target ,
4234+ static mem_access_result_t read_word_from_s1 (struct target * target ,
42074235 const riscv_mem_access_args_t args , uint32_t index )
42084236{
42094237 assert (riscv_mem_access_is_read (args ));
42104238
42114239 uint64_t value ;
42124240
42134241 if (register_read_direct (target , & value , GDB_REGNO_S1 ) != ERROR_OK )
4214- return ERROR_FAIL ;
4242+ return MEM_ACCESS_FAILED_REG_READ_FAILED ;
42154243 set_buffer_and_log_read (args , index , value );
4216- return ERROR_OK ;
4244+ return MEM_ACCESS_OK ;
42174245}
42184246
42194247static int read_memory_progbuf_inner_fill_progbuf (struct target * target ,
@@ -4256,18 +4284,19 @@ static int read_memory_progbuf_inner_fill_progbuf(struct target *target,
42564284 * re-read the data only if `abstract command busy` or `DMI busy`
42574285 * is encountered in the process.
42584286 */
4259- static int read_memory_progbuf_inner (struct target * target , const riscv_mem_access_args_t args )
4287+ static mem_access_result_t
4288+ read_memory_progbuf_inner (struct target * target , const riscv_mem_access_args_t args )
42604289{
42614290 assert (riscv_mem_access_is_read (args ));
42624291 assert (args .count > 1 && "If count == 1, read_memory_progbuf_inner_one must be called" );
42634292
4264- if (read_memory_progbuf_inner_fill_progbuf (target , args .increment , args .size ) != ERROR_OK )
4265- return ERROR_FAIL ;
4293+ if (read_memory_progbuf_inner_fill_progbuf (target ,
4294+ args .increment , args .size ) != ERROR_OK )
4295+ return MEM_ACCESS_SKIPPED_PROGBUF_FILL_FAILED ;
42664296
42674297 if (read_memory_progbuf_inner_startup (target , args .address ,
4268- args .increment , /*index*/ 0 )
4269- != ERROR_OK )
4270- return ERROR_FAIL ;
4298+ args .increment , /*index*/ 0 ) != ERROR_OK )
4299+ return MEM_ACCESS_FAILED_PROGBUF_STARTUP_FAILED ;
42714300 /* The program in program buffer is executed twice during
42724301 * read_memory_progbuf_inner_startup().
42734302 * Here:
@@ -4285,26 +4314,26 @@ static int read_memory_progbuf_inner(struct target *target, const riscv_mem_acce
42854314 if (read_memory_progbuf_inner_try_to_read (target , args , & elements_read ,
42864315 index , loop_count ) != ERROR_OK ) {
42874316 dm_write (target , DM_ABSTRACTAUTO , 0 );
4288- return ERROR_FAIL ;
4317+ return MEM_ACCESS_FAILED_PROGBUF_INNER_FAILED ;
42894318 }
42904319 if (elements_read == 0 ) {
42914320 if (read_memory_progbuf_inner_ensure_forward_progress (target , args ,
42924321 index ) != ERROR_OK ) {
42934322 dm_write (target , DM_ABSTRACTAUTO , 0 );
4294- return ERROR_FAIL ;
4323+ return MEM_ACCESS_FAILED_NO_FORWARD_PROGRESS ;
42954324 }
42964325 elements_read = 1 ;
42974326 }
42984327 index += elements_read ;
42994328 assert (index <= loop_count );
43004329 }
43014330 if (dm_write (target , DM_ABSTRACTAUTO , 0 ) != ERROR_OK )
4302- return ERROR_FAIL ;
4331+ return MEM_ACCESS_FAILED_DM_ACCESS_FAILED ;
43034332
43044333 /* Read the penultimate word. */
4305- if (read_word_from_dm_data_regs (target , args , args . count - 2 )
4306- != ERROR_OK )
4307- return ERROR_FAIL ;
4334+ if (read_word_from_dm_data_regs (target ,
4335+ args , args . count - 2 ) != ERROR_OK )
4336+ return MEM_ACCESS_FAILED_DM_ACCESS_FAILED ;
43084337 /* Read the last word. */
43094338 return read_word_from_s1 (target , args , args .count - 1 );
43104339}
@@ -4313,33 +4342,35 @@ static int read_memory_progbuf_inner(struct target *target, const riscv_mem_acce
43134342 * Only need to save/restore one GPR to read a single word, and the progbuf
43144343 * program doesn't need to increment.
43154344 */
4316- static int read_memory_progbuf_inner_one (struct target * target , const riscv_mem_access_args_t args )
4345+ static mem_access_result_t
4346+ read_memory_progbuf_inner_one (struct target * target , const riscv_mem_access_args_t args )
43174347{
43184348 assert (riscv_mem_access_is_read (args ));
43194349
43204350 if (riscv013_reg_save (target , GDB_REGNO_S1 ) != ERROR_OK )
4321- return ERROR_FAIL ;
4351+ return MEM_ACCESS_SKIPPED_REG_SAVE_FAILED ;
43224352
43234353 struct riscv_program program ;
43244354
43254355 riscv_program_init (& program , target );
4326- if (riscv_program_load (& program , GDB_REGNO_S1 , GDB_REGNO_S1 , 0 , args .size ) != ERROR_OK )
4327- return ERROR_FAIL ;
4328- if (riscv_program_ebreak (& program ) != ERROR_OK )
4329- return ERROR_FAIL ;
4356+ if (riscv_program_load (& program , GDB_REGNO_S1 , GDB_REGNO_S1 ,
4357+ /* offset = */ 0 , args .size ) != ERROR_OK
4358+ || riscv_program_ebreak (& program ) != ERROR_OK )
4359+ return MEM_ACCESS_SKIPPED_PROGBUF_FILL_FAILED ;
4360+
43304361 if (riscv_program_write (& program ) != ERROR_OK )
4331- return ERROR_FAIL ;
4362+ return MEM_ACCESS_SKIPPED_PROGRAM_WRITE_FAILED ;
43324363
43334364 /* Write address to S1, and execute buffer. */
4334- if (write_abstract_arg (target , 0 , args . address , riscv_xlen ( target ))
4335- != ERROR_OK )
4336- return ERROR_FAIL ;
4365+ if (write_abstract_arg (target , /* index = */ 0 ,
4366+ args . address , riscv_xlen ( target )) != ERROR_OK )
4367+ return MEM_ACCESS_SKIPPED_WRITE_ABSTRACT_ARG_FAILED ;
43374368 uint32_t command = riscv013_access_register_command (target , GDB_REGNO_S1 ,
43384369 riscv_xlen (target ), AC_ACCESS_REGISTER_WRITE |
43394370 AC_ACCESS_REGISTER_TRANSFER | AC_ACCESS_REGISTER_POSTEXEC );
43404371 uint32_t cmderr ;
43414372 if (riscv013_execute_abstract_command (target , command , & cmderr ) != ERROR_OK )
4342- return ERROR_FAIL ;
4373+ return MEM_ACCESS_FAILED_EXECUTE_ABSTRACT_FAILED ;
43434374
43444375 return read_word_from_s1 (target , args , 0 );
43454376}
@@ -4358,11 +4389,9 @@ read_memory_progbuf(struct target *target, const riscv_mem_access_args_t args)
43584389 if (execute_autofence (target ) != ERROR_OK )
43594390 return MEM_ACCESS_SKIPPED_FENCE_EXEC_FAILED ;
43604391
4361- int res = (args .count == 1 ) ?
4392+ return (args .count == 1 ) ?
43624393 read_memory_progbuf_inner_one (target , args ) :
43634394 read_memory_progbuf_inner (target , args );
4364-
4365- return res == ERROR_OK ? MEM_ACCESS_OK : MEM_ACCESS_FAILED ;
43664395}
43674396
43684397static mem_access_result_t
@@ -4390,15 +4419,15 @@ access_memory_progbuf(struct target *target, const riscv_mem_access_args_t args)
43904419 riscv_reg_t dcsr_old = 0 ;
43914420 if (modify_privilege_for_virt2phys_mode (target ,
43924421 & mstatus , & mstatus_old , & dcsr , & dcsr_old ) != ERROR_OK )
4393- return MEM_ACCESS_FAILED_PRIV_MOD_FAILED ;
4422+ return MEM_ACCESS_SKIPPED_PRIV_MOD_FAILED ;
43944423
43954424 mem_access_result_t result = is_read ?
43964425 read_memory_progbuf (target , args ) :
43974426 write_memory_progbuf (target , args );
43984427
43994428 if (restore_privilege_from_virt2phys_mode (target ,
44004429 mstatus , mstatus_old , dcsr , dcsr_old ) != ERROR_OK )
4401- return MEM_ACCESS_FAILED ;
4430+ return MEM_ACCESS_FAILED_PRIV_MOD_FAILED ;
44024431
44034432 return result ;
44044433}
@@ -4421,17 +4450,18 @@ access_memory_sysbus(struct target *target, const riscv_mem_access_args_t args)
44214450 int ret = ERROR_FAIL ;
44224451 const bool is_read = riscv_mem_access_is_read (args );
44234452 const uint64_t sbver = get_field (info -> sbcs , DM_SBCS_SBVERSION );
4424- if (sbver == 0 )
4453+ if (sbver == 0 ) {
44254454 ret = is_read ? read_memory_bus_v0 (target , args ) :
44264455 write_memory_bus_v0 (target , args );
4427- else if (sbver == 1 )
4456+ } else if (sbver == 1 ) {
44284457 ret = is_read ? read_memory_bus_v1 (target , args ) :
44294458 write_memory_bus_v1 (target , args );
4430- else
4431- LOG_TARGET_ERROR (target ,
4432- "Unknown system bus version: %" PRIu64 , sbver );
4459+ } else {
4460+ LOG_TARGET_ERROR (target , "Unknown system bus version: %" PRIu64 , sbver );
4461+ return MEM_ACCESS_SKIPPED_UNKNOWN_SYSBUS_VERSION ;
4462+ }
44334463
4434- return ( ret == ERROR_OK ) ? MEM_ACCESS_OK : MEM_ACCESS_FAILED ;
4464+ return ret == ERROR_OK ? MEM_ACCESS_OK : MEM_ACCESS_SKIPPED_SYSBUS_ACCESS_FAILED ;
44354465}
44364466
44374467static mem_access_result_t
@@ -4449,10 +4479,8 @@ access_memory_abstract(struct target *target, const riscv_mem_access_args_t args
44494479 TARGET_PRIxADDR , access_type , args .count ,
44504480 args .size , args .address );
44514481
4452- int result = is_read ? read_memory_abstract (target , args ) :
4482+ return is_read ? read_memory_abstract (target , args ) :
44534483 write_memory_abstract (target , args );
4454-
4455- return result == ERROR_OK ? MEM_ACCESS_OK : MEM_ACCESS_FAILED ;
44564484}
44574485
44584486static int
@@ -4913,16 +4941,19 @@ static int write_memory_progbuf_fill_progbuf(struct target *target, uint32_t siz
49134941 return riscv_program_write (& program );
49144942}
49154943
4916- static int write_memory_progbuf_inner (struct target * target , const riscv_mem_access_args_t args )
4944+ static mem_access_result_t
4945+ write_memory_progbuf_inner (struct target * target ,
4946+ const riscv_mem_access_args_t args )
49174947{
49184948 assert (riscv_mem_access_is_write (args ));
49194949
49204950 if (write_memory_progbuf_fill_progbuf (target , args .size ) != ERROR_OK )
4921- return ERROR_FAIL ;
4951+ return MEM_ACCESS_SKIPPED_PROGBUF_FILL_FAILED ;
49224952
49234953 target_addr_t addr_on_target = args .address ;
4924- if (write_memory_progbuf_startup (target , & addr_on_target , args .write_buffer , args .size ) != ERROR_OK )
4925- return ERROR_FAIL ;
4954+ if (write_memory_progbuf_startup (target , & addr_on_target ,
4955+ args .write_buffer , args .size ) != ERROR_OK )
4956+ return MEM_ACCESS_FAILED_PROGBUF_STARTUP_FAILED ;
49264957
49274958 const target_addr_t end_addr = args .address + (target_addr_t )args .size * args .count ;
49284959
@@ -4932,7 +4963,7 @@ static int write_memory_progbuf_inner(struct target *target, const riscv_mem_acc
49324963 if (write_memory_progbuf_try_to_write (target , & next_addr_on_target ,
49334964 end_addr , args .size , curr_buff ) != ERROR_OK ) {
49344965 write_memory_progbuf_teardown (target );
4935- return ERROR_FAIL ;
4966+ return MEM_ACCESS_FAILED_PROGBUF_INNER_FAILED ;
49364967 }
49374968 /* write_memory_progbuf_try_to_write() ensures that at least one item
49384969 * gets successfully written even when busy condition is encountered.
@@ -4941,20 +4972,21 @@ static int write_memory_progbuf_inner(struct target *target, const riscv_mem_acc
49414972 assert (next_addr_on_target - args .address <= (target_addr_t )args .size * args .count );
49424973 }
49434974
4944- return write_memory_progbuf_teardown (target );
4975+ return write_memory_progbuf_teardown (target ) == ERROR_OK ?
4976+ MEM_ACCESS_OK : MEM_ACCESS_FAILED_PROGBUF_TEARDOWN_FAILED ;
49454977}
49464978
49474979static mem_access_result_t
49484980write_memory_progbuf (struct target * target , const riscv_mem_access_args_t args )
49494981{
49504982 assert (riscv_mem_access_is_write (args ));
49514983
4952- int result = write_memory_progbuf_inner (target , args );
4984+ mem_access_result_t result = write_memory_progbuf_inner (target , args );
49534985
49544986 if (execute_autofence (target ) != ERROR_OK )
4955- return MEM_ACCESS_SKIPPED_FENCE_EXEC_FAILED ;
4987+ return MEM_ACCESS_FAILED_FENCE_EXEC_FAILED ;
49564988
4957- return result == ERROR_OK ? MEM_ACCESS_OK : MEM_ACCESS_FAILED ;
4989+ return result ;
49584990}
49594991
49604992static bool riscv013_get_impebreak (const struct target * target )
0 commit comments