Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge branch 'arm32-bpf-add-support-for-cpuv4-insns'
Puranjay Mohan says: ==================== arm32, bpf: add support for cpuv4 insns Changes in V2 -> V3 - Added comments at places where there could be confustion. - In the patch for DIV64, fix the if-else case that would never run. - In the same patch use a single instruction to POP caller saved regs. - Add a patch to change maintainership of ARM32 BPF JIT. Changes in V1 -> V2: - Fix coding style issues. - Don't use tmp variable for src in emit_ldsx_r() as it is redundant. - Optimize emit_ldsx_r() when offset can fit in immediate. Add the support for cpuv4 instructions for ARM32 BPF JIT. 64-bit division was not supported earlier so this series adds 64-bit DIV, SDIV, MOD, SMOD instructions as well. This series needs any one of the patches from [1] to disable zero-extension for BPF_MEMSX to support ldsx. The relevant selftests have passed expect ldsx_insn which needs fentry: Tested on BeagleBone Black (ARMv7-A): [root@alarm del]# echo 1 > /proc/sys/net/core/bpf_jit_enable [root@alarm del]# ./test_progs -a verifier_sdiv,verifier_movsx,verifier_ldsx,verifier_gotol,verifier_bswap torvalds#337/1 verifier_bswap/BSWAP, 16:OK torvalds#337/2 verifier_bswap/BSWAP, 16 @unpriv:OK torvalds#337/3 verifier_bswap/BSWAP, 32:OK torvalds#337/4 verifier_bswap/BSWAP, 32 @unpriv:OK torvalds#337/5 verifier_bswap/BSWAP, 64:OK torvalds#337/6 verifier_bswap/BSWAP, 64 @unpriv:OK torvalds#337 verifier_bswap:OK torvalds#351/1 verifier_gotol/gotol, small_imm:OK torvalds#351/2 verifier_gotol/gotol, small_imm @unpriv:OK torvalds#351 verifier_gotol:OK torvalds#359/1 verifier_ldsx/LDSX, S8:OK torvalds#359/2 verifier_ldsx/LDSX, S8 @unpriv:OK torvalds#359/3 verifier_ldsx/LDSX, S16:OK torvalds#359/4 verifier_ldsx/LDSX, S16 @unpriv:OK torvalds#359/5 verifier_ldsx/LDSX, S32:OK torvalds#359/6 verifier_ldsx/LDSX, S32 @unpriv:OK torvalds#359/7 verifier_ldsx/LDSX, S8 range checking, privileged:OK torvalds#359/8 verifier_ldsx/LDSX, S16 range checking:OK torvalds#359/9 verifier_ldsx/LDSX, S16 range checking @unpriv:OK torvalds#359/10 verifier_ldsx/LDSX, S32 range checking:OK torvalds#359/11 verifier_ldsx/LDSX, S32 range checking @unpriv:OK torvalds#359 verifier_ldsx:OK torvalds#370/1 verifier_movsx/MOV32SX, S8:OK torvalds#370/2 verifier_movsx/MOV32SX, S8 @unpriv:OK torvalds#370/3 verifier_movsx/MOV32SX, S16:OK torvalds#370/4 verifier_movsx/MOV32SX, S16 @unpriv:OK torvalds#370/5 verifier_movsx/MOV64SX, S8:OK torvalds#370/6 verifier_movsx/MOV64SX, S8 @unpriv:OK torvalds#370/7 verifier_movsx/MOV64SX, S16:OK torvalds#370/8 verifier_movsx/MOV64SX, S16 @unpriv:OK torvalds#370/9 verifier_movsx/MOV64SX, S32:OK torvalds#370/10 verifier_movsx/MOV64SX, S32 @unpriv:OK torvalds#370/11 verifier_movsx/MOV32SX, S8, range_check:OK torvalds#370/12 verifier_movsx/MOV32SX, S8, range_check @unpriv:OK torvalds#370/13 verifier_movsx/MOV32SX, S16, range_check:OK torvalds#370/14 verifier_movsx/MOV32SX, S16, range_check @unpriv:OK torvalds#370/15 verifier_movsx/MOV32SX, S16, range_check 2:OK torvalds#370/16 verifier_movsx/MOV32SX, S16, range_check 2 @unpriv:OK torvalds#370/17 verifier_movsx/MOV64SX, S8, range_check:OK torvalds#370/18 verifier_movsx/MOV64SX, S8, range_check @unpriv:OK torvalds#370/19 verifier_movsx/MOV64SX, S16, range_check:OK torvalds#370/20 verifier_movsx/MOV64SX, S16, range_check @unpriv:OK torvalds#370/21 verifier_movsx/MOV64SX, S32, range_check:OK torvalds#370/22 verifier_movsx/MOV64SX, S32, range_check @unpriv:OK torvalds#370/23 verifier_movsx/MOV64SX, S16, R10 Sign Extension:OK torvalds#370/24 verifier_movsx/MOV64SX, S16, R10 Sign Extension @unpriv:OK torvalds#370 verifier_movsx:OK torvalds#382/1 verifier_sdiv/SDIV32, non-zero imm divisor, check 1:OK torvalds#382/2 verifier_sdiv/SDIV32, non-zero imm divisor, check 1 @unpriv:OK torvalds#382/3 verifier_sdiv/SDIV32, non-zero imm divisor, check 2:OK torvalds#382/4 verifier_sdiv/SDIV32, non-zero imm divisor, check 2 @unpriv:OK torvalds#382/5 verifier_sdiv/SDIV32, non-zero imm divisor, check 3:OK torvalds#382/6 verifier_sdiv/SDIV32, non-zero imm divisor, check 3 @unpriv:OK torvalds#382/7 verifier_sdiv/SDIV32, non-zero imm divisor, check 4:OK torvalds#382/8 verifier_sdiv/SDIV32, non-zero imm divisor, check 4 @unpriv:OK torvalds#382/9 verifier_sdiv/SDIV32, non-zero imm divisor, check 5:OK torvalds#382/10 verifier_sdiv/SDIV32, non-zero imm divisor, check 5 @unpriv:OK torvalds#382/11 verifier_sdiv/SDIV32, non-zero imm divisor, check 6:OK torvalds#382/12 verifier_sdiv/SDIV32, non-zero imm divisor, check 6 @unpriv:OK torvalds#382/13 verifier_sdiv/SDIV32, non-zero imm divisor, check 7:OK torvalds#382/14 verifier_sdiv/SDIV32, non-zero imm divisor, check 7 @unpriv:OK torvalds#382/15 verifier_sdiv/SDIV32, non-zero imm divisor, check 8:OK torvalds#382/16 verifier_sdiv/SDIV32, non-zero imm divisor, check 8 @unpriv:OK torvalds#382/17 verifier_sdiv/SDIV32, non-zero reg divisor, check 1:OK torvalds#382/18 verifier_sdiv/SDIV32, non-zero reg divisor, check 1 @unpriv:OK torvalds#382/19 verifier_sdiv/SDIV32, non-zero reg divisor, check 2:OK torvalds#382/20 verifier_sdiv/SDIV32, non-zero reg divisor, check 2 @unpriv:OK torvalds#382/21 verifier_sdiv/SDIV32, non-zero reg divisor, check 3:OK torvalds#382/22 verifier_sdiv/SDIV32, non-zero reg divisor, check 3 @unpriv:OK torvalds#382/23 verifier_sdiv/SDIV32, non-zero reg divisor, check 4:OK torvalds#382/24 verifier_sdiv/SDIV32, non-zero reg divisor, check 4 @unpriv:OK torvalds#382/25 verifier_sdiv/SDIV32, non-zero reg divisor, check 5:OK torvalds#382/26 verifier_sdiv/SDIV32, non-zero reg divisor, check 5 @unpriv:OK torvalds#382/27 verifier_sdiv/SDIV32, non-zero reg divisor, check 6:OK torvalds#382/28 verifier_sdiv/SDIV32, non-zero reg divisor, check 6 @unpriv:OK torvalds#382/29 verifier_sdiv/SDIV32, non-zero reg divisor, check 7:OK torvalds#382/30 verifier_sdiv/SDIV32, non-zero reg divisor, check 7 @unpriv:OK torvalds#382/31 verifier_sdiv/SDIV32, non-zero reg divisor, check 8:OK torvalds#382/32 verifier_sdiv/SDIV32, non-zero reg divisor, check 8 @unpriv:OK torvalds#382/33 verifier_sdiv/SDIV64, non-zero imm divisor, check 1:OK torvalds#382/34 verifier_sdiv/SDIV64, non-zero imm divisor, check 1 @unpriv:OK torvalds#382/35 verifier_sdiv/SDIV64, non-zero imm divisor, check 2:OK torvalds#382/36 verifier_sdiv/SDIV64, non-zero imm divisor, check 2 @unpriv:OK torvalds#382/37 verifier_sdiv/SDIV64, non-zero imm divisor, check 3:OK torvalds#382/38 verifier_sdiv/SDIV64, non-zero imm divisor, check 3 @unpriv:OK torvalds#382/39 verifier_sdiv/SDIV64, non-zero imm divisor, check 4:OK torvalds#382/40 verifier_sdiv/SDIV64, non-zero imm divisor, check 4 @unpriv:OK torvalds#382/41 verifier_sdiv/SDIV64, non-zero imm divisor, check 5:OK torvalds#382/42 verifier_sdiv/SDIV64, non-zero imm divisor, check 5 @unpriv:OK torvalds#382/43 verifier_sdiv/SDIV64, non-zero imm divisor, check 6:OK torvalds#382/44 verifier_sdiv/SDIV64, non-zero imm divisor, check 6 @unpriv:OK torvalds#382/45 verifier_sdiv/SDIV64, non-zero reg divisor, check 1:OK torvalds#382/46 verifier_sdiv/SDIV64, non-zero reg divisor, check 1 @unpriv:OK torvalds#382/47 verifier_sdiv/SDIV64, non-zero reg divisor, check 2:OK torvalds#382/48 verifier_sdiv/SDIV64, non-zero reg divisor, check 2 @unpriv:OK torvalds#382/49 verifier_sdiv/SDIV64, non-zero reg divisor, check 3:OK torvalds#382/50 verifier_sdiv/SDIV64, non-zero reg divisor, check 3 @unpriv:OK torvalds#382/51 verifier_sdiv/SDIV64, non-zero reg divisor, check 4:OK torvalds#382/52 verifier_sdiv/SDIV64, non-zero reg divisor, check 4 @unpriv:OK torvalds#382/53 verifier_sdiv/SDIV64, non-zero reg divisor, check 5:OK torvalds#382/54 verifier_sdiv/SDIV64, non-zero reg divisor, check 5 @unpriv:OK torvalds#382/55 verifier_sdiv/SDIV64, non-zero reg divisor, check 6:OK torvalds#382/56 verifier_sdiv/SDIV64, non-zero reg divisor, check 6 @unpriv:OK torvalds#382/57 verifier_sdiv/SMOD32, non-zero imm divisor, check 1:OK torvalds#382/58 verifier_sdiv/SMOD32, non-zero imm divisor, check 1 @unpriv:OK torvalds#382/59 verifier_sdiv/SMOD32, non-zero imm divisor, check 2:OK torvalds#382/60 verifier_sdiv/SMOD32, non-zero imm divisor, check 2 @unpriv:OK torvalds#382/61 verifier_sdiv/SMOD32, non-zero imm divisor, check 3:OK torvalds#382/62 verifier_sdiv/SMOD32, non-zero imm divisor, check 3 @unpriv:OK torvalds#382/63 verifier_sdiv/SMOD32, non-zero imm divisor, check 4:OK torvalds#382/64 verifier_sdiv/SMOD32, non-zero imm divisor, check 4 @unpriv:OK torvalds#382/65 verifier_sdiv/SMOD32, non-zero imm divisor, check 5:OK torvalds#382/66 verifier_sdiv/SMOD32, non-zero imm divisor, check 5 @unpriv:OK torvalds#382/67 verifier_sdiv/SMOD32, non-zero imm divisor, check 6:OK torvalds#382/68 verifier_sdiv/SMOD32, non-zero imm divisor, check 6 @unpriv:OK torvalds#382/69 verifier_sdiv/SMOD32, non-zero reg divisor, check 1:OK torvalds#382/70 verifier_sdiv/SMOD32, non-zero reg divisor, check 1 @unpriv:OK torvalds#382/71 verifier_sdiv/SMOD32, non-zero reg divisor, check 2:OK torvalds#382/72 verifier_sdiv/SMOD32, non-zero reg divisor, check 2 @unpriv:OK torvalds#382/73 verifier_sdiv/SMOD32, non-zero reg divisor, check 3:OK torvalds#382/74 verifier_sdiv/SMOD32, non-zero reg divisor, check 3 @unpriv:OK torvalds#382/75 verifier_sdiv/SMOD32, non-zero reg divisor, check 4:OK torvalds#382/76 verifier_sdiv/SMOD32, non-zero reg divisor, check 4 @unpriv:OK torvalds#382/77 verifier_sdiv/SMOD32, non-zero reg divisor, check 5:OK torvalds#382/78 verifier_sdiv/SMOD32, non-zero reg divisor, check 5 @unpriv:OK torvalds#382/79 verifier_sdiv/SMOD32, non-zero reg divisor, check 6:OK torvalds#382/80 verifier_sdiv/SMOD32, non-zero reg divisor, check 6 @unpriv:OK torvalds#382/81 verifier_sdiv/SMOD64, non-zero imm divisor, check 1:OK torvalds#382/82 verifier_sdiv/SMOD64, non-zero imm divisor, check 1 @unpriv:OK torvalds#382/83 verifier_sdiv/SMOD64, non-zero imm divisor, check 2:OK torvalds#382/84 verifier_sdiv/SMOD64, non-zero imm divisor, check 2 @unpriv:OK torvalds#382/85 verifier_sdiv/SMOD64, non-zero imm divisor, check 3:OK torvalds#382/86 verifier_sdiv/SMOD64, non-zero imm divisor, check 3 @unpriv:OK torvalds#382/87 verifier_sdiv/SMOD64, non-zero imm divisor, check 4:OK torvalds#382/88 verifier_sdiv/SMOD64, non-zero imm divisor, check 4 @unpriv:OK torvalds#382/89 verifier_sdiv/SMOD64, non-zero imm divisor, check 5:OK torvalds#382/90 verifier_sdiv/SMOD64, non-zero imm divisor, check 5 @unpriv:OK torvalds#382/91 verifier_sdiv/SMOD64, non-zero imm divisor, check 6:OK torvalds#382/92 verifier_sdiv/SMOD64, non-zero imm divisor, check 6 @unpriv:OK torvalds#382/93 verifier_sdiv/SMOD64, non-zero imm divisor, check 7:OK torvalds#382/94 verifier_sdiv/SMOD64, non-zero imm divisor, check 7 @unpriv:OK torvalds#382/95 verifier_sdiv/SMOD64, non-zero imm divisor, check 8:OK torvalds#382/96 verifier_sdiv/SMOD64, non-zero imm divisor, check 8 @unpriv:OK torvalds#382/97 verifier_sdiv/SMOD64, non-zero reg divisor, check 1:OK torvalds#382/98 verifier_sdiv/SMOD64, non-zero reg divisor, check 1 @unpriv:OK torvalds#382/99 verifier_sdiv/SMOD64, non-zero reg divisor, check 2:OK torvalds#382/100 verifier_sdiv/SMOD64, non-zero reg divisor, check 2 @unpriv:OK torvalds#382/101 verifier_sdiv/SMOD64, non-zero reg divisor, check 3:OK torvalds#382/102 verifier_sdiv/SMOD64, non-zero reg divisor, check 3 @unpriv:OK torvalds#382/103 verifier_sdiv/SMOD64, non-zero reg divisor, check 4:OK torvalds#382/104 verifier_sdiv/SMOD64, non-zero reg divisor, check 4 @unpriv:OK torvalds#382/105 verifier_sdiv/SMOD64, non-zero reg divisor, check 5:OK torvalds#382/106 verifier_sdiv/SMOD64, non-zero reg divisor, check 5 @unpriv:OK torvalds#382/107 verifier_sdiv/SMOD64, non-zero reg divisor, check 6:OK torvalds#382/108 verifier_sdiv/SMOD64, non-zero reg divisor, check 6 @unpriv:OK torvalds#382/109 verifier_sdiv/SMOD64, non-zero reg divisor, check 7:OK torvalds#382/110 verifier_sdiv/SMOD64, non-zero reg divisor, check 7 @unpriv:OK torvalds#382/111 verifier_sdiv/SMOD64, non-zero reg divisor, check 8:OK torvalds#382/112 verifier_sdiv/SMOD64, non-zero reg divisor, check 8 @unpriv:OK torvalds#382/113 verifier_sdiv/SDIV32, zero divisor:OK torvalds#382/114 verifier_sdiv/SDIV32, zero divisor @unpriv:OK torvalds#382/115 verifier_sdiv/SDIV64, zero divisor:OK torvalds#382/116 verifier_sdiv/SDIV64, zero divisor @unpriv:OK torvalds#382/117 verifier_sdiv/SMOD32, zero divisor:OK torvalds#382/118 verifier_sdiv/SMOD32, zero divisor @unpriv:OK torvalds#382/119 verifier_sdiv/SMOD64, zero divisor:OK torvalds#382/120 verifier_sdiv/SMOD64, zero divisor @unpriv:OK torvalds#382 verifier_sdiv:OK Summary: 5/163 PASSED, 0 SKIPPED, 0 FAILED As the selftests don't compile for 32-bit architectures without modifications due to long being 32-bit, I have added new tests to lib/test_bpf.c for cpuv4 insns, all are passing: test_bpf: Summary: 1052 PASSED, 0 FAILED, [891/1040 JIT'ed] test_bpf: test_tail_calls: Summary: 10 PASSED, 0 FAILED, [10/10 JIT'ed] test_bpf: test_skb_segment: Summary: 2 PASSED, 0 FAILED [1] https://lore.kernel.org/all/[email protected]/ ==================== Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Alexei Starovoitov <[email protected]>
- Loading branch information