target: aarch64: rewrite commands 'aarch64 mcr/mrc' as COMMAND_HANDLER

This also fixes an incorrect return ERROR_TARGET_NOT_HALTED from a
jim command.

Change-Id: I99a02a21bedb64e60944e295c7cf24356e07be60
Signed-off-by: Antonio Borneo <borneo.antonio@gmail.com>
Reviewed-on: https://review.openocd.org/c/openocd/+/7490
Tested-by: jenkins
This commit is contained in:
Antonio Borneo 2022-12-19 12:49:20 +01:00
parent 0332da1f15
commit 21e6252965
1 changed files with 46 additions and 83 deletions

View File

@ -2952,53 +2952,41 @@ COMMAND_HANDLER(aarch64_mask_interrupts_command)
return ERROR_OK; return ERROR_OK;
} }
static int jim_mcrmrc(Jim_Interp *interp, int argc, Jim_Obj * const *argv) COMMAND_HANDLER(aarch64_mcrmrc_command)
{ {
struct command *c = jim_to_command(interp);
struct command_context *context;
struct target *target;
struct arm *arm;
int retval;
bool is_mcr = false; bool is_mcr = false;
int arg_cnt = 0; unsigned int arg_cnt = 5;
if (!strcmp(c->name, "mcr")) { if (!strcmp(CMD_NAME, "mcr")) {
is_mcr = true; is_mcr = true;
arg_cnt = 7;
} else {
arg_cnt = 6; arg_cnt = 6;
} }
context = current_command_context(interp); if (arg_cnt != CMD_ARGC)
assert(context); return ERROR_COMMAND_SYNTAX_ERROR;
target = get_current_target(context); struct target *target = get_current_target(CMD_CTX);
if (!target) { if (!target) {
LOG_ERROR("%s: no current target", __func__); command_print(CMD, "no current target");
return JIM_ERR; return ERROR_FAIL;
} }
if (!target_was_examined(target)) { if (!target_was_examined(target)) {
LOG_ERROR("%s: not yet examined", target_name(target)); command_print(CMD, "%s: not yet examined", target_name(target));
return JIM_ERR; return ERROR_TARGET_NOT_EXAMINED;
} }
arm = target_to_arm(target); struct arm *arm = target_to_arm(target);
if (!is_arm(arm)) { if (!is_arm(arm)) {
LOG_ERROR("%s: not an ARM", target_name(target)); command_print(CMD, "%s: not an ARM", target_name(target));
return JIM_ERR; return ERROR_FAIL;
} }
if (target->state != TARGET_HALTED) if (target->state != TARGET_HALTED)
return ERROR_TARGET_NOT_HALTED; return ERROR_TARGET_NOT_HALTED;
if (arm->core_state == ARM_STATE_AARCH64) { if (arm->core_state == ARM_STATE_AARCH64) {
LOG_ERROR("%s: not 32-bit arm target", target_name(target)); command_print(CMD, "%s: not 32-bit arm target", target_name(target));
return JIM_ERR; return ERROR_FAIL;
}
if (argc != arg_cnt) {
LOG_ERROR("%s: wrong number of arguments", __func__);
return JIM_ERR;
} }
int cpnum; int cpnum;
@ -3007,87 +2995,62 @@ static int jim_mcrmrc(Jim_Interp *interp, int argc, Jim_Obj * const *argv)
uint32_t crn; uint32_t crn;
uint32_t crm; uint32_t crm;
uint32_t value; uint32_t value;
long l;
/* NOTE: parameter sequence matches ARM instruction set usage: /* NOTE: parameter sequence matches ARM instruction set usage:
* MCR pNUM, op1, rX, CRn, CRm, op2 ; write CP from rX * MCR pNUM, op1, rX, CRn, CRm, op2 ; write CP from rX
* MRC pNUM, op1, rX, CRn, CRm, op2 ; read CP into rX * MRC pNUM, op1, rX, CRn, CRm, op2 ; read CP into rX
* The "rX" is necessarily omitted; it uses Tcl mechanisms. * The "rX" is necessarily omitted; it uses Tcl mechanisms.
*/ */
retval = Jim_GetLong(interp, argv[1], &l); COMMAND_PARSE_NUMBER(int, CMD_ARGV[0], cpnum);
if (retval != JIM_OK) if (cpnum & ~0xf) {
return retval; command_print(CMD, "coprocessor %d out of range", cpnum);
if (l & ~0xf) { return ERROR_COMMAND_ARGUMENT_INVALID;
LOG_ERROR("%s: %s %d out of range", __func__,
"coprocessor", (int) l);
return JIM_ERR;
} }
cpnum = l;
retval = Jim_GetLong(interp, argv[2], &l); COMMAND_PARSE_NUMBER(u32, CMD_ARGV[1], op1);
if (retval != JIM_OK) if (op1 & ~0x7) {
return retval; command_print(CMD, "op1 %d out of range", op1);
if (l & ~0x7) { return ERROR_COMMAND_ARGUMENT_INVALID;
LOG_ERROR("%s: %s %d out of range", __func__,
"op1", (int) l);
return JIM_ERR;
} }
op1 = l;
retval = Jim_GetLong(interp, argv[3], &l); COMMAND_PARSE_NUMBER(u32, CMD_ARGV[2], crn);
if (retval != JIM_OK) if (crn & ~0xf) {
return retval; command_print(CMD, "CRn %d out of range", crn);
if (l & ~0xf) { return ERROR_COMMAND_ARGUMENT_INVALID;
LOG_ERROR("%s: %s %d out of range", __func__,
"CRn", (int) l);
return JIM_ERR;
} }
crn = l;
retval = Jim_GetLong(interp, argv[4], &l); COMMAND_PARSE_NUMBER(u32, CMD_ARGV[3], crm);
if (retval != JIM_OK) if (crm & ~0xf) {
return retval; command_print(CMD, "CRm %d out of range", crm);
if (l & ~0xf) { return ERROR_COMMAND_ARGUMENT_INVALID;
LOG_ERROR("%s: %s %d out of range", __func__,
"CRm", (int) l);
return JIM_ERR;
} }
crm = l;
retval = Jim_GetLong(interp, argv[5], &l); COMMAND_PARSE_NUMBER(u32, CMD_ARGV[4], op2);
if (retval != JIM_OK) if (op2 & ~0x7) {
return retval; command_print(CMD, "op2 %d out of range", op2);
if (l & ~0x7) { return ERROR_COMMAND_ARGUMENT_INVALID;
LOG_ERROR("%s: %s %d out of range", __func__,
"op2", (int) l);
return JIM_ERR;
} }
op2 = l;
value = 0; if (is_mcr) {
COMMAND_PARSE_NUMBER(u32, CMD_ARGV[5], value);
if (is_mcr == true) {
retval = Jim_GetLong(interp, argv[6], &l);
if (retval != JIM_OK)
return retval;
value = l;
/* NOTE: parameters reordered! */ /* NOTE: parameters reordered! */
/* ARMV4_5_MCR(cpnum, op1, 0, crn, crm, op2) */ /* ARMV4_5_MCR(cpnum, op1, 0, crn, crm, op2) */
retval = arm->mcr(target, cpnum, op1, op2, crn, crm, value); int retval = arm->mcr(target, cpnum, op1, op2, crn, crm, value);
if (retval != ERROR_OK) if (retval != ERROR_OK)
return JIM_ERR; return retval;
} else { } else {
value = 0;
/* NOTE: parameters reordered! */ /* NOTE: parameters reordered! */
/* ARMV4_5_MRC(cpnum, op1, 0, crn, crm, op2) */ /* ARMV4_5_MRC(cpnum, op1, 0, crn, crm, op2) */
retval = arm->mrc(target, cpnum, op1, op2, crn, crm, &value); int retval = arm->mrc(target, cpnum, op1, op2, crn, crm, &value);
if (retval != ERROR_OK) if (retval != ERROR_OK)
return JIM_ERR; return retval;
Jim_SetResult(interp, Jim_NewIntObj(interp, value)); command_print(CMD, "0x%" PRIx32, value);
} }
return JIM_OK; return ERROR_OK;
} }
static const struct command_registration aarch64_exec_command_handlers[] = { static const struct command_registration aarch64_exec_command_handlers[] = {
@ -3122,14 +3085,14 @@ static const struct command_registration aarch64_exec_command_handlers[] = {
{ {
.name = "mcr", .name = "mcr",
.mode = COMMAND_EXEC, .mode = COMMAND_EXEC,
.jim_handler = jim_mcrmrc, .handler = aarch64_mcrmrc_command,
.help = "write coprocessor register", .help = "write coprocessor register",
.usage = "cpnum op1 CRn CRm op2 value", .usage = "cpnum op1 CRn CRm op2 value",
}, },
{ {
.name = "mrc", .name = "mrc",
.mode = COMMAND_EXEC, .mode = COMMAND_EXEC,
.jim_handler = jim_mcrmrc, .handler = aarch64_mcrmrc_command,
.help = "read coprocessor register", .help = "read coprocessor register",
.usage = "cpnum op1 CRn CRm op2", .usage = "cpnum op1 CRn CRm op2",
}, },