Allocate RISC-V arch_info during target creation (#531)

* Allocate RISC-V arch_info during target creation

* Ensured that target->arch_info is allocated as soon as the
  target is created. Needed so that per-target config commands
  (e.g. "riscv set_mem_access") can be executed also in the
  OpenOCD's config phase (before calling "init").

* Added several assert()'s for safety.

Signed-off-by: Jan Matyas <matyas@codasip.com>

* Removed a TODO comment
This commit is contained in:
Jan Matyas 2020-09-17 22:20:12 +02:00 committed by GitHub
parent 1712dc2c54
commit 11c4f89b32
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 25 additions and 10 deletions

View File

@ -228,6 +228,8 @@ static int get_register(struct target *target, riscv_reg_t *value, int hartid,
static riscv011_info_t *get_info(const struct target *target) static riscv011_info_t *get_info(const struct target *target)
{ {
riscv_info_t *info = (riscv_info_t *) target->arch_info; riscv_info_t *info = (riscv_info_t *) target->arch_info;
assert(info);
assert(info->version_specific);
return (riscv011_info_t *) info->version_specific; return (riscv011_info_t *) info->version_specific;
} }
@ -2300,7 +2302,7 @@ static int init_target(struct command_context *cmd_ctx,
struct target *target) struct target *target)
{ {
LOG_DEBUG("init"); LOG_DEBUG("init");
riscv_info_t *generic_info = (riscv_info_t *)target->arch_info; RISCV_INFO(generic_info);
generic_info->get_register = get_register; generic_info->get_register = get_register;
generic_info->set_register = set_register; generic_info->set_register = set_register;
generic_info->read_memory = read_memory; generic_info->read_memory = read_memory;

View File

@ -239,6 +239,8 @@ LIST_HEAD(dm_list);
static riscv013_info_t *get_info(const struct target *target) static riscv013_info_t *get_info(const struct target *target)
{ {
riscv_info_t *info = (riscv_info_t *) target->arch_info; riscv_info_t *info = (riscv_info_t *) target->arch_info;
assert(info);
assert(info->version_specific);
return (riscv013_info_t *) info->version_specific; return (riscv013_info_t *) info->version_specific;
} }
@ -2031,7 +2033,7 @@ static int init_target(struct command_context *cmd_ctx,
struct target *target) struct target *target)
{ {
LOG_DEBUG("init"); LOG_DEBUG("init");
riscv_info_t *generic_info = (riscv_info_t *) target->arch_info; RISCV_INFO(generic_info);
generic_info->get_register = &riscv013_get_register; generic_info->get_register = &riscv013_get_register;
generic_info->set_register = &riscv013_set_register; generic_info->set_register = &riscv013_set_register;

View File

@ -468,15 +468,21 @@ static struct target_type *get_target_type(struct target *target)
} }
} }
static int riscv_create_target(struct target *target, Jim_Interp *interp)
{
LOG_DEBUG("riscv_create_target()");
target->arch_info = calloc(1, sizeof(riscv_info_t));
if (!target->arch_info)
return ERROR_FAIL;
riscv_info_init(target, target->arch_info);
return ERROR_OK;
}
static int riscv_init_target(struct command_context *cmd_ctx, static int riscv_init_target(struct command_context *cmd_ctx,
struct target *target) struct target *target)
{ {
LOG_DEBUG("riscv_init_target()"); LOG_DEBUG("riscv_init_target()");
target->arch_info = calloc(1, sizeof(riscv_info_t)); RISCV_INFO(info);
if (!target->arch_info)
return ERROR_FAIL;
riscv_info_t *info = (riscv_info_t *) target->arch_info;
riscv_info_init(target, info);
info->cmd_ctx = cmd_ctx; info->cmd_ctx = cmd_ctx;
select_dtmcontrol.num_bits = target->tap->ir_length; select_dtmcontrol.num_bits = target->tap->ir_length;
@ -1143,7 +1149,7 @@ static int riscv_examine(struct target *target)
/* Don't need to select dbus, since the first thing we do is read dtmcontrol. */ /* Don't need to select dbus, since the first thing we do is read dtmcontrol. */
riscv_info_t *info = (riscv_info_t *) target->arch_info; RISCV_INFO(info);
uint32_t dtmcontrol = dtmcontrol_scan(target, 0); uint32_t dtmcontrol = dtmcontrol_scan(target, 0);
LOG_DEBUG("dtmcontrol=0x%x", dtmcontrol); LOG_DEBUG("dtmcontrol=0x%x", dtmcontrol);
info->dtm_version = get_field(dtmcontrol, DTMCONTROL_VERSION); info->dtm_version = get_field(dtmcontrol, DTMCONTROL_VERSION);
@ -1865,7 +1871,7 @@ static int riscv_run_algorithm(struct target *target, int num_mem_params,
struct reg_param *reg_params, target_addr_t entry_point, struct reg_param *reg_params, target_addr_t entry_point,
target_addr_t exit_point, int timeout_ms, void *arch_info) target_addr_t exit_point, int timeout_ms, void *arch_info)
{ {
riscv_info_t *info = (riscv_info_t *) target->arch_info; RISCV_INFO(info);
int hartid = riscv_current_hartid(target); int hartid = riscv_current_hartid(target);
if (num_mem_params > 0) { if (num_mem_params > 0) {
@ -3129,6 +3135,7 @@ static unsigned riscv_data_bits(struct target *target)
struct target_type riscv_target = { struct target_type riscv_target = {
.name = "riscv", .name = "riscv",
.target_create = riscv_create_target,
.init_target = riscv_init_target, .init_target = riscv_init_target,
.deinit_target = riscv_deinit_target, .deinit_target = riscv_deinit_target,
.examine = riscv_examine, .examine = riscv_examine,
@ -3181,6 +3188,7 @@ void riscv_info_init(struct target *target, riscv_info_t *r)
r->dtm_version = 1; r->dtm_version = 1;
r->registers_initialized = false; r->registers_initialized = false;
r->current_hartid = target->coreid; r->current_hartid = target->coreid;
r->version_specific = NULL;
memset(r->trigger_unique_id, 0xff, sizeof(r->trigger_unique_id)); memset(r->trigger_unique_id, 0xff, sizeof(r->trigger_unique_id));

View File

@ -232,7 +232,10 @@ extern bool riscv_ebreaku;
* that provides that. */ * that provides that. */
static inline riscv_info_t *riscv_info(const struct target *target) __attribute__((unused)); static inline riscv_info_t *riscv_info(const struct target *target) __attribute__((unused));
static inline riscv_info_t *riscv_info(const struct target *target) static inline riscv_info_t *riscv_info(const struct target *target)
{ return target->arch_info; } {
assert(target->arch_info);
return target->arch_info;
}
#define RISCV_INFO(R) riscv_info_t *R = riscv_info(target); #define RISCV_INFO(R) riscv_info_t *R = riscv_info(target);
extern uint8_t ir_dtmcontrol[4]; extern uint8_t ir_dtmcontrol[4];