Magnus Lundin Thc cortex_m3_poll function does not identify that a target is running...
authoroharboe <oharboe@b42882b7-edfa-0310-969c-e2dbd0fdcd60>
Sun, 12 Jul 2009 19:29:08 +0000 (19:29 +0000)
committeroharboe <oharboe@b42882b7-edfa-0310-969c-e2dbd0fdcd60>
Sun, 12 Jul 2009 19:29:08 +0000 (19:29 +0000)
This patch correctly identifies a running target.

Patch made a tad more palatable by David Brownell <david-b@pacbell.net>

git-svn-id: svn://svn.berlios.de/openocd/trunk@2510 b42882b7-edfa-0310-969c-e2dbd0fdcd60

src/target/cortex_m3.c

index 5789870f57442af143ef760a92e047b10b6f23b8..53ecd0a90d5309e89de466efed373f37a438308a 100644 (file)
@@ -512,16 +512,19 @@ int cortex_m3_poll(target_t *target)
                }
        }
 
-       /*
-       if (cortex_m3->dcb_dhcsr & S_SLEEP)
-               target->state = TARGET_SLEEP;
-       */
+       /* REVISIT when S_SLEEP is set, it's in a Sleep or DeepSleep state.
+        * How best to model low power modes?
+        */
 
-#if 0
-       /* Read Debug Fault Status Register, added to figure out the lockup when running flashtest.script  */
-       mem_ap_read_atomic_u32(swjdp, NVIC_DFSR, &cortex_m3->nvic_dfsr);
-       LOG_DEBUG("dcb_dhcsr 0x%x, nvic_dfsr 0x%x, target->state: %s", cortex_m3->dcb_dhcsr, cortex_m3->nvic_dfsr, target_state_name(target));
-#endif
+       if (target->state == TARGET_UNKNOWN)
+       {
+               /* check if processor is retiring instructions */
+               if (cortex_m3->dcb_dhcsr & S_RETIRE_ST)
+               {
+                       target->state = TARGET_RUNNING;
+                       return ERROR_OK;
+               }
+       }
 
        return ERROR_OK;
 }