summaryrefslogtreecommitdiffstats
path: root/arch/arm/include/asm/arch_timer.h
diff options
context:
space:
mode:
authorMark Rutland <mark.rutland@arm.com>2013-01-11 14:32:33 +0000
committerMark Rutland <mark.rutland@arm.com>2013-01-31 15:51:23 +0000
commit45801042225c66a66fb2cb50fae6ff71883a99d6 (patch)
tree569367ff83dfc2b5e6c29bdeb1d32facffbb778e /arch/arm/include/asm/arch_timer.h
parentec944c93a293bee6b4cc6b6f1c9560526c7ed635 (diff)
downloadop-kernel-dev-45801042225c66a66fb2cb50fae6ff71883a99d6.zip
op-kernel-dev-45801042225c66a66fb2cb50fae6ff71883a99d6.tar.gz
arm: arch_timer: add isbs to register accessors
Without the isbs in arch_timer_get_cnt{p,v}ct the cpu may speculate reads and return stale values. This could be bad for code sensitive to changes in expected deltas between calls (e.g. the delay loop). Without isbs in arch_timer_reg_write the processor may reorder instructions around enabling/disabling of the timer or writing the compare value, which we probably don't want. This patch adds isbs to prevent those issues. Signed-off-by: Mark Rutland <mark.rutland@arm.com> Acked-by: Catalin Marinas <catalin.marinas@arm.com>
Diffstat (limited to 'arch/arm/include/asm/arch_timer.h')
-rw-r--r--arch/arm/include/asm/arch_timer.h4
1 files changed, 4 insertions, 0 deletions
diff --git a/arch/arm/include/asm/arch_timer.h b/arch/arm/include/asm/arch_timer.h
index db0fdc4..75975d9 100644
--- a/arch/arm/include/asm/arch_timer.h
+++ b/arch/arm/include/asm/arch_timer.h
@@ -49,6 +49,8 @@ static inline void arch_timer_reg_write(const int access, const int reg, u32 val
break;
}
}
+
+ isb();
}
static inline u32 arch_timer_reg_read(const int access, const int reg)
@@ -91,6 +93,7 @@ static inline u64 arch_counter_get_cntpct(void)
{
u64 cval;
+ isb();
asm volatile("mrrc p15, 0, %Q0, %R0, c14" : "=r" (cval));
return cval;
}
@@ -99,6 +102,7 @@ static inline u64 arch_counter_get_cntvct(void)
{
u64 cval;
+ isb();
asm volatile("mrrc p15, 1, %Q0, %R0, c14" : "=r" (cval));
return cval;
}
OpenPOWER on IntegriCloud