• Puranjay Mohan's avatar
    bpf, riscv64/cfi: Support kCFI + BPF on riscv64 · e63985ec
    Puranjay Mohan authored
    The riscv BPF JIT doesn't emit proper kCFI prologues for BPF programs
    and struct_ops trampolines when CONFIG_CFI_CLANG is enabled.
    
    This causes CFI failures when calling BPF programs and can even crash
    the kernel due to invalid memory accesses.
    
    Example crash:
    
    root@rv-selftester:~/bpf# ./test_progs -a dummy_st_ops
    
     Unable to handle kernel paging request at virtual address ffffffff78204ffc
     Oops [#1]
     Modules linked in: bpf_testmod(OE) [....]
     CPU: 3 PID: 356 Comm: test_progs Tainted: P           OE      6.8.0-rc1 #1
     Hardware name: riscv-virtio,qemu (DT)
     epc : bpf_struct_ops_test_run+0x28c/0x5fc
      ra : bpf_struct_ops_test_run+0x26c/0x5fc
     epc : ffffffff82958010 ra : ffffffff82957ff0 sp : ff200000007abc80
      gp : ffffffff868d6218 tp : ff6000008d87b840 t0 : 000000000000000f
      t1 : 0000000000000000 t2 : 000000002005793e s0 : ff200000007abcf0
      s1 : ff6000008a90fee0 a0 : 0000000000000000 a1 : 0000000000000000
      a2 : 0000000000000000 a3 : 0000000000000000 a4 : 0000000000000000
      a5 : ffffffff868dba26 a6 : 0000000000000001 a7 : 0000000052464e43
      s2 : 00007ffffc0a95f0 s3 : ff6000008a90fe80 s4 : ff60000084c24c00
      s5 : ffffffff78205000 s6 : ff60000088750648 s7 : ff20000000035008
      s8 : fffffffffffffff4 s9 : ffffffff86200610 s10: 0000000000000000
      s11: 0000000000000000 t3 : ffffffff8483dc30 t4 : ffffffff8483dc10
      t5 : ffffffff8483dbf0 t6 : ffffffff8483dbd0
     status: 0000000200000120 badaddr: ffffffff78204ffc cause: 000000000000000d
     [<ffffffff82958010>] bpf_struct_ops_test_run+0x28c/0x5fc
     [<ffffffff805083ee>] bpf_prog_test_run+0x170/0x548
     [<ffffffff805029c8>] __sys_bpf+0x2d2/0x378
     [<ffffffff804ff570>] __riscv_sys_bpf+0x5c/0x120
     [<ffffffff8000e8fe>] syscall_handler+0x62/0xe4
     [<ffffffff83362df6>] do_trap_ecall_u+0xc6/0x27c
     [<ffffffff833822c4>] ret_from_exception+0x0/0x64
     Code: b603 0109 b683 0189 b703 0209 8493 0609 157d 8d65 (a303) ffca
     ---[ end trace 0000000000000000 ]---
     Kernel panic - not syncing: Fatal exception
     SMP: stopping secondary CPUs
    
    Implement proper kCFI prologues for the BPF programs and callbacks and
    drop __nocfi for riscv64. Fix the trampoline generation code to emit kCFI
    prologue when a struct_ops trampoline is being prepared.
    Signed-off-by: default avatarPuranjay Mohan <puranjay12@gmail.com>
    Signed-off-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
    Signed-off-by: default avatarAndrii Nakryiko <andrii@kernel.org>
    Acked-by: default avatarBjörn Töpel <bjorn@kernel.org>
    Link: https://lore.kernel.org/bpf/20240303170207.82201-2-puranjay12@gmail.com
    e63985ec
bpf_jit.h 27.4 KB