From acc97daf225267c7a6123f845cf36f24ec5a49f3 Mon Sep 17 00:00:00 2001 From: "Russell King (Oracle)" Date: Fri, 27 May 2022 13:27:19 +0100 Subject: arm64: text replication: verify kernel text 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) --- arch/arm64/mm/ktext.c | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) 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) -- cgit