From 32ad8243342f106c7bde4858dc848b29ff753a3a Mon Sep 17 00:00:00 2001 From: Tiezhu Yang Date: Thu, 25 Dec 2025 10:50:10 +0800 Subject: [PATCH 1/2] LoongArch: Disable instrumentation for setup_ptwalker() Upstream: no Conflict: none Checkpatch: pass According to Documentation/dev-tools/kasan.rst, software KASAN modes use compiler instrumentation to insert validity checks. Such instrumentation might be incompatible with some parts of the kernel, and therefore needs to be disabled, just use the attribute __no_sanitize_address to disable instrumentation for the low level function setup_ptwalker(). Otherwise bringing up the secondary CPUs failed when CONFIG_KASAN is set on the Loongson-3C6000 server machine, here are the call chains: smpboot_entry() start_secondary() cpu_probe() per_cpu_trap_init() tlb_init() setup_tlb_handler() setup_ptwalker() Signed-off-by: Tiezhu Yang Signed-off-by: Ming Wang --- arch/loongarch/mm/tlb.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arch/loongarch/mm/tlb.c b/arch/loongarch/mm/tlb.c index 5503d4e4b096..1f9a7bbc0562 100644 --- a/arch/loongarch/mm/tlb.c +++ b/arch/loongarch/mm/tlb.c @@ -202,7 +202,7 @@ void __update_tlb(struct vm_area_struct *vma, unsigned long address, pte_t *ptep local_irq_restore(flags); } -static void setup_ptwalker(void) +static void __no_sanitize_address setup_ptwalker(void) { unsigned long pwctl0, pwctl1; unsigned long pgd_i = 0, pgd_w = 0; -- Gitee From 5f6e07b52e04122e5811385974c5b9eaa0e45146 Mon Sep 17 00:00:00 2001 From: Tiezhu Yang Date: Thu, 25 Dec 2025 10:30:00 +0800 Subject: [PATCH 2/2] LoongArch: Remove some code if kasan_arch_is_ready() is false Upstream: no Conflict: none Checkpatch: pass In the current kasan_init(), kasan_arch_is_ready() is false before setting kasan_early_stage as false, kasan_mem_to_shadow() always return the same address (void *)(kasan_early_shadow_page) no matter what the parameter is, kasan_populate_early_shadow() does nothing due to its parameters are the same addresses, just remove the related code. Signed-off-by: Tiezhu Yang Signed-off-by: Ming Wang --- arch/loongarch/mm/kasan_init.c | 49 +++++++++++++++------------------- 1 file changed, 21 insertions(+), 28 deletions(-) diff --git a/arch/loongarch/mm/kasan_init.c b/arch/loongarch/mm/kasan_init.c index 7277b7583e1b..853a004a45cf 100644 --- a/arch/loongarch/mm/kasan_init.c +++ b/arch/loongarch/mm/kasan_init.c @@ -44,34 +44,30 @@ bool kasan_early_stage = true; void *kasan_mem_to_shadow(const void *addr) { - if (!kasan_arch_is_ready()) { + unsigned long maddr = (unsigned long)addr; + unsigned long xrange = (maddr >> XRANGE_SHIFT) & 0xffff; + unsigned long offset = 0; + + if (maddr >= FIXADDR_START) return (void *)(kasan_early_shadow_page); - } else { - unsigned long maddr = (unsigned long)addr; - unsigned long xrange = (maddr >> XRANGE_SHIFT) & 0xffff; - unsigned long offset = 0; - - if (maddr >= FIXADDR_START) - return (void *)(kasan_early_shadow_page); - - maddr &= XRANGE_SHADOW_MASK; - switch (xrange) { - case XKPRANGE_CC_SEG: - offset = XKPRANGE_CC_SHADOW_OFFSET; - break; - case XKPRANGE_UC_SEG: - offset = XKPRANGE_UC_SHADOW_OFFSET; - break; - case XKVRANGE_VC_SEG: - offset = XKVRANGE_VC_SHADOW_OFFSET; - break; - default: - WARN_ON(1); - return NULL; - } - return (void *)((maddr >> KASAN_SHADOW_SCALE_SHIFT) + offset); + maddr &= XRANGE_SHADOW_MASK; + switch (xrange) { + case XKPRANGE_CC_SEG: + offset = XKPRANGE_CC_SHADOW_OFFSET; + break; + case XKPRANGE_UC_SEG: + offset = XKPRANGE_UC_SHADOW_OFFSET; + break; + case XKVRANGE_VC_SEG: + offset = XKVRANGE_VC_SHADOW_OFFSET; + break; + default: + WARN_ON(1); + return NULL; } + + return (void *)((maddr >> KASAN_SHADOW_SCALE_SHIFT) + offset); } const void *kasan_shadow_to_mem(const void *shadow_addr) @@ -290,9 +286,6 @@ void __init kasan_init(void) /* Maps everything to a single page of zeroes */ kasan_pgd_populate(KASAN_SHADOW_START, KASAN_SHADOW_END, NUMA_NO_NODE, true); - kasan_populate_early_shadow(kasan_mem_to_shadow((void *)VMALLOC_START), - kasan_mem_to_shadow((void *)KFENCE_AREA_END)); - kasan_early_stage = false; /* Populate the linear mapping */ -- Gitee