Skip to content

Commit c533641

Browse files
seehearfeelchenhuacai
authored andcommitted
LoongArch: BPF: Fix sign-extension mov instructions
We can see that "Short form of movsx, dst_reg = (s8,s16,s32)src_reg" in include/linux/filter.h, additionally, for BPF_ALU64 the value of the destination register is unchanged whereas for BPF_ALU the upper 32 bits of the destination register are zeroed, so it should clear the upper 32 bits for BPF_ALU. [root@linux fedora]# echo 1 > /proc/sys/net/core/bpf_jit_enable [root@linux fedora]# modprobe test_bpf Before: test_bpf: torvalds#81 ALU_MOVSX | BPF_B jited:1 ret 2 != 1 (0x2 != 0x1)FAIL (1 times) test_bpf: torvalds#82 ALU_MOVSX | BPF_H jited:1 ret 2 != 1 (0x2 != 0x1)FAIL (1 times) After: test_bpf: torvalds#81 ALU_MOVSX | BPF_B jited:1 6 PASS test_bpf: torvalds#82 ALU_MOVSX | BPF_H jited:1 6 PASS By the way, the bpf selftest case "./test_progs -t verifier_movsx" can also be fixed with this patch. Fixes: f48012f ("LoongArch: BPF: Support sign-extension mov instructions") Signed-off-by: Tiezhu Yang <yangtiezhu@loongson.cn> Signed-off-by: Huacai Chen <chenhuacai@loongson.cn>
1 parent c47598a commit c533641

File tree

1 file changed

+2
-0
lines changed

1 file changed

+2
-0
lines changed

arch/loongarch/net/bpf_jit.c

+2
Original file line numberDiff line numberDiff line change
@@ -480,10 +480,12 @@ static int build_insn(const struct bpf_insn *insn, struct jit_ctx *ctx, bool ext
480480
case 8:
481481
move_reg(ctx, t1, src);
482482
emit_insn(ctx, extwb, dst, t1);
483+
emit_zext_32(ctx, dst, is32);
483484
break;
484485
case 16:
485486
move_reg(ctx, t1, src);
486487
emit_insn(ctx, extwh, dst, t1);
488+
emit_zext_32(ctx, dst, is32);
487489
break;
488490
case 32:
489491
emit_insn(ctx, addw, dst, src, LOONGARCH_GPR_ZERO);

0 commit comments

Comments
 (0)