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

PPC: net: bpf_jit_comp: 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 PowerPC JIT parts for the BPF XOR operation.
Signed-off-by: default avatarDaniel Borkmann <daniel.borkmann@tik.ee.ethz.ch>
Cc: Matt Evans <matt@ozlabs.org>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Acked-by: default avatarMatt Evans <matt@ozlabs.org>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 18d359ce
...@@ -168,9 +168,12 @@ ...@@ -168,9 +168,12 @@
#define PPC_INST_AND 0x7c000038 #define PPC_INST_AND 0x7c000038
#define PPC_INST_ANDDOT 0x7c000039 #define PPC_INST_ANDDOT 0x7c000039
#define PPC_INST_OR 0x7c000378 #define PPC_INST_OR 0x7c000378
#define PPC_INST_XOR 0x7c000278
#define PPC_INST_ANDI 0x70000000 #define PPC_INST_ANDI 0x70000000
#define PPC_INST_ORI 0x60000000 #define PPC_INST_ORI 0x60000000
#define PPC_INST_ORIS 0x64000000 #define PPC_INST_ORIS 0x64000000
#define PPC_INST_XORI 0x68000000
#define PPC_INST_XORIS 0x6c000000
#define PPC_INST_NEG 0x7c0000d0 #define PPC_INST_NEG 0x7c0000d0
#define PPC_INST_BRANCH 0x48000000 #define PPC_INST_BRANCH 0x48000000
#define PPC_INST_BRANCH_COND 0x40800000 #define PPC_INST_BRANCH_COND 0x40800000
......
...@@ -134,6 +134,12 @@ DECLARE_LOAD_FUNC(sk_load_byte_msh); ...@@ -134,6 +134,12 @@ DECLARE_LOAD_FUNC(sk_load_byte_msh);
___PPC_RS(a) | IMM_L(i)) ___PPC_RS(a) | IMM_L(i))
#define PPC_ORIS(d, a, i) EMIT(PPC_INST_ORIS | ___PPC_RA(d) | \ #define PPC_ORIS(d, a, i) EMIT(PPC_INST_ORIS | ___PPC_RA(d) | \
___PPC_RS(a) | IMM_L(i)) ___PPC_RS(a) | IMM_L(i))
#define PPC_XOR(d, a, b) EMIT(PPC_INST_XOR | ___PPC_RA(d) | \
___PPC_RS(a) | ___PPC_RB(b))
#define PPC_XORI(d, a, i) EMIT(PPC_INST_XORI | ___PPC_RA(d) | \
___PPC_RS(a) | IMM_L(i))
#define PPC_XORIS(d, a, i) EMIT(PPC_INST_XORIS | ___PPC_RA(d) | \
___PPC_RS(a) | IMM_L(i))
#define PPC_SLW(d, a, s) EMIT(PPC_INST_SLW | ___PPC_RA(d) | \ #define PPC_SLW(d, a, s) EMIT(PPC_INST_SLW | ___PPC_RA(d) | \
___PPC_RS(a) | ___PPC_RB(s)) ___PPC_RS(a) | ___PPC_RB(s))
#define PPC_SRW(d, a, s) EMIT(PPC_INST_SRW | ___PPC_RA(d) | \ #define PPC_SRW(d, a, s) EMIT(PPC_INST_SRW | ___PPC_RA(d) | \
......
...@@ -232,6 +232,17 @@ static int bpf_jit_build_body(struct sk_filter *fp, u32 *image, ...@@ -232,6 +232,17 @@ static int bpf_jit_build_body(struct sk_filter *fp, u32 *image,
if (K >= 65536) if (K >= 65536)
PPC_ORIS(r_A, r_A, IMM_H(K)); PPC_ORIS(r_A, r_A, IMM_H(K));
break; break;
case BPF_S_ANC_ALU_XOR_X:
case BPF_S_ALU_XOR_X: /* A ^= X */
ctx->seen |= SEEN_XREG;
PPC_XOR(r_A, r_A, r_X);
break;
case BPF_S_ALU_XOR_K: /* A ^= K */
if (IMM_L(K))
PPC_XORI(r_A, r_A, IMM_L(K));
if (K >= 65536)
PPC_XORIS(r_A, r_A, IMM_H(K));
break;
case BPF_S_ALU_LSH_X: /* A <<= X; */ case BPF_S_ALU_LSH_X: /* A <<= X; */
ctx->seen |= SEEN_XREG; ctx->seen |= SEEN_XREG;
PPC_SLW(r_A, r_A, r_X); PPC_SLW(r_A, r_A, r_X);
......
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