summaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
authorHengqi Chen <hengqi.chen@gmail.com>2023-11-08 07:12:16 +0100
committerHuacai Chen <chenhuacai@loongson.cn>2023-11-08 07:12:16 +0100
commit9ddd2b8d1a8b566195c196fe4249d04cd75cc73c (patch)
tree47c7650b2683a3de986868e04771572b9df316ce /arch
parentLoongArch: BPF: Support unconditional bswap instructions (diff)
downloadlinux-9ddd2b8d1a8b566195c196fe4249d04cd75cc73c.tar.xz
linux-9ddd2b8d1a8b566195c196fe4249d04cd75cc73c.zip
LoongArch: BPF: Support 32-bit offset jmp instructions
Add support for 32-bit offset jmp instruction. Currently, we use b instruction which supports range within ±128MB for such jumps. This should be large enough for BPF progs. Signed-off-by: Hengqi Chen <hengqi.chen@gmail.com> Signed-off-by: Huacai Chen <chenhuacai@loongson.cn>
Diffstat (limited to 'arch')
-rw-r--r--arch/loongarch/net/bpf_jit.c6
1 files changed, 5 insertions, 1 deletions
diff --git a/arch/loongarch/net/bpf_jit.c b/arch/loongarch/net/bpf_jit.c
index a8be6d4b058c..050fcf233a34 100644
--- a/arch/loongarch/net/bpf_jit.c
+++ b/arch/loongarch/net/bpf_jit.c
@@ -848,7 +848,11 @@ static int build_insn(const struct bpf_insn *insn, struct jit_ctx *ctx, bool ext
/* PC += off */
case BPF_JMP | BPF_JA:
- jmp_offset = bpf2la_offset(i, off, ctx);
+ case BPF_JMP32 | BPF_JA:
+ if (BPF_CLASS(code) == BPF_JMP)
+ jmp_offset = bpf2la_offset(i, off, ctx);
+ else
+ jmp_offset = bpf2la_offset(i, imm, ctx);
if (emit_uncond_jmp(ctx, jmp_offset) < 0)
goto toofar;
break;