diff options
author | Robert Jarzmik <robert.jarzmik@free.fr> | 2013-06-23 23:17:55 +0200 |
---|---|---|
committer | Spencer Oliver <spen@spen-soft.co.uk> | 2013-07-01 08:44:59 +0000 |
commit | 12e25f34ebc9a62ac327d51229c32deda009addc (patch) | |
tree | 472148fb8cb84ad76ad5fec1e2423dbc11c6f8cc /src/target/xscale.c | |
parent | ffcfbb02152a6696e4e3e6cba359ec89ffd54739 (diff) |
target: xscale more human vector catching
Replace hexadecimal masks for vector catching with words
representing the caught exception, such as dabt for data
abort, etc ...
This way, the new xscale command is :
- xscale vector_catch
Reads back to the user the current vector catching status
- xscale vector_catch reset dabt pabt
Sets the caught vectors to data abort and prefetch abort
for example.
This is mostly taken from Cortex-M3 openocd code.
Change-Id: I66591d5796f0e07f0f31edc8d28722e1e48aa8c5
Signed-off-by: Robert Jarzmik <robert.jarzmik@free.fr>
Reviewed-on: http://openocd.zylin.com/1456
Tested-by: jenkins
Reviewed-by: Marek Vasut <marek.vasut@gmail.com>
Reviewed-by: Spencer Oliver <spen@spen-soft.co.uk>
Diffstat (limited to 'src/target/xscale.c')
-rw-r--r-- | src/target/xscale.c | 60 |
1 files changed, 49 insertions, 11 deletions
diff --git a/src/target/xscale.c b/src/target/xscale.c index d03184a1..92c4ede8 100644 --- a/src/target/xscale.c +++ b/src/target/xscale.c @@ -3218,28 +3218,66 @@ COMMAND_HANDLER(xscale_handle_idcache_command) return ERROR_OK; } +static const struct { + char name[15]; + unsigned mask; +} vec_ids[] = { + { "fiq", DCSR_TF, }, + { "irq", DCSR_TI, }, + { "dabt", DCSR_TD, }, + { "pabt", DCSR_TA, }, + { "swi", DCSR_TS, }, + { "undef", DCSR_TU, }, + { "reset", DCSR_TR, }, +}; + COMMAND_HANDLER(xscale_handle_vector_catch_command) { struct target *target = get_current_target(CMD_CTX); struct xscale_common *xscale = target_to_xscale(target); int retval; + uint32_t dcsr_value; + uint32_t catch = 0; + struct reg *dcsr_reg = &xscale->reg_cache->reg_list[XSCALE_DCSR]; retval = xscale_verify_pointer(CMD_CTX, xscale); if (retval != ERROR_OK) return retval; - if (CMD_ARGC < 1) - return ERROR_COMMAND_SYNTAX_ERROR; - else { - COMMAND_PARSE_NUMBER(u8, CMD_ARGV[0], xscale->vector_catch); - buf_set_u32(xscale->reg_cache->reg_list[XSCALE_DCSR].value, - 16, - 8, - xscale->vector_catch); + dcsr_value = buf_get_u32(dcsr_reg->value, 0, 32); + if (CMD_ARGC > 0) { + if (CMD_ARGC == 1) { + if (strcmp(CMD_ARGV[0], "all") == 0) { + catch = DCSR_TRAP_MASK; + CMD_ARGC--; + } else if (strcmp(CMD_ARGV[0], "none") == 0) { + catch = 0; + CMD_ARGC--; + } + } + while (CMD_ARGC-- > 0) { + unsigned i; + for (i = 0; i < ARRAY_SIZE(vec_ids); i++) { + if (strcmp(CMD_ARGV[CMD_ARGC], vec_ids[i].name)) + continue; + catch |= vec_ids[i].mask; + break; + } + if (i == ARRAY_SIZE(vec_ids)) { + LOG_ERROR("No vector '%s'", CMD_ARGV[CMD_ARGC]); + return ERROR_COMMAND_SYNTAX_ERROR; + } + } + *(uint32_t *)(dcsr_reg->value) &= ~DCSR_TRAP_MASK; + *(uint32_t *)(dcsr_reg->value) |= catch; xscale_write_dcsr(target, -1, -1); } - command_print(CMD_CTX, "vector catch mask: 0x%2.2x", xscale->vector_catch); + dcsr_value = buf_get_u32(dcsr_reg->value, 0, 32); + for (unsigned i = 0; i < ARRAY_SIZE(vec_ids); i++) { + command_print(CMD_CTX, "%15s: %s", vec_ids[i].name, + (dcsr_value & vec_ids[i].mask) ? "catch" : "ignore"); + } return ERROR_OK; } @@ -3585,9 +3623,9 @@ static const struct command_registration xscale_exec_command_handlers[] = { .name = "vector_catch", .handler = xscale_handle_vector_catch_command, .mode = COMMAND_EXEC, - .help = "set or display 8-bit mask of vectors " + .help = "set or display mask of vectors " "that should trigger debug entry", - .usage = "[mask]", + .usage = "['all'|'none'|'fiq'|'irq'|'dabt'|'pabt'|'swi'|'undef'|'reset']", }, { .name = "vector_table", |