[PATCH v2 6/9] kho: support read-only KHO mode in KHO core

From: Pasha Tatashin

Date: Sun Oct 25 2026 - 13:42:49 EST


When booted with 'kho_ro=<pa>', skip standard KHO bootmem and FDT
ingestion in kho_populate() before early_param parsing runs, disable
standard KHO in kho_memory_init() once early parameters are parsed, and
use kho_ro_get_fdt() in kho_retrieve_subtree().

Signed-off-by: Pasha Tatashin <pasha.tatashin@xxxxxxxxxx>
---
kernel/liveupdate/kexec_handover.c | 8 ++++++++
kernel/liveupdate/kexec_handover_common.c | 2 +-
2 files changed, 9 insertions(+), 1 deletion(-)

diff --git a/kernel/liveupdate/kexec_handover.c b/kernel/liveupdate/kexec_handover.c
index 67efbdd39439..cc56caeecba7 100644
--- a/kernel/liveupdate/kexec_handover.c
+++ b/kernel/liveupdate/kexec_handover.c
@@ -1819,6 +1819,11 @@ void __init kho_memory_init_early(void)

void __init kho_memory_init(void)
{
+ if (kho_is_ro()) {
+ kho_enable = false;
+ return;
+ }
+
if (is_kdump_kernel()) {
kho_enable = false;
pr_info("disabled in the kdump kernel\n");
@@ -1841,6 +1846,9 @@ void __init kho_populate(phys_addr_t fdt_phys, u64 fdt_len,
bool populated = false;
int err;

+ if (kho_ro_cmdline_enabled())
+ return;
+
/* Validate the input FDT */
fdt = early_memremap(fdt_phys, fdt_len);
if (!fdt) {
diff --git a/kernel/liveupdate/kexec_handover_common.c b/kernel/liveupdate/kexec_handover_common.c
index dc25cb4c08af..a9bc8d45d3ba 100644
--- a/kernel/liveupdate/kexec_handover_common.c
+++ b/kernel/liveupdate/kexec_handover_common.c
@@ -263,7 +263,7 @@ phys_addr_t __init kho_get_mem_map_phys(const void *fdt)
*/
int kho_retrieve_subtree(const char *name, phys_addr_t *phys, size_t *size)
{
- const void *fdt = kho_get_fdt();
+ const void *fdt = kho_is_ro() ? kho_ro_get_fdt() : kho_get_fdt();
const u64 *val;
int offset, len;

--
2.56.0.307.g5fe7bd680c-goog