diff options
author | Russell King (Oracle) <rmk+kernel@armlinux.org.uk> | 2022-05-27 13:27:19 +0100 |
---|---|---|
committer | Russell King (Oracle) <rmk+kernel@armlinux.org.uk> | 2023-10-11 18:15:52 +0100 |
commit | 7fa946ce05c273d5ff092c814efe64978e5faf45 (patch) | |
tree | d6c7da0fb4e2c07b3ee78c172bcf8f44f47bf220 /arch | |
parent | 460488c7f4c09ae8257b056945e0dd375fe6794b (diff) |
arm64: text replication: verify kernel textaarch64/ktext/v6.5
Verify that the replicated kernel image for the non-boot nodes matches
the boot kernel image, and report differences found. This ensures that
the non-boot modes are running an identical copy of the kernel.
Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
Diffstat (limited to 'arch')
-rw-r--r-- | arch/arm64/mm/ktext.c | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/arch/arm64/mm/ktext.c b/arch/arm64/mm/ktext.c index d29497c37da9..d9d7c0bb064d 100644 --- a/arch/arm64/mm/ktext.c +++ b/arch/arm64/mm/ktext.c @@ -124,6 +124,43 @@ void ktext_replication_patch_alternative(__le32 *src, int nr_inst) } } +static int __init ktext_replication_check(void) +{ + size_t size = _etext - _stext; + int nid; + + preempt_disable(); + pr_info("CPU%u: Checking ktext replication\n", smp_processor_id()); + + for_each_node(nid) { + if (!kernel_texts[nid]) + continue; + + if (memcmp(_stext, kernel_texts[nid], size)) { + u32 *st, *kt; + size_t i, n; + + pr_err("NID%u: kernel text disagreement\n", nid); + + st = (u32 *)_stext; + kt = kernel_texts[nid]; + for (i = n = 0; i < size / 4; i ++) { + if (st[i] != kt[i]) { + pr_err("Offset 0x%zx: 0x%08x != 0x%08x\n", + i * 4, st[i], kt[i]); + if (n++ > 8) + break; + } + } + } + } + preempt_enable(); + + return 0; +} +late_initcall(ktext_replication_check); + + static bool ktext_enabled = IS_ENABLED(CONFIG_REPLICATE_KTEXT_DEFAULT); static int __init parse_ktext(char *str) |