powerpc/32s: map kasan zero shadow with PAGE_READONLY instead of PAGE_KERNEL_RO
authorChristophe Leroy <christophe.leroy@c-s.fr>
Fri, 26 Apr 2019 16:23:37 +0000 (16:23 +0000)
committerMichael Ellerman <mpe@ellerman.id.au>
Thu, 2 May 2019 15:20:26 +0000 (01:20 +1000)
For hash32, the zero shadow page gets mapped with PAGE_READONLY instead
of PAGE_KERNEL_RO, because the PP bits don't provide a RO kernel, so
PAGE_KERNEL_RO is equivalent to PAGE_KERNEL. By using PAGE_READONLY,
the page is RO for both kernel and user, but this is not a security issue
as it contains only zeroes.

Signed-off-by: Christophe Leroy <christophe.leroy@c-s.fr>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
arch/powerpc/mm/kasan/kasan_init_32.c

index ba8361487075138d40872a01397f3086550f83b3..0d62be3cba47b8f6d22340ccba961800d8b86d4c 100644 (file)
@@ -39,7 +39,10 @@ static int kasan_init_shadow_page_tables(unsigned long k_start, unsigned long k_
 
                if (!new)
                        return -ENOMEM;
-               kasan_populate_pte(new, PAGE_KERNEL_RO);
+               if (early_mmu_has_feature(MMU_FTR_HPTE_TABLE))
+                       kasan_populate_pte(new, PAGE_READONLY);
+               else
+                       kasan_populate_pte(new, PAGE_KERNEL_RO);
                pmd_populate_kernel(&init_mm, pmd, new);
        }
        return 0;
@@ -84,7 +87,10 @@ static int __ref kasan_init_region(void *start, size_t size)
 
 static void __init kasan_remap_early_shadow_ro(void)
 {
-       kasan_populate_pte(kasan_early_shadow_pte, PAGE_KERNEL_RO);
+       if (early_mmu_has_feature(MMU_FTR_HPTE_TABLE))
+               kasan_populate_pte(kasan_early_shadow_pte, PAGE_READONLY);
+       else
+               kasan_populate_pte(kasan_early_shadow_pte, PAGE_KERNEL_RO);
 
        flush_tlb_kernel_range(KASAN_SHADOW_START, KASAN_SHADOW_END);
 }