• Björn Töpel's avatar
    riscv, bpf: Fix inconsistent JIT image generation · c56fb2aa
    Björn Töpel authored
    In order to generate the prologue and epilogue, the BPF JIT needs to
    know which registers that are clobbered. Therefore, the during
    pre-final passes, the prologue is generated after the body of the
    program body-prologue-epilogue. Then, in the final pass, a proper
    prologue-body-epilogue JITted image is generated.
    
    This scheme has worked most of the time. However, for some large
    programs with many jumps, e.g. the test_kmod.sh BPF selftest with
    hardening enabled (blinding constants), this has shown to be
    incorrect. For the final pass, when the proper prologue-body-epilogue
    is generated, the image has not converged. This will lead to that the
    final image will have incorrect jump offsets. The following is an
    excerpt from an incorrect image:
    
      | ...
      |     3b8:       00c50663                beq     a0,a2,3c4 <.text+0x3c4>
      |     3bc:       0020e317                auipc   t1,0x20e
      |     3c0:       49630067                jalr    zero,1174(t1) # 20e852 <.text+0x20e852>
      | ...
      |  20e84c:       8796                    c.mv    a5,t0
      |  20e84e:       6422                    c.ldsp  s0,8(sp)    # Epilogue start
      |  20e850:       6141                    c.addi16sp      sp,16
      |  20e852:       853e                    c.mv    a0,a5       # Incorrect jump target
      |  20e854:       8082                    c.jr    ra
    
    The image has shrunk, and the epilogue offset is incorrect in the
    final pass.
    
    Correct the problem by always generating proper prologue-body-epilogue
    outputs, which means that the first pass will only generate the body
    to track what registers that are touched.
    
    Fixes: 2353ecc6 ("bpf, riscv: add BPF JIT for RV64G")
    Signed-off-by: default avatarBjörn Töpel <bjorn@rivosinc.com>
    Signed-off-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
    Link: https://lore.kernel.org/bpf/20230710074131.19596-1-bjorn@kernel.org
    c56fb2aa
bpf_jit_core.c 4.4 KB