From 2ce3a01a6fb1b111ff128553a7a86d1121ab5281 Mon Sep 17 00:00:00 2001 From: Alex Zenla Date: Mon, 13 May 2024 23:54:57 -0700 Subject: [PATCH] implement initrd loading for pvh --- crates/xen/xenclient/src/boot.rs | 5 +++-- crates/xen/xenclient/src/x86pvh.rs | 10 ++++++++-- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/crates/xen/xenclient/src/boot.rs b/crates/xen/xenclient/src/boot.rs index 376b882..bbf4497 100644 --- a/crates/xen/xenclient/src/boot.rs +++ b/crates/xen/xenclient/src/boot.rs @@ -208,14 +208,15 @@ impl BootSetup { kernel_segment = Some(self.load_kernel_segment(&mut domain).await?); } - self.platform.alloc_magic_pages(&mut domain).await?; - if domain.image_info.unmapped_initrd { initrd_segment = Some(domain.alloc_module(initrd).await?); } domain.initrd_segment = initrd_segment.ok_or(Error::MemorySetupFailed("initrd_segment missing"))?; + + self.platform.alloc_magic_pages(&mut domain).await?; + domain.store_evtchn = self.call.evtchn_alloc_unbound(self.domid, 0).await?; let _kernel_segment = diff --git a/crates/xen/xenclient/src/x86pvh.rs b/crates/xen/xenclient/src/x86pvh.rs index dce218f..d39d794 100644 --- a/crates/xen/xenclient/src/x86pvh.rs +++ b/crates/xen/xenclient/src/x86pvh.rs @@ -631,6 +631,10 @@ impl BootSetupPlatform for X86PvhPlatform { ) .await?; + if domain.cmdline.chars().count() > HVM_START_MAX_CMDLINE_SIZE - 1 { + return Err(Error::GenericError("kernel cmdline too large".to_string())); + } + let mut start_info_size = size_of::(); start_info_size += HVM_START_MAX_CMDLINE_SIZE; start_info_size += size_of::() * HVM_START_MAX_MEMMAP_ENTRIES; @@ -705,8 +709,10 @@ impl BootSetupPlatform for X86PvhPlatform { (*info).rsdp_paddr = self.acpi_modules[0].guest_addr; (*info).nr_modules = 1; (*info).modlist_paddr = (start_info_segment.pfn << self.page_shift()) - + size_of::() as u64 - + (size_of::() * HVM_START_MAX_MEMMAP_ENTRIES) as u64; + + (size_of::() + + HVM_START_MAX_CMDLINE_SIZE + + (size_of::() * HVM_START_MAX_MEMMAP_ENTRIES)) + as u64; }; let cmdline_ptr = (ptr + size_of::() as u64) as *mut u8; for (i, c) in domain.cmdline.chars().enumerate() {