Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c2ea1d56 authored by Ralf Baechle's avatar Ralf Baechle
Browse files

MIPS: Avoid potential hazard on Context register



set_saved_sp reads Context register. Avoid reading stale value from
earlier incomplete write.

Issue found and fixed for head.S by Chris Dearman <chris@mips.com>.

Signed-off-by: default avatarChris Dearman <chris@mips.com>
Signed-off-by: default avatarRalf Baechle <ralf@linux-mips.org>
parent cd847b78
Loading
Loading
Loading
Loading
+3 −0
Original line number Original line Diff line number Diff line
@@ -16,6 +16,7 @@
#include <linux/smp.h>
#include <linux/smp.h>
#include <linux/slab.h>
#include <linux/slab.h>
#include <asm/cacheflush.h>
#include <asm/cacheflush.h>
#include <asm/hazards.h>
#include <asm/tlbflush.h>
#include <asm/tlbflush.h>
#ifdef CONFIG_MIPS_MT_SMTC
#ifdef CONFIG_MIPS_MT_SMTC
#include <asm/mipsmtregs.h>
#include <asm/mipsmtregs.h>
@@ -36,11 +37,13 @@ extern unsigned long pgd_current[];
#ifdef CONFIG_32BIT
#ifdef CONFIG_32BIT
#define TLBMISS_HANDLER_SETUP()						\
#define TLBMISS_HANDLER_SETUP()						\
	write_c0_context((unsigned long) smp_processor_id() << 25);	\
	write_c0_context((unsigned long) smp_processor_id() << 25);	\
	back_to_back_c0_hazard();					\
	TLBMISS_HANDLER_SETUP_PGD(swapper_pg_dir)
	TLBMISS_HANDLER_SETUP_PGD(swapper_pg_dir)
#endif
#endif
#ifdef CONFIG_64BIT
#ifdef CONFIG_64BIT
#define TLBMISS_HANDLER_SETUP()						\
#define TLBMISS_HANDLER_SETUP()						\
	write_c0_context((unsigned long) smp_processor_id() << 26);	\
	write_c0_context((unsigned long) smp_processor_id() << 26);	\
	back_to_back_c0_hazard();					\
	TLBMISS_HANDLER_SETUP_PGD(swapper_pg_dir)
	TLBMISS_HANDLER_SETUP_PGD(swapper_pg_dir)
#endif
#endif


+1 −0
Original line number Original line Diff line number Diff line
@@ -191,6 +191,7 @@ NESTED(kernel_entry, 16, sp) # kernel entry point
	/* Set the SP after an empty pt_regs.  */
	/* Set the SP after an empty pt_regs.  */
	PTR_LI		sp, _THREAD_SIZE - 32 - PT_SIZE
	PTR_LI		sp, _THREAD_SIZE - 32 - PT_SIZE
	PTR_ADDU	sp, $28
	PTR_ADDU	sp, $28
	back_to_back_c0_hazard
	set_saved_sp	sp, t0, t1
	set_saved_sp	sp, t0, t1
	PTR_SUBU	sp, 4 * SZREG		# init stack pointer
	PTR_SUBU	sp, 4 * SZREG		# init stack pointer