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-12 10:52:14 +0100 |
commit | 9c39f8df28f65c151fd3c0a4c9ad880950c7ebc6 (patch) | |
tree | 80033f9a44f63f98cda39699b283c8667c4c165c | |
parent | 1bbbd0034ceb0ddd05a5a344bb148193252ba535 (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; + } } |