Skip to content

Commit bb0a1d6

Browse files
Xu Kuohaiborkmann
authored andcommitted
bpf, arm64: Support sign-extension mov instructions
Add JIT support for BPF sign-extension mov instructions with arm64 SXTB/SXTH/SXTW instructions. Signed-off-by: Xu Kuohai <[email protected]> Signed-off-by: Daniel Borkmann <[email protected]> Tested-by: Florent Revest <[email protected]> Acked-by: Florent Revest <[email protected]> Link: https://lore.kernel.org/bpf/[email protected]
1 parent cc88f54 commit bb0a1d6

File tree

2 files changed

+19
-1
lines changed

2 files changed

+19
-1
lines changed

arch/arm64/net/bpf_jit.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,11 @@
192192
#define A64_UXTH(sf, Rd, Rn) A64_UBFM(sf, Rd, Rn, 0, 15)
193193
#define A64_UXTW(sf, Rd, Rn) A64_UBFM(sf, Rd, Rn, 0, 31)
194194

195+
/* Sign extend */
196+
#define A64_SXTB(sf, Rd, Rn) A64_SBFM(sf, Rd, Rn, 0, 7)
197+
#define A64_SXTH(sf, Rd, Rn) A64_SBFM(sf, Rd, Rn, 0, 15)
198+
#define A64_SXTW(sf, Rd, Rn) A64_SBFM(sf, Rd, Rn, 0, 31)
199+
195200
/* Move wide (immediate) */
196201
#define A64_MOVEW(sf, Rd, imm16, shift, type) \
197202
aarch64_insn_gen_movewide(Rd, imm16, shift, \

arch/arm64/net/bpf_jit_comp.c

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -786,7 +786,20 @@ static int build_insn(const struct bpf_insn *insn, struct jit_ctx *ctx,
786786
/* dst = src */
787787
case BPF_ALU | BPF_MOV | BPF_X:
788788
case BPF_ALU64 | BPF_MOV | BPF_X:
789-
emit(A64_MOV(is64, dst, src), ctx);
789+
switch (insn->off) {
790+
case 0:
791+
emit(A64_MOV(is64, dst, src), ctx);
792+
break;
793+
case 8:
794+
emit(A64_SXTB(is64, dst, src), ctx);
795+
break;
796+
case 16:
797+
emit(A64_SXTH(is64, dst, src), ctx);
798+
break;
799+
case 32:
800+
emit(A64_SXTW(is64, dst, src), ctx);
801+
break;
802+
}
790803
break;
791804
/* dst = dst OP src */
792805
case BPF_ALU | BPF_ADD | BPF_X:

0 commit comments

Comments
 (0)