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

Commit 9d91069f authored by Archer Yan's avatar Archer Yan Committed by Greg Kroah-Hartman
Browse files

MIPS: Fix kernel crash for R6 in jump label branch function



commit 47c25036b60f27b86ab44b66a8861bcf81cde39b upstream.

Insert Branch instruction instead of NOP to make sure assembler don't
patch code in forbidden slot. In jump label function, it might
be possible to patch Control Transfer Instructions(CTIs) into
forbidden slot, which will generate Reserved Instruction exception
in MIPS release 6.

Signed-off-by: default avatarArcher Yan <ayan@wavecomp.com>
Reviewed-by: default avatarPaul Burton <paul.burton@mips.com>
[paul.burton@mips.com:
  - Add MIPS prefix to subject.
  - Mark for stable from v4.0, which introduced r6 support, onwards.]
Signed-off-by: default avatarPaul Burton <paul.burton@mips.com>
Cc: linux-mips@vger.kernel.org
Cc: stable@vger.kernel.org # v4.0+
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 6e74961b
Loading
Loading
Loading
Loading
+4 −4
Original line number Original line Diff line number Diff line
@@ -21,15 +21,15 @@
#endif
#endif


#ifdef CONFIG_CPU_MICROMIPS
#ifdef CONFIG_CPU_MICROMIPS
#define NOP_INSN "nop32"
#define B_INSN "b32"
#else
#else
#define NOP_INSN "nop"
#define B_INSN "b"
#endif
#endif


static __always_inline bool arch_static_branch(struct static_key *key, bool branch)
static __always_inline bool arch_static_branch(struct static_key *key, bool branch)
{
{
	asm_volatile_goto("1:\t" NOP_INSN "\n\t"
	asm_volatile_goto("1:\t" B_INSN " 2f\n\t"
		"nop\n\t"
		"2:\tnop\n\t"
		".pushsection __jump_table,  \"aw\"\n\t"
		".pushsection __jump_table,  \"aw\"\n\t"
		WORD_INSN " 1b, %l[l_yes], %0\n\t"
		WORD_INSN " 1b, %l[l_yes], %0\n\t"
		".popsection\n\t"
		".popsection\n\t"