mirror of
https://github.com/torvalds/linux.git
synced 2024-11-27 14:41:39 +00:00
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);
|
||||
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);
|
||||
@ -867,8 +869,24 @@ b_epilogue:
|
||||
|
||||
BUILD_BUG_ON(FIELD_SIZEOF(struct net_device,
|
||||
ifindex) != 4);
|
||||
off = offsetof(struct net_device, ifindex);
|
||||
emit(ARM_LDR_I(r_A, r_scratch, off), ctx);
|
||||
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;
|
||||
|
@ -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
|
||||
@ -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…
Reference in New Issue
Block a user