Commit 3cbe2041 authored by Daniel Borkmann's avatar Daniel Borkmann Committed by David S. Miller

ARM: net: bpf_jit_32: add XOR instruction for BPF JIT

This patch is a follow-up for patch "filter: add XOR instruction for use
with X/K" that implements BPF ARM JIT parts for the BPF XOR operation.
Signed-off-by: default avatarDaniel Borkmann <daniel.borkmann@tik.ee.ethz.ch>
Cc: Mircea Gherzan <mgherzan@gmail.com>
Cc: Arnd Bergmann <arnd@arndb.de>
Acked-by: default avatarMircea Gherzan <mgherzan@gmail.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 910cc727
...@@ -646,6 +646,16 @@ static int build_body(struct jit_ctx *ctx) ...@@ -646,6 +646,16 @@ static int build_body(struct jit_ctx *ctx)
update_on_xread(ctx); update_on_xread(ctx);
emit(ARM_ORR_R(r_A, r_A, r_X), ctx); emit(ARM_ORR_R(r_A, r_A, r_X), ctx);
break; break;
case BPF_S_ALU_XOR_K:
/* A ^= K; */
OP_IMM3(ARM_EOR, r_A, r_A, k, ctx);
break;
case BPF_S_ANC_ALU_XOR_X:
case BPF_S_ALU_XOR_X:
/* A ^= X */
update_on_xread(ctx);
emit(ARM_EOR_R(r_A, r_A, r_X), ctx);
break;
case BPF_S_ALU_AND_K: case BPF_S_ALU_AND_K:
/* A &= K */ /* A &= K */
OP_IMM3(ARM_AND, r_A, r_A, k, ctx); OP_IMM3(ARM_AND, r_A, r_A, k, ctx);
...@@ -762,11 +772,6 @@ static int build_body(struct jit_ctx *ctx) ...@@ -762,11 +772,6 @@ static int build_body(struct jit_ctx *ctx)
update_on_xread(ctx); update_on_xread(ctx);
emit(ARM_MOV_R(r_A, r_X), ctx); emit(ARM_MOV_R(r_A, r_X), ctx);
break; break;
case BPF_S_ANC_ALU_XOR_X:
/* A ^= X */
update_on_xread(ctx);
emit(ARM_EOR_R(r_A, r_A, r_X), ctx);
break;
case BPF_S_ANC_PROTOCOL: case BPF_S_ANC_PROTOCOL:
/* A = ntohs(skb->protocol) */ /* A = ntohs(skb->protocol) */
ctx->seen |= SEEN_SKB; ctx->seen |= SEEN_SKB;
......
...@@ -69,6 +69,7 @@ ...@@ -69,6 +69,7 @@
#define ARM_INST_CMP_I 0x03500000 #define ARM_INST_CMP_I 0x03500000
#define ARM_INST_EOR_R 0x00200000 #define ARM_INST_EOR_R 0x00200000
#define ARM_INST_EOR_I 0x02200000
#define ARM_INST_LDRB_I 0x05d00000 #define ARM_INST_LDRB_I 0x05d00000
#define ARM_INST_LDRB_R 0x07d00000 #define ARM_INST_LDRB_R 0x07d00000
...@@ -135,6 +136,7 @@ ...@@ -135,6 +136,7 @@
#define ARM_CMP_I(rn, imm) _AL3_I(ARM_INST_CMP, 0, rn, imm) #define ARM_CMP_I(rn, imm) _AL3_I(ARM_INST_CMP, 0, rn, imm)
#define ARM_EOR_R(rd, rn, rm) _AL3_R(ARM_INST_EOR, rd, rn, rm) #define ARM_EOR_R(rd, rn, rm) _AL3_R(ARM_INST_EOR, rd, rn, rm)
#define ARM_EOR_I(rd, rn, imm) _AL3_I(ARM_INST_EOR, rd, rn, imm)
#define ARM_LDR_I(rt, rn, off) (ARM_INST_LDR_I | (rt) << 12 | (rn) << 16 \ #define ARM_LDR_I(rt, rn, off) (ARM_INST_LDR_I | (rt) << 12 | (rn) << 16 \
| (off)) | (off))
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment