While implementing JIT for packet capture ran into several issues:
1. x86 JIT had pre-existing bug which would crash
2. ARM64 BPF JIT was missing instructions for packet access.
Which had been discovered previously [1]
3. Tests related to JIT were not being run or missing coverage.
Fixed all of these. Patches are ordered so that most urgent fix
is first, followed by the test that should have caught the problem.
The arm64 epilogue branch fix (patch 4) was originally posted by
Christophe Fontaine [1]; that series stalled, so it is carried here
with his authorship.
Changes since v3:
- incorporate review feedback
- rebase to current main
- extend the x86 fix to all fixed-width immediates, not just JSET:
TEST is always imm32, while ROR and the shift group are always
imm8; patch 1 retitled to match
- add a regression test for a large shift count (patch 3)
Changes since v2:
- found more places where the x86 JIT emitted invalid opcodes for
fixed-width immediates
Changes since v1:
- add the x86 JSET encoding fix and its regression test, found once
the convert test ran generated code through the JIT
- carry Christophe's arm64 epilogue fix with his sign-off
- convert test now runs the converted filters through the JIT, not
just loading them
- kept Marat's ack on the "check JIT was generated" patch; dropped it
on the convert test since that changed substantially
[1] https://inbox.dpdk.org/dev/[email protected]/
Christophe Fontaine (1):
bpf/arm64: fix offset type to allow a negative jump
Stephen Hemminger (6):
bpf/x86: fix JIT encoding of fixed-width immediates
test/bpf: add JSET test with small immediate
test/bpf: add test for large shift
test/bpf: check that JIT was generated
bpf/arm64: add BPF_ABS/BPF_IND packet load support
test/bpf: check that bpf_convert can be JIT'd
app/test/test_bpf.c | 327 +++++++++++++++++++++++++++++++---------
lib/bpf/bpf_jit_arm64.c | 153 ++++++++++++++++++-
lib/bpf/bpf_jit_x86.c | 6 +-
lib/bpf/meson.build | 2 +
4 files changed, 412 insertions(+), 76 deletions(-)
--
2.53.0