Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

MIPS: Fix protected_cache(e)_op() for microMIPS

When building for microMIPS we need to ensure that the assembler always
knows that there is code at the target of a branch or jump. Commit
7170bdc77755 ("MIPS: Add return errors to protected cache ops")
introduced a fixup path to protected_cache(e)_op() which does not meet
this requirement. The fixup path jumps to the "2" label but the .section
pseudo-op immediately following it causes the label to be marked as
data. Linking then fails with:

mips-img-linux-gnu-ld: arch/mips/mm/c-r4k.o: .fixup+0x0: Unsupported
jump between ISA modes; consider recompiling with interlinking
enabled.

Fix this by declaring that "2" labels code using the .insn directive.

Fixes: 7170bdc77755 ("MIPS: Add return errors to protected cache ops")
Signed-off-by: Paul Burton <paul.burton@imgtec.com>
Signed-off-by: James Hogan <james.hogan@imgtec.com>
Reviewed-by: Maciej W. Rozycki <macro@imgtec.com>
Cc: linux-mips@linux-mips.org
Cc: Ralf Baechle <ralf@linux-mips.org>
Patchwork: https://patchwork.linux-mips.org/patch/15274/
Signed-off-by: James Hogan <james.hogan@imgtec.com>

authored by

Paul Burton and committed by
James Hogan
f229454d f700a420

+4 -2
+4 -2
arch/mips/include/asm/r4kcache.h
··· 154 154 " .set noreorder \n" \ 155 155 " .set "MIPS_ISA_ARCH_LEVEL" \n" \ 156 156 "1: cache %1, (%2) \n" \ 157 - "2: .set pop \n" \ 157 + "2: .insn \n" \ 158 + " .set pop \n" \ 158 159 " .section .fixup,\"ax\" \n" \ 159 160 "3: li %0, %3 \n" \ 160 161 " j 2b \n" \ ··· 178 177 " .set mips0 \n" \ 179 178 " .set eva \n" \ 180 179 "1: cachee %1, (%2) \n" \ 181 - "2: .set pop \n" \ 180 + "2: .insn \n" \ 181 + " .set pop \n" \ 182 182 " .section .fixup,\"ax\" \n" \ 183 183 "3: li %0, %3 \n" \ 184 184 " j 2b \n" \