Le 12/09/2023 à 02:11, Erhard Furtner a écrit : > On Mon, 4 Sep 2023 14:55:17 +0000 > Christophe Leroy <christophe.le...@csgroup.eu> wrote: > >> Another thing that could be interesting to test is to remove (or comment >> out) the following line in arch/powerpc/mm/kasan/Makefile : >> >> obj-$(CONFIG_PPC_BOOK3S_32) += book3s_32.o >> >> That way, the weak version of kasan_init_region() will be used instead >> of the one in book3s_32.c > > Tinkered around with older kernels and .config options meanwhile. I found out > it's not a new issue, also happens on kernel v6.0. Have not tried older > kernels yet. > > Also on v6.0 the issue disappears when I comment out > "obj-$(CONFIG_PPC_BOOK3S_32) += book3s_32.o" in > arch/powerpc/mm/kasan/Makefile. > > Even more interesting is the issue disappears too when I deselect > INIT_STACK_ALL_PATTERN in my kernel .config. The kernel boots just fine with > KASAN when INIT_STACK_NONE=y is set! True for kernel v6.0 and v6.6-rc1. > > Current v6.6-rc1 kernel .config and dmesg attached. >
I suspect something wrong when we set the BATs. Can you try with the following additional traces: diff --git a/arch/powerpc/mm/kasan/book3s_32.c b/arch/powerpc/mm/kasan/book3s_32.c index 450a67ef0bbe..9954b7a3b7ae 100644 --- a/arch/powerpc/mm/kasan/book3s_32.c +++ b/arch/powerpc/mm/kasan/book3s_32.c @@ -15,6 +15,7 @@ int __init kasan_init_region(void *start, size_t size) phys_addr_t phys; int ret; + pr_err("%s: %px %x %lx %lx\n", __func__, start, size, k_start, k_end); while (k_nobat < k_end) { unsigned int k_size = bat_block_size(k_nobat, k_end); int idx = find_free_bat(); @@ -28,6 +29,7 @@ int __init kasan_init_region(void *start, size_t size) if (!phys) break; + pr_err("%s: setbat %d %lx %x %x\n", __func__, idx, k_nobat, phys, k_size); setbat(idx, k_nobat, phys, k_size, PAGE_KERNEL); k_nobat += k_size; } @@ -47,6 +49,7 @@ int __init kasan_init_region(void *start, size_t size) kasan_update_early_region(k_start, k_nobat, __pte(0)); + pr_err("%s: loop %lx %lx\n", __func__, k_nobat, k_end); for (k_cur = k_nobat; k_cur < k_end; k_cur += PAGE_SIZE) { pmd_t *pmd = pmd_off_k(k_cur); pte_t pte = pfn_pte(PHYS_PFN(phys + k_cur - k_nobat), PAGE_KERNEL); You'd then get something like: Total memory = 2048MB; using 4096kB for hash table Activating Kernel Userspace Access Protection Activating Kernel Userspace Execution Prevention Linux version 6.6.0-rc1+ (chle...@po20335.idsi0.si.c-s.fr) (powerpc64-linux-gcc (GCC) 12.2.0, GNU ld (GNU Binutils) 2.39) #461 Tue Sep 12 09:37:11 CEST 2023 kasan_init_region: c0000000 30000000 f8000000 fe000000 kasan_init_region: setbat 3 f8000000 7c000000 4000000 kasan_init_region: loop fc000000 fe000000 KASAN init done Thanks Christophe