From: Uwe Kleine-König Date: Mon, 8 Dec 2014 10:42:04 +0000 (+0100) Subject: Cortex-A: Don't flush the data/unified cache if MMU is off X-Git-Tag: v0.9.0-rc1~45 X-Git-Url: https://review.openocd.org/gitweb?p=openocd.git;a=commitdiff_plain;h=e968fd189537892caaf91d6012e77bafa0b76751;hp=0836a0fa21e7f2363891c04b195ddb91f94abf28 Cortex-A: Don't flush the data/unified cache if MMU is off When the SCTLR has C set but M unset (i.e. Caching on, but MMU off) the cache if effectively off. So only flush the cache if MMU is on, otherwise stale entries might be committed to memory. Change-Id: Iaff8b6f25b7a41ba838b91d45684c98f99fc0b27 Signed-off-by: Uwe Kleine-König Reviewed-on: http://openocd.zylin.com/2429 Tested-by: jenkins Reviewed-by: Christopher Head Reviewed-by: Paul Fertser Reviewed-by: Vladimir Svoboda --- diff --git a/src/target/cortex_a.c b/src/target/cortex_a.c index 9ae04322b9..ab52dd75a5 100644 --- a/src/target/cortex_a.c +++ b/src/target/cortex_a.c @@ -146,14 +146,14 @@ static int cortex_a_mmu_modify(struct target *target, int enable) cortex_a->cp15_control_reg_curr); } } else { - if (cortex_a->cp15_control_reg_curr & 0x4U) { - /* data cache is active */ - cortex_a->cp15_control_reg_curr &= ~0x4U; - /* flush data cache armv7 function to be called */ - if (armv7a->armv7a_mmu.armv7a_cache.flush_all_data_cache) - armv7a->armv7a_mmu.armv7a_cache.flush_all_data_cache(target); - } if ((cortex_a->cp15_control_reg_curr & 0x1U)) { + if (cortex_a->cp15_control_reg_curr & 0x4U) { + /* data cache is active */ + cortex_a->cp15_control_reg_curr &= ~0x4U; + /* flush data cache armv7 function to be called */ + if (armv7a->armv7a_mmu.armv7a_cache.flush_all_data_cache) + armv7a->armv7a_mmu.armv7a_cache.flush_all_data_cache(target); + } cortex_a->cp15_control_reg_curr &= ~0x1U; retval = armv7a->arm.mcr(target, 15, 0, 0, /* op1, op2 */