[PATCH] riscv: kasan: use local_tlb_flush_all() to avoid uninitialized __sbi_rfence

Palmer Dabbelt palmer at dabbelt.com
Tue Jul 21 00:18:39 EDT 2020


On Thu, 09 Jul 2020 19:40:54 PDT (-0700), vincent.chen at sifive.com wrote:
> It fails to boot the v5.8-rc4 kernel with CONFIG_KASAN because kasan_init
> and kasan_early_init use uninitialized __sbi_rfence as executing the
> tlb_flush_all(). Actually, at this moment, only the CPU which is
> responsible for the system initialization enables the MMU. Other CPUs are
> parking at the .Lsecondary_start. Hence the tlb_flush_all() is able to be
> replaced by local_tlb_flush_all() to avoid using uninitialized
> __sbi_rfence.
>
> Signed-off-by: Vincent Chen <vincent.chen at sifive.com>
> ---
>  arch/riscv/mm/kasan_init.c | 4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/arch/riscv/mm/kasan_init.c b/arch/riscv/mm/kasan_init.c
> index 4a8b61806633..87b4ab3d3c77 100644
> --- a/arch/riscv/mm/kasan_init.c
> +++ b/arch/riscv/mm/kasan_init.c
> @@ -44,7 +44,7 @@ asmlinkage void __init kasan_early_init(void)
>  				(__pa(((uintptr_t) kasan_early_shadow_pmd))),
>  				__pgprot(_PAGE_TABLE)));
>
> -	flush_tlb_all();
> +	local_flush_tlb_all();
>  }
>
>  static void __init populate(void *start, void *end)
> @@ -79,7 +79,7 @@ static void __init populate(void *start, void *end)
>  			pfn_pgd(PFN_DOWN(__pa(&pmd[offset])),
>  				__pgprot(_PAGE_TABLE)));
>
> -	flush_tlb_all();
> +	local_flush_tlb_all();
>  	memset(start, 0, end - start);
>  }

Can we just move the sbi_init() call before the kasan_init() call?  I feel like
the SBI should be initialized directly after paging, as probing really doesn't
have any dependencies.



More information about the linux-riscv mailing list