linux/arch/loongarch
Tiezhu Yang 56db97af7c LoongArch: Rework KASAN initialization for PTW-enabled systems
commit 5ec5ac4ca2 upstream.

kasan_init_generic() indicates that kasan is fully initialized, so it
should be put at end of kasan_init().

Otherwise bringing up the primary CPU failed when CONFIG_KASAN is set
on PTW-enabled systems, here are the call chains:

    kernel_entry()
      start_kernel()
        setup_arch()
          kasan_init()
            kasan_init_generic()

The reason is PTW-enabled systems have speculative accesses which means
memory accesses to the shadow memory after kasan_init() may be executed
by hardware before. However, accessing shadow memory is safe only after
kasan fully initialized because kasan_init() uses a temporary PGD table
until we have populated all levels of shadow page tables and writen the
PGD register. Moving kasan_init_generic() later can defer the occasion
of kasan_enabled(), so as to avoid speculative accesses on shadow pages.

After moving kasan_init_generic() to the end, kasan_init() can no longer
call kasan_mem_to_shadow() for shadow address conversion because it will
always return kasan_early_shadow_page. On the other hand, we should keep
the current logic of kasan_mem_to_shadow() for both the early and final
stage because there may be instrumentation before kasan_init().

To solve this, we factor out a new mem_to_shadow() function from current
kasan_mem_to_shadow() for the shadow address conversion in kasan_init().

Cc: stable@vger.kernel.org
Signed-off-by: Tiezhu Yang <yangtiezhu@loongson.cn>
Signed-off-by: Huacai Chen <chenhuacai@loongson.cn>
[ Huacai: To backport from upstream to 6.6 & 6.12, kasan_enabled() is
          replaced with kasan_arch_is_ready() and kasan_init_generic()
          is replaced with "kasan_early_stage = false". ]
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
History 2026-02-19 16:29:55 +01:00
..
boot LoongArch: dts: loongson-2k2000: Add default interrupt controller address cells 2026-01-23 11:18:48 +01:00
configs mm: z3fold: deprecate CONFIG_Z3FOLD 2024-09-17 01:07:00 -07:00
crypto move asm/unaligned.h to linux/unaligned.h 2024-10-02 17:23:23 -04:00
include LoongArch: Use __pmd()/__pte() for swap entry conversions 2026-01-08 10:14:47 +01:00
kernel LoongArch: Enable exception fixup for specific ADE subcode 2026-02-11 13:40:19 +01:00
kvm LoongArch: KVM: Add delay until timer interrupt injected 2025-11-24 10:35:58 +01:00
lib LoongArch: csum: Fix OoB access in IP checksum code for negative lengths 2025-02-21 14:01:17 +01:00
mm LoongArch: Rework KASAN initialization for PTW-enabled systems 2026-02-19 16:29:55 +01:00
net LoongArch: BPF: Sign extend kfunc call arguments 2026-01-08 10:14:51 +01:00
pci LoongArch: Add new PCI ID for pci_fixup_vgadev() 2026-01-08 10:14:46 +01:00
power LoongArch: Save and restore CSR.CNTC for hibernation 2025-05-22 14:29:44 +02:00
vdso LoongArch: vDSO: Remove -nostdlib complier flag 2025-09-09 18:58:05 +02:00
Kbuild LoongArch: Allow device trees be built into the kernel 2024-01-17 12:43:00 +08:00
Kconfig LoongArch: Update help info of ARCH_STRICT_ALIGN 2025-09-25 11:13:45 +02:00
Kconfig.debug LoongArch: Only allow OBJTOOL & ORC unwinder if toolchain supports -mthin-add-sub 2024-06-21 10:18:40 +08:00
Makefile LoongArch: Add cflag -fno-isolate-erroneous-paths-dereference 2025-10-19 16:33:39 +02:00