[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <20220126173011.3476262-3-ardb@kernel.org>
Date: Wed, 26 Jan 2022 18:30:01 +0100
From: Ard Biesheuvel <ardb@...nel.org>
To: linux-arm-kernel@...ts.infradead.org
Cc: kvmarm@...ts.cs.columbia.edu, linux-hardening@...r.kernel.org,
Ard Biesheuvel <ardb@...nel.org>,
Will Deacon <will@...nel.org>, Marc Zyngier <maz@...nel.org>,
Fuad Tabba <tabba@...gle.com>,
Quentin Perret <qperret@...gle.com>,
Mark Rutland <mark.rutland@....com>,
James Morse <james.morse@....com>,
Catalin Marinas <catalin.marinas@....com>
Subject: [RFC PATCH 02/12] arm64: mm: add helpers to remap page tables read-only/read-write
Add a couple of helpers to remap a single page read-only or read-write
via its linear address. This will be used for mappings of page table
pages in the linear region.
Note that set_memory_ro/set_memory_rw operate on addresses in the
vmalloc space only, so they cannot be used here.
Signed-off-by: Ard Biesheuvel <ardb@...nel.org>
---
arch/arm64/include/asm/pgtable.h | 3 +++
arch/arm64/mm/pageattr.c | 14 ++++++++++++++
2 files changed, 17 insertions(+)
diff --git a/arch/arm64/include/asm/pgtable.h b/arch/arm64/include/asm/pgtable.h
index c4ba047a82d2..8d3806c68687 100644
--- a/arch/arm64/include/asm/pgtable.h
+++ b/arch/arm64/include/asm/pgtable.h
@@ -34,6 +34,9 @@
#include <linux/mm_types.h>
#include <linux/sched.h>
+int set_pgtable_ro(void *addr);
+int set_pgtable_rw(void *addr);
+
#ifdef CONFIG_TRANSPARENT_HUGEPAGE
#define __HAVE_ARCH_FLUSH_PMD_TLB_RANGE
diff --git a/arch/arm64/mm/pageattr.c b/arch/arm64/mm/pageattr.c
index a3bacd79507a..61f4aca08b95 100644
--- a/arch/arm64/mm/pageattr.c
+++ b/arch/arm64/mm/pageattr.c
@@ -153,6 +153,20 @@ int set_memory_valid(unsigned long addr, int numpages, int enable)
__pgprot(PTE_VALID));
}
+int set_pgtable_ro(void *addr)
+{
+ return __change_memory_common((u64)addr, PAGE_SIZE,
+ __pgprot(PTE_RDONLY),
+ __pgprot(PTE_WRITE));
+}
+
+int set_pgtable_rw(void *addr)
+{
+ return __change_memory_common((u64)addr, PAGE_SIZE,
+ __pgprot(PTE_WRITE),
+ __pgprot(PTE_RDONLY));
+}
+
int set_direct_map_invalid_noflush(struct page *page)
{
struct page_change_data data = {
--
2.30.2
Powered by blists - more mailing lists