• Björn Töpel's avatar
    bpf, riscv: add BPF JIT for RV64G · 2353ecc6
    Björn Töpel authored
    This commit adds a BPF JIT for RV64G.
    
    The JIT is a two-pass JIT, and has a dynamic prolog/epilogue (similar
    to the MIPS64 BPF JIT) instead of static ones (e.g. x86_64).
    
    At the moment the RISC-V Linux port does not support
    CONFIG_HAVE_KPROBES, which means that CONFIG_BPF_EVENTS is not
    supported. Thus, no tests involving BPF_PROG_TYPE_TRACEPOINT,
    BPF_PROG_TYPE_PERF_EVENT, BPF_PROG_TYPE_KPROBE and
    BPF_PROG_TYPE_RAW_TRACEPOINT passes.
    
    The implementation does not support "far branching" (>4KiB).
    
    Test results:
      # modprobe test_bpf
      test_bpf: Summary: 378 PASSED, 0 FAILED, [366/366 JIT'ed]
    
      # echo 1 > /proc/sys/kernel/unprivileged_bpf_disabled
      # ./test_verifier
      ...
      Summary: 761 PASSED, 507 SKIPPED, 2 FAILED
    
    Note that "test_verifier" was run with one build with
    CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y and one without, otherwise
    many of the the tests that require unaligned access were skipped.
    
    CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y:
      # echo 1 > /proc/sys/kernel/unprivileged_bpf_disabled
      # ./test_verifier | grep -c 'NOTE.*unknown align'
      0
    
    No CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS:
      # echo 1 > /proc/sys/kernel/unprivileged_bpf_disabled
      # ./test_verifier | grep -c 'NOTE.*unknown align'
      59
    
    The two failing test_verifier tests are:
      "ld_abs: vlan + abs, test 1"
      "ld_abs: jump around ld_abs"
    
    This is due to that "far branching" involved in those tests.
    
    All tests where done on QEMU (QEMU emulator version 3.1.50
    (v3.1.0-688-g8ae951fbc106)).
    Signed-off-by: default avatarBjörn Töpel <bjorn.topel@gmail.com>
    Signed-off-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
    2353ecc6
Kconfig 6.41 KB