• Jisheng Zhang's avatar
    riscv: move sbi_init() earlier before jump_label_init() · 24fc1808
    Jisheng Zhang authored
    We call jump_label_init() in setup_arch() is to use static key
    mechanism earlier, but riscv jump label relies on the sbi functions,
    If we enable static key before sbi_init(), the code path looks like:
      static_branch_enable()
        ..
          arch_jump_label_transform()
            patch_text_nosync()
              flush_icache_range()
                flush_icache_all()
                  sbi_remote_fence_i() for CONFIG_RISCV_SBI case
                    __sbi_rfence()
    
    Since sbi isn't initialized, so NULL deference! Here is a typical
    panic log:
    
    [    0.000000] Unable to handle kernel NULL pointer dereference at virtual address 0000000000000000
    [    0.000000] Oops [#1]
    [    0.000000] Modules linked in:
    [    0.000000] CPU: 0 PID: 0 Comm: swapper Not tainted 5.18.0-rc7+ #79
    [    0.000000] Hardware name: riscv-virtio,qemu (DT)
    [    0.000000] epc : 0x0
    [    0.000000]  ra : sbi_remote_fence_i+0x1e/0x26
    [    0.000000] epc : 0000000000000000 ra : ffffffff80005826 sp : ffffffff80c03d50
    [    0.000000]  gp : ffffffff80ca6178 tp : ffffffff80c0ad80 t0 : 6200000000000000
    [    0.000000]  t1 : 0000000000000000 t2 : 62203a6b746e6972 s0 : ffffffff80c03d60
    [    0.000000]  s1 : ffffffff80001af6 a0 : 0000000000000000 a1 : 0000000000000000
    [    0.000000]  a2 : 0000000000000000 a3 : 0000000000000000 a4 : 0000000000000000
    [    0.000000]  a5 : 0000000000000000 a6 : 0000000000000000 a7 : 0000000000080200
    [    0.000000]  s2 : ffffffff808b3e48 s3 : ffffffff808bf698 s4 : ffffffff80cb2818
    [    0.000000]  s5 : 0000000000000001 s6 : ffffffff80c9c345 s7 : ffffffff80895aa0
    [    0.000000]  s8 : 0000000000000001 s9 : 000000000000007f s10: 0000000000000000
    [    0.000000]  s11: 0000000000000000 t3 : ffffffff80824d08 t4 : 0000000000000022
    [    0.000000]  t5 : 000000000000003d t6 : 0000000000000000
    [    0.000000] status: 0000000000000100 badaddr: 0000000000000000 cause: 000000000000000c
    [    0.000000] ---[ end trace 0000000000000000 ]---
    [    0.000000] Kernel panic - not syncing: Attempted to kill the idle task!
    [    0.000000] ---[ end Kernel panic - not syncing: Attempted to kill the idle task! ]---
    
    Fix this issue by moving sbi_init() earlier before jump_label_init()
    Signed-off-by: default avatarJisheng Zhang <jszhang@kernel.org>
    Reviewed-by: default avatarAnup Patel <anup@brainfault.org>
    Reviewed-by: default avatarAtish Patra <atishp@rivosinc.com>
    Link: https://lore.kernel.org/r/20230515054928.2079268-2-sunilvl@ventanamicro.comSigned-off-by: default avatarPalmer Dabbelt <palmer@rivosinc.com>
    24fc1808
setup.c 8.23 KB