]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
MIPS: jump_label.c: Correct the span of the J instruction
authorMaciej W. Rozycki <macro@codesourcery.com>
Mon, 17 Nov 2014 16:09:54 +0000 (16:09 +0000)
committerBen Hutchings <ben@decadent.org.uk>
Wed, 22 May 2019 22:15:01 +0000 (23:15 +0100)
commit 99436f7d69045800ffd1d66912f85d37150c7e2b upstream.

Correct the check for the span of the 256MB segment addressable by the J
instruction according to this instruction's semantics.  The calculation
of the jump target is applied to the address of the delay-slot
instruction that immediately follows.  Adjust the check accordingly by
adding 4 to `e->code' that holds the address of the J instruction
itself.

Signed-off-by: Maciej W. Rozycki <macro@codesourcery.com>
Cc: linux-mips@linux-mips.org
Patchwork: https://patchwork.linux-mips.org/patch/8515/
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
arch/mips/kernel/jump_label.c

index 6001610cfe55f846a403633a13cfa8973a23e07a..f65a843e883bc97163a9885f424218c8f57af254 100644 (file)
@@ -27,8 +27,8 @@ void arch_jump_label_transform(struct jump_entry *e,
        union mips_instruction *insn_p =
                (union mips_instruction *)(unsigned long)e->code;
 
-       /* Jump only works within a 256MB aligned region. */
-       BUG_ON((e->target & ~J_RANGE_MASK) != (e->code & ~J_RANGE_MASK));
+       /* Jump only works within a 256MB aligned region of its delay slot. */
+       BUG_ON((e->target & ~J_RANGE_MASK) != ((e->code + 4) & ~J_RANGE_MASK));
 
        /* Target must have 4 byte alignment. */
        BUG_ON((e->target & 3) != 0);