bpf, arm64: Support sign-extension mov instructions
authorXu Kuohai <xukuohai@huawei.com>
Tue, 15 Aug 2023 15:41:54 +0000 (11:41 -0400)
committerDaniel Borkmann <daniel@iogearbox.net>
Fri, 18 Aug 2023 13:45:58 +0000 (15:45 +0200)
Add JIT support for BPF sign-extension mov instructions with arm64
SXTB/SXTH/SXTW instructions.

Signed-off-by: Xu Kuohai <xukuohai@huawei.com>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Tested-by: Florent Revest <revest@chromium.org>
Acked-by: Florent Revest <revest@chromium.org>
Link: https://lore.kernel.org/bpf/20230815154158.717901-4-xukuohai@huaweicloud.com
arch/arm64/net/bpf_jit.h
arch/arm64/net/bpf_jit_comp.c

index 086ffbad0eb5401bdfde21c62d0dbd05697a5051..949810a0c48c89d61ba2afb6c1134039078379f1 100644 (file)
 #define A64_UXTH(sf, Rd, Rn) A64_UBFM(sf, Rd, Rn, 0, 15)
 #define A64_UXTW(sf, Rd, Rn) A64_UBFM(sf, Rd, Rn, 0, 31)
 
+/* Sign extend */
+#define A64_SXTB(sf, Rd, Rn) A64_SBFM(sf, Rd, Rn, 0, 7)
+#define A64_SXTH(sf, Rd, Rn) A64_SBFM(sf, Rd, Rn, 0, 15)
+#define A64_SXTW(sf, Rd, Rn) A64_SBFM(sf, Rd, Rn, 0, 31)
+
 /* Move wide (immediate) */
 #define A64_MOVEW(sf, Rd, imm16, shift, type) \
        aarch64_insn_gen_movewide(Rd, imm16, shift, \
index 22f1b0d5fb3c7caa8863d8f11a91c0525487c154..9b796e74ef42d525ebe0d3c69119d77c6f8a836b 100644 (file)
@@ -786,7 +786,20 @@ static int build_insn(const struct bpf_insn *insn, struct jit_ctx *ctx,
        /* dst = src */
        case BPF_ALU | BPF_MOV | BPF_X:
        case BPF_ALU64 | BPF_MOV | BPF_X:
-               emit(A64_MOV(is64, dst, src), ctx);
+               switch (insn->off) {
+               case 0:
+                       emit(A64_MOV(is64, dst, src), ctx);
+                       break;
+               case 8:
+                       emit(A64_SXTB(is64, dst, src), ctx);
+                       break;
+               case 16:
+                       emit(A64_SXTH(is64, dst, src), ctx);
+                       break;
+               case 32:
+                       emit(A64_SXTW(is64, dst, src), ctx);
+                       break;
+               }
                break;
        /* dst = dst OP src */
        case BPF_ALU | BPF_ADD | BPF_X: