On Wed, 2009-04-22 at 11:50 -0700, Zach Welch wrote:
> Hi all,
>
> This is the second of the two patches provided by Jeff Williams,
> re-based against r1509. I have barely glanced through it for now, as
> the old patch simply had some fuzz in it. I thought I should try to
> re-post it to see if the community will start to do something with it
> (e.g. review it for TODOs).
>
> Do NOT apply, but please provide feedback or revised patches. Better,
> tell me that I can forget about this patch for the time being, because
> someone else is going to take some responsibility for it. :)
Now with the patch attached.
--Z
Index: src/target/embeddedice.c
===================================================================
--- src/target/embeddedice.c (revision 1509)
+++ src/target/embeddedice.c (working copy)
@@ -288,11 +288,17 @@
fields[0].in_value = reg->value;
jtag_set_check_value(fields+0, check_value, check_mask, NULL);
- /* when reading the DCC data register, leaving the address field set to
- * EICE_COMMS_DATA would read the register twice
- * reading the control register is safe
+// /* when reading the DCC data register, leaving the address field set to
+// * EICE_COMMS_DATA would read the register twice
+// * reading the control register is safe
+// */
+// buf_set_u32(fields[1].out_value, 0, 5, embeddedice_reg_arch_info[EICE_COMMS_CTRL]);
+ /*
+ * It turns out that on at least teh MC1322x it's not OK to read some other random register.
+ * Re-read the one requested!
+ * Beside, there's no reason to introduce risk even if it seems to work.
*/
- buf_set_u32(fields[1].out_value, 0, 5, embeddedice_reg_arch_info[EICE_COMMS_CTRL]);
+ buf_set_u32(fields[1].out_value, 0, 5, reg_addr);
jtag_add_dr_scan(3, fields, TAP_INVALID);
@@ -397,8 +403,13 @@
void embeddedice_write_reg(reg_t *reg, u32 value)
{
embeddedice_reg_t *ice_reg = reg->arch_info;
+ int i;
- LOG_DEBUG("%i: 0x%8.8x", ice_reg->addr, value);
+ for (i = 0; i<16; i++) {
+ if (embeddedice_reg_arch_info[i] == ice_reg->addr) {
+ LOG_DEBUG("reg: %s: val: 0x%8.8x", embeddedice_reg_list[i], value);
+ }
+ }
jtag_add_end_state(TAP_IDLE);
arm_jtag_scann(ice_reg->jtag_info, 0x2);
Index: src/target/arm7tdmi.c
===================================================================
--- src/target/arm7tdmi.c (revision 1509)
+++ src/target/arm7tdmi.c (working copy)
@@ -56,6 +56,16 @@
int arm7tdmi_poll(struct target_s *target);
int arm7tdmi_halt(target_t *target);
+/*
+ * When we "clock in" we have to put a rational instruction in the DRSHIFT "out", so that
+ * we don't change the EICE by leaving a junk instruction in the pipeline.
+ * These two values insert an outbound NOP and debug=0 whenever we otherwise specify nothing.
+ * N.B. It's global since NOP is different in Thumb and ARM modes.
+ */
+
+u8 default_debug_out_val = 0x0;
+u32 default_nop_out = 0x1001057; // is initialized to equivalent of: flip_u32(ARMV4_5_NOP, 32)
+
target_type_t arm7tdmi_target =
{
.name = "arm7tdmi",
@@ -201,7 +211,7 @@
fields[0].tap = jtag_info->tap;
fields[0].num_bits = 1;
- fields[0].out_value = NULL;
+ fields[0].out_value = &default_debug_out_val;
fields[0].out_mask = NULL;
fields[0].in_value = NULL;
fields[0].in_check_value = NULL;
@@ -211,7 +221,7 @@
fields[1].tap = jtag_info->tap;
fields[1].num_bits = 32;
- fields[1].out_value = NULL;
+ fields[1].out_value = (u8*) &default_nop_out;
fields[1].out_mask = NULL;
fields[1].in_value = NULL;
fields[1].in_handler = arm_jtag_buf_to_u32_flip;
@@ -223,13 +233,13 @@
jtag_add_runtest(0, TAP_INVALID);
+ if((retval = jtag_execute_queue()) != ERROR_OK)
+ {
+ return retval;
+ }
+
#ifdef _DEBUG_INSTRUCTION_EXECUTION_
{
- if((retval = jtag_execute_queue()) != ERROR_OK)
- {
- return retval;
- }
-
if (in)
{
LOG_DEBUG("in: 0x%8.8x", *in);
@@ -262,7 +272,7 @@
fields[0].tap = jtag_info->tap;
fields[0].num_bits = 1;
- fields[0].out_value = NULL;
+ fields[0].out_value = &default_debug_out_val;
fields[0].out_mask = NULL;
fields[0].in_value = NULL;
fields[0].in_check_value = NULL;
@@ -272,7 +282,7 @@
fields[1].tap = jtag_info->tap;
fields[1].num_bits = 32;
- fields[1].out_value = NULL;
+ fields[1].out_value = (u8*) &default_nop_out;
fields[1].out_mask = NULL;
fields[1].in_value = NULL;
switch (size)
@@ -316,6 +326,7 @@
return ERROR_OK;
}
+
void arm7tdmi_change_to_arm(target_t *target, u32 *r0, u32 *pc)
{
/* get pointers to arch-specific information */
@@ -323,6 +334,9 @@
arm7_9_common_t *arm7_9 = armv4_5->arch_info;
arm_jtag_t *jtag_info = &arm7_9->jtag_info;
+ // Set the global "clocking in" NOP to a Thumb instruction
+ default_nop_out = flip_u32(ARMV4_5_T_NOP, 32);
+
/* save r0 before using it and put system in ARM state
* to allow common handling of ARM and THUMB debugging */
@@ -364,6 +378,10 @@
* reading PC in Thumb state gives address of instruction + 4
*/
*pc -= 0xa;
+
+ // Set the global "clocking in" NOP to an ARM instruction
+ default_nop_out = flip_u32(ARMV4_5_NOP, 32);
+
}
void arm7tdmi_read_core_regs(target_t *target, u32 mask, u32* core_regs[16])
@@ -513,6 +531,9 @@
arm7_9_common_t *arm7_9 = armv4_5->arch_info;
arm_jtag_t *jtag_info = &arm7_9->jtag_info;
+ // On the MC1322x we crash into Thumb mode if we don't clear the pipeline before each op.
+ arm7tdmi_clock_out(jtag_info, ARMV4_5_NOP, NULL, 0);
+
/* LDMIA r0-15, [r0] at debug speed
* register values will start to appear on 4th DCLK
*/
@@ -539,6 +560,9 @@
arm7_9_common_t *arm7_9 = armv4_5->arch_info;
arm_jtag_t *jtag_info = &arm7_9->jtag_info;
+ // On the MC1322x we crash into Thumb mode if we don't clear the pipeline before each op.
+ arm7tdmi_clock_out(jtag_info, ARMV4_5_NOP, NULL, 0);
+
/* put system-speed load-multiple into the pipeline */
arm7tdmi_clock_out(jtag_info, ARMV4_5_NOP, NULL, 0);
arm7tdmi_clock_out(jtag_info, ARMV4_5_NOP, NULL, 1);
Index: src/target/arm7_9_common.c
===================================================================
--- src/target/arm7_9_common.c (revision 1509)
+++ src/target/arm7_9_common.c (working copy)
@@ -1969,6 +1969,7 @@
{
armv4_5_common_t *armv4_5 = target->arch_info;
arm7_9_common_t *arm7_9 = armv4_5->arch_info;
+ reg_t *dbg_stat = &arm7_9->eice_cache->reg_list[EICE_DBG_STAT];
u32 reg[16];
u32 num_accesses = 0;
@@ -1980,6 +1981,11 @@
LOG_DEBUG("address: 0x%8.8x, size: 0x%8.8x, count: 0x%8.8x", address, size, count);
+ // Debug investigation code - MC1322x is crashing into Thumb state and/or coming out of debug (DBGACK ==0).
+ embeddedice_read_reg(dbg_stat);
+ if ((retval = jtag_execute_queue()) != ERROR_OK)
+ return retval;
+
if (target->state != TARGET_HALTED)
{
LOG_WARNING("target not halted");
@@ -2116,6 +2122,11 @@
break;
}
+ // Debug investigation code - MC1322x is crashing into Thumb state and/or coming out of debug (DBGACK ==0).
+ embeddedice_read_reg(dbg_stat);
+ if ((retval = jtag_execute_queue()) != ERROR_OK)
+ return retval;
+
if (armv4_5_mode_to_number(armv4_5->core_mode)==-1)
return ERROR_FAIL;
@@ -2138,6 +2149,11 @@
return ERROR_TARGET_DATA_ABORT;
}
+ // Debug investigation code - MC1322x is crashing into Thumb state and/or coming out of debug (DBGACK ==0).
+ embeddedice_read_reg(dbg_stat);
+ if ((retval = jtag_execute_queue()) != ERROR_OK)
+ return retval;
+
return ERROR_OK;
}
_______________________________________________
Openocd-development mailing list
[email protected]
https://lists.berlios.de/mailman/listinfo/openocd-development