Markos Chandras
95782bf434
MIPS: BPF: Prevent kernel fall over for >=32bit shifts
...
Remove BUG_ON() if the shift immediate is >=32 to avoid kernel crashes
due to malicious user input. If the shift immediate is >= 32,
we simply load the destination register with 0 since only
32-bit instructions are used by JIT so this will do the
correct thing even on MIPS64.
Signed-off-by: Markos Chandras <markos.chandras@imgtec.com >
Cc: David S. Miller <davem@davemloft.net >
Cc: Daniel Borkmann <dborkman@redhat.com >
Cc: Alexei Starovoitov <ast@plumgrid.com >
Cc: netdev@vger.kernel.org
Cc: linux-mips@linux-mips.org
Patchwork: https://patchwork.linux-mips.org/patch/7179/
Signed-off-by: Ralf Baechle <ralf@linux-mips.org >
2014-06-26 10:48:22 +01:00
Markos Chandras
e5bb48b055
MIPS: bpf: Drop update_on_xread and always initialize the X register
...
Previously, update_on_xread() only set the reset flag if SEEN_X hasn't
been set already. However, SEEN_X is used to indicate that X is used
as destination or source register so there are some cases where X
is only used as source register and we really need to make sure that it
has been initialized in time. As a result of which, drop this function and
always set X to zero if it's used in any of the opcodes.
Signed-off-by: Markos Chandras <markos.chandras@imgtec.com >
Cc: David S. Miller <davem@davemloft.net >
Cc: Daniel Borkmann <dborkman@redhat.com >
Cc: Alexei Starovoitov <ast@plumgrid.com >
Cc: netdev@vger.kernel.org
Cc: linux-mips@linux-mips.org
Patchwork: https://patchwork.linux-mips.org/patch/7133/
Signed-off-by: Ralf Baechle <ralf@linux-mips.org >
2014-06-26 10:48:22 +01:00
Markos Chandras
10c4d614d2
MIPS: bpf: Fix is_range() semantics
...
is_range() was meant to check whether the number is within
the s16 range or not. However the return values and consumers expected
the exact opposite. We fix that by inverting the logic in the function
to return 'true' for < s16 and 'false' for > s16.
Signed-off-by: Markos Chandras <markos.chandras@imgtec.com >
Reported-by: Alexei Starovoitov <ast@plumgrid.com >
Cc: David S. Miller <davem@davemloft.net >
Cc: Daniel Borkmann <dborkman@redhat.com >
Cc: Alexei Starovoitov <ast@plumgrid.com >
Cc: netdev@vger.kernel.org
Cc: linux-mips@linux-mips.org
Patchwork: https://patchwork.linux-mips.org/patch/7131/
Signed-off-by: Ralf Baechle <ralf@linux-mips.org >
2014-06-26 10:48:21 +01:00
Markos Chandras
78b95b662c
MIPS: bpf: Use pr_debug instead of pr_warn for unhandled opcodes
...
We should prevent spamming the logs during normal execution of bpf-jit.
Signed-off-by: Markos Chandras <markos.chandras@imgtec.com >
Suggested-by: Alexei Starovoitov <ast@plumgrid.com >
Cc: David S. Miller <davem@davemloft.net >
Cc: Daniel Borkmann <dborkman@redhat.com >
Cc: Alexei Starovoitov <ast@plumgrid.com >
Cc: netdev@vger.kernel.org
Cc: linux-mips@linux-mips.org
Patchwork: https://patchwork.linux-mips.org/patch/7129/
Signed-off-by: Ralf Baechle <ralf@linux-mips.org >
2014-06-26 10:48:21 +01:00
Markos Chandras
91a41d7f97
MIPS: bpf: Fix return values for VLAN_TAG_PRESENT case
...
If VLAN_TAG_PRESENT is not zero, then return 1 as expected by
classic BPF. Otherwise return 0.
Signed-off-by: Markos Chandras <markos.chandras@imgtec.com >
Cc: David S. Miller <davem@davemloft.net >
Cc: Daniel Borkmann <dborkman@redhat.com >
Cc: Alexei Starovoitov <ast@plumgrid.com >
Cc: netdev@vger.kernel.org
Cc: linux-mips@linux-mips.org
Patchwork: https://patchwork.linux-mips.org/patch/7128/
Signed-off-by: Ralf Baechle <ralf@linux-mips.org >
2014-06-26 10:48:21 +01:00
Markos Chandras
6e86c59d4d
MIPS: bpf: Use correct mask for VLAN_TAG case
...
Using VLAN_VID_MASK is not correct to get the vlan tag. Use
~VLAN_PRESENT_MASK instead and make sure it's u16 so the top 16-bits
will be removed. This will ensure that the emit_andi() code will not
treat this as a big 32-bit unsigned value.
Signed-off-by: Markos Chandras <markos.chandras@imgtec.com >
Cc: David S. Miller <davem@davemloft.net >
Cc: Daniel Borkmann <dborkman@redhat.com >
Cc: Alexei Starovoitov <ast@plumgrid.com >
Cc: netdev@vger.kernel.org
Cc: linux-mips@linux-mips.org
Patchwork: https://patchwork.linux-mips.org/patch/7127/
Signed-off-by: Ralf Baechle <ralf@linux-mips.org >
2014-06-26 10:48:21 +01:00
Markos Chandras
1ab24a4e3d
MIPS: bpf: Fix branch conditional for BPF_J{GT/GE} cases
...
The sltiu and sltu instructions will set the scratch register
to 1 if A <= X|K so fix the emitted branch conditional to check
for scratch != zero rather than scratch >= zero which would complicate
the resuling branch logic given that MIPS does not have a BGT or BGET
instructions to compare general purpose registers directly.
Signed-off-by: Markos Chandras <markos.chandras@imgtec.com >
Cc: David S. Miller <davem@davemloft.net >
Cc: Daniel Borkmann <dborkman@redhat.com >
Cc: Alexei Starovoitov <ast@plumgrid.com >
Cc: netdev@vger.kernel.org
Cc: linux-mips@linux-mips.org
Patchwork: https://patchwork.linux-mips.org/patch/7126/
Signed-off-by: Ralf Baechle <ralf@linux-mips.org >
2014-06-26 10:48:21 +01:00
Markos Chandras
9eebfe478d
MIPS: bpf: Add SEEN_SKB to flags when looking for the PKT_TYPE
...
The SKF_AD_PKTTYPE uses the skb pointer so make sure it's in the
flags so it will be initialized in time.
Signed-off-by: Markos Chandras <markos.chandras@imgtec.com >
Cc: David S. Miller <davem@davemloft.net >
Cc: Daniel Borkmann <dborkman@redhat.com >
Cc: Alexei Starovoitov <ast@plumgrid.com >
Cc: netdev@vger.kernel.org
Cc: linux-mips@linux-mips.org
Patchwork: https://patchwork.linux-mips.org/patch/7125/
Signed-off-by: Ralf Baechle <ralf@linux-mips.org >
2014-06-26 10:48:20 +01:00
Markos Chandras
9ee1606e8a
MIPS: bpf: Use 'andi' instead of 'and' for the VLAN cases
...
The VLAN_VID_MASK and VLAN_TAG_PRESENT are immediates, so using
'and' which expects 3 registers will produce wrong results. Fix
this by using the 'andi' instruction.
Signed-off-by: Markos Chandras <markos.chandras@imgtec.com >
Cc: David S. Miller <davem@davemloft.net >
Cc: Daniel Borkmann <dborkman@redhat.com >
Cc: Alexei Starovoitov <ast@plumgrid.com >
Cc: netdev@vger.kernel.org
Cc: linux-mips@linux-mips.org
Patchwork: https://patchwork.linux-mips.org/patch/7124/
Signed-off-by: Ralf Baechle <ralf@linux-mips.org >
2014-06-26 10:48:20 +01:00
Markos Chandras
55393ee535
MIPS: bpf: Return error code if the offset is a negative number
...
Previously, the negative offset was not checked leading to failures
due to trying to load data beyond the skb struct boundaries. Until we
have proper asm helpers in place, it's best if we return ENOSUPP if K
is negative when trying to JIT the filter or 0 during runtime if we
do an indirect load where the value of X is unknown during build time.
Signed-off-by: Markos Chandras <markos.chandras@imgtec.com >
Cc: David S. Miller <davem@davemloft.net >
Cc: Daniel Borkmann <dborkman@redhat.com >
Cc: Alexei Starovoitov <ast@plumgrid.com >
Cc: netdev@vger.kernel.org
Cc: linux-mips@linux-mips.org
Patchwork: https://patchwork.linux-mips.org/patch/7123/
Signed-off-by: Ralf Baechle <ralf@linux-mips.org >
2014-06-26 10:48:20 +01:00
Markos Chandras
35a8e16abe
MIPS: bpf: Use the LO register to get division's quotient
...
Reading from the HI register to get the division result is wrong.
The quotient is placed in the LO register.
Signed-off-by: Markos Chandras <markos.chandras@imgtec.com >
Cc: "David S. Miller" <davem@davemloft.net >
Cc: Daniel Borkmann <dborkman@redhat.com >
Cc: Alexei Starovoitov <ast@plumgrid.com >
Cc: netdev@vger.kernel.org
Cc: linux-mips@linux-mips.org
Patchwork: https://patchwork.linux-mips.org/patch/7122/
Signed-off-by: Ralf Baechle <ralf@linux-mips.org >
2014-06-26 10:48:20 +01:00
Daniel Borkmann
a83d081ed1
MIPS: BPF JIT: Fix build error.
...
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 3480593131
("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
c6610de353
("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 3480593131
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 >
Cc: linux-kernel@vger.kernel.org <linux-kernel@vger.kernel.org >
Cc: Linux MIPS Mailing List <linux-mips@linux-mips.org >
Patchwork: https://patchwork.linux-mips.org/patch/7099/
Signed-off-by: Ralf Baechle <ralf@linux-mips.org >
2014-06-26 10:48:18 +01:00
Ralf Baechle
b4f16c938e
MIPS: BFP: Simplify code slightly.
...
This keeps the if condition slightly simpler - it's going to become ore
complication.
Signed-off-by: Ralf Baechle <ralf@linux-mips.org >
2014-06-04 22:50:40 +02:00
Markos Chandras
c6610de353
MIPS: net: Add BPF JIT
...
This adds initial support for BPF-JIT on MIPS
Tested on mips32 LE/BE and mips64 BE/n64 using
dhcp, ping and various tcpdump filters.
Benchmarking:
Assuming the remote MIPS target uses 192.168.154.181
as its IP address, and the local host uses 192.168.154.136,
the following results can be obtained using the following
tcpdump filter (catches no frames) and a simple
'time ping -f -c 1000000' command.
[root@(none) ~]# tcpdump -p -n -s 0 -i eth0 net 10.0.0.0/24 -d
(000) ldh [12]
(001) jeq #0x800 jt 2 jf 8
(002) ld [26]
(003) and #0xffffff00
(004) jeq #0xa000000 jt 16 jf 5
(005) ld [30]
(006) and #0xffffff00
(007) jeq #0xa000000 jt 16 jf 17
(008) jeq #0x806 jt 10 jf 9
(009) jeq #0x8035 jt 10 jf 17
(010) ld [28]
(011) and #0xffffff00
(012) jeq #0xa000000 jt 16 jf 13
(013) ld [38]
(014) and #0xffffff00
(015) jeq #0xa000000 jt 16 jf 17
(016) ret #65535
- BPF-JIT Disabled
real 1m38.005s
user 0m1.510s
sys 0m6.710s
- BPF-JIT Enabled
real 1m35.215s
user 0m1.200s
sys 0m4.140s
[ralf@linux-mips.org: Resolved conflict.]
Signed-off-by: Markos Chandras <markos.chandras@imgtec.com>
2014-05-30 16:10:20 +02:00