This series is based on 7.0-rc6, the aim is to support more instructions:
(1) 8 and 16 bit read-modify-write instructions,
(2) load-acquire and store-release instructions.
When compiling, please set CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS and
unset CONFIG_BPF_UNPRIV_DEFAULT_OFF.
All of the related testcases passed and no regressions for bpf selftests.
Here are the test results on LoongArch:
$ sudo ./test_progs -t verifier_load_acquire
#577/1 verifier_load_acquire/load-acquire, 8-bit:OK
#577/2 verifier_load_acquire/load-acquire, 8-bit @unpriv:OK
#577/3 verifier_load_acquire/load-acquire, 16-bit:OK
#577/4 verifier_load_acquire/load-acquire, 16-bit @unpriv:OK
#577/5 verifier_load_acquire/load-acquire, 32-bit:OK
#577/6 verifier_load_acquire/load-acquire, 32-bit @unpriv:OK
#577/7 verifier_load_acquire/load-acquire, 64-bit:OK
#577/8 verifier_load_acquire/load-acquire, 64-bit @unpriv:OK
#577/9 verifier_load_acquire/load-acquire with uninitialized src_reg:OK
#577/10 verifier_load_acquire/load-acquire with uninitialized src_reg @unpriv:OK
#577/11 verifier_load_acquire/load-acquire with non-pointer src_reg:OK
#577/12 verifier_load_acquire/load-acquire with non-pointer src_reg @unpriv:OK
#577/13 verifier_load_acquire/misaligned load-acquire:OK
#577/14 verifier_load_acquire/misaligned load-acquire @unpriv:OK
#577/15 verifier_load_acquire/load-acquire from ctx pointer:OK
#577/16 verifier_load_acquire/load-acquire from ctx pointer @unpriv:OK
#577/17 verifier_load_acquire/load-acquire with invalid register R15:OK
#577/18 verifier_load_acquire/load-acquire with invalid register R15 @unpriv:OK
#577/19 verifier_load_acquire/load-acquire from pkt pointer:OK
#577/20 verifier_load_acquire/load-acquire from flow_keys pointer:OK
#577/21 verifier_load_acquire/load-acquire from sock pointer:OK
#577 verifier_load_acquire:OK
Summary: 1/21 PASSED, 0 SKIPPED, 0 FAILED
$ sudo ./test_progs -t verifier_store_release
#615/1 verifier_store_release/store-release, 8-bit:OK
#615/2 verifier_store_release/store-release, 8-bit @unpriv:OK
#615/3 verifier_store_release/store-release, 16-bit:OK
#615/4 verifier_store_release/store-release, 16-bit @unpriv:OK
#615/5 verifier_store_release/store-release, 32-bit:OK
#615/6 verifier_store_release/store-release, 32-bit @unpriv:OK
#615/7 verifier_store_release/store-release, 64-bit:OK
#615/8 verifier_store_release/store-release, 64-bit @unpriv:OK
#615/9 verifier_store_release/store-release with uninitialized src_reg:OK
#615/10 verifier_store_release/store-release with uninitialized src_reg @unpriv:OK
#615/11 verifier_store_release/store-release with uninitialized dst_reg:OK
#615/12 verifier_store_release/store-release with uninitialized dst_reg @unpriv:OK
#615/13 verifier_store_release/store-release with non-pointer dst_reg:OK
#615/14 verifier_store_release/store-release with non-pointer dst_reg @unpriv:OK
#615/15 verifier_store_release/misaligned store-release:OK
#615/16 verifier_store_release/misaligned store-release @unpriv:OK
#615/17 verifier_store_release/store-release to ctx pointer:OK
#615/18 verifier_store_release/store-release to ctx pointer @unpriv:OK
#615/19 verifier_store_release/store-release, leak pointer to stack:OK
#615/20 verifier_store_release/store-release, leak pointer to stack @unpriv:OK
#615/21 verifier_store_release/store-release, leak pointer to map:OK
#615/22 verifier_store_release/store-release, leak pointer to map @unpriv:OK
#615/23 verifier_store_release/store-release with invalid register R15:OK
#615/24 verifier_store_release/store-release with invalid register R15 @unpriv:OK
#615/25 verifier_store_release/store-release to pkt pointer:OK
#615/26 verifier_store_release/store-release to flow_keys pointer:OK
#615/27 verifier_store_release/store-release to sock pointer:OK
#615 verifier_store_release:OK
Summary: 1/27 PASSED, 0 SKIPPED, 0 FAILED
$ sudo ./test_progs -t verifier_precision/bpf_load_acquire
#596/5 verifier_precision/bpf_load_acquire:OK
#596 verifier_precision:OK
Summary: 1/1 PASSED, 0 SKIPPED, 0 FAILED
$ sudo ./test_progs -t verifier_precision/bpf_store_release
#596/6 verifier_precision/bpf_store_release:OK
#596 verifier_precision:OK
Summary: 1/1 PASSED, 0 SKIPPED, 0 FAILED
$ sudo ./test_progs -t compute_live_registers/atomic_load_acq_store_rel
#80/7 compute_live_registers/atomic_load_acq_store_rel:OK
#80 compute_live_registers:OK
Summary: 1/1 PASSED, 0 SKIPPED, 0 FAILED
Tiezhu Yang (5):
LoongArch: Define format for AM{SWAP/ADD}.{B/H}, DBAR and BSTRINS.D
LoongArch: BPF: Add the default case in emit_atomic() and rename it
LoongArch: BPF: Support 8 and 16 bit read-modify-write instructions
LoongArch: BPF: Support load-acquire and store-release instructions
selftests/bpf: Make CAN_USE_LOAD_ACQ_STORE_REL usable for LoongArch
arch/loongarch/include/asm/cpu-features.h | 1 +
arch/loongarch/include/asm/cpu.h | 2 +
arch/loongarch/include/asm/inst.h | 11 +
arch/loongarch/include/uapi/asm/hwcap.h | 1 +
arch/loongarch/kernel/cpu-probe.c | 4 +
arch/loongarch/net/bpf_jit.c | 193 +++++++++++++++++-
arch/loongarch/net/bpf_jit.h | 12 ++
tools/testing/selftests/bpf/progs/bpf_misc.h | 4 +-
.../selftests/bpf/progs/verifier_precision.c | 4 +-
9 files changed, 217 insertions(+), 15 deletions(-)
--
2.42.0