Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4c0f5d1e authored by Christophe Leroy's avatar Christophe Leroy Committed by Michael Ellerman
Browse files

powerpc/mm: Add a helper to select PAGE_KERNEL_RO or PAGE_READONLY



In a couple of places there is a need to select whether read-only
protection of shadow pages is performed with PAGE_KERNEL_RO or with
PAGE_READONLY.

Add a helper to avoid duplicating the choice.

Signed-off-by: default avatarChristophe Leroy <christophe.leroy@c-s.fr>
Cc: stable@vger.kernel.org
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/9f33f44b9cd741c4a02b3dce7b8ef9438fe2cd2a.1566382750.git.christophe.leroy@c-s.fr
parent 13c7bb3c
Loading
Loading
Loading
Loading
+13 −8
Original line number Diff line number Diff line
@@ -12,6 +12,14 @@
#include <asm/code-patching.h>
#include <mm/mmu_decl.h>

static pgprot_t kasan_prot_ro(void)
{
	if (early_mmu_has_feature(MMU_FTR_HPTE_TABLE))
		return PAGE_READONLY;

	return PAGE_KERNEL_RO;
}

static void kasan_populate_pte(pte_t *ptep, pgprot_t prot)
{
	unsigned long va = (unsigned long)kasan_early_shadow_page;
@@ -26,6 +34,7 @@ static int __ref kasan_init_shadow_page_tables(unsigned long k_start, unsigned l
{
	pmd_t *pmd;
	unsigned long k_cur, k_next;
	pgprot_t prot = kasan_prot_ro();

	pmd = pmd_offset(pud_offset(pgd_offset_k(k_start), k_start), k_start);

@@ -43,10 +52,7 @@ static int __ref kasan_init_shadow_page_tables(unsigned long k_start, unsigned l

		if (!new)
			return -ENOMEM;
		if (early_mmu_has_feature(MMU_FTR_HPTE_TABLE))
			kasan_populate_pte(new, PAGE_READONLY);
		else
			kasan_populate_pte(new, PAGE_KERNEL_RO);
		kasan_populate_pte(new, prot);

		smp_wmb(); /* See comment in __pte_alloc */

@@ -103,10 +109,9 @@ static int __ref kasan_init_region(void *start, size_t size)

static void __init kasan_remap_early_shadow_ro(void)
{
	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);
	pgprot_t prot = kasan_prot_ro();

	kasan_populate_pte(kasan_early_shadow_pte, prot);

	flush_tlb_kernel_range(KASAN_SHADOW_START, KASAN_SHADOW_END);
}