powerpc64/kasan: Pass virtual addresses to kasan_init_phys_region()
authorBenjamin Gray <bgray@linux.ibm.com>
Mon, 12 Feb 2024 04:50:20 +0000 (15:50 +1100)
committerMichael Ellerman <mpe@ellerman.id.au>
Tue, 7 May 2024 14:28:16 +0000 (00:28 +1000)
The kasan_init_phys_region() function maps shadow pages necessary for
the ranges of the linear map backed by physical pages. Currently
kasan_init_phys_region() is being passed physical addresses, but
kasan_mem_to_shadow() expects virtual addresses.

It works right now because the lower bits (12:64) of the
kasan_mem_to_shadow() calculation are the same for the real and virtual
addresses, so the actual PTE value is the same in the end. But virtual
addresses are the intended input, so fix it.

Signed-off-by: Benjamin Gray <bgray@linux.ibm.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://msgid.link/20240212045020.70364-1-bgray@linux.ibm.com
arch/powerpc/mm/kasan/init_book3e_64.c
arch/powerpc/mm/kasan/init_book3s_64.c

index 11519e88dc6bd9a2444bf061334c049a0496590a..43c03b84ff32d0f711b348b7cec343b13ee49676 100644 (file)
@@ -112,7 +112,7 @@ void __init kasan_init(void)
        pte_t zero_pte = pfn_pte(virt_to_pfn(kasan_early_shadow_page), PAGE_KERNEL_RO);
 
        for_each_mem_range(i, &start, &end)
-               kasan_init_phys_region((void *)start, (void *)end);
+               kasan_init_phys_region(phys_to_virt(start), phys_to_virt(end));
 
        if (IS_ENABLED(CONFIG_KASAN_VMALLOC))
                kasan_remove_zero_shadow((void *)VMALLOC_START, VMALLOC_SIZE);
index 9300d641cf9ae850865007bafeef382027e2dcb1..3fb5ce4f48f41d4f6fc9d19842e7615ec51fe7da 100644 (file)
@@ -62,7 +62,7 @@ void __init kasan_init(void)
        }
 
        for_each_mem_range(i, &start, &end)
-               kasan_init_phys_region((void *)start, (void *)end);
+               kasan_init_phys_region(phys_to_virt(start), phys_to_virt(end));
 
        for (i = 0; i < PTRS_PER_PTE; i++)
                __set_pte_at(&init_mm, (unsigned long)kasan_early_shadow_page,