X-Git-Url: https://review.openocd.org/gitweb?a=blobdiff_plain;f=src%2Ftarget%2Fxscale.c;h=ed2afa461e75c3ba8d277dded14ee2c41017d565;hb=9188a9bc680702a10ed5ccd4a748829816fe172d;hp=d03184a10589bfd292278797ba309c68434d915d;hpb=08d4411b59dd8bd0e7d8009003b71d23acbf6eee;p=openocd.git diff --git a/src/target/xscale.c b/src/target/xscale.c index d03184a105..ed2afa461e 100644 --- a/src/target/xscale.c +++ b/src/target/xscale.c @@ -1447,6 +1447,13 @@ static int xscale_assert_reset(struct target *target) LOG_DEBUG("target->state: %s", target_state_name(target)); + /* assert reset */ + jtag_add_reset(0, 1); + + /* sleep 1ms, to be sure we fulfill any requirements */ + jtag_add_sleep(1000); + jtag_execute_queue(); + /* select DCSR instruction (set endstate to R-T-I to ensure we don't * end up in T-L-R, which would reset JTAG */ @@ -1463,13 +1470,6 @@ static int xscale_assert_reset(struct target *target) xscale_jtag_set_instr(target->tap, ~0, TAP_IDLE); jtag_execute_queue(); - /* assert reset */ - jtag_add_reset(0, 1); - - /* sleep 1ms, to be sure we fulfill any requirements */ - jtag_add_sleep(1000); - jtag_execute_queue(); - target->state = TARGET_RESET; if (target->reset_halt) { @@ -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",