Michael Bruck:
[openocd.git] / src / target / arm11.c
index 905a5d77eda112297191ebf6e508db499e76235f..9c3d1f28d6062d1b1e3031807ccc590a21d1600a 100644 (file)
@@ -282,7 +282,6 @@ enum arm11_regcache_ids
     ARM11_RC_WDTR,
     ARM11_RC_RDTR,
 
-
     ARM11_RC_MAX,
 };
 
@@ -332,8 +331,14 @@ void arm11_check_init(arm11_common_t * arm11, u32 * dscr)
 
        /* add further reset initialization here */
 
+       arm11->simulate_reset_on_next_halt = true;
+
        if (*dscr & ARM11_DSCR_CORE_HALTED)
        {
+           /** \todo TODO: this needs further scrutiny because
+             * arm11_on_enter_debug_state() never gets properly called
+             */
+
            arm11->target->state        = TARGET_HALTED;
            arm11->target->debug_reason = arm11_get_DSCR_debug_reason(*dscr);
        }
@@ -405,15 +410,6 @@ static void arm11_on_enter_debug_state(arm11_common_t * arm11)
 
     arm11_write_DSCR(arm11, new_dscr);
 
-//    jtag_execute_queue();
-
-
-
-//    DEBUG("SAVE DSCR %08x", R(DSCR));
-
-//    if (R(DSCR) & ARM11_DSCR_WDTR_FULL)
-//     DEBUG("SAVE wDTR %08x", R(WDTR));
-
 
     /* From the spec:
        Before executing any instruction in debug state you have to drain the write buffer.
@@ -502,7 +498,20 @@ static void arm11_on_enter_debug_state(arm11_common_t * arm11)
        arm11->reg_values[ARM11_RC_PC] -= 8;
     }
 
-//    DEBUG("SAVE PC   %08x", R(PC));
+    if (arm11->simulate_reset_on_next_halt)
+    {
+       arm11->simulate_reset_on_next_halt = false;
+
+       DEBUG("Reset c1 Control Register");
+
+       /* Write 0 (reset value) to Control register 0 to disable MMU/Cache etc. */
+
+       /* MCR p15,0,R0,c1,c0,0 */
+       arm11_run_instr_data_to_core_via_r0(arm11, 0xee010f10, 0);
+
+    }
+
+
 
     arm11_run_instr_data_finish(arm11);
 
@@ -558,7 +567,7 @@ void arm11_leave_debug_state(arm11_common_t * arm11)
        /* MRC p14,0,r?,c0,c5,0 */
        arm11_run_instr_data_to_core1(arm11, 0xee100e15 | (i << 12), R(RX + i));
 
-//     DEBUG("RESTORE R%d %08x", i, R(RX + i));
+//     DEBUG("RESTORE R" ZU " %08x", i, R(RX + i));
     }}
 
     arm11_run_instr_data_finish(arm11);
@@ -719,6 +728,11 @@ int arm11_halt(struct target_s *target)
 
     DEBUG("target->state: %s", target_state_strings[target->state]);
 
+    if (target->state == TARGET_UNKNOWN)
+    {
+       arm11->simulate_reset_on_next_halt = true;
+    }
+
     if (target->state == TARGET_HALTED)
     {
        WARNING("target was already halted");
@@ -779,7 +793,7 @@ int arm11_resume(struct target_s *target, int current, u32 address, int handle_b
     if (!current)
        R(PC) = address;
 
-    INFO("RESUME PC %08x", R(PC));
+    INFO("RESUME PC %08x%s", R(PC), !current ? "!" : "");
 
     /* clear breakpoints/watchpoints and VCR*/
     arm11_sc7_clear_vbw(arm11);
@@ -818,7 +832,7 @@ int arm11_resume(struct target_s *target, int current, u32 address, int handle_b
     
            arm11_sc7_run(arm11, brp, asizeof(brp));
 
-           DEBUG("Add BP %d at %08x", brp_num, bp->address);
+           DEBUG("Add BP " ZU " at %08x", brp_num, bp->address);
 
            brp_num++;
        }
@@ -876,7 +890,7 @@ int arm11_step(struct target_s *target, int current, u32 address, int handle_bre
     if (!current)
        R(PC) = address;
 
-    INFO("STEP PC %08x", R(PC));
+    INFO("STEP PC %08x%s", R(PC), !current ? "!" : "");
 
     /** \todo TODO: Thumb not supported here */
 
@@ -884,7 +898,7 @@ int arm11_step(struct target_s *target, int current, u32 address, int handle_bre
 
     arm11_read_memory_word(arm11, R(PC), &next_instruction);
 
-    /** skip over BKPT */
+    /* skip over BKPT */
     if ((next_instruction & 0xFFF00070) == 0xe1200070)
     {
        R(PC) += 4;
@@ -892,6 +906,15 @@ int arm11_step(struct target_s *target, int current, u32 address, int handle_bre
        arm11->reg_list[ARM11_RC_PC].dirty = 0;
        INFO("Skipping BKPT");
     }
+    /* skip over Wait for interrupt / Standby */
+    /* mcr     15, 0, r?, cr7, cr0, {4} */
+    else if ((next_instruction & 0xFFFF0FFF) == 0xee070f90)
+    {
+       R(PC) += 4;
+       arm11->reg_list[ARM11_RC_PC].valid = 1;
+       arm11->reg_list[ARM11_RC_PC].dirty = 0;
+       INFO("Skipping WFI");
+    }
     /* ignore B to self */
     else if ((next_instruction & 0xFEFFFFFF) == 0xeafffffe)
     {
@@ -1074,7 +1097,8 @@ int arm11_read_memory(struct target_s *target, u32 address, u32 size, u32 count,
        /** \todo TODO: check if dirty is the right choice to force a rewrite on arm11_resume() */
        arm11->reg_list[ARM11_RC_R1].dirty = 1;
 
-       while (count--)
+       {size_t i;
+       for (i = 0; i < count; i++)
        {
            /* ldrb    r1, [r0], #1 */
            arm11_run_instr_no_data1(arm11, 0xe4d01001);
@@ -1084,7 +1108,8 @@ int arm11_read_memory(struct target_s *target, u32 address, u32 size, u32 count,
            arm11_run_instr_data_from_core(arm11, 0xEE001E15, &res, 1);
 
            *buffer++ = res;
-       }
+       }}
+
        break;
 
     case 2:
@@ -1093,7 +1118,8 @@ int arm11_read_memory(struct target_s *target, u32 address, u32 size, u32 count,
 
        u16 * buf16 = (u16*)buffer;
 
-       while (count--)
+       {size_t i;
+       for (i = 0; i < count; i++)
        {
            /* ldrh    r1, [r0], #2 */
            arm11_run_instr_no_data1(arm11, 0xe0d010b2);
@@ -1104,7 +1130,8 @@ int arm11_read_memory(struct target_s *target, u32 address, u32 size, u32 count,
            arm11_run_instr_data_from_core(arm11, 0xEE001E15, &res, 1);
 
            *buf16++ = res;
-       }
+       }}
+
        break;
     }
 
@@ -1136,17 +1163,21 @@ int arm11_write_memory(struct target_s *target, u32 address, u32 size, u32 count
     switch (size)
     {
     case 1:
+    {
        arm11->reg_list[ARM11_RC_R1].dirty = 1;
 
-       while (count--)
+       {size_t i;
+       for (i = 0; i < count; i++)
        {
            /* MRC p14,0,r1,c0,c5,0 */
            arm11_run_instr_data_to_core1(arm11, 0xee101e15, *buffer++);
 
            /* strb    r1, [r0], #1 */
            arm11_run_instr_no_data1(arm11, 0xe4c01001);
-       }
+       }}
+
        break;
+    }
 
     case 2:
     {
@@ -1154,14 +1185,16 @@ int arm11_write_memory(struct target_s *target, u32 address, u32 size, u32 count
 
        u16 * buf16 = (u16*)buffer;
 
-       while (count--)
+       {size_t i;
+       for (i = 0; i < count; i++)
        {
            /* MRC p14,0,r1,c0,c5,0 */
            arm11_run_instr_data_to_core1(arm11, 0xee101e15, *buf16++);
 
            /* strh    r1, [r0], #2 */
            arm11_run_instr_no_data1(arm11, 0xe0c010b2);
-       }
+       }}
+
        break;
     }
 
@@ -1490,7 +1523,7 @@ void arm11_build_reg_cache(target_t *target)
        ARM11_REGCACHE_COUNT != asizeof(arm11_reg_defs) ||
        ARM11_REGCACHE_COUNT != ARM11_RC_MAX)
     {
-       ERROR("arm11->reg_values inconsistent (%d %d %d %d)", ARM11_REGCACHE_COUNT, asizeof(arm11->reg_values), asizeof(arm11_reg_defs), ARM11_RC_MAX);
+       ERROR("arm11->reg_values inconsistent (%d " ZU " " ZU " %d)", ARM11_REGCACHE_COUNT, asizeof(arm11->reg_values), asizeof(arm11_reg_defs), ARM11_RC_MAX);
        exit(-1);
     }
 

Linking to existing account procedure

If you already have an account and want to add another login method you MUST first sign in with your existing account and then change URL to read https://review.openocd.org/login/?link to get to this page again but this time it'll work for linking. Thank you.

SSH host keys fingerprints

1024 SHA256:YKx8b7u5ZWdcbp7/4AeXNaqElP49m6QrwfXaqQGJAOk gerrit-code-review@openocd.zylin.com (DSA)
384 SHA256:jHIbSQa4REvwCFG4cq5LBlBLxmxSqelQPem/EXIrxjk gerrit-code-review@openocd.org (ECDSA)
521 SHA256:UAOPYkU9Fjtcao0Ul/Rrlnj/OsQvt+pgdYSZ4jOYdgs gerrit-code-review@openocd.org (ECDSA)
256 SHA256:A13M5QlnozFOvTllybRZH6vm7iSt0XLxbA48yfc2yfY gerrit-code-review@openocd.org (ECDSA)
256 SHA256:spYMBqEYoAOtK7yZBrcwE8ZpYt6b68Cfh9yEVetvbXg gerrit-code-review@openocd.org (ED25519)
+--[ED25519 256]--+
|=..              |
|+o..   .         |
|*.o   . .        |
|+B . . .         |
|Bo. = o S        |
|Oo.+ + =         |
|oB=.* = . o      |
| =+=.+   + E     |
|. .=o   . o      |
+----[SHA256]-----+
2048 SHA256:0Onrb7/PHjpo6iVZ7xQX2riKN83FJ3KGU0TvI0TaFG4 gerrit-code-review@openocd.zylin.com (RSA)