diff options
author | Daniel Borkmann <dxchgb@gmail.com> | 2012-11-07 10:28:28 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2012-11-13 18:21:10 -0500 |
commit | 3cbe20412ef4656169e09ea40ec47f973ad99a92 (patch) | |
tree | ba2c9581a170933dc4a65ffe9bde5847bd10e966 /arch/arm/net | |
parent | 910cc727bf5cba11ce51be86fa2fb2454b10f3d9 (diff) |
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: Daniel Borkmann <daniel.borkmann@tik.ee.ethz.ch>
Cc: Mircea Gherzan <mgherzan@gmail.com>
Cc: Arnd Bergmann <arnd@arndb.de>
Acked-by: Mircea Gherzan <mgherzan@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'arch/arm/net')
-rw-r--r-- | arch/arm/net/bpf_jit_32.c | 15 | ||||
-rw-r--r-- | arch/arm/net/bpf_jit_32.h | 2 |
2 files changed, 12 insertions, 5 deletions
diff --git a/arch/arm/net/bpf_jit_32.c b/arch/arm/net/bpf_jit_32.c index c641fb685017..8be702de34f9 100644 --- a/arch/arm/net/bpf_jit_32.c +++ b/arch/arm/net/bpf_jit_32.c | |||
@@ -646,6 +646,16 @@ load_ind: | |||
646 | update_on_xread(ctx); | 646 | update_on_xread(ctx); |
647 | emit(ARM_ORR_R(r_A, r_A, r_X), ctx); | 647 | emit(ARM_ORR_R(r_A, r_A, r_X), ctx); |
648 | break; | 648 | break; |
649 | case BPF_S_ALU_XOR_K: | ||
650 | /* A ^= K; */ | ||
651 | OP_IMM3(ARM_EOR, r_A, r_A, k, ctx); | ||
652 | break; | ||
653 | case BPF_S_ANC_ALU_XOR_X: | ||
654 | case BPF_S_ALU_XOR_X: | ||
655 | /* A ^= X */ | ||
656 | update_on_xread(ctx); | ||
657 | emit(ARM_EOR_R(r_A, r_A, r_X), ctx); | ||
658 | break; | ||
649 | case BPF_S_ALU_AND_K: | 659 | case BPF_S_ALU_AND_K: |
650 | /* A &= K */ | 660 | /* A &= K */ |
651 | OP_IMM3(ARM_AND, r_A, r_A, k, ctx); | 661 | OP_IMM3(ARM_AND, r_A, r_A, k, ctx); |
@@ -762,11 +772,6 @@ b_epilogue: | |||
762 | update_on_xread(ctx); | 772 | update_on_xread(ctx); |
763 | emit(ARM_MOV_R(r_A, r_X), ctx); | 773 | emit(ARM_MOV_R(r_A, r_X), ctx); |
764 | break; | 774 | break; |
765 | case BPF_S_ANC_ALU_XOR_X: | ||
766 | /* A ^= X */ | ||
767 | update_on_xread(ctx); | ||
768 | emit(ARM_EOR_R(r_A, r_A, r_X), ctx); | ||
769 | break; | ||
770 | case BPF_S_ANC_PROTOCOL: | 775 | case BPF_S_ANC_PROTOCOL: |
771 | /* A = ntohs(skb->protocol) */ | 776 | /* A = ntohs(skb->protocol) */ |
772 | ctx->seen |= SEEN_SKB; | 777 | ctx->seen |= SEEN_SKB; |
diff --git a/arch/arm/net/bpf_jit_32.h b/arch/arm/net/bpf_jit_32.h index 7fa2f7d3cb90..afb84621ff6f 100644 --- a/arch/arm/net/bpf_jit_32.h +++ b/arch/arm/net/bpf_jit_32.h | |||
@@ -69,6 +69,7 @@ | |||
69 | #define ARM_INST_CMP_I 0x03500000 | 69 | #define ARM_INST_CMP_I 0x03500000 |
70 | 70 | ||
71 | #define ARM_INST_EOR_R 0x00200000 | 71 | #define ARM_INST_EOR_R 0x00200000 |
72 | #define ARM_INST_EOR_I 0x02200000 | ||
72 | 73 | ||
73 | #define ARM_INST_LDRB_I 0x05d00000 | 74 | #define ARM_INST_LDRB_I 0x05d00000 |
74 | #define ARM_INST_LDRB_R 0x07d00000 | 75 | #define ARM_INST_LDRB_R 0x07d00000 |
@@ -135,6 +136,7 @@ | |||
135 | #define ARM_CMP_I(rn, imm) _AL3_I(ARM_INST_CMP, 0, rn, imm) | 136 | #define ARM_CMP_I(rn, imm) _AL3_I(ARM_INST_CMP, 0, rn, imm) |
136 | 137 | ||
137 | #define ARM_EOR_R(rd, rn, rm) _AL3_R(ARM_INST_EOR, rd, rn, rm) | 138 | #define ARM_EOR_R(rd, rn, rm) _AL3_R(ARM_INST_EOR, rd, rn, rm) |
139 | #define ARM_EOR_I(rd, rn, imm) _AL3_I(ARM_INST_EOR, rd, rn, imm) | ||
138 | 140 | ||
139 | #define ARM_LDR_I(rt, rn, off) (ARM_INST_LDR_I | (rt) << 12 | (rn) << 16 \ | 141 | #define ARM_LDR_I(rt, rn, off) (ARM_INST_LDR_I | (rt) << 12 | (rn) << 16 \ |
140 | | (off)) | 142 | | (off)) |