From mboxrd@z Thu Jan 1 00:00:00 1970 From: Dave.Martin@arm.com (Dave Martin) Date: Tue, 9 Jul 2013 17:32:18 +0100 Subject: [PATCH 2/3] arm: virt: ensure visibility of __boot_cpu_mode In-Reply-To: <1373379366-15689-3-git-send-email-mark.rutland@arm.com> References: <1373379366-15689-1-git-send-email-mark.rutland@arm.com> <1373379366-15689-3-git-send-email-mark.rutland@arm.com> Message-ID: <20130709163217.GC2911@localhost.localdomain> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org On Tue, Jul 09, 2013 at 03:16:05PM +0100, Mark Rutland wrote: > Secondary CPUs write to __boot_cpu_mode with caches disabled, and thus a > cached value of __boot_cpu_mode may be incoherent with that in memory. > This could lead to a failure to detect mismatched boot modes. > > This patch adds flushing to ensure that writes by secondaries to > __boot_cpu_mode are made visible before we test against it. > > Signed-off-by: Mark Rutland > Cc: Dave Martin > Cc: Marc Zyngier > Cc: Christoffer Dall Acked-by: Dave Martin > --- > arch/arm/include/asm/virt.h | 12 ++++++++++++ > arch/arm/kernel/setup.c | 2 ++ > 2 files changed, 14 insertions(+) > > diff --git a/arch/arm/include/asm/virt.h b/arch/arm/include/asm/virt.h > index 50af92b..4371f45 100644 > --- a/arch/arm/include/asm/virt.h > +++ b/arch/arm/include/asm/virt.h > @@ -29,6 +29,7 @@ > #define BOOT_CPU_MODE_MISMATCH PSR_N_BIT > > #ifndef __ASSEMBLY__ > +#include > > #ifdef CONFIG_ARM_VIRT_EXT > /* > @@ -41,10 +42,21 @@ > */ > extern int __boot_cpu_mode; > > +static inline void sync_boot_mode(void) > +{ > + /* > + * As secondaries write to __boot_cpu_mode with caches disabled, we > + * must flush the corresponding cache entries to ensure the visibility > + * of their writes. > + */ > + sync_cache_r(&__boot_cpu_mode); > +} > + > void __hyp_set_vectors(unsigned long phys_vector_base); > unsigned long __hyp_get_vectors(void); > #else > #define __boot_cpu_mode (SVC_MODE) > +#define sync_boot_mode() > #endif > > #ifndef ZIMAGE > diff --git a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c > index b4b1d39..4af9b38 100644 > --- a/arch/arm/kernel/setup.c > +++ b/arch/arm/kernel/setup.c > @@ -744,6 +744,8 @@ static int __init meminfo_cmp(const void *_a, const void *_b) > void __init hyp_mode_check(void) > { > #ifdef CONFIG_ARM_VIRT_EXT > + sync_boot_mode(); > + > if (is_hyp_mode_available()) { > pr_info("CPU: All CPU(s) started in HYP mode.\n"); > pr_info("CPU: Virtualization extensions available.\n"); > -- > 1.8.1.1 > > > _______________________________________________ > linux-arm-kernel mailing list > linux-arm-kernel at lists.infradead.org > http://lists.infradead.org/mailman/listinfo/linux-arm-kernel