aboutsummaryrefslogtreecommitdiff
path: root/src/target/cortex_a.c
diff options
context:
space:
mode:
authorSeth LaForge <sethml@google.com>2014-05-06 16:02:23 -0700
committerAndreas Fritiofson <andreas.fritiofson@gmail.com>2014-06-22 08:23:53 +0000
commit7b6158db4ee38aa9b10cae667c081ee781411f83 (patch)
treea38007f27d13fe5d3a9336845cd1aee12e7937df /src/target/cortex_a.c
parenta0e37fe2c0c0a62c9c314e62c494e12359a819e0 (diff)
cortex_a: fix lockup when writing to high address
On a processor with caches, when you write data to memory OpenOCD invalidates the cache lines affected. If you write to an address within 64 bytes of UINT32_MAX, then the for loop control variable wrapped around resulting in an infinite loop. Change control variable to be an offset from the address involved. We should never be asked to write 2^32 bytes, so wraparound should not be a problem. Change-Id: Ibfe654113eff71684862ff651e7a1cd05ccc6760 Signed-off-by: Seth LaForge <sethml@google.com> Reviewed-on: http://openocd.zylin.com/2126 Tested-by: jenkins Reviewed-by: Spencer Oliver <spen@spen-soft.co.uk>
Diffstat (limited to 'src/target/cortex_a.c')
-rw-r--r--src/target/cortex_a.c12
1 files changed, 6 insertions, 6 deletions
diff --git a/src/target/cortex_a.c b/src/target/cortex_a.c
index 50eb9d48..4418e9a3 100644
--- a/src/target/cortex_a.c
+++ b/src/target/cortex_a.c
@@ -2232,12 +2232,12 @@ static int cortex_a8_write_phys_memory(struct target *target,
* with MVA to PoU
* MCR p15, 0, r0, c7, c5, 1
*/
- for (uint32_t cacheline = address;
- cacheline < address + size * count;
+ for (uint32_t cacheline = 0;
+ cacheline < size * count;
cacheline += 64) {
retval = dpm->instr_write_data_r0(dpm,
ARMV4_5_MCR(15, 0, 0, 7, 5, 1),
- cacheline);
+ address + cacheline);
if (retval != ERROR_OK)
return retval;
}
@@ -2249,12 +2249,12 @@ static int cortex_a8_write_phys_memory(struct target *target,
* with MVA to PoC
* MCR p15, 0, r0, c7, c6, 1
*/
- for (uint32_t cacheline = address;
- cacheline < address + size * count;
+ for (uint32_t cacheline = 0;
+ cacheline < size * count;
cacheline += 64) {
retval = dpm->instr_write_data_r0(dpm,
ARMV4_5_MCR(15, 0, 0, 7, 6, 1),
- cacheline);
+ address + cacheline);
if (retval != ERROR_OK)
return retval;
}