All of lore.kernel.org
 help / color / mirror / Atom feed
diff for duplicates of <53A01572.5090603@redhat.com>

diff --git a/a/2.txt b/N1/2.txt
index 8b13789..ab98c4d 100644
--- a/a/2.txt
+++ b/N1/2.txt
@@ -1 +1,494 @@
+>From 12b5040eebd51f5efd6ffe04b1bec8ebbe5a9caf Mon Sep 17 00:00:00 2001
+From: Daniel Borkmann <dborkman@redhat.com>
+Date: Tue, 17 Jun 2014 11:48:28 +0200
+Subject: [PATCH] mips: filter: fix build error in BPF JIT
 
+Guenter reported that on MIPS, the following build error occurs when
+BPF JIT is enabled:
+
+  mips: allmodconfig fails in 3.16-rc1 with lots of undefined symbols.
+
+  arch/mips/net/bpf_jit.c: In function 'is_load_to_a':
+  arch/mips/net/bpf_jit.c:559:7: error: 'BPF_S_LD_W_LEN' undeclared (first use in this function)
+  arch/mips/net/bpf_jit.c:559:7: note: each undeclared identifier is reported only once for each function it appears in
+  arch/mips/net/bpf_jit.c:560:7: error: 'BPF_S_LD_W_ABS' undeclared (first use in this function)
+  [...]
+
+The reason behind this is that 3480593131e0 ("net: filter: get rid of
+BPF_S_* enum") was routed via net-next tree, that takes all BPF-related
+changes, at a time where MIPS BPF JIT was not part of net-next, while
+c6610de353da ("MIPS: net: Add BPF JIT") was routed via mips arch tree
+and went into mainline within the same merge window. Thus, fix it up by
+converting BPF_S_* in a similar fashion as in 3480593131e0 for MIPS.
+
+Reported-by: Guenter Roeck <linux@roeck-us.net>
+Signed-off-by: Daniel Borkmann <dborkman@redhat.com>
+Cc: Ralf Baechle <ralf@linux-mips.org>
+Cc: Alexei Starovoitov <ast@plumgrid.com>
+Cc: Markos Chandras <markos.chandras@imgtec.com>
+---
+ arch/mips/net/bpf_jit.c | 143 +++++++++++++++++++++++-------------------------
+ 1 file changed, 69 insertions(+), 74 deletions(-)
+
+diff --git a/arch/mips/net/bpf_jit.c b/arch/mips/net/bpf_jit.c
+index a67b975..f7c2064 100644
+--- a/arch/mips/net/bpf_jit.c
++++ b/arch/mips/net/bpf_jit.c
+@@ -556,18 +556,10 @@ static inline void update_on_xread(struct jit_ctx *ctx)
+ static bool is_load_to_a(u16 inst)
+ {
+ 	switch (inst) {
+-	case BPF_S_LD_W_LEN:
+-	case BPF_S_LD_W_ABS:
+-	case BPF_S_LD_H_ABS:
+-	case BPF_S_LD_B_ABS:
+-	case BPF_S_ANC_CPU:
+-	case BPF_S_ANC_IFINDEX:
+-	case BPF_S_ANC_MARK:
+-	case BPF_S_ANC_PROTOCOL:
+-	case BPF_S_ANC_RXHASH:
+-	case BPF_S_ANC_VLAN_TAG:
+-	case BPF_S_ANC_VLAN_TAG_PRESENT:
+-	case BPF_S_ANC_QUEUE:
++	case BPF_LD | BPF_W | BPF_LEN:
++	case BPF_LD | BPF_W | BPF_ABS:
++	case BPF_LD | BPF_H | BPF_ABS:
++	case BPF_LD | BPF_B | BPF_ABS:
+ 		return true;
+ 	default:
+ 		return false;
+@@ -709,7 +701,7 @@ static void build_prologue(struct jit_ctx *ctx)
+ 		emit_jit_reg_move(r_X, r_zero, ctx);
+ 
+ 	/* Do not leak kernel data to userspace */
+-	if ((first_inst != BPF_S_RET_K) && !(is_load_to_a(first_inst)))
++	if ((first_inst != (BPF_RET | BPF_K)) && !(is_load_to_a(first_inst)))
+ 		emit_jit_reg_move(r_A, r_zero, ctx);
+ }
+ 
+@@ -783,41 +775,44 @@ static int build_body(struct jit_ctx *ctx)
+ 	u32 k, b_off __maybe_unused;
+ 
+ 	for (i = 0; i < prog->len; i++) {
++		u16 code;
++
+ 		inst = &(prog->insns[i]);
+ 		pr_debug("%s: code->0x%02x, jt->0x%x, jf->0x%x, k->0x%x\n",
+ 			 __func__, inst->code, inst->jt, inst->jf, inst->k);
+ 		k = inst->k;
++		code = bpf_anc_helper(inst);
+ 
+ 		if (ctx->target == NULL)
+ 			ctx->offsets[i] = ctx->idx * 4;
+ 
+-		switch (inst->code) {
+-		case BPF_S_LD_IMM:
++		switch (code) {
++		case BPF_LD | BPF_IMM:
+ 			/* A <- k ==> li r_A, k */
+ 			ctx->flags |= SEEN_A;
+ 			emit_load_imm(r_A, k, ctx);
+ 			break;
+-		case BPF_S_LD_W_LEN:
++		case BPF_LD | BPF_W | BPF_LEN:
+ 			BUILD_BUG_ON(FIELD_SIZEOF(struct sk_buff, len) != 4);
+ 			/* A <- len ==> lw r_A, offset(skb) */
+ 			ctx->flags |= SEEN_SKB | SEEN_A;
+ 			off = offsetof(struct sk_buff, len);
+ 			emit_load(r_A, r_skb, off, ctx);
+ 			break;
+-		case BPF_S_LD_MEM:
++		case BPF_LD | BPF_MEM:
+ 			/* A <- M[k] ==> lw r_A, offset(M) */
+ 			ctx->flags |= SEEN_MEM | SEEN_A;
+ 			emit_load(r_A, r_M, SCRATCH_OFF(k), ctx);
+ 			break;
+-		case BPF_S_LD_W_ABS:
++		case BPF_LD | BPF_W | BPF_ABS:
+ 			/* A <- P[k:4] */
+ 			load_order = 2;
+ 			goto load;
+-		case BPF_S_LD_H_ABS:
++		case BPF_LD | BPF_H | BPF_ABS:
+ 			/* A <- P[k:2] */
+ 			load_order = 1;
+ 			goto load;
+-		case BPF_S_LD_B_ABS:
++		case BPF_LD | BPF_B | BPF_ABS:
+ 			/* A <- P[k:1] */
+ 			load_order = 0;
+ load:
+@@ -852,15 +847,15 @@ load_common:
+ 			emit_b(b_imm(prog->len, ctx), ctx);
+ 			emit_reg_move(r_ret, r_zero, ctx);
+ 			break;
+-		case BPF_S_LD_W_IND:
++		case BPF_LD | BPF_W | BPF_IND:
+ 			/* A <- P[X + k:4] */
+ 			load_order = 2;
+ 			goto load_ind;
+-		case BPF_S_LD_H_IND:
++		case BPF_LD | BPF_H | BPF_IND:
+ 			/* A <- P[X + k:2] */
+ 			load_order = 1;
+ 			goto load_ind;
+-		case BPF_S_LD_B_IND:
++		case BPF_LD | BPF_B | BPF_IND:
+ 			/* A <- P[X + k:1] */
+ 			load_order = 0;
+ load_ind:
+@@ -868,23 +863,23 @@ load_ind:
+ 			ctx->flags |= SEEN_OFF | SEEN_X;
+ 			emit_addiu(r_off, r_X, k, ctx);
+ 			goto load_common;
+-		case BPF_S_LDX_IMM:
++		case BPF_LDX | BPF_IMM:
+ 			/* X <- k */
+ 			ctx->flags |= SEEN_X;
+ 			emit_load_imm(r_X, k, ctx);
+ 			break;
+-		case BPF_S_LDX_MEM:
++		case BPF_LDX | BPF_MEM:
+ 			/* X <- M[k] */
+ 			ctx->flags |= SEEN_X | SEEN_MEM;
+ 			emit_load(r_X, r_M, SCRATCH_OFF(k), ctx);
+ 			break;
+-		case BPF_S_LDX_W_LEN:
++		case BPF_LDX | BPF_W | BPF_LEN:
+ 			/* X <- len */
+ 			ctx->flags |= SEEN_X | SEEN_SKB;
+ 			off = offsetof(struct sk_buff, len);
+ 			emit_load(r_X, r_skb, off, ctx);
+ 			break;
+-		case BPF_S_LDX_B_MSH:
++		case BPF_LDX | BPF_B | BPF_MSH:
+ 			/* X <- 4 * (P[k:1] & 0xf) */
+ 			ctx->flags |= SEEN_X | SEEN_CALL | SEEN_S0 | SEEN_SKB;
+ 			/* Load offset to a1 */
+@@ -917,50 +912,50 @@ load_ind:
+ 			emit_b(b_imm(prog->len, ctx), ctx);
+ 			emit_load_imm(r_ret, 0, ctx); /* delay slot */
+ 			break;
+-		case BPF_S_ST:
++		case BPF_ST:
+ 			/* M[k] <- A */
+ 			ctx->flags |= SEEN_MEM | SEEN_A;
+ 			emit_store(r_A, r_M, SCRATCH_OFF(k), ctx);
+ 			break;
+-		case BPF_S_STX:
++		case BPF_STX:
+ 			/* M[k] <- X */
+ 			ctx->flags |= SEEN_MEM | SEEN_X;
+ 			emit_store(r_X, r_M, SCRATCH_OFF(k), ctx);
+ 			break;
+-		case BPF_S_ALU_ADD_K:
++		case BPF_ALU | BPF_ADD | BPF_K:
+ 			/* A += K */
+ 			ctx->flags |= SEEN_A;
+ 			emit_addiu(r_A, r_A, k, ctx);
+ 			break;
+-		case BPF_S_ALU_ADD_X:
++		case BPF_ALU | BPF_ADD | BPF_X:
+ 			/* A += X */
+ 			ctx->flags |= SEEN_A | SEEN_X;
+ 			emit_addu(r_A, r_A, r_X, ctx);
+ 			break;
+-		case BPF_S_ALU_SUB_K:
++		case BPF_ALU | BPF_SUB | BPF_K:
+ 			/* A -= K */
+ 			ctx->flags |= SEEN_A;
+ 			emit_addiu(r_A, r_A, -k, ctx);
+ 			break;
+-		case BPF_S_ALU_SUB_X:
++		case BPF_ALU | BPF_SUB | BPF_X:
+ 			/* A -= X */
+ 			ctx->flags |= SEEN_A | SEEN_X;
+ 			emit_subu(r_A, r_A, r_X, ctx);
+ 			break;
+-		case BPF_S_ALU_MUL_K:
++		case BPF_ALU | BPF_MUL | BPF_K:
+ 			/* A *= K */
+ 			/* Load K to scratch register before MUL */
+ 			ctx->flags |= SEEN_A | SEEN_S0;
+ 			emit_load_imm(r_s0, k, ctx);
+ 			emit_mul(r_A, r_A, r_s0, ctx);
+ 			break;
+-		case BPF_S_ALU_MUL_X:
++		case BPF_ALU | BPF_MUL | BPF_X:
+ 			/* A *= X */
+ 			update_on_xread(ctx);
+ 			ctx->flags |= SEEN_A | SEEN_X;
+ 			emit_mul(r_A, r_A, r_X, ctx);
+ 			break;
+-		case BPF_S_ALU_DIV_K:
++		case BPF_ALU | BPF_DIV | BPF_K:
+ 			/* A /= k */
+ 			if (k == 1)
+ 				break;
+@@ -973,7 +968,7 @@ load_ind:
+ 			emit_load_imm(r_s0, k, ctx);
+ 			emit_div(r_A, r_s0, ctx);
+ 			break;
+-		case BPF_S_ALU_MOD_K:
++		case BPF_ALU | BPF_MOD | BPF_K:
+ 			/* A %= k */
+ 			if (k == 1 || optimize_div(&k)) {
+ 				ctx->flags |= SEEN_A;
+@@ -984,7 +979,7 @@ load_ind:
+ 				emit_mod(r_A, r_s0, ctx);
+ 			}
+ 			break;
+-		case BPF_S_ALU_DIV_X:
++		case BPF_ALU | BPF_DIV | BPF_X:
+ 			/* A /= X */
+ 			update_on_xread(ctx);
+ 			ctx->flags |= SEEN_X | SEEN_A;
+@@ -994,7 +989,7 @@ load_ind:
+ 			emit_load_imm(r_val, 0, ctx); /* delay slot */
+ 			emit_div(r_A, r_X, ctx);
+ 			break;
+-		case BPF_S_ALU_MOD_X:
++		case BPF_ALU | BPF_MOD | BPF_X:
+ 			/* A %= X */
+ 			update_on_xread(ctx);
+ 			ctx->flags |= SEEN_X | SEEN_A;
+@@ -1004,94 +999,94 @@ load_ind:
+ 			emit_load_imm(r_val, 0, ctx); /* delay slot */
+ 			emit_mod(r_A, r_X, ctx);
+ 			break;
+-		case BPF_S_ALU_OR_K:
++		case BPF_ALU | BPF_OR | BPF_K:
+ 			/* A |= K */
+ 			ctx->flags |= SEEN_A;
+ 			emit_ori(r_A, r_A, k, ctx);
+ 			break;
+-		case BPF_S_ALU_OR_X:
++		case BPF_ALU | BPF_OR | BPF_X:
+ 			/* A |= X */
+ 			update_on_xread(ctx);
+ 			ctx->flags |= SEEN_A;
+ 			emit_ori(r_A, r_A, r_X, ctx);
+ 			break;
+-		case BPF_S_ALU_XOR_K:
++		case BPF_ALU | BPF_XOR | BPF_K:
+ 			/* A ^= k */
+ 			ctx->flags |= SEEN_A;
+ 			emit_xori(r_A, r_A, k, ctx);
+ 			break;
+-		case BPF_S_ANC_ALU_XOR_X:
+-		case BPF_S_ALU_XOR_X:
++		case BPF_ANC | SKF_AD_ALU_XOR_X:
++		case BPF_ALU | BPF_XOR | BPF_X:
+ 			/* A ^= X */
+ 			update_on_xread(ctx);
+ 			ctx->flags |= SEEN_A;
+ 			emit_xor(r_A, r_A, r_X, ctx);
+ 			break;
+-		case BPF_S_ALU_AND_K:
++		case BPF_ALU | BPF_AND | BPF_K:
+ 			/* A &= K */
+ 			ctx->flags |= SEEN_A;
+ 			emit_andi(r_A, r_A, k, ctx);
+ 			break;
+-		case BPF_S_ALU_AND_X:
++		case BPF_ALU | BPF_AND | BPF_X:
+ 			/* A &= X */
+ 			update_on_xread(ctx);
+ 			ctx->flags |= SEEN_A | SEEN_X;
+ 			emit_and(r_A, r_A, r_X, ctx);
+ 			break;
+-		case BPF_S_ALU_LSH_K:
++		case BPF_ALU | BPF_LSH | BPF_K:
+ 			/* A <<= K */
+ 			ctx->flags |= SEEN_A;
+ 			emit_sll(r_A, r_A, k, ctx);
+ 			break;
+-		case BPF_S_ALU_LSH_X:
++		case BPF_ALU | BPF_LSH | BPF_X:
+ 			/* A <<= X */
+ 			ctx->flags |= SEEN_A | SEEN_X;
+ 			update_on_xread(ctx);
+ 			emit_sllv(r_A, r_A, r_X, ctx);
+ 			break;
+-		case BPF_S_ALU_RSH_K:
++		case BPF_ALU | BPF_RSH | BPF_K:
+ 			/* A >>= K */
+ 			ctx->flags |= SEEN_A;
+ 			emit_srl(r_A, r_A, k, ctx);
+ 			break;
+-		case BPF_S_ALU_RSH_X:
++		case BPF_ALU | BPF_RSH | BPF_X:
+ 			ctx->flags |= SEEN_A | SEEN_X;
+ 			update_on_xread(ctx);
+ 			emit_srlv(r_A, r_A, r_X, ctx);
+ 			break;
+-		case BPF_S_ALU_NEG:
++		case BPF_ALU | BPF_NEG:
+ 			/* A = -A */
+ 			ctx->flags |= SEEN_A;
+ 			emit_neg(r_A, ctx);
+ 			break;
+-		case BPF_S_JMP_JA:
++		case BPF_JMP | BPF_JA:
+ 			/* pc += K */
+ 			emit_b(b_imm(i + k + 1, ctx), ctx);
+ 			emit_nop(ctx);
+ 			break;
+-		case BPF_S_JMP_JEQ_K:
++		case BPF_JMP | BPF_JEQ | BPF_K:
+ 			/* pc += ( A == K ) ? pc->jt : pc->jf */
+ 			condt = MIPS_COND_EQ | MIPS_COND_K;
+ 			goto jmp_cmp;
+-		case BPF_S_JMP_JEQ_X:
++		case BPF_JMP | BPF_JEQ | BPF_X:
+ 			ctx->flags |= SEEN_X;
+ 			/* pc += ( A == X ) ? pc->jt : pc->jf */
+ 			condt = MIPS_COND_EQ | MIPS_COND_X;
+ 			goto jmp_cmp;
+-		case BPF_S_JMP_JGE_K:
++		case BPF_JMP | BPF_JGE | BPF_K:
+ 			/* pc += ( A >= K ) ? pc->jt : pc->jf */
+ 			condt = MIPS_COND_GE | MIPS_COND_K;
+ 			goto jmp_cmp;
+-		case BPF_S_JMP_JGE_X:
++		case BPF_JMP | BPF_JGE | BPF_X:
+ 			ctx->flags |= SEEN_X;
+ 			/* pc += ( A >= X ) ? pc->jt : pc->jf */
+ 			condt = MIPS_COND_GE | MIPS_COND_X;
+ 			goto jmp_cmp;
+-		case BPF_S_JMP_JGT_K:
++		case BPF_JMP | BPF_JGT | BPF_K:
+ 			/* pc += ( A > K ) ? pc->jt : pc->jf */
+ 			condt = MIPS_COND_GT | MIPS_COND_K;
+ 			goto jmp_cmp;
+-		case BPF_S_JMP_JGT_X:
++		case BPF_JMP | BPF_JGT | BPF_X:
+ 			ctx->flags |= SEEN_X;
+ 			/* pc += ( A > X ) ? pc->jt : pc->jf */
+ 			condt = MIPS_COND_GT | MIPS_COND_X;
+@@ -1167,7 +1162,7 @@ jmp_cmp:
+ 				}
+ 			}
+ 			break;
+-		case BPF_S_JMP_JSET_K:
++		case BPF_JMP | BPF_JSET | BPF_K:
+ 			ctx->flags |= SEEN_S0 | SEEN_S1 | SEEN_A;
+ 			/* pc += (A & K) ? pc -> jt : pc -> jf */
+ 			emit_load_imm(r_s1, k, ctx);
+@@ -1181,7 +1176,7 @@ jmp_cmp:
+ 			emit_b(b_off, ctx);
+ 			emit_nop(ctx);
+ 			break;
+-		case BPF_S_JMP_JSET_X:
++		case BPF_JMP | BPF_JSET | BPF_X:
+ 			ctx->flags |= SEEN_S0 | SEEN_X | SEEN_A;
+ 			/* pc += (A & X) ? pc -> jt : pc -> jf */
+ 			emit_and(r_s0, r_A, r_X, ctx);
+@@ -1194,7 +1189,7 @@ jmp_cmp:
+ 			emit_b(b_off, ctx);
+ 			emit_nop(ctx);
+ 			break;
+-		case BPF_S_RET_A:
++		case BPF_RET | BPF_A:
+ 			ctx->flags |= SEEN_A;
+ 			if (i != prog->len - 1)
+ 				/*
+@@ -1204,7 +1199,7 @@ jmp_cmp:
+ 				emit_b(b_imm(prog->len, ctx), ctx);
+ 			emit_reg_move(r_ret, r_A, ctx); /* delay slot */
+ 			break;
+-		case BPF_S_RET_K:
++		case BPF_RET | BPF_K:
+ 			/*
+ 			 * It can emit two instructions so it does not fit on
+ 			 * the delay slot.
+@@ -1219,19 +1214,19 @@ jmp_cmp:
+ 				emit_nop(ctx);
+ 			}
+ 			break;
+-		case BPF_S_MISC_TAX:
++		case BPF_MISC | BPF_TAX:
+ 			/* X = A */
+ 			ctx->flags |= SEEN_X | SEEN_A;
+ 			emit_jit_reg_move(r_X, r_A, ctx);
+ 			break;
+-		case BPF_S_MISC_TXA:
++		case BPF_MISC | BPF_TXA:
+ 			/* A = X */
+ 			ctx->flags |= SEEN_A | SEEN_X;
+ 			update_on_xread(ctx);
+ 			emit_jit_reg_move(r_A, r_X, ctx);
+ 			break;
+ 		/* AUX */
+-		case BPF_S_ANC_PROTOCOL:
++		case BPF_ANC | SKF_AD_PROTOCOL:
+ 			/* A = ntohs(skb->protocol */
+ 			ctx->flags |= SEEN_SKB | SEEN_OFF | SEEN_A;
+ 			BUILD_BUG_ON(FIELD_SIZEOF(struct sk_buff,
+@@ -1256,7 +1251,7 @@ jmp_cmp:
+ 			}
+ #endif
+ 			break;
+-		case BPF_S_ANC_CPU:
++		case BPF_ANC | SKF_AD_CPU:
+ 			ctx->flags |= SEEN_A | SEEN_OFF;
+ 			/* A = current_thread_info()->cpu */
+ 			BUILD_BUG_ON(FIELD_SIZEOF(struct thread_info,
+@@ -1265,7 +1260,7 @@ jmp_cmp:
+ 			/* $28/gp points to the thread_info struct */
+ 			emit_load(r_A, 28, off, ctx);
+ 			break;
+-		case BPF_S_ANC_IFINDEX:
++		case BPF_ANC | SKF_AD_IFINDEX:
+ 			/* A = skb->dev->ifindex */
+ 			ctx->flags |= SEEN_SKB | SEEN_A | SEEN_S0;
+ 			off = offsetof(struct sk_buff, dev);
+@@ -1279,31 +1274,31 @@ jmp_cmp:
+ 			off = offsetof(struct net_device, ifindex);
+ 			emit_load(r_A, r_s0, off, ctx);
+ 			break;
+-		case BPF_S_ANC_MARK:
++		case BPF_ANC | SKF_AD_MARK:
+ 			ctx->flags |= SEEN_SKB | SEEN_A;
+ 			BUILD_BUG_ON(FIELD_SIZEOF(struct sk_buff, mark) != 4);
+ 			off = offsetof(struct sk_buff, mark);
+ 			emit_load(r_A, r_skb, off, ctx);
+ 			break;
+-		case BPF_S_ANC_RXHASH:
++		case BPF_ANC | SKF_AD_RXHASH:
+ 			ctx->flags |= SEEN_SKB | SEEN_A;
+ 			BUILD_BUG_ON(FIELD_SIZEOF(struct sk_buff, hash) != 4);
+ 			off = offsetof(struct sk_buff, hash);
+ 			emit_load(r_A, r_skb, off, ctx);
+ 			break;
+-		case BPF_S_ANC_VLAN_TAG:
+-		case BPF_S_ANC_VLAN_TAG_PRESENT:
++		case BPF_ANC | SKF_AD_VLAN_TAG:
++		case BPF_ANC | SKF_AD_VLAN_TAG_PRESENT:
+ 			ctx->flags |= SEEN_SKB | SEEN_S0 | SEEN_A;
+ 			BUILD_BUG_ON(FIELD_SIZEOF(struct sk_buff,
+ 						  vlan_tci) != 2);
+ 			off = offsetof(struct sk_buff, vlan_tci);
+ 			emit_half_load(r_s0, r_skb, off, ctx);
+-			if (inst->code == BPF_S_ANC_VLAN_TAG)
++			if (code == (BPF_ANC | SKF_AD_VLAN_TAG))
+ 				emit_and(r_A, r_s0, VLAN_VID_MASK, ctx);
+ 			else
+ 				emit_and(r_A, r_s0, VLAN_TAG_PRESENT, ctx);
+ 			break;
+-		case BPF_S_ANC_PKTTYPE:
++		case BPF_ANC | SKF_AD_PKTTYPE:
+ 			off = pkt_type_offset();
+ 
+ 			if (off < 0)
+@@ -1312,7 +1307,7 @@ jmp_cmp:
+ 			/* Keep only the last 3 bits */
+ 			emit_andi(r_A, r_tmp, PKT_TYPE_MAX, ctx);
+ 			break;
+-		case BPF_S_ANC_QUEUE:
++		case BPF_ANC | SKF_AD_QUEUE:
+ 			ctx->flags |= SEEN_SKB | SEEN_A;
+ 			BUILD_BUG_ON(FIELD_SIZEOF(struct sk_buff,
+ 						  queue_mapping) != 2);
+-- 
+1.7.11.7
diff --git a/a/content_digest b/N1/content_digest
index 8e7e5b3..d543f15 100644
--- a/a/content_digest
+++ b/N1/content_digest
@@ -43,5 +43,499 @@
  "\01:2\0"
  "fn\00001-mips-filter-fix-build-error-in-BPF-JIT.patch\0"
  "b\0"
+ ">From 12b5040eebd51f5efd6ffe04b1bec8ebbe5a9caf Mon Sep 17 00:00:00 2001\n"
+ "From: Daniel Borkmann <dborkman@redhat.com>\n"
+ "Date: Tue, 17 Jun 2014 11:48:28 +0200\n"
+ "Subject: [PATCH] mips: filter: fix build error in BPF JIT\n"
+ "\n"
+ "Guenter reported that on MIPS, the following build error occurs when\n"
+ "BPF JIT is enabled:\n"
+ "\n"
+ "  mips: allmodconfig fails in 3.16-rc1 with lots of undefined symbols.\n"
+ "\n"
+ "  arch/mips/net/bpf_jit.c: In function 'is_load_to_a':\n"
+ "  arch/mips/net/bpf_jit.c:559:7: error: 'BPF_S_LD_W_LEN' undeclared (first use in this function)\n"
+ "  arch/mips/net/bpf_jit.c:559:7: note: each undeclared identifier is reported only once for each function it appears in\n"
+ "  arch/mips/net/bpf_jit.c:560:7: error: 'BPF_S_LD_W_ABS' undeclared (first use in this function)\n"
+ "  [...]\n"
+ "\n"
+ "The reason behind this is that 3480593131e0 (\"net: filter: get rid of\n"
+ "BPF_S_* enum\") was routed via net-next tree, that takes all BPF-related\n"
+ "changes, at a time where MIPS BPF JIT was not part of net-next, while\n"
+ "c6610de353da (\"MIPS: net: Add BPF JIT\") was routed via mips arch tree\n"
+ "and went into mainline within the same merge window. Thus, fix it up by\n"
+ "converting BPF_S_* in a similar fashion as in 3480593131e0 for MIPS.\n"
+ "\n"
+ "Reported-by: Guenter Roeck <linux@roeck-us.net>\n"
+ "Signed-off-by: Daniel Borkmann <dborkman@redhat.com>\n"
+ "Cc: Ralf Baechle <ralf@linux-mips.org>\n"
+ "Cc: Alexei Starovoitov <ast@plumgrid.com>\n"
+ "Cc: Markos Chandras <markos.chandras@imgtec.com>\n"
+ "---\n"
+ " arch/mips/net/bpf_jit.c | 143 +++++++++++++++++++++++-------------------------\n"
+ " 1 file changed, 69 insertions(+), 74 deletions(-)\n"
+ "\n"
+ "diff --git a/arch/mips/net/bpf_jit.c b/arch/mips/net/bpf_jit.c\n"
+ "index a67b975..f7c2064 100644\n"
+ "--- a/arch/mips/net/bpf_jit.c\n"
+ "+++ b/arch/mips/net/bpf_jit.c\n"
+ "@@ -556,18 +556,10 @@ static inline void update_on_xread(struct jit_ctx *ctx)\n"
+ " static bool is_load_to_a(u16 inst)\n"
+ " {\n"
+ " \tswitch (inst) {\n"
+ "-\tcase BPF_S_LD_W_LEN:\n"
+ "-\tcase BPF_S_LD_W_ABS:\n"
+ "-\tcase BPF_S_LD_H_ABS:\n"
+ "-\tcase BPF_S_LD_B_ABS:\n"
+ "-\tcase BPF_S_ANC_CPU:\n"
+ "-\tcase BPF_S_ANC_IFINDEX:\n"
+ "-\tcase BPF_S_ANC_MARK:\n"
+ "-\tcase BPF_S_ANC_PROTOCOL:\n"
+ "-\tcase BPF_S_ANC_RXHASH:\n"
+ "-\tcase BPF_S_ANC_VLAN_TAG:\n"
+ "-\tcase BPF_S_ANC_VLAN_TAG_PRESENT:\n"
+ "-\tcase BPF_S_ANC_QUEUE:\n"
+ "+\tcase BPF_LD | BPF_W | BPF_LEN:\n"
+ "+\tcase BPF_LD | BPF_W | BPF_ABS:\n"
+ "+\tcase BPF_LD | BPF_H | BPF_ABS:\n"
+ "+\tcase BPF_LD | BPF_B | BPF_ABS:\n"
+ " \t\treturn true;\n"
+ " \tdefault:\n"
+ " \t\treturn false;\n"
+ "@@ -709,7 +701,7 @@ static void build_prologue(struct jit_ctx *ctx)\n"
+ " \t\temit_jit_reg_move(r_X, r_zero, ctx);\n"
+ " \n"
+ " \t/* Do not leak kernel data to userspace */\n"
+ "-\tif ((first_inst != BPF_S_RET_K) && !(is_load_to_a(first_inst)))\n"
+ "+\tif ((first_inst != (BPF_RET | BPF_K)) && !(is_load_to_a(first_inst)))\n"
+ " \t\temit_jit_reg_move(r_A, r_zero, ctx);\n"
+ " }\n"
+ " \n"
+ "@@ -783,41 +775,44 @@ static int build_body(struct jit_ctx *ctx)\n"
+ " \tu32 k, b_off __maybe_unused;\n"
+ " \n"
+ " \tfor (i = 0; i < prog->len; i++) {\n"
+ "+\t\tu16 code;\n"
+ "+\n"
+ " \t\tinst = &(prog->insns[i]);\n"
+ " \t\tpr_debug(\"%s: code->0x%02x, jt->0x%x, jf->0x%x, k->0x%x\\n\",\n"
+ " \t\t\t __func__, inst->code, inst->jt, inst->jf, inst->k);\n"
+ " \t\tk = inst->k;\n"
+ "+\t\tcode = bpf_anc_helper(inst);\n"
+ " \n"
+ " \t\tif (ctx->target == NULL)\n"
+ " \t\t\tctx->offsets[i] = ctx->idx * 4;\n"
+ " \n"
+ "-\t\tswitch (inst->code) {\n"
+ "-\t\tcase BPF_S_LD_IMM:\n"
+ "+\t\tswitch (code) {\n"
+ "+\t\tcase BPF_LD | BPF_IMM:\n"
+ " \t\t\t/* A <- k ==> li r_A, k */\n"
+ " \t\t\tctx->flags |= SEEN_A;\n"
+ " \t\t\temit_load_imm(r_A, k, ctx);\n"
+ " \t\t\tbreak;\n"
+ "-\t\tcase BPF_S_LD_W_LEN:\n"
+ "+\t\tcase BPF_LD | BPF_W | BPF_LEN:\n"
+ " \t\t\tBUILD_BUG_ON(FIELD_SIZEOF(struct sk_buff, len) != 4);\n"
+ " \t\t\t/* A <- len ==> lw r_A, offset(skb) */\n"
+ " \t\t\tctx->flags |= SEEN_SKB | SEEN_A;\n"
+ " \t\t\toff = offsetof(struct sk_buff, len);\n"
+ " \t\t\temit_load(r_A, r_skb, off, ctx);\n"
+ " \t\t\tbreak;\n"
+ "-\t\tcase BPF_S_LD_MEM:\n"
+ "+\t\tcase BPF_LD | BPF_MEM:\n"
+ " \t\t\t/* A <- M[k] ==> lw r_A, offset(M) */\n"
+ " \t\t\tctx->flags |= SEEN_MEM | SEEN_A;\n"
+ " \t\t\temit_load(r_A, r_M, SCRATCH_OFF(k), ctx);\n"
+ " \t\t\tbreak;\n"
+ "-\t\tcase BPF_S_LD_W_ABS:\n"
+ "+\t\tcase BPF_LD | BPF_W | BPF_ABS:\n"
+ " \t\t\t/* A <- P[k:4] */\n"
+ " \t\t\tload_order = 2;\n"
+ " \t\t\tgoto load;\n"
+ "-\t\tcase BPF_S_LD_H_ABS:\n"
+ "+\t\tcase BPF_LD | BPF_H | BPF_ABS:\n"
+ " \t\t\t/* A <- P[k:2] */\n"
+ " \t\t\tload_order = 1;\n"
+ " \t\t\tgoto load;\n"
+ "-\t\tcase BPF_S_LD_B_ABS:\n"
+ "+\t\tcase BPF_LD | BPF_B | BPF_ABS:\n"
+ " \t\t\t/* A <- P[k:1] */\n"
+ " \t\t\tload_order = 0;\n"
+ " load:\n"
+ "@@ -852,15 +847,15 @@ load_common:\n"
+ " \t\t\temit_b(b_imm(prog->len, ctx), ctx);\n"
+ " \t\t\temit_reg_move(r_ret, r_zero, ctx);\n"
+ " \t\t\tbreak;\n"
+ "-\t\tcase BPF_S_LD_W_IND:\n"
+ "+\t\tcase BPF_LD | BPF_W | BPF_IND:\n"
+ " \t\t\t/* A <- P[X + k:4] */\n"
+ " \t\t\tload_order = 2;\n"
+ " \t\t\tgoto load_ind;\n"
+ "-\t\tcase BPF_S_LD_H_IND:\n"
+ "+\t\tcase BPF_LD | BPF_H | BPF_IND:\n"
+ " \t\t\t/* A <- P[X + k:2] */\n"
+ " \t\t\tload_order = 1;\n"
+ " \t\t\tgoto load_ind;\n"
+ "-\t\tcase BPF_S_LD_B_IND:\n"
+ "+\t\tcase BPF_LD | BPF_B | BPF_IND:\n"
+ " \t\t\t/* A <- P[X + k:1] */\n"
+ " \t\t\tload_order = 0;\n"
+ " load_ind:\n"
+ "@@ -868,23 +863,23 @@ load_ind:\n"
+ " \t\t\tctx->flags |= SEEN_OFF | SEEN_X;\n"
+ " \t\t\temit_addiu(r_off, r_X, k, ctx);\n"
+ " \t\t\tgoto load_common;\n"
+ "-\t\tcase BPF_S_LDX_IMM:\n"
+ "+\t\tcase BPF_LDX | BPF_IMM:\n"
+ " \t\t\t/* X <- k */\n"
+ " \t\t\tctx->flags |= SEEN_X;\n"
+ " \t\t\temit_load_imm(r_X, k, ctx);\n"
+ " \t\t\tbreak;\n"
+ "-\t\tcase BPF_S_LDX_MEM:\n"
+ "+\t\tcase BPF_LDX | BPF_MEM:\n"
+ " \t\t\t/* X <- M[k] */\n"
+ " \t\t\tctx->flags |= SEEN_X | SEEN_MEM;\n"
+ " \t\t\temit_load(r_X, r_M, SCRATCH_OFF(k), ctx);\n"
+ " \t\t\tbreak;\n"
+ "-\t\tcase BPF_S_LDX_W_LEN:\n"
+ "+\t\tcase BPF_LDX | BPF_W | BPF_LEN:\n"
+ " \t\t\t/* X <- len */\n"
+ " \t\t\tctx->flags |= SEEN_X | SEEN_SKB;\n"
+ " \t\t\toff = offsetof(struct sk_buff, len);\n"
+ " \t\t\temit_load(r_X, r_skb, off, ctx);\n"
+ " \t\t\tbreak;\n"
+ "-\t\tcase BPF_S_LDX_B_MSH:\n"
+ "+\t\tcase BPF_LDX | BPF_B | BPF_MSH:\n"
+ " \t\t\t/* X <- 4 * (P[k:1] & 0xf) */\n"
+ " \t\t\tctx->flags |= SEEN_X | SEEN_CALL | SEEN_S0 | SEEN_SKB;\n"
+ " \t\t\t/* Load offset to a1 */\n"
+ "@@ -917,50 +912,50 @@ load_ind:\n"
+ " \t\t\temit_b(b_imm(prog->len, ctx), ctx);\n"
+ " \t\t\temit_load_imm(r_ret, 0, ctx); /* delay slot */\n"
+ " \t\t\tbreak;\n"
+ "-\t\tcase BPF_S_ST:\n"
+ "+\t\tcase BPF_ST:\n"
+ " \t\t\t/* M[k] <- A */\n"
+ " \t\t\tctx->flags |= SEEN_MEM | SEEN_A;\n"
+ " \t\t\temit_store(r_A, r_M, SCRATCH_OFF(k), ctx);\n"
+ " \t\t\tbreak;\n"
+ "-\t\tcase BPF_S_STX:\n"
+ "+\t\tcase BPF_STX:\n"
+ " \t\t\t/* M[k] <- X */\n"
+ " \t\t\tctx->flags |= SEEN_MEM | SEEN_X;\n"
+ " \t\t\temit_store(r_X, r_M, SCRATCH_OFF(k), ctx);\n"
+ " \t\t\tbreak;\n"
+ "-\t\tcase BPF_S_ALU_ADD_K:\n"
+ "+\t\tcase BPF_ALU | BPF_ADD | BPF_K:\n"
+ " \t\t\t/* A += K */\n"
+ " \t\t\tctx->flags |= SEEN_A;\n"
+ " \t\t\temit_addiu(r_A, r_A, k, ctx);\n"
+ " \t\t\tbreak;\n"
+ "-\t\tcase BPF_S_ALU_ADD_X:\n"
+ "+\t\tcase BPF_ALU | BPF_ADD | BPF_X:\n"
+ " \t\t\t/* A += X */\n"
+ " \t\t\tctx->flags |= SEEN_A | SEEN_X;\n"
+ " \t\t\temit_addu(r_A, r_A, r_X, ctx);\n"
+ " \t\t\tbreak;\n"
+ "-\t\tcase BPF_S_ALU_SUB_K:\n"
+ "+\t\tcase BPF_ALU | BPF_SUB | BPF_K:\n"
+ " \t\t\t/* A -= K */\n"
+ " \t\t\tctx->flags |= SEEN_A;\n"
+ " \t\t\temit_addiu(r_A, r_A, -k, ctx);\n"
+ " \t\t\tbreak;\n"
+ "-\t\tcase BPF_S_ALU_SUB_X:\n"
+ "+\t\tcase BPF_ALU | BPF_SUB | BPF_X:\n"
+ " \t\t\t/* A -= X */\n"
+ " \t\t\tctx->flags |= SEEN_A | SEEN_X;\n"
+ " \t\t\temit_subu(r_A, r_A, r_X, ctx);\n"
+ " \t\t\tbreak;\n"
+ "-\t\tcase BPF_S_ALU_MUL_K:\n"
+ "+\t\tcase BPF_ALU | BPF_MUL | BPF_K:\n"
+ " \t\t\t/* A *= K */\n"
+ " \t\t\t/* Load K to scratch register before MUL */\n"
+ " \t\t\tctx->flags |= SEEN_A | SEEN_S0;\n"
+ " \t\t\temit_load_imm(r_s0, k, ctx);\n"
+ " \t\t\temit_mul(r_A, r_A, r_s0, ctx);\n"
+ " \t\t\tbreak;\n"
+ "-\t\tcase BPF_S_ALU_MUL_X:\n"
+ "+\t\tcase BPF_ALU | BPF_MUL | BPF_X:\n"
+ " \t\t\t/* A *= X */\n"
+ " \t\t\tupdate_on_xread(ctx);\n"
+ " \t\t\tctx->flags |= SEEN_A | SEEN_X;\n"
+ " \t\t\temit_mul(r_A, r_A, r_X, ctx);\n"
+ " \t\t\tbreak;\n"
+ "-\t\tcase BPF_S_ALU_DIV_K:\n"
+ "+\t\tcase BPF_ALU | BPF_DIV | BPF_K:\n"
+ " \t\t\t/* A /= k */\n"
+ " \t\t\tif (k == 1)\n"
+ " \t\t\t\tbreak;\n"
+ "@@ -973,7 +968,7 @@ load_ind:\n"
+ " \t\t\temit_load_imm(r_s0, k, ctx);\n"
+ " \t\t\temit_div(r_A, r_s0, ctx);\n"
+ " \t\t\tbreak;\n"
+ "-\t\tcase BPF_S_ALU_MOD_K:\n"
+ "+\t\tcase BPF_ALU | BPF_MOD | BPF_K:\n"
+ " \t\t\t/* A %= k */\n"
+ " \t\t\tif (k == 1 || optimize_div(&k)) {\n"
+ " \t\t\t\tctx->flags |= SEEN_A;\n"
+ "@@ -984,7 +979,7 @@ load_ind:\n"
+ " \t\t\t\temit_mod(r_A, r_s0, ctx);\n"
+ " \t\t\t}\n"
+ " \t\t\tbreak;\n"
+ "-\t\tcase BPF_S_ALU_DIV_X:\n"
+ "+\t\tcase BPF_ALU | BPF_DIV | BPF_X:\n"
+ " \t\t\t/* A /= X */\n"
+ " \t\t\tupdate_on_xread(ctx);\n"
+ " \t\t\tctx->flags |= SEEN_X | SEEN_A;\n"
+ "@@ -994,7 +989,7 @@ load_ind:\n"
+ " \t\t\temit_load_imm(r_val, 0, ctx); /* delay slot */\n"
+ " \t\t\temit_div(r_A, r_X, ctx);\n"
+ " \t\t\tbreak;\n"
+ "-\t\tcase BPF_S_ALU_MOD_X:\n"
+ "+\t\tcase BPF_ALU | BPF_MOD | BPF_X:\n"
+ " \t\t\t/* A %= X */\n"
+ " \t\t\tupdate_on_xread(ctx);\n"
+ " \t\t\tctx->flags |= SEEN_X | SEEN_A;\n"
+ "@@ -1004,94 +999,94 @@ load_ind:\n"
+ " \t\t\temit_load_imm(r_val, 0, ctx); /* delay slot */\n"
+ " \t\t\temit_mod(r_A, r_X, ctx);\n"
+ " \t\t\tbreak;\n"
+ "-\t\tcase BPF_S_ALU_OR_K:\n"
+ "+\t\tcase BPF_ALU | BPF_OR | BPF_K:\n"
+ " \t\t\t/* A |= K */\n"
+ " \t\t\tctx->flags |= SEEN_A;\n"
+ " \t\t\temit_ori(r_A, r_A, k, ctx);\n"
+ " \t\t\tbreak;\n"
+ "-\t\tcase BPF_S_ALU_OR_X:\n"
+ "+\t\tcase BPF_ALU | BPF_OR | BPF_X:\n"
+ " \t\t\t/* A |= X */\n"
+ " \t\t\tupdate_on_xread(ctx);\n"
+ " \t\t\tctx->flags |= SEEN_A;\n"
+ " \t\t\temit_ori(r_A, r_A, r_X, ctx);\n"
+ " \t\t\tbreak;\n"
+ "-\t\tcase BPF_S_ALU_XOR_K:\n"
+ "+\t\tcase BPF_ALU | BPF_XOR | BPF_K:\n"
+ " \t\t\t/* A ^= k */\n"
+ " \t\t\tctx->flags |= SEEN_A;\n"
+ " \t\t\temit_xori(r_A, r_A, k, ctx);\n"
+ " \t\t\tbreak;\n"
+ "-\t\tcase BPF_S_ANC_ALU_XOR_X:\n"
+ "-\t\tcase BPF_S_ALU_XOR_X:\n"
+ "+\t\tcase BPF_ANC | SKF_AD_ALU_XOR_X:\n"
+ "+\t\tcase BPF_ALU | BPF_XOR | BPF_X:\n"
+ " \t\t\t/* A ^= X */\n"
+ " \t\t\tupdate_on_xread(ctx);\n"
+ " \t\t\tctx->flags |= SEEN_A;\n"
+ " \t\t\temit_xor(r_A, r_A, r_X, ctx);\n"
+ " \t\t\tbreak;\n"
+ "-\t\tcase BPF_S_ALU_AND_K:\n"
+ "+\t\tcase BPF_ALU | BPF_AND | BPF_K:\n"
+ " \t\t\t/* A &= K */\n"
+ " \t\t\tctx->flags |= SEEN_A;\n"
+ " \t\t\temit_andi(r_A, r_A, k, ctx);\n"
+ " \t\t\tbreak;\n"
+ "-\t\tcase BPF_S_ALU_AND_X:\n"
+ "+\t\tcase BPF_ALU | BPF_AND | BPF_X:\n"
+ " \t\t\t/* A &= X */\n"
+ " \t\t\tupdate_on_xread(ctx);\n"
+ " \t\t\tctx->flags |= SEEN_A | SEEN_X;\n"
+ " \t\t\temit_and(r_A, r_A, r_X, ctx);\n"
+ " \t\t\tbreak;\n"
+ "-\t\tcase BPF_S_ALU_LSH_K:\n"
+ "+\t\tcase BPF_ALU | BPF_LSH | BPF_K:\n"
+ " \t\t\t/* A <<= K */\n"
+ " \t\t\tctx->flags |= SEEN_A;\n"
+ " \t\t\temit_sll(r_A, r_A, k, ctx);\n"
+ " \t\t\tbreak;\n"
+ "-\t\tcase BPF_S_ALU_LSH_X:\n"
+ "+\t\tcase BPF_ALU | BPF_LSH | BPF_X:\n"
+ " \t\t\t/* A <<= X */\n"
+ " \t\t\tctx->flags |= SEEN_A | SEEN_X;\n"
+ " \t\t\tupdate_on_xread(ctx);\n"
+ " \t\t\temit_sllv(r_A, r_A, r_X, ctx);\n"
+ " \t\t\tbreak;\n"
+ "-\t\tcase BPF_S_ALU_RSH_K:\n"
+ "+\t\tcase BPF_ALU | BPF_RSH | BPF_K:\n"
+ " \t\t\t/* A >>= K */\n"
+ " \t\t\tctx->flags |= SEEN_A;\n"
+ " \t\t\temit_srl(r_A, r_A, k, ctx);\n"
+ " \t\t\tbreak;\n"
+ "-\t\tcase BPF_S_ALU_RSH_X:\n"
+ "+\t\tcase BPF_ALU | BPF_RSH | BPF_X:\n"
+ " \t\t\tctx->flags |= SEEN_A | SEEN_X;\n"
+ " \t\t\tupdate_on_xread(ctx);\n"
+ " \t\t\temit_srlv(r_A, r_A, r_X, ctx);\n"
+ " \t\t\tbreak;\n"
+ "-\t\tcase BPF_S_ALU_NEG:\n"
+ "+\t\tcase BPF_ALU | BPF_NEG:\n"
+ " \t\t\t/* A = -A */\n"
+ " \t\t\tctx->flags |= SEEN_A;\n"
+ " \t\t\temit_neg(r_A, ctx);\n"
+ " \t\t\tbreak;\n"
+ "-\t\tcase BPF_S_JMP_JA:\n"
+ "+\t\tcase BPF_JMP | BPF_JA:\n"
+ " \t\t\t/* pc += K */\n"
+ " \t\t\temit_b(b_imm(i + k + 1, ctx), ctx);\n"
+ " \t\t\temit_nop(ctx);\n"
+ " \t\t\tbreak;\n"
+ "-\t\tcase BPF_S_JMP_JEQ_K:\n"
+ "+\t\tcase BPF_JMP | BPF_JEQ | BPF_K:\n"
+ " \t\t\t/* pc += ( A == K ) ? pc->jt : pc->jf */\n"
+ " \t\t\tcondt = MIPS_COND_EQ | MIPS_COND_K;\n"
+ " \t\t\tgoto jmp_cmp;\n"
+ "-\t\tcase BPF_S_JMP_JEQ_X:\n"
+ "+\t\tcase BPF_JMP | BPF_JEQ | BPF_X:\n"
+ " \t\t\tctx->flags |= SEEN_X;\n"
+ " \t\t\t/* pc += ( A == X ) ? pc->jt : pc->jf */\n"
+ " \t\t\tcondt = MIPS_COND_EQ | MIPS_COND_X;\n"
+ " \t\t\tgoto jmp_cmp;\n"
+ "-\t\tcase BPF_S_JMP_JGE_K:\n"
+ "+\t\tcase BPF_JMP | BPF_JGE | BPF_K:\n"
+ " \t\t\t/* pc += ( A >= K ) ? pc->jt : pc->jf */\n"
+ " \t\t\tcondt = MIPS_COND_GE | MIPS_COND_K;\n"
+ " \t\t\tgoto jmp_cmp;\n"
+ "-\t\tcase BPF_S_JMP_JGE_X:\n"
+ "+\t\tcase BPF_JMP | BPF_JGE | BPF_X:\n"
+ " \t\t\tctx->flags |= SEEN_X;\n"
+ " \t\t\t/* pc += ( A >= X ) ? pc->jt : pc->jf */\n"
+ " \t\t\tcondt = MIPS_COND_GE | MIPS_COND_X;\n"
+ " \t\t\tgoto jmp_cmp;\n"
+ "-\t\tcase BPF_S_JMP_JGT_K:\n"
+ "+\t\tcase BPF_JMP | BPF_JGT | BPF_K:\n"
+ " \t\t\t/* pc += ( A > K ) ? pc->jt : pc->jf */\n"
+ " \t\t\tcondt = MIPS_COND_GT | MIPS_COND_K;\n"
+ " \t\t\tgoto jmp_cmp;\n"
+ "-\t\tcase BPF_S_JMP_JGT_X:\n"
+ "+\t\tcase BPF_JMP | BPF_JGT | BPF_X:\n"
+ " \t\t\tctx->flags |= SEEN_X;\n"
+ " \t\t\t/* pc += ( A > X ) ? pc->jt : pc->jf */\n"
+ " \t\t\tcondt = MIPS_COND_GT | MIPS_COND_X;\n"
+ "@@ -1167,7 +1162,7 @@ jmp_cmp:\n"
+ " \t\t\t\t}\n"
+ " \t\t\t}\n"
+ " \t\t\tbreak;\n"
+ "-\t\tcase BPF_S_JMP_JSET_K:\n"
+ "+\t\tcase BPF_JMP | BPF_JSET | BPF_K:\n"
+ " \t\t\tctx->flags |= SEEN_S0 | SEEN_S1 | SEEN_A;\n"
+ " \t\t\t/* pc += (A & K) ? pc -> jt : pc -> jf */\n"
+ " \t\t\temit_load_imm(r_s1, k, ctx);\n"
+ "@@ -1181,7 +1176,7 @@ jmp_cmp:\n"
+ " \t\t\temit_b(b_off, ctx);\n"
+ " \t\t\temit_nop(ctx);\n"
+ " \t\t\tbreak;\n"
+ "-\t\tcase BPF_S_JMP_JSET_X:\n"
+ "+\t\tcase BPF_JMP | BPF_JSET | BPF_X:\n"
+ " \t\t\tctx->flags |= SEEN_S0 | SEEN_X | SEEN_A;\n"
+ " \t\t\t/* pc += (A & X) ? pc -> jt : pc -> jf */\n"
+ " \t\t\temit_and(r_s0, r_A, r_X, ctx);\n"
+ "@@ -1194,7 +1189,7 @@ jmp_cmp:\n"
+ " \t\t\temit_b(b_off, ctx);\n"
+ " \t\t\temit_nop(ctx);\n"
+ " \t\t\tbreak;\n"
+ "-\t\tcase BPF_S_RET_A:\n"
+ "+\t\tcase BPF_RET | BPF_A:\n"
+ " \t\t\tctx->flags |= SEEN_A;\n"
+ " \t\t\tif (i != prog->len - 1)\n"
+ " \t\t\t\t/*\n"
+ "@@ -1204,7 +1199,7 @@ jmp_cmp:\n"
+ " \t\t\t\temit_b(b_imm(prog->len, ctx), ctx);\n"
+ " \t\t\temit_reg_move(r_ret, r_A, ctx); /* delay slot */\n"
+ " \t\t\tbreak;\n"
+ "-\t\tcase BPF_S_RET_K:\n"
+ "+\t\tcase BPF_RET | BPF_K:\n"
+ " \t\t\t/*\n"
+ " \t\t\t * It can emit two instructions so it does not fit on\n"
+ " \t\t\t * the delay slot.\n"
+ "@@ -1219,19 +1214,19 @@ jmp_cmp:\n"
+ " \t\t\t\temit_nop(ctx);\n"
+ " \t\t\t}\n"
+ " \t\t\tbreak;\n"
+ "-\t\tcase BPF_S_MISC_TAX:\n"
+ "+\t\tcase BPF_MISC | BPF_TAX:\n"
+ " \t\t\t/* X = A */\n"
+ " \t\t\tctx->flags |= SEEN_X | SEEN_A;\n"
+ " \t\t\temit_jit_reg_move(r_X, r_A, ctx);\n"
+ " \t\t\tbreak;\n"
+ "-\t\tcase BPF_S_MISC_TXA:\n"
+ "+\t\tcase BPF_MISC | BPF_TXA:\n"
+ " \t\t\t/* A = X */\n"
+ " \t\t\tctx->flags |= SEEN_A | SEEN_X;\n"
+ " \t\t\tupdate_on_xread(ctx);\n"
+ " \t\t\temit_jit_reg_move(r_A, r_X, ctx);\n"
+ " \t\t\tbreak;\n"
+ " \t\t/* AUX */\n"
+ "-\t\tcase BPF_S_ANC_PROTOCOL:\n"
+ "+\t\tcase BPF_ANC | SKF_AD_PROTOCOL:\n"
+ " \t\t\t/* A = ntohs(skb->protocol */\n"
+ " \t\t\tctx->flags |= SEEN_SKB | SEEN_OFF | SEEN_A;\n"
+ " \t\t\tBUILD_BUG_ON(FIELD_SIZEOF(struct sk_buff,\n"
+ "@@ -1256,7 +1251,7 @@ jmp_cmp:\n"
+ " \t\t\t}\n"
+ " #endif\n"
+ " \t\t\tbreak;\n"
+ "-\t\tcase BPF_S_ANC_CPU:\n"
+ "+\t\tcase BPF_ANC | SKF_AD_CPU:\n"
+ " \t\t\tctx->flags |= SEEN_A | SEEN_OFF;\n"
+ " \t\t\t/* A = current_thread_info()->cpu */\n"
+ " \t\t\tBUILD_BUG_ON(FIELD_SIZEOF(struct thread_info,\n"
+ "@@ -1265,7 +1260,7 @@ jmp_cmp:\n"
+ " \t\t\t/* $28/gp points to the thread_info struct */\n"
+ " \t\t\temit_load(r_A, 28, off, ctx);\n"
+ " \t\t\tbreak;\n"
+ "-\t\tcase BPF_S_ANC_IFINDEX:\n"
+ "+\t\tcase BPF_ANC | SKF_AD_IFINDEX:\n"
+ " \t\t\t/* A = skb->dev->ifindex */\n"
+ " \t\t\tctx->flags |= SEEN_SKB | SEEN_A | SEEN_S0;\n"
+ " \t\t\toff = offsetof(struct sk_buff, dev);\n"
+ "@@ -1279,31 +1274,31 @@ jmp_cmp:\n"
+ " \t\t\toff = offsetof(struct net_device, ifindex);\n"
+ " \t\t\temit_load(r_A, r_s0, off, ctx);\n"
+ " \t\t\tbreak;\n"
+ "-\t\tcase BPF_S_ANC_MARK:\n"
+ "+\t\tcase BPF_ANC | SKF_AD_MARK:\n"
+ " \t\t\tctx->flags |= SEEN_SKB | SEEN_A;\n"
+ " \t\t\tBUILD_BUG_ON(FIELD_SIZEOF(struct sk_buff, mark) != 4);\n"
+ " \t\t\toff = offsetof(struct sk_buff, mark);\n"
+ " \t\t\temit_load(r_A, r_skb, off, ctx);\n"
+ " \t\t\tbreak;\n"
+ "-\t\tcase BPF_S_ANC_RXHASH:\n"
+ "+\t\tcase BPF_ANC | SKF_AD_RXHASH:\n"
+ " \t\t\tctx->flags |= SEEN_SKB | SEEN_A;\n"
+ " \t\t\tBUILD_BUG_ON(FIELD_SIZEOF(struct sk_buff, hash) != 4);\n"
+ " \t\t\toff = offsetof(struct sk_buff, hash);\n"
+ " \t\t\temit_load(r_A, r_skb, off, ctx);\n"
+ " \t\t\tbreak;\n"
+ "-\t\tcase BPF_S_ANC_VLAN_TAG:\n"
+ "-\t\tcase BPF_S_ANC_VLAN_TAG_PRESENT:\n"
+ "+\t\tcase BPF_ANC | SKF_AD_VLAN_TAG:\n"
+ "+\t\tcase BPF_ANC | SKF_AD_VLAN_TAG_PRESENT:\n"
+ " \t\t\tctx->flags |= SEEN_SKB | SEEN_S0 | SEEN_A;\n"
+ " \t\t\tBUILD_BUG_ON(FIELD_SIZEOF(struct sk_buff,\n"
+ " \t\t\t\t\t\t  vlan_tci) != 2);\n"
+ " \t\t\toff = offsetof(struct sk_buff, vlan_tci);\n"
+ " \t\t\temit_half_load(r_s0, r_skb, off, ctx);\n"
+ "-\t\t\tif (inst->code == BPF_S_ANC_VLAN_TAG)\n"
+ "+\t\t\tif (code == (BPF_ANC | SKF_AD_VLAN_TAG))\n"
+ " \t\t\t\temit_and(r_A, r_s0, VLAN_VID_MASK, ctx);\n"
+ " \t\t\telse\n"
+ " \t\t\t\temit_and(r_A, r_s0, VLAN_TAG_PRESENT, ctx);\n"
+ " \t\t\tbreak;\n"
+ "-\t\tcase BPF_S_ANC_PKTTYPE:\n"
+ "+\t\tcase BPF_ANC | SKF_AD_PKTTYPE:\n"
+ " \t\t\toff = pkt_type_offset();\n"
+ " \n"
+ " \t\t\tif (off < 0)\n"
+ "@@ -1312,7 +1307,7 @@ jmp_cmp:\n"
+ " \t\t\t/* Keep only the last 3 bits */\n"
+ " \t\t\temit_andi(r_A, r_tmp, PKT_TYPE_MAX, ctx);\n"
+ " \t\t\tbreak;\n"
+ "-\t\tcase BPF_S_ANC_QUEUE:\n"
+ "+\t\tcase BPF_ANC | SKF_AD_QUEUE:\n"
+ " \t\t\tctx->flags |= SEEN_SKB | SEEN_A;\n"
+ " \t\t\tBUILD_BUG_ON(FIELD_SIZEOF(struct sk_buff,\n"
+ " \t\t\t\t\t\t  queue_mapping) != 2);\n"
+ "-- \n"
+ 1.7.11.7
 
-b81a1750c1d03a95cd37334032e59d68ed7170993eea9be4518559018c098c65
+bf9fad7d89a64fb45bfdf24fbe287d63995fef411320e2845c6eaf352fa7c9b2

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.