ARM: net: add support for BPF_ANC | SKF_AD_HATYPE in ARM JIT.
Signed-off-by: Nicolas Schichan <nschichan@freebox.fr> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
303249ab16
commit
5bf705b43b
|
@ -857,7 +857,9 @@ b_epilogue:
|
||||||
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 @@ b_epilogue:
|
||||||
|
|
||||||
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 @@
|
||||||
#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 @@
|
||||||
| (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))
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue