From 9f684d04e46c634b3ac38108744c4bf968dc7fa2 Mon Sep 17 00:00:00 2001 From: Yifan Liu Date: Fri, 7 Nov 2025 05:17:09 +0000 Subject: [PATCH] hv: fdt: Add API to set kernel boot args Set kernel bootargs through FDT path "/chosen/bootargs". Tracked-On: #8841 Signed-off-by: Yifan Liu Acked-by: Wang Yu1 --- hypervisor/common/fdt.c | 15 +++++++++++++++ hypervisor/common/vfdt.c | 18 +++++++++++++++--- hypervisor/include/common/fdt_api.h | 1 + 3 files changed, 31 insertions(+), 3 deletions(-) diff --git a/hypervisor/common/fdt.c b/hypervisor/common/fdt.c index 82692b462..331fd6ec6 100644 --- a/hypervisor/common/fdt.c +++ b/hypervisor/common/fdt.c @@ -170,6 +170,21 @@ int fdt_add_rsvd_node(void *fdt, uint64_t addr, uint64_t size) return ret; } +int fdt_set_kernel_bootargs(void *fdt, const char *bootargs) +{ + int node, ret = 0; + + node = fdt_path_offset(fdt, "/chosen"); + if (node == -FDT_ERR_NOTFOUND) { + node = fdt_add_subnode(fdt, 0, "/chosen"); + } + + if (node > 0) { + ret = fdt_setprop_string(fdt, node, "bootargs", bootargs); + } + return ret; +} + void init_devtree(uint64_t fdt_paddr) { void *fdt = hpa2hva_early(fdt_paddr); diff --git a/hypervisor/common/vfdt.c b/hypervisor/common/vfdt.c index eaffd2aa7..32d13303f 100644 --- a/hypervisor/common/vfdt.c +++ b/hypervisor/common/vfdt.c @@ -11,6 +11,20 @@ #include #include +void init_vm_vfdt_common(struct acrn_vm *vm) +{ + struct acrn_vm_config *vm_config = get_vm_config(vm->vm_id); + void *fdt = vm_get_vfdt(vm); + + if (vm_config->os_config.bootargs[0] != '\0') { + fdt_set_kernel_bootargs(fdt, vm_config->os_config.bootargs); + } + + vm->sw.fdt_info.src_addr = fdt; + vm->sw.fdt_info.size = fdt_totalsize(fdt); + /* load addr is initialized in image loader */ +} + void init_service_vm_vfdt(struct acrn_vm *vm) { void *fdt = vm_get_vfdt(vm); @@ -44,7 +58,5 @@ void init_service_vm_vfdt(struct acrn_vm *vm) arch_init_service_vm_vfdt(vm); - vm->sw.fdt_info.src_addr = fdt; - vm->sw.fdt_info.size = fdt_totalsize(fdt); - /* load addr is initialized in image loader */ + init_vm_vfdt_common(vm); } diff --git a/hypervisor/include/common/fdt_api.h b/hypervisor/include/common/fdt_api.h index 5bf426098..431c1480f 100644 --- a/hypervisor/include/common/fdt_api.h +++ b/hypervisor/include/common/fdt_api.h @@ -18,5 +18,6 @@ uint8_t *get_host_fdt(void); int fdt_get_phys_mem_region(const void *fdt, uint64_t *addr_out, uint64_t *size_out); int fdt_get_rsvd_mem_regions(const void *fdt, struct mem_region *out_region, int *out_nr_region); int fdt_add_rsvd_node(void *fdt, uint64_t addr, uint64_t size); +int fdt_set_kernel_bootargs(void *fdt, const char *bootargs); #endif /* FDT_API_H */