Nathan Lynch <nath...@linux.ibm.com> writes: > kasan is known to crash at boot on book3s_64 with non-radix MMU. As > noted in commit 41b7a347bf14 ("powerpc: Book3S 64-bit outline-only > KASAN support"): > > A kernel with CONFIG_KASAN=y will crash during boot on a machine > using HPT translation because not all the entry points to the > generic KASAN code are protected with a call to kasan_arch_is_ready().
I guess I thought there was some plan to fix that. But maybe I'm misremembering. Looking now it's not entirely straight forward with the way the headers are structured. So I guess I'm wrong about that. > Such crashes look like this: > > BUG: Unable to handle kernel data access at 0xc00e00000308b100 > Faulting instruction address: 0xc0000000006d0fcc > Oops: Kernel access of bad area, sig: 11 [#1] > LE PAGE_SIZE=64K MMU=Hash SMP NR_CPUS=2048 NUMA pSeries > CPU: 0 PID: 1 Comm: swapper/0 Not tainted 6.0.0-rc5-02183-g3ab165dea2a2 #13 > [...regs...] > NIP [c0000000006d0fcc] kasan_byte_accessible+0xc/0x20 > LR [c0000000006cd9cc] __kasan_check_byte+0x2c/0xa0 > Call Trace: > [c00000001688f930] [c00000001688f970] 0xc00000001688f970 (unreliable) > [c00000001688f970] [c0000000005f6a74] ksize+0x34/0xa0 > [c00000001688f9a0] [c0000000024c03a8] __alloc_skb+0xd8/0x2d0 > [c00000001688fa00] [c0000000003c48c0] audit_log_start+0x260/0x660 > [c00000001688fb30] [c0000000003c50ec] audit_log+0x3c/0x70 > [c00000001688fb60] [c00000000404590c] audit_init+0x188/0x1ac > [c00000001688fbe0] [c0000000000127e0] do_one_initcall+0xe0/0x610 > [c00000001688fcd0] [c00000000400a1f0] kernel_init_freeable+0x4c0/0x574 > [c00000001688fda0] [c000000000013450] kernel_init+0x30/0x1d0 > [c00000001688fe10] [c00000000000cd54] ret_from_kernel_thread+0x5c/0x64 > > If you look carefully enough at the full kernel output, you might > notice this message, much earlier: > > KASAN not enabled as it requires radix! > > But the eventual oops does not carry any indication that the real > problem was detected early on and is a known limitation. > > Change init_book3s_64.c::kasan_init() to emit a warning backtrace and > taint the kernel when not running on radix. When the kernel likely > oopses later, the 'W' taint flag in the report should help minimize > developer time spent trying to understand what's gone wrong. Should we just panic() directly? It's too earily in kasan_init(), nothing gets to the console. But we have kasan_late_init() already, the patch below seems to work and gives us: Booting Linux via __start() @ 0x0000000000400000 ... [ 0.000000][ T0] hash-mmu: Page sizes from device-tree: [ 0.000000][ T0] hash-mmu: base_shift=12: shift=12, sllp=0x0000, avpnm=0x00000000, tlbiel=1, penc=0 [ 0.000000][ T0] hash-mmu: base_shift=16: shift=16, sllp=0x0110, avpnm=0x00000000, tlbiel=1, penc=1 [ 0.000000][ T0] Using 1TB segments [ 0.000000][ T0] hash-mmu: Initializing hash mmu with SLB [ 0.000000][ T0] Linux version 6.0.0-rc2-00225-g8b68240ff7d7-dirty (michael@alpine1-p1) (gcc (Ubuntu 11.2.0-7ubuntu2) 11.2.0, GNU ld (GNU Binutils for Ubuntu) 2.37) #403 SMP Thu Oct 6 14:53:58 AEDT 2022 [ 0.000000][ T0] KASAN not enabled as it requires radix! ... [ 0.000000][ T0] mem auto-init: stack:off, heap alloc:off, heap free:off [ 0.000000][ T0] stackdepot hash table entries: 1048576 (order: 7, 8388608 bytes, linear) [ 0.000000][ T0] Kernel panic - not syncing: KASAN enabled kernel can't boot with Hash MMU! [ 0.000000][ T0] CPU: 0 PID: 0 Comm: swapper Not tainted 6.0.0-rc2-00225-g8b68240ff7d7-dirty #403 [ 0.000000][ T0] Hardware name: IBM pSeries (emulated by qemu) POWER8 (raw) 0x4d0200 0xf000004 of:SLOF,HEAD pSeries [ 0.000000][ T0] Call Trace: [ 0.000000][ T0] [c0000000031efd20] [c000000000bf5450] dump_stack_lvl+0x74/0xa8 (unreliable) [ 0.000000][ T0] [c0000000031efd60] [c00000000017d160] panic+0x1b0/0x480 [ 0.000000][ T0] [c0000000031efe00] [c00000000201e028] kasan_late_init+0x30/0x34 [ 0.000000][ T0] [c0000000031efe60] [c000000002018c4c] mem_init+0xc8/0xec [ 0.000000][ T0] [c0000000031efe90] [c000000002004538] mm_init+0x84/0xbc [ 0.000000][ T0] [c0000000031eff00] [c0000000020047a0] start_kernel+0x1cc/0x4bc [ 0.000000][ T0] [c0000000031eff90] [c00000000000d998] start_here_common+0x1c/0x84 cheers diff --git a/arch/powerpc/mm/kasan/init_book3s_64.c b/arch/powerpc/mm/kasan/init_book3s_64.c index 9300d641cf9a..cc1b4ee8be53 100644 --- a/arch/powerpc/mm/kasan/init_book3s_64.c +++ b/arch/powerpc/mm/kasan/init_book3s_64.c @@ -101,4 +101,8 @@ void __init kasan_init(void) void __init kasan_early_init(void) { } -void __init kasan_late_init(void) { } +void __init kasan_late_init(void) +{ + if (!radix_enabled()) + panic("KASAN enabled kernel can't boot with Hash MMU!"); +}