From 13eac429e1b2b6b9061a58c05dc7e67415d5ad0e Mon Sep 17 00:00:00 2001 From: ntfreak Date: Fri, 11 Jan 2008 20:38:43 +0000 Subject: [PATCH] - debug handler file not closed - (thanks to oyvind harboe for the patch) - arm_simulate_step called incorrect arm_evaluate_opcode when in thumb mode git-svn-id: svn://svn.berlios.de/openocd/trunk@254 b42882b7-edfa-0310-969c-e2dbd0fdcd60 --- src/jtag/jtag.c | 48 +++++++++++++++++++------------------- src/target/arm_simulator.c | 9 ++++--- src/target/xscale.c | 2 ++ 3 files changed, 32 insertions(+), 27 deletions(-) diff --git a/src/jtag/jtag.c b/src/jtag/jtag.c index bc5e88fb29..3ef5735eb0 100644 --- a/src/jtag/jtag.c +++ b/src/jtag/jtag.c @@ -416,7 +416,7 @@ int jtag_add_ir_scan(int num_fields, scan_field_t *fields, enum tap_state state, cmd_queue_cur_state = cmd_queue_end_state; - for (i=0; i < jtag_num_devices; i++) + for (i = 0; i < jtag_num_devices; i++) { int found = 0; device = jtag_get_device(i); @@ -432,7 +432,7 @@ int jtag_add_ir_scan(int num_fields, scan_field_t *fields, enum tap_state state, } /* search the list */ - for (j=0; j < num_fields; j++) + for (j = 0; j < num_fields; j++) { if (i == fields[j].device) { @@ -562,12 +562,12 @@ int jtag_add_dr_scan(int num_fields, scan_field_t *fields, enum tap_state state, cmd_queue_cur_state = cmd_queue_end_state; - for (i=0; i < jtag_num_devices; i++) + for (i = 0; i < jtag_num_devices; i++) { int found = 0; (*last_cmd)->cmd.scan->fields[field_count].device = i; - for (j=0; j < num_fields; j++) + for (j = 0; j < num_fields; j++) { if (i == fields[j].device) { @@ -952,7 +952,7 @@ int jtag_scan_size(scan_command_t *cmd) int i; /* count bits in scan command */ - for (i=0; inum_fields; i++) + for (i = 0; i < cmd->num_fields; i++) { bit_count += cmd->fields[i].num_bits; } @@ -1002,7 +1002,7 @@ int jtag_read_buffer(u8 *buffer, scan_command_t *cmd) /* we return ERROR_OK, unless a check fails, or a handler reports a problem */ retval = ERROR_OK; - for (i=0; i < cmd->num_fields; i++) + for (i = 0; i < cmd->num_fields; i++) { /* if neither in_value nor in_handler * are specified we don't have to examine this field @@ -1012,16 +1012,16 @@ int jtag_read_buffer(u8 *buffer, scan_command_t *cmd) int num_bits = cmd->fields[i].num_bits; u8 *captured = buf_set_buf(buffer, bit_count, malloc(CEIL(num_bits, 8)), 0, num_bits); - #ifdef _DEBUG_JTAG_IO_ - char *char_buf; +#ifdef _DEBUG_JTAG_IO_ + char *char_buf; - char_buf = buf_to_str(captured, (num_bits > 64) ? 64 : num_bits, 16); - DEBUG("fields[%i].in_value: 0x%s", i, char_buf); - free(char_buf); - #endif + char_buf = buf_to_str(captured, (num_bits > 64) ? 64 : num_bits, 16); + DEBUG("fields[%i].in_value: 0x%s", i, char_buf); + free(char_buf); +#endif - void *priv=cmd->fields[i].in_handler_priv; - if (cmd->fields[i].in_handler==&jtag_check_value) + void *priv = cmd->fields[i].in_handler_priv; + if (cmd->fields[i].in_handler == &jtag_check_value) { /* Yuk! we want to pass in the pointer to cmd->fields[i] which is not known * when jtag_check_value is invoked @@ -1035,7 +1035,7 @@ int jtag_read_buffer(u8 *buffer, scan_command_t *cmd) * Change in_handler to be varargs and have fields+i as the first vararg? * */ - priv=cmd->fields+i; + priv = cmd->fields + i; } if (cmd->fields[i].in_value) { @@ -1074,7 +1074,7 @@ int jtag_read_buffer(u8 *buffer, scan_command_t *cmd) int jtag_check_value(u8 *captured, void *priv) { - int retval=ERROR_OK; + int retval = ERROR_OK; scan_field_t *field=(scan_field_t *)priv; int num_bits = field->num_bits; @@ -1137,16 +1137,16 @@ int jtag_check_value(u8 *captured, void *priv) void jtag_set_check_value(scan_field_t *field, u8 *value, u8 *mask, error_handler_t *in_error_handler) { if (value) - field->in_handler=jtag_check_value; + field->in_handler = jtag_check_value; else - field->in_handler=NULL; /* No check, e.g. embeddedice uses value==NULL to indicate no check */ - field->in_handler_priv=NULL; /* this will be filled in at the invocation site to point to the field duplicate */ - field->in_check_value=value; - field->in_check_mask=mask; + field->in_handler = NULL; /* No check, e.g. embeddedice uses value==NULL to indicate no check */ + field->in_handler_priv = NULL; /* this will be filled in at the invocation site to point to the field duplicate */ + field->in_check_value = value; + field->in_check_mask = mask; if (in_error_handler) - field->in_handler_error_handler=*in_error_handler; + field->in_handler_error_handler = *in_error_handler; else - field->in_handler_error_handler.error_handler=NULL; + field->in_handler_error_handler.error_handler = NULL; } enum scan_type jtag_scan_type(scan_command_t *cmd) @@ -1154,7 +1154,7 @@ enum scan_type jtag_scan_type(scan_command_t *cmd) int i; int type = 0; - for (i=0; i < cmd->num_fields; i++) + for (i = 0; i < cmd->num_fields; i++) { if (cmd->fields[i].in_value || cmd->fields[i].in_handler) type |= SCAN_IN; diff --git a/src/target/arm_simulator.c b/src/target/arm_simulator.c index 561b14f8f2..4ed0558605 100644 --- a/src/target/arm_simulator.c +++ b/src/target/arm_simulator.c @@ -269,13 +269,14 @@ int thumb_pass_branch_condition(u32 cpsr, u16 opcode) int arm_simulate_step(target_t *target, u32 *dry_run_pc) { armv4_5_common_t *armv4_5 = target->arch_info; - u32 opcode; u32 current_pc = buf_get_u32(armv4_5->core_cache->reg_list[15].value, 0, 32); arm_instruction_t instruction; int instruction_size; if (armv4_5->core_state == ARMV4_5_STATE_ARM) { + u32 opcode; + /* get current instruction, and identify it */ target_read_u32(target, current_pc, &opcode); arm_evaluate_opcode(opcode, current_pc, &instruction); @@ -298,8 +299,10 @@ int arm_simulate_step(target_t *target, u32 *dry_run_pc) } else { - target_read_u32(target, current_pc, &opcode); - arm_evaluate_opcode(opcode, current_pc, &instruction); + u16 opcode; + + target_read_u16(target, current_pc, &opcode); + thumb_evaluate_opcode(opcode, current_pc, &instruction); instruction_size = 2; /* check condition code (only for branch instructions) */ diff --git a/src/target/xscale.c b/src/target/xscale.c index cb673df686..92cc1422c3 100644 --- a/src/target/xscale.c +++ b/src/target/xscale.c @@ -1680,6 +1680,8 @@ int xscale_deassert_reset(target_t *target) /* resume the target */ xscale_resume(target, 1, 0x0, 1, 0); } + + fileio_close(&debug_handler); } else { -- 2.30.2