target: add generic Xtensa LX support
Generic Xtensa LX support extends the original Espressif/Xtensa patch-set to support arbitrary Xtensa configurations, as defined in a core-specific .cfg file. Not yet fully-featured. Additional functionality to be added: - Xtensa NX support - DAP/SWD support - File-IO support - Generic Xtensa multi-core support Valgrind-clean, no new Clang analyzer warnings Signed-off-by: Ian Thompson <ianst@cadence.com> Change-Id: I08e7bf8fa57c25b5d0cb75a1aa7a2ac13a380c52 Reviewed-on: https://review.openocd.org/c/openocd/+/7055 Tested-by: jenkins Reviewed-by: Erhan Kurubas <erhan.kurubas@espressif.com> Reviewed-by: Antonio Borneo <borneo.antonio@gmail.com>
This commit is contained in:
committed by
Antonio Borneo
parent
be2e5c6c35
commit
ce5ca9f7ba
@@ -450,11 +450,10 @@ int esp_xtensa_smp_watchpoint_remove(struct target *target, struct watchpoint *w
|
||||
|
||||
int esp_xtensa_smp_init_arch_info(struct target *target,
|
||||
struct esp_xtensa_smp_common *esp_xtensa_smp,
|
||||
const struct xtensa_config *xtensa_cfg,
|
||||
struct xtensa_debug_module_config *dm_cfg,
|
||||
const struct esp_xtensa_smp_chip_ops *chip_ops)
|
||||
{
|
||||
int ret = esp_xtensa_init_arch_info(target, &esp_xtensa_smp->esp_xtensa, xtensa_cfg, dm_cfg);
|
||||
int ret = esp_xtensa_init_arch_info(target, &esp_xtensa_smp->esp_xtensa, dm_cfg);
|
||||
if (ret != ERROR_OK)
|
||||
return ret;
|
||||
esp_xtensa_smp->chip_ops = chip_ops;
|
||||
@@ -467,6 +466,139 @@ int esp_xtensa_smp_target_init(struct command_context *cmd_ctx, struct target *t
|
||||
return esp_xtensa_target_init(cmd_ctx, target);
|
||||
}
|
||||
|
||||
COMMAND_HANDLER(esp_xtensa_smp_cmd_xtdef)
|
||||
{
|
||||
struct target *target = get_current_target(CMD_CTX);
|
||||
if (target->smp && CMD_ARGC > 0) {
|
||||
struct target_list *head;
|
||||
struct target *curr;
|
||||
foreach_smp_target(head, target->smp_targets) {
|
||||
curr = head->target;
|
||||
int ret = CALL_COMMAND_HANDLER(xtensa_cmd_xtdef_do,
|
||||
target_to_xtensa(curr));
|
||||
if (ret != ERROR_OK)
|
||||
return ret;
|
||||
}
|
||||
return ERROR_OK;
|
||||
}
|
||||
return CALL_COMMAND_HANDLER(xtensa_cmd_xtdef_do,
|
||||
target_to_xtensa(target));
|
||||
}
|
||||
|
||||
COMMAND_HANDLER(esp_xtensa_smp_cmd_xtopt)
|
||||
{
|
||||
struct target *target = get_current_target(CMD_CTX);
|
||||
if (target->smp && CMD_ARGC > 0) {
|
||||
struct target_list *head;
|
||||
struct target *curr;
|
||||
foreach_smp_target(head, target->smp_targets) {
|
||||
curr = head->target;
|
||||
int ret = CALL_COMMAND_HANDLER(xtensa_cmd_xtopt_do,
|
||||
target_to_xtensa(curr));
|
||||
if (ret != ERROR_OK)
|
||||
return ret;
|
||||
}
|
||||
return ERROR_OK;
|
||||
}
|
||||
return CALL_COMMAND_HANDLER(xtensa_cmd_xtopt_do,
|
||||
target_to_xtensa(target));
|
||||
}
|
||||
|
||||
COMMAND_HANDLER(esp_xtensa_smp_cmd_xtmem)
|
||||
{
|
||||
struct target *target = get_current_target(CMD_CTX);
|
||||
if (target->smp && CMD_ARGC > 0) {
|
||||
struct target_list *head;
|
||||
struct target *curr;
|
||||
foreach_smp_target(head, target->smp_targets) {
|
||||
curr = head->target;
|
||||
int ret = CALL_COMMAND_HANDLER(xtensa_cmd_xtmem_do,
|
||||
target_to_xtensa(curr));
|
||||
if (ret != ERROR_OK)
|
||||
return ret;
|
||||
}
|
||||
return ERROR_OK;
|
||||
}
|
||||
return CALL_COMMAND_HANDLER(xtensa_cmd_xtmem_do,
|
||||
target_to_xtensa(target));
|
||||
}
|
||||
|
||||
COMMAND_HANDLER(esp_xtensa_smp_cmd_xtmpu)
|
||||
{
|
||||
struct target *target = get_current_target(CMD_CTX);
|
||||
if (target->smp && CMD_ARGC > 0) {
|
||||
struct target_list *head;
|
||||
struct target *curr;
|
||||
foreach_smp_target(head, target->smp_targets) {
|
||||
curr = head->target;
|
||||
int ret = CALL_COMMAND_HANDLER(xtensa_cmd_xtmpu_do,
|
||||
target_to_xtensa(curr));
|
||||
if (ret != ERROR_OK)
|
||||
return ret;
|
||||
}
|
||||
return ERROR_OK;
|
||||
}
|
||||
return CALL_COMMAND_HANDLER(xtensa_cmd_xtmpu_do,
|
||||
target_to_xtensa(target));
|
||||
}
|
||||
|
||||
COMMAND_HANDLER(esp_xtensa_smp_cmd_xtmmu)
|
||||
{
|
||||
struct target *target = get_current_target(CMD_CTX);
|
||||
if (target->smp && CMD_ARGC > 0) {
|
||||
struct target_list *head;
|
||||
struct target *curr;
|
||||
foreach_smp_target(head, target->smp_targets) {
|
||||
curr = head->target;
|
||||
int ret = CALL_COMMAND_HANDLER(xtensa_cmd_xtmmu_do,
|
||||
target_to_xtensa(curr));
|
||||
if (ret != ERROR_OK)
|
||||
return ret;
|
||||
}
|
||||
return ERROR_OK;
|
||||
}
|
||||
return CALL_COMMAND_HANDLER(xtensa_cmd_xtmmu_do,
|
||||
target_to_xtensa(target));
|
||||
}
|
||||
|
||||
COMMAND_HANDLER(esp_xtensa_smp_cmd_xtreg)
|
||||
{
|
||||
struct target *target = get_current_target(CMD_CTX);
|
||||
if (target->smp && CMD_ARGC > 0) {
|
||||
struct target_list *head;
|
||||
struct target *curr;
|
||||
foreach_smp_target(head, target->smp_targets) {
|
||||
curr = head->target;
|
||||
int ret = CALL_COMMAND_HANDLER(xtensa_cmd_xtreg_do,
|
||||
target_to_xtensa(curr));
|
||||
if (ret != ERROR_OK)
|
||||
return ret;
|
||||
}
|
||||
return ERROR_OK;
|
||||
}
|
||||
return CALL_COMMAND_HANDLER(xtensa_cmd_xtreg_do,
|
||||
target_to_xtensa(target));
|
||||
}
|
||||
|
||||
COMMAND_HANDLER(esp_xtensa_smp_cmd_xtregfmt)
|
||||
{
|
||||
struct target *target = get_current_target(CMD_CTX);
|
||||
if (target->smp && CMD_ARGC > 0) {
|
||||
struct target_list *head;
|
||||
struct target *curr;
|
||||
foreach_smp_target(head, target->smp_targets) {
|
||||
curr = head->target;
|
||||
int ret = CALL_COMMAND_HANDLER(xtensa_cmd_xtregfmt_do,
|
||||
target_to_xtensa(curr));
|
||||
if (ret != ERROR_OK)
|
||||
return ret;
|
||||
}
|
||||
return ERROR_OK;
|
||||
}
|
||||
return CALL_COMMAND_HANDLER(xtensa_cmd_xtregfmt_do,
|
||||
target_to_xtensa(target));
|
||||
}
|
||||
|
||||
COMMAND_HANDLER(esp_xtensa_smp_cmd_permissive_mode)
|
||||
{
|
||||
struct target *target = get_current_target(CMD_CTX);
|
||||
@@ -632,6 +764,62 @@ COMMAND_HANDLER(esp_xtensa_smp_cmd_tracedump)
|
||||
}
|
||||
|
||||
const struct command_registration esp_xtensa_smp_xtensa_command_handlers[] = {
|
||||
{
|
||||
.name = "xtdef",
|
||||
.handler = esp_xtensa_smp_cmd_xtdef,
|
||||
.mode = COMMAND_CONFIG,
|
||||
.help = "Configure Xtensa core type",
|
||||
.usage = "<type>",
|
||||
},
|
||||
{
|
||||
.name = "xtopt",
|
||||
.handler = esp_xtensa_smp_cmd_xtopt,
|
||||
.mode = COMMAND_CONFIG,
|
||||
.help = "Configure Xtensa core option",
|
||||
.usage = "<name> <value>",
|
||||
},
|
||||
{
|
||||
.name = "xtmem",
|
||||
.handler = esp_xtensa_smp_cmd_xtmem,
|
||||
.mode = COMMAND_CONFIG,
|
||||
.help = "Configure Xtensa memory/cache option",
|
||||
.usage = "<type> [parameters]",
|
||||
},
|
||||
{
|
||||
.name = "xtmmu",
|
||||
.handler = esp_xtensa_smp_cmd_xtmmu,
|
||||
.mode = COMMAND_CONFIG,
|
||||
.help = "Configure Xtensa MMU option",
|
||||
.usage = "<NIREFILLENTRIES> <NDREFILLENTRIES> <IVARWAY56> <DVARWAY56>",
|
||||
},
|
||||
{
|
||||
.name = "xtmpu",
|
||||
.handler = esp_xtensa_smp_cmd_xtmpu,
|
||||
.mode = COMMAND_CONFIG,
|
||||
.help = "Configure Xtensa MPU option",
|
||||
.usage = "<num FG seg> <min seg size> <lockable> <executeonly>",
|
||||
},
|
||||
{
|
||||
.name = "xtreg",
|
||||
.handler = esp_xtensa_smp_cmd_xtreg,
|
||||
.mode = COMMAND_CONFIG,
|
||||
.help = "Configure Xtensa register",
|
||||
.usage = "<regname> <regnum>",
|
||||
},
|
||||
{
|
||||
.name = "xtregs",
|
||||
.handler = esp_xtensa_smp_cmd_xtreg,
|
||||
.mode = COMMAND_CONFIG,
|
||||
.help = "Configure number of Xtensa registers",
|
||||
.usage = "<numregs>",
|
||||
},
|
||||
{
|
||||
.name = "xtregfmt",
|
||||
.handler = esp_xtensa_smp_cmd_xtregfmt,
|
||||
.mode = COMMAND_CONFIG,
|
||||
.help = "Configure format of Xtensa register map",
|
||||
.usage = "<numgregs>",
|
||||
},
|
||||
{
|
||||
.name = "set_permissive",
|
||||
.handler = esp_xtensa_smp_cmd_permissive_mode,
|
||||
|
||||
Reference in New Issue
Block a user