mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-10-05 08:26:59 +00:00
bpf, arm64: implement jiting of BPF_J{LT, LE, SLT, SLE}
This work implements jiting of BPF_J{LT,LE,SLT,SLE} instructions with BPF_X/BPF_K variants for the arm64 eBPF JIT. Signed-off-by: Daniel Borkmann <daniel@iogearbox.net> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
52afc51e94
commit
c362b2f34e
2 changed files with 24 additions and 0 deletions
|
@ -44,8 +44,12 @@
|
||||||
#define A64_COND_NE AARCH64_INSN_COND_NE /* != */
|
#define A64_COND_NE AARCH64_INSN_COND_NE /* != */
|
||||||
#define A64_COND_CS AARCH64_INSN_COND_CS /* unsigned >= */
|
#define A64_COND_CS AARCH64_INSN_COND_CS /* unsigned >= */
|
||||||
#define A64_COND_HI AARCH64_INSN_COND_HI /* unsigned > */
|
#define A64_COND_HI AARCH64_INSN_COND_HI /* unsigned > */
|
||||||
|
#define A64_COND_LS AARCH64_INSN_COND_LS /* unsigned <= */
|
||||||
|
#define A64_COND_CC AARCH64_INSN_COND_CC /* unsigned < */
|
||||||
#define A64_COND_GE AARCH64_INSN_COND_GE /* signed >= */
|
#define A64_COND_GE AARCH64_INSN_COND_GE /* signed >= */
|
||||||
#define A64_COND_GT AARCH64_INSN_COND_GT /* signed > */
|
#define A64_COND_GT AARCH64_INSN_COND_GT /* signed > */
|
||||||
|
#define A64_COND_LE AARCH64_INSN_COND_LE /* signed <= */
|
||||||
|
#define A64_COND_LT AARCH64_INSN_COND_LT /* signed < */
|
||||||
#define A64_B_(cond, imm19) A64_COND_BRANCH(cond, (imm19) << 2)
|
#define A64_B_(cond, imm19) A64_COND_BRANCH(cond, (imm19) << 2)
|
||||||
|
|
||||||
/* Unconditional branch (immediate) */
|
/* Unconditional branch (immediate) */
|
||||||
|
|
|
@ -527,10 +527,14 @@ static int build_insn(const struct bpf_insn *insn, struct jit_ctx *ctx)
|
||||||
/* IF (dst COND src) JUMP off */
|
/* IF (dst COND src) JUMP off */
|
||||||
case BPF_JMP | BPF_JEQ | BPF_X:
|
case BPF_JMP | BPF_JEQ | BPF_X:
|
||||||
case BPF_JMP | BPF_JGT | BPF_X:
|
case BPF_JMP | BPF_JGT | BPF_X:
|
||||||
|
case BPF_JMP | BPF_JLT | BPF_X:
|
||||||
case BPF_JMP | BPF_JGE | BPF_X:
|
case BPF_JMP | BPF_JGE | BPF_X:
|
||||||
|
case BPF_JMP | BPF_JLE | BPF_X:
|
||||||
case BPF_JMP | BPF_JNE | BPF_X:
|
case BPF_JMP | BPF_JNE | BPF_X:
|
||||||
case BPF_JMP | BPF_JSGT | BPF_X:
|
case BPF_JMP | BPF_JSGT | BPF_X:
|
||||||
|
case BPF_JMP | BPF_JSLT | BPF_X:
|
||||||
case BPF_JMP | BPF_JSGE | BPF_X:
|
case BPF_JMP | BPF_JSGE | BPF_X:
|
||||||
|
case BPF_JMP | BPF_JSLE | BPF_X:
|
||||||
emit(A64_CMP(1, dst, src), ctx);
|
emit(A64_CMP(1, dst, src), ctx);
|
||||||
emit_cond_jmp:
|
emit_cond_jmp:
|
||||||
jmp_offset = bpf2a64_offset(i + off, i, ctx);
|
jmp_offset = bpf2a64_offset(i + off, i, ctx);
|
||||||
|
@ -542,9 +546,15 @@ static int build_insn(const struct bpf_insn *insn, struct jit_ctx *ctx)
|
||||||
case BPF_JGT:
|
case BPF_JGT:
|
||||||
jmp_cond = A64_COND_HI;
|
jmp_cond = A64_COND_HI;
|
||||||
break;
|
break;
|
||||||
|
case BPF_JLT:
|
||||||
|
jmp_cond = A64_COND_CC;
|
||||||
|
break;
|
||||||
case BPF_JGE:
|
case BPF_JGE:
|
||||||
jmp_cond = A64_COND_CS;
|
jmp_cond = A64_COND_CS;
|
||||||
break;
|
break;
|
||||||
|
case BPF_JLE:
|
||||||
|
jmp_cond = A64_COND_LS;
|
||||||
|
break;
|
||||||
case BPF_JSET:
|
case BPF_JSET:
|
||||||
case BPF_JNE:
|
case BPF_JNE:
|
||||||
jmp_cond = A64_COND_NE;
|
jmp_cond = A64_COND_NE;
|
||||||
|
@ -552,9 +562,15 @@ static int build_insn(const struct bpf_insn *insn, struct jit_ctx *ctx)
|
||||||
case BPF_JSGT:
|
case BPF_JSGT:
|
||||||
jmp_cond = A64_COND_GT;
|
jmp_cond = A64_COND_GT;
|
||||||
break;
|
break;
|
||||||
|
case BPF_JSLT:
|
||||||
|
jmp_cond = A64_COND_LT;
|
||||||
|
break;
|
||||||
case BPF_JSGE:
|
case BPF_JSGE:
|
||||||
jmp_cond = A64_COND_GE;
|
jmp_cond = A64_COND_GE;
|
||||||
break;
|
break;
|
||||||
|
case BPF_JSLE:
|
||||||
|
jmp_cond = A64_COND_LE;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
}
|
}
|
||||||
|
@ -566,10 +582,14 @@ static int build_insn(const struct bpf_insn *insn, struct jit_ctx *ctx)
|
||||||
/* IF (dst COND imm) JUMP off */
|
/* IF (dst COND imm) JUMP off */
|
||||||
case BPF_JMP | BPF_JEQ | BPF_K:
|
case BPF_JMP | BPF_JEQ | BPF_K:
|
||||||
case BPF_JMP | BPF_JGT | BPF_K:
|
case BPF_JMP | BPF_JGT | BPF_K:
|
||||||
|
case BPF_JMP | BPF_JLT | BPF_K:
|
||||||
case BPF_JMP | BPF_JGE | BPF_K:
|
case BPF_JMP | BPF_JGE | BPF_K:
|
||||||
|
case BPF_JMP | BPF_JLE | BPF_K:
|
||||||
case BPF_JMP | BPF_JNE | BPF_K:
|
case BPF_JMP | BPF_JNE | BPF_K:
|
||||||
case BPF_JMP | BPF_JSGT | BPF_K:
|
case BPF_JMP | BPF_JSGT | BPF_K:
|
||||||
|
case BPF_JMP | BPF_JSLT | BPF_K:
|
||||||
case BPF_JMP | BPF_JSGE | BPF_K:
|
case BPF_JMP | BPF_JSGE | BPF_K:
|
||||||
|
case BPF_JMP | BPF_JSLE | BPF_K:
|
||||||
emit_a64_mov_i(1, tmp, imm, ctx);
|
emit_a64_mov_i(1, tmp, imm, ctx);
|
||||||
emit(A64_CMP(1, dst, tmp), ctx);
|
emit(A64_CMP(1, dst, tmp), ctx);
|
||||||
goto emit_cond_jmp;
|
goto emit_cond_jmp;
|
||||||
|
|
Loading…
Reference in a new issue