diff options
author | Maciej W. Rozycki <macro@codesourcery.com> | 2014-11-17 16:09:54 +0000 |
---|---|---|
committer | Ralf Baechle <ralf@linux-mips.org> | 2014-11-19 18:22:08 +0100 |
commit | 99436f7d69045800ffd1d66912f85d37150c7e2b (patch) | |
tree | 962a10905af43e16423a1a0878fa6a87deae78ea /arch/mips | |
parent | 640465bda58c7078725201be7430c31a349121e9 (diff) |
MIPS: jump_label.c: Correct the span of the J instruction
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>
Diffstat (limited to 'arch/mips')
-rw-r--r-- | arch/mips/kernel/jump_label.c | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/arch/mips/kernel/jump_label.c b/arch/mips/kernel/jump_label.c index 6001610cfe5..f65a843e883 100644 --- a/arch/mips/kernel/jump_label.c +++ b/arch/mips/kernel/jump_label.c @@ -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); |