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.