Commit 5bf705b4 authored by Nicolas Schichan's avatar Nicolas Schichan Committed by David S. Miller

ARM: net: add support for BPF_ANC | SKF_AD_HATYPE in ARM JIT.

Signed-off-by: default avatarNicolas Schichan <nschichan@freebox.fr>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 303249ab
...@@ -857,7 +857,9 @@ static int build_body(struct jit_ctx *ctx) ...@@ -857,7 +857,9 @@ static int build_body(struct jit_ctx *ctx)
emit(ARM_LDR_I(r_A, r_scratch, off), ctx); emit(ARM_LDR_I(r_A, r_scratch, off), ctx);
break; break;
case BPF_ANC | SKF_AD_IFINDEX: case BPF_ANC | SKF_AD_IFINDEX:
case BPF_ANC | SKF_AD_HATYPE:
/* A = skb->dev->ifindex */ /* A = skb->dev->ifindex */
/* A = skb->dev->type */
ctx->seen |= SEEN_SKB; ctx->seen |= SEEN_SKB;
off = offsetof(struct sk_buff, dev); off = offsetof(struct sk_buff, dev);
emit(ARM_LDR_I(r_scratch, r_skb, off), ctx); emit(ARM_LDR_I(r_scratch, r_skb, off), ctx);
...@@ -867,8 +869,24 @@ static int build_body(struct jit_ctx *ctx) ...@@ -867,8 +869,24 @@ static int build_body(struct jit_ctx *ctx)
BUILD_BUG_ON(FIELD_SIZEOF(struct net_device, BUILD_BUG_ON(FIELD_SIZEOF(struct net_device,
ifindex) != 4); ifindex) != 4);
off = offsetof(struct net_device, ifindex); BUILD_BUG_ON(FIELD_SIZEOF(struct net_device,
emit(ARM_LDR_I(r_A, r_scratch, off), ctx); 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; break;
case BPF_ANC | SKF_AD_MARK: case BPF_ANC | SKF_AD_MARK:
ctx->seen |= SEEN_SKB; ctx->seen |= SEEN_SKB;
......
...@@ -74,6 +74,7 @@ ...@@ -74,6 +74,7 @@
#define ARM_INST_LDRB_I 0x05d00000 #define ARM_INST_LDRB_I 0x05d00000
#define ARM_INST_LDRB_R 0x07d00000 #define ARM_INST_LDRB_R 0x07d00000
#define ARM_INST_LDRH_I 0x01d000b0 #define ARM_INST_LDRH_I 0x01d000b0
#define ARM_INST_LDRH_R 0x019000b0
#define ARM_INST_LDR_I 0x05900000 #define ARM_INST_LDR_I 0x05900000
#define ARM_INST_LDM 0x08900000 #define ARM_INST_LDM 0x08900000
...@@ -160,6 +161,8 @@ ...@@ -160,6 +161,8 @@
| (rm)) | (rm))
#define ARM_LDRH_I(rt, rn, off) (ARM_INST_LDRH_I | (rt) << 12 | (rn) << 16 \ #define ARM_LDRH_I(rt, rn, off) (ARM_INST_LDRH_I | (rt) << 12 | (rn) << 16 \
| (((off) & 0xf0) << 4) | ((off) & 0xf)) | (((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)) #define ARM_LDM(rn, regs) (ARM_INST_LDM | (rn) << 16 | (regs))
......
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