diff options
author | Russell King (Oracle) <rmk+kernel@armlinux.org.uk> | 2022-04-21 16:09:57 +0100 |
---|---|---|
committer | Russell King (Oracle) <rmk+kernel@armlinux.org.uk> | 2023-10-30 12:55:57 +0000 |
commit | 04d79b59295624ca50691ba4c45d1eda6c4db80f (patch) | |
tree | 540af697ec5435405da056dfe1cbc0b3be499bac | |
parent | 661b061bd90889a0b5a51f8616e407c414f938cb (diff) |
arm64: text replication: add sanity checks
The kernel text and modules must be in separate L0 page table entries.
Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
-rw-r--r-- | arch/arm64/mm/ktext.c | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/arch/arm64/mm/ktext.c b/arch/arm64/mm/ktext.c index 3a8d37c9abc4..901f159c65e6 100644 --- a/arch/arm64/mm/ktext.c +++ b/arch/arm64/mm/ktext.c @@ -3,6 +3,27 @@ * Copyright (C) 2022, Oracle and/or its affiliates. */ +#include <linux/kernel.h> +#include <linux/pgtable.h> + +#include <asm/ktext.h> +#include <asm/memory.h> + void __init ktext_replication_init(void) { + int kidx = pgd_index((phys_addr_t)KERNEL_START); + + /* + * If we've messed up and the kernel shares a L0 entry with the + * module or vmalloc area, then don't even attempt to use text + * replication. + */ + if (pgd_index(MODULES_VADDR) == kidx) { + pr_warn("Kernel is located in the same L0 index as modules - text replication disabled\n"); + return; + } + if (pgd_index(VMALLOC_START) == kidx) { + pr_warn("Kernel is located in the same L0 index as vmalloc - text replication disabled\n"); + return; + } } |