Skip to content

Commit

Permalink
Merge branch 'arm32-bpf-add-support-for-cpuv4-insns'
Browse files Browse the repository at this point in the history
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
Alexei Starovoitov committed Sep 16, 2023
2 parents 9b2b863 + 9b31b4f commit c4ab64e
Show file tree
Hide file tree
Showing 10 changed files with 694 additions and 31 deletions.
5 changes: 3 additions & 2 deletions MAINTAINERS
Original file line number Diff line number Diff line change
Expand Up @@ -3596,9 +3596,10 @@ F: Documentation/devicetree/bindings/iio/accel/bosch,bma400.yaml
F: drivers/iio/accel/bma400*

BPF JIT for ARM
M: Shubham Bansal <[email protected]>
M: Russell King <[email protected]>
M: Puranjay Mohan <[email protected]>
L: [email protected]
S: Odd Fixes
S: Maintained
F: arch/arm/net/

BPF JIT for ARM64
Expand Down
Loading

0 comments on commit c4ab64e

Please sign in to comment.