target/riscv: use `riscv_reg_t` and `enum gbb_regno` consistently

Change-Id: Ia476251e835fa5fd129ae6b679c6049c5c60c716
Signed-off-by: Evgeniy Naydanov <evgeniy.naydanov@syntacore.com>
This commit is contained in:
Evgeniy Naydanov 2023-04-24 14:09:08 +03:00
parent 919a98a05b
commit 7a181e8bbc
3 changed files with 52 additions and 42 deletions

View File

@ -212,7 +212,8 @@ typedef struct {
static int poll_target(struct target *target, bool announce); static int poll_target(struct target *target, bool announce);
static int riscv011_poll(struct target *target); static int riscv011_poll(struct target *target);
static int get_register(struct target *target, riscv_reg_t *value, int regid); static int get_register(struct target *target, riscv_reg_t *value,
enum gdb_regno regid);
/*** Utility functions. ***/ /*** Utility functions. ***/
@ -1324,7 +1325,8 @@ static int register_write(struct target *target, unsigned int number,
return ERROR_OK; return ERROR_OK;
} }
static int get_register(struct target *target, riscv_reg_t *value, int regid) static int get_register(struct target *target, riscv_reg_t *value,
enum gdb_regno regid)
{ {
riscv011_info_t *info = get_info(target); riscv011_info_t *info = get_info(target);
@ -1368,7 +1370,8 @@ static int get_register(struct target *target, riscv_reg_t *value, int regid)
return ERROR_OK; return ERROR_OK;
} }
static int set_register(struct target *target, int regid, uint64_t value) static int set_register(struct target *target, enum gdb_regno regid,
riscv_reg_t value)
{ {
return register_write(target, regid, value); return register_write(target, regid, value);
} }

View File

@ -36,8 +36,9 @@ static void riscv013_clear_abstract_error(struct target *target);
/* Implementations of the functions in struct riscv_info. */ /* Implementations of the functions in struct riscv_info. */
static int riscv013_get_register(struct target *target, static int riscv013_get_register(struct target *target,
riscv_reg_t *value, int rid); riscv_reg_t *value, enum gdb_regno rid);
static int riscv013_set_register(struct target *target, int regid, uint64_t value); static int riscv013_set_register(struct target *target, enum gdb_regno regid,
riscv_reg_t value);
static int dm013_select_hart(struct target *target, int hart_index); static int dm013_select_hart(struct target *target, int hart_index);
static int riscv013_halt_prep(struct target *target); static int riscv013_halt_prep(struct target *target);
static int riscv013_halt_go(struct target *target); static int riscv013_halt_go(struct target *target);
@ -57,9 +58,10 @@ static void riscv013_fill_dmi_write_u64(struct target *target, char *buf, int a,
static void riscv013_fill_dmi_read_u64(struct target *target, char *buf, int a); static void riscv013_fill_dmi_read_u64(struct target *target, char *buf, int a);
static int riscv013_dmi_write_u64_bits(struct target *target); static int riscv013_dmi_write_u64_bits(struct target *target);
static void riscv013_fill_dmi_nop_u64(struct target *target, char *buf); static void riscv013_fill_dmi_nop_u64(struct target *target, char *buf);
static int register_read_direct(struct target *target, uint64_t *value, uint32_t number); static int register_read_direct(struct target *target, riscv_reg_t *value,
static int register_write_direct(struct target *target, unsigned number, enum gdb_regno number);
uint64_t value); static int register_write_direct(struct target *target, enum gdb_regno number,
riscv_reg_t value);
static int read_memory(struct target *target, target_addr_t address, static int read_memory(struct target *target, target_addr_t address,
uint32_t size, uint32_t count, uint8_t *buffer, uint32_t increment); uint32_t size, uint32_t count, uint8_t *buffer, uint32_t increment);
static int write_memory(struct target *target, target_addr_t address, static int write_memory(struct target *target, target_addr_t address,
@ -875,8 +877,8 @@ static uint32_t access_register_command(struct target *target, uint32_t number,
return command; return command;
} }
static int register_read_abstract(struct target *target, uint64_t *value, static int register_read_abstract(struct target *target, riscv_reg_t *value,
uint32_t number, unsigned size) enum gdb_regno number, unsigned int size)
{ {
RISCV013_INFO(info); RISCV013_INFO(info);
@ -913,8 +915,8 @@ static int register_read_abstract(struct target *target, uint64_t *value,
return ERROR_OK; return ERROR_OK;
} }
static int register_write_abstract(struct target *target, uint32_t number, static int register_write_abstract(struct target *target, enum gdb_regno number,
uint64_t value, unsigned size) riscv_reg_t value, unsigned int size)
{ {
RISCV013_INFO(info); RISCV013_INFO(info);
@ -1043,7 +1045,7 @@ static int examine_progbuf(struct target *target)
return ERROR_OK; return ERROR_OK;
} }
static int is_fpu_reg(uint32_t gdb_regno) static int is_fpu_reg(enum gdb_regno gdb_regno)
{ {
return (gdb_regno >= GDB_REGNO_FPR0 && gdb_regno <= GDB_REGNO_FPR31) || return (gdb_regno >= GDB_REGNO_FPR0 && gdb_regno <= GDB_REGNO_FPR31) ||
(gdb_regno == GDB_REGNO_CSR0 + CSR_FFLAGS) || (gdb_regno == GDB_REGNO_CSR0 + CSR_FFLAGS) ||
@ -1051,7 +1053,7 @@ static int is_fpu_reg(uint32_t gdb_regno)
(gdb_regno == GDB_REGNO_CSR0 + CSR_FCSR); (gdb_regno == GDB_REGNO_CSR0 + CSR_FCSR);
} }
static int is_vector_reg(uint32_t gdb_regno) static int is_vector_reg(enum gdb_regno gdb_regno)
{ {
return (gdb_regno >= GDB_REGNO_V0 && gdb_regno <= GDB_REGNO_V31) || return (gdb_regno >= GDB_REGNO_V0 && gdb_regno <= GDB_REGNO_V31) ||
gdb_regno == GDB_REGNO_VSTART || gdb_regno == GDB_REGNO_VSTART ||
@ -1063,8 +1065,8 @@ static int is_vector_reg(uint32_t gdb_regno)
gdb_regno == GDB_REGNO_VLENB; gdb_regno == GDB_REGNO_VLENB;
} }
static int prep_for_register_access(struct target *target, uint64_t *mstatus, static int prep_for_register_access(struct target *target, riscv_reg_t *mstatus,
int regno) enum gdb_regno regno)
{ {
if (is_fpu_reg(regno) || is_vector_reg(regno)) { if (is_fpu_reg(regno) || is_vector_reg(regno)) {
if (register_read_direct(target, mstatus, GDB_REGNO_MSTATUS) != ERROR_OK) if (register_read_direct(target, mstatus, GDB_REGNO_MSTATUS) != ERROR_OK)
@ -1085,7 +1087,7 @@ static int prep_for_register_access(struct target *target, uint64_t *mstatus,
} }
static int cleanup_after_register_access(struct target *target, static int cleanup_after_register_access(struct target *target,
uint64_t mstatus, int regno) riscv_reg_t mstatus, enum gdb_regno regno)
{ {
if ((is_fpu_reg(regno) && (mstatus & MSTATUS_FS) == 0) || if ((is_fpu_reg(regno) && (mstatus & MSTATUS_FS) == 0) ||
(is_vector_reg(regno) && (mstatus & MSTATUS_VS) == 0)) (is_vector_reg(regno) && (mstatus & MSTATUS_VS) == 0))
@ -1254,7 +1256,7 @@ static int scratch_write64(struct target *target, scratch_mem_t *scratch,
} }
/** Return register size in bits. */ /** Return register size in bits. */
static unsigned register_size(struct target *target, unsigned number) static unsigned int register_size(struct target *target, enum gdb_regno number)
{ {
/* If reg_cache hasn't been initialized yet, make a guess. We need this for /* If reg_cache hasn't been initialized yet, make a guess. We need this for
* when this function is called during examine(). */ * when this function is called during examine(). */
@ -1276,12 +1278,12 @@ static bool has_sufficient_progbuf(struct target *target, unsigned size)
* Immediately write the new value to the requested register. This mechanism * Immediately write the new value to the requested register. This mechanism
* bypasses any caches. * bypasses any caches.
*/ */
static int register_write_direct(struct target *target, unsigned number, static int register_write_direct(struct target *target, enum gdb_regno number,
uint64_t value) riscv_reg_t value)
{ {
LOG_TARGET_DEBUG(target, "%s <- 0x%" PRIx64, gdb_regno_name(number), value); LOG_TARGET_DEBUG(target, "%s <- 0x%" PRIx64, gdb_regno_name(number), value);
uint64_t mstatus; riscv_reg_t mstatus;
if (prep_for_register_access(target, &mstatus, number) != ERROR_OK) if (prep_for_register_access(target, &mstatus, number) != ERROR_OK)
return ERROR_FAIL; return ERROR_FAIL;
@ -1378,12 +1380,13 @@ static int register_write_direct(struct target *target, unsigned number,
} }
/** Actually read registers from the target right now. */ /** Actually read registers from the target right now. */
static int register_read_direct(struct target *target, uint64_t *value, uint32_t number) static int register_read_direct(struct target *target, riscv_reg_t *value,
enum gdb_regno number)
{ {
if (dm013_select_target(target) != ERROR_OK) if (dm013_select_target(target) != ERROR_OK)
return ERROR_FAIL; return ERROR_FAIL;
uint64_t mstatus; riscv_reg_t mstatus;
if (prep_for_register_access(target, &mstatus, number) != ERROR_OK) if (prep_for_register_access(target, &mstatus, number) != ERROR_OK)
return ERROR_FAIL; return ERROR_FAIL;
@ -1910,8 +1913,8 @@ static COMMAND_HELPER(riscv013_print_info, struct target *target)
return 0; return 0;
} }
static int prep_for_vector_access(struct target *target, uint64_t *saved_vtype, static int prep_for_vector_access(struct target *target, riscv_reg_t *saved_vtype,
uint64_t *saved_vl, unsigned *debug_vl, unsigned *debug_vsew) riscv_reg_t *saved_vl, unsigned int *debug_vl, unsigned int *debug_vsew)
{ {
RISCV_INFO(r); RISCV_INFO(r);
/* TODO: this continuous save/restore is terrible for performance. */ /* TODO: this continuous save/restore is terrible for performance. */
@ -1964,8 +1967,8 @@ static int prep_for_vector_access(struct target *target, uint64_t *saved_vtype,
return ERROR_OK; return ERROR_OK;
} }
static int cleanup_after_vector_access(struct target *target, uint64_t vtype, static int cleanup_after_vector_access(struct target *target, riscv_reg_t vtype,
uint64_t vl) riscv_reg_t vl)
{ {
/* Restore vtype and vl. */ /* Restore vtype and vl. */
if (register_write_direct(target, GDB_REGNO_VTYPE, vtype) != ERROR_OK) if (register_write_direct(target, GDB_REGNO_VTYPE, vtype) != ERROR_OK)
@ -1976,7 +1979,7 @@ static int cleanup_after_vector_access(struct target *target, uint64_t vtype,
} }
static int riscv013_get_register_buf(struct target *target, static int riscv013_get_register_buf(struct target *target,
uint8_t *value, int regno) uint8_t *value, enum gdb_regno regno)
{ {
assert(regno >= GDB_REGNO_V0 && regno <= GDB_REGNO_V31); assert(regno >= GDB_REGNO_V0 && regno <= GDB_REGNO_V31);
@ -1986,11 +1989,11 @@ static int riscv013_get_register_buf(struct target *target,
if (riscv_save_register(target, GDB_REGNO_S0) != ERROR_OK) if (riscv_save_register(target, GDB_REGNO_S0) != ERROR_OK)
return ERROR_FAIL; return ERROR_FAIL;
uint64_t mstatus; riscv_reg_t mstatus;
if (prep_for_register_access(target, &mstatus, regno) != ERROR_OK) if (prep_for_register_access(target, &mstatus, regno) != ERROR_OK)
return ERROR_FAIL; return ERROR_FAIL;
uint64_t vtype, vl; riscv_reg_t vtype, vl;
unsigned int debug_vl, debug_vsew; unsigned int debug_vl, debug_vsew;
if (prep_for_vector_access(target, &vtype, &vl, &debug_vl, &debug_vsew) != ERROR_OK) if (prep_for_vector_access(target, &vtype, &vl, &debug_vl, &debug_vsew) != ERROR_OK)
return ERROR_FAIL; return ERROR_FAIL;
@ -2014,7 +2017,7 @@ static int riscv013_get_register_buf(struct target *target,
* so messed up that attempting to restore isn't going to help. */ * so messed up that attempting to restore isn't going to help. */
result = riscv_program_exec(&program, target); result = riscv_program_exec(&program, target);
if (result == ERROR_OK) { if (result == ERROR_OK) {
uint64_t v; riscv_reg_t v;
if (register_read_direct(target, &v, GDB_REGNO_S0) != ERROR_OK) if (register_read_direct(target, &v, GDB_REGNO_S0) != ERROR_OK)
return ERROR_FAIL; return ERROR_FAIL;
buf_set_u64(value, debug_vsew * i, debug_vsew, v); buf_set_u64(value, debug_vsew * i, debug_vsew, v);
@ -2035,7 +2038,7 @@ static int riscv013_get_register_buf(struct target *target,
} }
static int riscv013_set_register_buf(struct target *target, static int riscv013_set_register_buf(struct target *target,
int regno, const uint8_t *value) enum gdb_regno regno, const uint8_t *value)
{ {
assert(regno >= GDB_REGNO_V0 && regno <= GDB_REGNO_V31); assert(regno >= GDB_REGNO_V0 && regno <= GDB_REGNO_V31);
@ -2045,11 +2048,11 @@ static int riscv013_set_register_buf(struct target *target,
if (riscv_save_register(target, GDB_REGNO_S0) != ERROR_OK) if (riscv_save_register(target, GDB_REGNO_S0) != ERROR_OK)
return ERROR_FAIL; return ERROR_FAIL;
uint64_t mstatus; riscv_reg_t mstatus;
if (prep_for_register_access(target, &mstatus, regno) != ERROR_OK) if (prep_for_register_access(target, &mstatus, regno) != ERROR_OK)
return ERROR_FAIL; return ERROR_FAIL;
uint64_t vtype, vl; riscv_reg_t vtype, vl;
unsigned int debug_vl, debug_vsew; unsigned int debug_vl, debug_vsew;
if (prep_for_vector_access(target, &vtype, &vl, &debug_vl, &debug_vsew) != ERROR_OK) if (prep_for_vector_access(target, &vtype, &vl, &debug_vl, &debug_vsew) != ERROR_OK)
return ERROR_FAIL; return ERROR_FAIL;
@ -4142,7 +4145,7 @@ struct target_type riscv013_target = {
/*** 0.13-specific implementations of various RISC-V helper functions. ***/ /*** 0.13-specific implementations of various RISC-V helper functions. ***/
static int riscv013_get_register(struct target *target, static int riscv013_get_register(struct target *target,
riscv_reg_t *value, int rid) riscv_reg_t *value, enum gdb_regno rid)
{ {
LOG_DEBUG("[%s] reading register %s", target_name(target), LOG_DEBUG("[%s] reading register %s", target_name(target),
gdb_regno_name(rid)); gdb_regno_name(rid));
@ -4170,7 +4173,8 @@ static int riscv013_get_register(struct target *target,
return result; return result;
} }
static int riscv013_set_register(struct target *target, int rid, uint64_t value) static int riscv013_set_register(struct target *target, enum gdb_regno rid,
riscv_reg_t value)
{ {
if (dm013_select_target(target) != ERROR_OK) if (dm013_select_target(target) != ERROR_OK)
return ERROR_FAIL; return ERROR_FAIL;
@ -4182,7 +4186,7 @@ static int riscv013_set_register(struct target *target, int rid, uint64_t value)
} else if (rid == GDB_REGNO_PC) { } else if (rid == GDB_REGNO_PC) {
LOG_TARGET_DEBUG(target, "writing PC to DPC: 0x%" PRIx64, value); LOG_TARGET_DEBUG(target, "writing PC to DPC: 0x%" PRIx64, value);
register_write_direct(target, GDB_REGNO_DPC, value); register_write_direct(target, GDB_REGNO_DPC, value);
uint64_t actual_value; riscv_reg_t actual_value;
register_read_direct(target, &actual_value, GDB_REGNO_DPC); register_read_direct(target, &actual_value, GDB_REGNO_DPC);
LOG_TARGET_DEBUG(target, " actual DPC written: 0x%016" PRIx64, actual_value); LOG_TARGET_DEBUG(target, " actual DPC written: 0x%016" PRIx64, actual_value);
if (value != actual_value) { if (value != actual_value) {
@ -4191,7 +4195,7 @@ static int riscv013_set_register(struct target *target, int rid, uint64_t value)
return ERROR_FAIL; return ERROR_FAIL;
} }
} else if (rid == GDB_REGNO_PRIV) { } else if (rid == GDB_REGNO_PRIV) {
uint64_t dcsr; riscv_reg_t dcsr;
register_read_direct(target, &dcsr, GDB_REGNO_DCSR); register_read_direct(target, &dcsr, GDB_REGNO_DCSR);
dcsr = set_field(dcsr, CSR_DCSR_PRV, get_field(value, VIRT_PRIV_PRV)); dcsr = set_field(dcsr, CSR_DCSR_PRV, get_field(value, VIRT_PRIV_PRV));
dcsr = set_field(dcsr, CSR_DCSR_V, get_field(value, VIRT_PRIV_V)); dcsr = set_field(dcsr, CSR_DCSR_V, get_field(value, VIRT_PRIV_V));

View File

@ -178,10 +178,13 @@ struct riscv_info {
/* Helper functions that target the various RISC-V debug spec /* Helper functions that target the various RISC-V debug spec
* implementations. */ * implementations. */
int (*get_register)(struct target *target, riscv_reg_t *value, int regid); int (*get_register)(struct target *target, riscv_reg_t *value,
int (*set_register)(struct target *target, int regid, uint64_t value); enum gdb_regno regno);
int (*get_register_buf)(struct target *target, uint8_t *buf, int regno); int (*set_register)(struct target *target, enum gdb_regno regno,
int (*set_register_buf)(struct target *target, int regno, riscv_reg_t value);
int (*get_register_buf)(struct target *target, uint8_t *buf,
enum gdb_regno regno);
int (*set_register_buf)(struct target *target, enum gdb_regno regno,
const uint8_t *buf); const uint8_t *buf);
int (*select_target)(struct target *target); int (*select_target)(struct target *target);
int (*get_hart_state)(struct target *target, enum riscv_hart_state *state); int (*get_hart_state)(struct target *target, enum riscv_hart_state *state);