Before switching to non-secure, make sure that CNTVOFF is set
to zero on all CPUs. Otherwise, kernel running in non-secure
without HYP enabled (hence using virtual timers) may observe
timers that are not synchronized, effectively seeing time
going backward...

Signed-off-by: Marc Zyngier <marc.zyng...@arm.com>
---
 arch/arm/cpu/armv7/nonsec_virt.S | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/arch/arm/cpu/armv7/nonsec_virt.S b/arch/arm/cpu/armv7/nonsec_virt.S
index 648066f..bbacbce 100644
--- a/arch/arm/cpu/armv7/nonsec_virt.S
+++ b/arch/arm/cpu/armv7/nonsec_virt.S
@@ -53,7 +53,14 @@ _secure_monitor:
        mrceq   p15, 0, r0, c12, c0, 1          @ get MVBAR value
        mcreq   p15, 4, r0, c12, c0, 0          @ write HVBAR
 #endif
+       bne     1f
 
+       @ Reset CNTVOFF to 0 before leaving monitor mode
+       mrc     p15, 0, r0, c0, c1, 1           @ read ID_PFR1
+       ands    r0, r0, #CPUID_ARM_GENTIMER_MASK        @ test arch timer bits
+       movne   r0, #0
+       mcrrne  p15, 4, r0, r0, c14             @ Reset CNTVOFF to zero
+1:
        movs    pc, lr                          @ return to non-secure SVC
 
 _hyp_trap:
-- 
1.8.2.3


_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to