Loading arch/arm/net/bpf_jit_32.c +20 −2 Original line number Diff line number Diff line Loading @@ -857,7 +857,9 @@ static int build_body(struct jit_ctx *ctx) emit(ARM_LDR_I(r_A, r_scratch, off), ctx); break; case BPF_ANC | SKF_AD_IFINDEX: case BPF_ANC | SKF_AD_HATYPE: /* A = skb->dev->ifindex */ /* A = skb->dev->type */ ctx->seen |= SEEN_SKB; off = offsetof(struct sk_buff, dev); emit(ARM_LDR_I(r_scratch, r_skb, off), ctx); Loading @@ -867,8 +869,24 @@ static int build_body(struct jit_ctx *ctx) BUILD_BUG_ON(FIELD_SIZEOF(struct net_device, ifindex) != 4); BUILD_BUG_ON(FIELD_SIZEOF(struct net_device, type) != 2); if (code == (BPF_ANC | SKF_AD_IFINDEX)) { off = offsetof(struct net_device, ifindex); emit(ARM_LDR_I(r_A, r_scratch, off), ctx); } else { /* * offset of field "type" in "struct * net_device" is above what can be * used in the ldrh rd, [rn, #imm] * instruction, so load the offset in * a register and use ldrh rd, [rn, rm] */ off = offsetof(struct net_device, type); emit_mov_i(ARM_R3, off, ctx); emit(ARM_LDRH_R(r_A, r_scratch, ARM_R3), ctx); } break; case BPF_ANC | SKF_AD_MARK: ctx->seen |= SEEN_SKB; Loading arch/arm/net/bpf_jit_32.h +3 −0 Original line number Diff line number Diff line Loading @@ -74,6 +74,7 @@ #define ARM_INST_LDRB_I 0x05d00000 #define ARM_INST_LDRB_R 0x07d00000 #define ARM_INST_LDRH_I 0x01d000b0 #define ARM_INST_LDRH_R 0x019000b0 #define ARM_INST_LDR_I 0x05900000 #define ARM_INST_LDM 0x08900000 Loading Loading @@ -160,6 +161,8 @@ | (rm)) #define ARM_LDRH_I(rt, rn, off) (ARM_INST_LDRH_I | (rt) << 12 | (rn) << 16 \ | (((off) & 0xf0) << 4) | ((off) & 0xf)) #define ARM_LDRH_R(rt, rn, rm) (ARM_INST_LDRH_R | (rt) << 12 | (rn) << 16 \ | (rm)) #define ARM_LDM(rn, regs) (ARM_INST_LDM | (rn) << 16 | (regs)) Loading Loading
arch/arm/net/bpf_jit_32.c +20 −2 Original line number Diff line number Diff line Loading @@ -857,7 +857,9 @@ static int build_body(struct jit_ctx *ctx) emit(ARM_LDR_I(r_A, r_scratch, off), ctx); break; case BPF_ANC | SKF_AD_IFINDEX: case BPF_ANC | SKF_AD_HATYPE: /* A = skb->dev->ifindex */ /* A = skb->dev->type */ ctx->seen |= SEEN_SKB; off = offsetof(struct sk_buff, dev); emit(ARM_LDR_I(r_scratch, r_skb, off), ctx); Loading @@ -867,8 +869,24 @@ static int build_body(struct jit_ctx *ctx) BUILD_BUG_ON(FIELD_SIZEOF(struct net_device, ifindex) != 4); BUILD_BUG_ON(FIELD_SIZEOF(struct net_device, type) != 2); if (code == (BPF_ANC | SKF_AD_IFINDEX)) { off = offsetof(struct net_device, ifindex); emit(ARM_LDR_I(r_A, r_scratch, off), ctx); } else { /* * offset of field "type" in "struct * net_device" is above what can be * used in the ldrh rd, [rn, #imm] * instruction, so load the offset in * a register and use ldrh rd, [rn, rm] */ off = offsetof(struct net_device, type); emit_mov_i(ARM_R3, off, ctx); emit(ARM_LDRH_R(r_A, r_scratch, ARM_R3), ctx); } break; case BPF_ANC | SKF_AD_MARK: ctx->seen |= SEEN_SKB; Loading
arch/arm/net/bpf_jit_32.h +3 −0 Original line number Diff line number Diff line Loading @@ -74,6 +74,7 @@ #define ARM_INST_LDRB_I 0x05d00000 #define ARM_INST_LDRB_R 0x07d00000 #define ARM_INST_LDRH_I 0x01d000b0 #define ARM_INST_LDRH_R 0x019000b0 #define ARM_INST_LDR_I 0x05900000 #define ARM_INST_LDM 0x08900000 Loading Loading @@ -160,6 +161,8 @@ | (rm)) #define ARM_LDRH_I(rt, rn, off) (ARM_INST_LDRH_I | (rt) << 12 | (rn) << 16 \ | (((off) & 0xf0) << 4) | ((off) & 0xf)) #define ARM_LDRH_R(rt, rn, rm) (ARM_INST_LDRH_R | (rt) << 12 | (rn) << 16 \ | (rm)) #define ARM_LDM(rn, regs) (ARM_INST_LDM | (rn) << 16 | (regs)) Loading