summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRussell King (Oracle) <rmk+kernel@armlinux.org.uk>2022-04-21 16:46:13 +0100
committerRussell King (Oracle) <rmk+kernel@armlinux.org.uk>2023-10-14 16:22:44 +0100
commit5b05b079df42df655c3dae352c93d69b01337243 (patch)
treee52b49da6ed9fb46abc87871fdaba897ddc03971
parentfa8b039f930726e48394cb72d4b5fa312184794f (diff)
arm64: text replication: add node 0 page table definitions
Add a struct definition for the level zero page table group (the optional trampoline page tables, reserved page tables, and swapper page tables). Add a symbol and extern declaration for the node 0 page table group. Add an array of pointers to per-node page tables, which will default to using the node 0 page table group. Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
-rw-r--r--arch/arm64/include/asm/pgtable.h14
-rw-r--r--arch/arm64/kernel/vmlinux.lds.S3
-rw-r--r--arch/arm64/mm/ktext.c4
3 files changed, 21 insertions, 0 deletions
diff --git a/arch/arm64/include/asm/pgtable.h b/arch/arm64/include/asm/pgtable.h
index 62caa54f4d21..fe1e2d62beda 100644
--- a/arch/arm64/include/asm/pgtable.h
+++ b/arch/arm64/include/asm/pgtable.h
@@ -615,6 +615,20 @@ extern pgd_t idmap_pg_dir[PTRS_PER_PGD];
extern pgd_t tramp_pg_dir[PTRS_PER_PGD];
extern pgd_t reserved_pg_dir[PTRS_PER_PGD];
+struct pgtables {
+#ifdef CONFIG_UNMAP_KERNEL_AT_EL0
+ pgd_t tramp_pg_dir[PTRS_PER_PGD];
+#endif
+ pgd_t reserved_pg_dir[PTRS_PER_PGD];
+ pgd_t swapper_pg_dir[PTRS_PER_PGD];
+};
+
+extern struct pgtables pgtable_node0;
+
+#ifdef CONFIG_REPLICATE_KTEXT
+extern struct pgtables *pgtables[MAX_NUMNODES];
+#endif
+
extern void set_swapper_pgd(pgd_t *pgdp, pgd_t pgd);
static inline bool in_swapper_pgdir(void *addr)
diff --git a/arch/arm64/kernel/vmlinux.lds.S b/arch/arm64/kernel/vmlinux.lds.S
index 3cd7e76cc562..d3c7ed76adbf 100644
--- a/arch/arm64/kernel/vmlinux.lds.S
+++ b/arch/arm64/kernel/vmlinux.lds.S
@@ -212,6 +212,9 @@ SECTIONS
idmap_pg_dir = .;
. += PAGE_SIZE;
+ /* pgtable struct - covers the tramp, reserved and swapper pgdirs */
+ pgtable_node0 = .;
+
#ifdef CONFIG_UNMAP_KERNEL_AT_EL0
tramp_pg_dir = .;
. += PAGE_SIZE;
diff --git a/arch/arm64/mm/ktext.c b/arch/arm64/mm/ktext.c
index 0017e7760d36..f3b61c73a337 100644
--- a/arch/arm64/mm/ktext.c
+++ b/arch/arm64/mm/ktext.c
@@ -15,6 +15,10 @@
#include <asm/ktext.h>
#include <asm/memory.h>
+struct pgtables *pgtables[MAX_NUMNODES] = {
+ [0 ... MAX_NUMNODES - 1] = &pgtable_node0,
+};
+
static void *kernel_texts[MAX_NUMNODES];
noinstr void ktext_replication_write(void *addr, void *data, size_t size)