Skip to content

Commit 7335759

Browse files
committed
target/riscv: set appropriate memory access result codes
Set appropriate memory access result codes Checkpatch-ignore: MACRO_ARG_PRECEDENCE, MULTISTATEMENT_MACRO_USE_DO_WHILE Checkpatch-ignore: TRAILING_SEMICOLON Change-Id: Ib73b5a041e5f15aef150b80fdd45f107de19d3a6 Signed-off-by: Farid Khaydari <f.khaydari@syntacore.com>
1 parent 56b7830 commit 7335759

File tree

1 file changed

+82
-50
lines changed

1 file changed

+82
-50
lines changed

src/target/riscv/riscv-013.c

Lines changed: 82 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -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

42194247
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,
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

43684397
static 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

44374467
static 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

44584486
static 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

49474979
static mem_access_result_t
49484980
write_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

49604992
static bool riscv013_get_impebreak(const struct target *target)

0 commit comments

Comments
 (0)