X-Git-Url: https://review.openocd.org/gitweb?a=blobdiff_plain;ds=sidebyside;f=src%2Ftarget%2Fxscale.c;h=484cdceafdf523fa3d57d68300ffd2819ed298e7;hb=16b6b5e7a86353dbc0c4823fe3d772c0faca7c1c;hp=3b5674581c2b3131c9695b8648986ec77602ea92;hpb=2615bf4398f393ee1e387128064093dcd44749c8;p=openocd.git diff --git a/src/target/xscale.c b/src/target/xscale.c index 3b5674581c..484cdceafd 100644 --- a/src/target/xscale.c +++ b/src/target/xscale.c @@ -250,7 +250,7 @@ static void xscale_getbuf(jtag_callback_data_t arg) static int xscale_receive(struct target *target, uint32_t *buffer, int num_words) { if (num_words == 0) - return ERROR_INVALID_ARGUMENTS; + return ERROR_COMMAND_SYNTAX_ERROR; struct xscale_common *xscale = target_to_xscale(target); int retval = ERROR_OK; @@ -273,12 +273,16 @@ static int xscale_receive(struct target *target, uint32_t *buffer, int num_words memset(&fields, 0, sizeof fields); fields[0].num_bits = 3; + uint8_t tmp; + fields[0].in_value = &tmp; fields[0].check_value = &field0_check_value; fields[0].check_mask = &field0_check_mask; fields[1].num_bits = 32; fields[2].num_bits = 1; + uint8_t tmp2; + fields[2].in_value = &tmp2; fields[2].check_value = &field2_check_value; fields[2].check_mask = &field2_check_mask; @@ -317,7 +321,7 @@ static int xscale_receive(struct target *target, uint32_t *buffer, int num_words /* examine results */ for (i = words_done; i < num_words; i++) { - if (!(field0[0] & 1)) + if (!(field0[i] & 1)) { /* move backwards if necessary */ int j; @@ -573,7 +577,7 @@ static int xscale_send(struct target *target, const uint8_t *buffer, int count, break; default: LOG_ERROR("BUG: size neither 4, 2 nor 1"); - return ERROR_INVALID_ARGUMENTS; + return ERROR_COMMAND_SYNTAX_ERROR; } jtag_add_dr_out(target->tap, 3, @@ -836,7 +840,7 @@ static int xscale_arch_state(struct target *target) if (armv4_5->common_magic != ARM_COMMON_MAGIC) { LOG_ERROR("BUG: called for a non-ARMv4/5 target"); - return ERROR_INVALID_ARGUMENTS; + return ERROR_COMMAND_SYNTAX_ERROR; } arm_arch_state(target); @@ -1180,7 +1184,6 @@ static int xscale_resume(struct target *target, int current, { struct xscale_common *xscale = target_to_xscale(target); struct arm *armv4_5 = &xscale->armv4_5_common; - struct breakpoint *breakpoint = target->breakpoints; uint32_t current_pc; int retval; int i; @@ -1218,6 +1221,7 @@ static int xscale_resume(struct target *target, int current, /* the front-end may request us not to handle breakpoints */ if (handle_breakpoints) { + struct breakpoint *breakpoint; breakpoint = breakpoint_find(target, buf_get_u32(armv4_5->pc->value, 0, 32)); if (breakpoint != NULL) @@ -1242,6 +1246,8 @@ static int xscale_resume(struct target *target, int current, /* restore banked registers */ retval = xscale_restore_banked(target); + if (retval != ERROR_OK) + return retval; /* send resume request */ xscale_send_u32(target, 0x30); @@ -1289,6 +1295,8 @@ static int xscale_resume(struct target *target, int current, /* restore banked registers */ retval = xscale_restore_banked(target); + if (retval != ERROR_OK) + return retval; /* send resume request (command 0x30 or 0x31) * clean the trace buffer if it is to be enabled (0x62) */ @@ -1462,6 +1470,7 @@ static int xscale_step(struct target *target, int current, if ((retval = arm_simulate_step(target, NULL)) != ERROR_OK) return retval; current_pc = buf_get_u32(armv4_5->pc->value, 0, 32); + LOG_DEBUG("current pc %" PRIx32, current_pc); target->debug_reason = DBG_REASON_SINGLESTEP; target_call_event_callbacks(target, TARGET_EVENT_HALTED); @@ -1480,6 +1489,8 @@ static int xscale_step(struct target *target, int current, } retval = xscale_step_inner(target, current, address, handle_breakpoints); + if (retval != ERROR_OK) + return retval; if (breakpoint) { @@ -1860,7 +1871,7 @@ static int xscale_read_memory(struct target *target, uint32_t address, /* sanitize arguments */ if (((size != 4) && (size != 2) && (size != 1)) || (count == 0) || !(buffer)) - return ERROR_INVALID_ARGUMENTS; + return ERROR_COMMAND_SYNTAX_ERROR; if (((size == 4) && (address & 0x3u)) || ((size == 2) && (address & 0x1u))) return ERROR_TARGET_UNALIGNED_ACCESS; @@ -1900,7 +1911,7 @@ static int xscale_read_memory(struct target *target, uint32_t address, break; default: LOG_ERROR("invalid read size"); - return ERROR_INVALID_ARGUMENTS; + return ERROR_COMMAND_SYNTAX_ERROR; } } @@ -1952,7 +1963,7 @@ static int xscale_write_memory(struct target *target, uint32_t address, /* sanitize arguments */ if (((size != 4) && (size != 2) && (size != 1)) || (count == 0) || !(buffer)) - return ERROR_INVALID_ARGUMENTS; + return ERROR_COMMAND_SYNTAX_ERROR; if (((size == 4) && (address & 0x3u)) || ((size == 2) && (address & 0x1u))) return ERROR_TARGET_UNALIGNED_ACCESS; @@ -3201,8 +3212,7 @@ COMMAND_HANDLER(xscale_handle_debug_handler_command) if (CMD_ARGC < 2) { - LOG_ERROR("'xscale debug_handler
' command takes two required operands"); - return ERROR_OK; + return ERROR_COMMAND_SYNTAX_ERROR; } if ((target = get_target(CMD_ARGV[0])) == NULL) @@ -3405,7 +3415,7 @@ COMMAND_HANDLER(xscale_handle_vector_catch_command) if (CMD_ARGC < 1) { - command_print(CMD_CTX, "usage: xscale vector_catch [mask]"); + return ERROR_COMMAND_SYNTAX_ERROR; } else { @@ -3472,7 +3482,7 @@ COMMAND_HANDLER(xscale_handle_vector_table_command) } if (err) - command_print(CMD_CTX, "usage: xscale vector_table "); + return ERROR_COMMAND_SYNTAX_ERROR; return ERROR_OK; } @@ -3502,7 +3512,7 @@ COMMAND_HANDLER(xscale_handle_trace_buffer_command) else if (strcmp("disable", CMD_ARGV[0]) == 0) xscale->trace.mode = XSCALE_TRACE_DISABLED; else - return ERROR_INVALID_ARGUMENTS; + return ERROR_COMMAND_SYNTAX_ERROR; } if (CMD_ARGC >= 2 && xscale->trace.mode != XSCALE_TRACE_DISABLED) @@ -3516,7 +3526,7 @@ COMMAND_HANDLER(xscale_handle_trace_buffer_command) { command_print(CMD_CTX, "fill buffer count must be > 0"); xscale->trace.mode = XSCALE_TRACE_DISABLED; - return ERROR_INVALID_ARGUMENTS; + return ERROR_COMMAND_SYNTAX_ERROR; } xscale->trace.buffer_fill = buffcount; xscale->trace.mode = XSCALE_TRACE_FILL; @@ -3526,7 +3536,7 @@ COMMAND_HANDLER(xscale_handle_trace_buffer_command) else { xscale->trace.mode = XSCALE_TRACE_DISABLED; - return ERROR_INVALID_ARGUMENTS; + return ERROR_COMMAND_SYNTAX_ERROR; } } @@ -3558,8 +3568,7 @@ COMMAND_HANDLER(xscale_handle_trace_image_command) if (CMD_ARGC < 1) { - command_print(CMD_CTX, "usage: xscale trace_image [base address] [type]"); - return ERROR_OK; + return ERROR_COMMAND_SYNTAX_ERROR; } retval = xscale_verify_pointer(CMD_CTX, xscale); @@ -3618,8 +3627,7 @@ COMMAND_HANDLER(xscale_handle_dump_trace_command) if (CMD_ARGC < 1) { - command_print(CMD_CTX, "usage: xscale dump_trace "); - return ERROR_OK; + return ERROR_COMMAND_SYNTAX_ERROR; } trace_data = xscale->trace.data; @@ -3719,7 +3727,7 @@ COMMAND_HANDLER(xscale_handle_cp15) break; default: command_print(CMD_CTX, "invalid register number"); - return ERROR_INVALID_ARGUMENTS; + return ERROR_COMMAND_SYNTAX_ERROR; } reg = &xscale->reg_cache->reg_list[reg_no]; @@ -3752,7 +3760,7 @@ COMMAND_HANDLER(xscale_handle_cp15) } else { - command_print(CMD_CTX, "usage: cp15 [register]<, [value]>"); + return ERROR_COMMAND_SYNTAX_ERROR; } return ERROR_OK; @@ -3848,7 +3856,7 @@ static const struct command_registration xscale_any_command_handlers[] = { .handler = xscale_handle_debug_handler_command, .mode = COMMAND_ANY, .help = "Change address used for debug handler.", - .usage = "target address", + .usage = "
", }, { .name = "cache_clean_address",