@@ -3490,11 +3490,39 @@ typedef enum {
3490
3490
SKIPPED, "skipped (dm target select failed)") \
3491
3491
MEM_ACCESS_RESULT_HANDLER(MEM_ACCESS_SKIPPED_FENCE_EXEC_FAILED, \
3492
3492
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)") \
3493
3507
MEM_ACCESS_RESULT_HANDLER(MEM_ACCESS_FAILED, FAILED, "failed") \
3494
3508
MEM_ACCESS_RESULT_HANDLER(MEM_ACCESS_FAILED_DM_ACCESS_FAILED, \
3495
3509
FAILED, "failed (DM register access failed)") \
3496
3510
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)") \
3498
3526
3499
3527
3500
3528
#define MEM_ACCESS_RESULT_HANDLER (name , kind , msg ) name,
@@ -4203,17 +4231,17 @@ static int read_word_from_dm_data_regs(struct target *target,
4203
4231
return result ;
4204
4232
}
4205
4233
4206
- static int read_word_from_s1 (struct target * target ,
4234
+ static mem_access_result_t read_word_from_s1 (struct target * target ,
4207
4235
const riscv_mem_access_args_t args , uint32_t index )
4208
4236
{
4209
4237
assert (riscv_mem_access_is_read (args ));
4210
4238
4211
4239
uint64_t value ;
4212
4240
4213
4241
if (register_read_direct (target , & value , GDB_REGNO_S1 ) != ERROR_OK )
4214
- return ERROR_FAIL ;
4242
+ return MEM_ACCESS_FAILED_REG_READ_FAILED ;
4215
4243
set_buffer_and_log_read (args , index , value );
4216
- return ERROR_OK ;
4244
+ return MEM_ACCESS_OK ;
4217
4245
}
4218
4246
4219
4247
static 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,
4256
4284
* re-read the data only if `abstract command busy` or `DMI busy`
4257
4285
* is encountered in the process.
4258
4286
*/
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 )
4260
4289
{
4261
4290
assert (riscv_mem_access_is_read (args ));
4262
4291
assert (args .count > 1 && "If count == 1, read_memory_progbuf_inner_one must be called" );
4263
4292
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 ;
4266
4296
4267
4297
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 ;
4271
4300
/* The program in program buffer is executed twice during
4272
4301
* read_memory_progbuf_inner_startup().
4273
4302
* Here:
@@ -4285,26 +4314,26 @@ static int read_memory_progbuf_inner(struct target *target, const riscv_mem_acce
4285
4314
if (read_memory_progbuf_inner_try_to_read (target , args , & elements_read ,
4286
4315
index , loop_count ) != ERROR_OK ) {
4287
4316
dm_write (target , DM_ABSTRACTAUTO , 0 );
4288
- return ERROR_FAIL ;
4317
+ return MEM_ACCESS_FAILED_PROGBUF_INNER_FAILED ;
4289
4318
}
4290
4319
if (elements_read == 0 ) {
4291
4320
if (read_memory_progbuf_inner_ensure_forward_progress (target , args ,
4292
4321
index ) != ERROR_OK ) {
4293
4322
dm_write (target , DM_ABSTRACTAUTO , 0 );
4294
- return ERROR_FAIL ;
4323
+ return MEM_ACCESS_FAILED_NO_FORWARD_PROGRESS ;
4295
4324
}
4296
4325
elements_read = 1 ;
4297
4326
}
4298
4327
index += elements_read ;
4299
4328
assert (index <= loop_count );
4300
4329
}
4301
4330
if (dm_write (target , DM_ABSTRACTAUTO , 0 ) != ERROR_OK )
4302
- return ERROR_FAIL ;
4331
+ return MEM_ACCESS_FAILED_DM_ACCESS_FAILED ;
4303
4332
4304
4333
/* 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 ;
4308
4337
/* Read the last word. */
4309
4338
return read_word_from_s1 (target , args , args .count - 1 );
4310
4339
}
@@ -4313,33 +4342,35 @@ static int read_memory_progbuf_inner(struct target *target, const riscv_mem_acce
4313
4342
* Only need to save/restore one GPR to read a single word, and the progbuf
4314
4343
* program doesn't need to increment.
4315
4344
*/
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 )
4317
4347
{
4318
4348
assert (riscv_mem_access_is_read (args ));
4319
4349
4320
4350
if (riscv013_reg_save (target , GDB_REGNO_S1 ) != ERROR_OK )
4321
- return ERROR_FAIL ;
4351
+ return MEM_ACCESS_SKIPPED_REG_SAVE_FAILED ;
4322
4352
4323
4353
struct riscv_program program ;
4324
4354
4325
4355
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
+
4330
4361
if (riscv_program_write (& program ) != ERROR_OK )
4331
- return ERROR_FAIL ;
4362
+ return MEM_ACCESS_SKIPPED_PROGRAM_WRITE_FAILED ;
4332
4363
4333
4364
/* 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 ;
4337
4368
uint32_t command = riscv013_access_register_command (target , GDB_REGNO_S1 ,
4338
4369
riscv_xlen (target ), AC_ACCESS_REGISTER_WRITE |
4339
4370
AC_ACCESS_REGISTER_TRANSFER | AC_ACCESS_REGISTER_POSTEXEC );
4340
4371
uint32_t cmderr ;
4341
4372
if (riscv013_execute_abstract_command (target , command , & cmderr ) != ERROR_OK )
4342
- return ERROR_FAIL ;
4373
+ return MEM_ACCESS_FAILED_EXECUTE_ABSTRACT_FAILED ;
4343
4374
4344
4375
return read_word_from_s1 (target , args , 0 );
4345
4376
}
@@ -4358,11 +4389,9 @@ read_memory_progbuf(struct target *target, const riscv_mem_access_args_t args)
4358
4389
if (execute_autofence (target ) != ERROR_OK )
4359
4390
return MEM_ACCESS_SKIPPED_FENCE_EXEC_FAILED ;
4360
4391
4361
- int res = (args .count == 1 ) ?
4392
+ return (args .count == 1 ) ?
4362
4393
read_memory_progbuf_inner_one (target , args ) :
4363
4394
read_memory_progbuf_inner (target , args );
4364
-
4365
- return res == ERROR_OK ? MEM_ACCESS_OK : MEM_ACCESS_FAILED ;
4366
4395
}
4367
4396
4368
4397
static mem_access_result_t
@@ -4390,15 +4419,15 @@ access_memory_progbuf(struct target *target, const riscv_mem_access_args_t args)
4390
4419
riscv_reg_t dcsr_old = 0 ;
4391
4420
if (modify_privilege_for_virt2phys_mode (target ,
4392
4421
& mstatus , & mstatus_old , & dcsr , & dcsr_old ) != ERROR_OK )
4393
- return MEM_ACCESS_FAILED_PRIV_MOD_FAILED ;
4422
+ return MEM_ACCESS_SKIPPED_PRIV_MOD_FAILED ;
4394
4423
4395
4424
mem_access_result_t result = is_read ?
4396
4425
read_memory_progbuf (target , args ) :
4397
4426
write_memory_progbuf (target , args );
4398
4427
4399
4428
if (restore_privilege_from_virt2phys_mode (target ,
4400
4429
mstatus , mstatus_old , dcsr , dcsr_old ) != ERROR_OK )
4401
- return MEM_ACCESS_FAILED ;
4430
+ return MEM_ACCESS_FAILED_PRIV_MOD_FAILED ;
4402
4431
4403
4432
return result ;
4404
4433
}
@@ -4421,17 +4450,18 @@ access_memory_sysbus(struct target *target, const riscv_mem_access_args_t args)
4421
4450
int ret = ERROR_FAIL ;
4422
4451
const bool is_read = riscv_mem_access_is_read (args );
4423
4452
const uint64_t sbver = get_field (info -> sbcs , DM_SBCS_SBVERSION );
4424
- if (sbver == 0 )
4453
+ if (sbver == 0 ) {
4425
4454
ret = is_read ? read_memory_bus_v0 (target , args ) :
4426
4455
write_memory_bus_v0 (target , args );
4427
- else if (sbver == 1 )
4456
+ } else if (sbver == 1 ) {
4428
4457
ret = is_read ? read_memory_bus_v1 (target , args ) :
4429
4458
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
+ }
4433
4463
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 ;
4435
4465
}
4436
4466
4437
4467
static mem_access_result_t
@@ -4449,10 +4479,8 @@ access_memory_abstract(struct target *target, const riscv_mem_access_args_t args
4449
4479
TARGET_PRIxADDR , access_type , args .count ,
4450
4480
args .size , args .address );
4451
4481
4452
- int result = is_read ? read_memory_abstract (target , args ) :
4482
+ return is_read ? read_memory_abstract (target , args ) :
4453
4483
write_memory_abstract (target , args );
4454
-
4455
- return result == ERROR_OK ? MEM_ACCESS_OK : MEM_ACCESS_FAILED ;
4456
4484
}
4457
4485
4458
4486
static int
@@ -4913,16 +4941,19 @@ static int write_memory_progbuf_fill_progbuf(struct target *target, uint32_t siz
4913
4941
return riscv_program_write (& program );
4914
4942
}
4915
4943
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 )
4917
4947
{
4918
4948
assert (riscv_mem_access_is_write (args ));
4919
4949
4920
4950
if (write_memory_progbuf_fill_progbuf (target , args .size ) != ERROR_OK )
4921
- return ERROR_FAIL ;
4951
+ return MEM_ACCESS_SKIPPED_PROGBUF_FILL_FAILED ;
4922
4952
4923
4953
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 ;
4926
4957
4927
4958
const target_addr_t end_addr = args .address + (target_addr_t )args .size * args .count ;
4928
4959
@@ -4932,7 +4963,7 @@ static int write_memory_progbuf_inner(struct target *target, const riscv_mem_acc
4932
4963
if (write_memory_progbuf_try_to_write (target , & next_addr_on_target ,
4933
4964
end_addr , args .size , curr_buff ) != ERROR_OK ) {
4934
4965
write_memory_progbuf_teardown (target );
4935
- return ERROR_FAIL ;
4966
+ return MEM_ACCESS_FAILED_PROGBUF_INNER_FAILED ;
4936
4967
}
4937
4968
/* write_memory_progbuf_try_to_write() ensures that at least one item
4938
4969
* 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
4941
4972
assert (next_addr_on_target - args .address <= (target_addr_t )args .size * args .count );
4942
4973
}
4943
4974
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 ;
4945
4977
}
4946
4978
4947
4979
static mem_access_result_t
4948
4980
write_memory_progbuf (struct target * target , const riscv_mem_access_args_t args )
4949
4981
{
4950
4982
assert (riscv_mem_access_is_write (args ));
4951
4983
4952
- int result = write_memory_progbuf_inner (target , args );
4984
+ mem_access_result_t result = write_memory_progbuf_inner (target , args );
4953
4985
4954
4986
if (execute_autofence (target ) != ERROR_OK )
4955
- return MEM_ACCESS_SKIPPED_FENCE_EXEC_FAILED ;
4987
+ return MEM_ACCESS_FAILED_FENCE_EXEC_FAILED ;
4956
4988
4957
- return result == ERROR_OK ? MEM_ACCESS_OK : MEM_ACCESS_FAILED ;
4989
+ return result ;
4958
4990
}
4959
4991
4960
4992
static bool riscv013_get_impebreak (const struct target * target )
0 commit comments