Skip to content

Commit 0c5d187

Browse files
committed
MIPS: BPF: Fix load delay slots.
The entire bpf_jit_asm.S is written in noreorder mode because "we know better" according to a comment. This also prevented the assembler from throwing in the required NOPs for MIPS I processors which have no load-use interlock, thus the load's consumer might end up using the old value of the register from prior to the load. Fixed by putting the assembler in reorder mode for just the affected load instructions. This is not enough for gas to actually try to be clever by looking at the next instruction and inserting a nop only when needed but as the comment said "we know better", so getting gas to unconditionally emit a NOP is just right in this case and prevents adding further ifdefery. Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
1 parent 1e16a8f commit 0c5d187

File tree

1 file changed

+4
-0
lines changed

1 file changed

+4
-0
lines changed

arch/mips/net/bpf_jit_asm.S

+4
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,9 @@ FEXPORT(sk_load_word_positive)
6161
is_offset_in_header(4, word)
6262
/* Offset within header boundaries */
6363
PTR_ADDU t1, $r_skb_data, offset
64+
.set reorder
6465
lw $r_A, 0(t1)
66+
.set noreorder
6567
#ifdef CONFIG_CPU_LITTLE_ENDIAN
6668
# if defined(__mips_isa_rev) && (__mips_isa_rev >= 2)
6769
wsbh t0, $r_A
@@ -88,7 +90,9 @@ FEXPORT(sk_load_half_positive)
8890
is_offset_in_header(2, half)
8991
/* Offset within header boundaries */
9092
PTR_ADDU t1, $r_skb_data, offset
93+
.set reorder
9194
lh $r_A, 0(t1)
95+
.set noreorder
9296
#ifdef CONFIG_CPU_LITTLE_ENDIAN
9397
# if defined(__mips_isa_rev) && (__mips_isa_rev >= 2)
9498
wsbh t0, $r_A

0 commit comments

Comments
 (0)