@@ -14,13 +14,6 @@ use std::sync::{Arc, Mutex};
1414use event_manager:: { MutEventSubscriber , SubscriberOps } ;
1515use libc:: EFD_NONBLOCK ;
1616use linux_loader:: cmdline:: Cmdline as LoaderKernelCmdline ;
17- use linux_loader:: loader:: KernelLoader ;
18- #[ cfg( target_arch = "x86_64" ) ]
19- use linux_loader:: loader:: elf:: Elf as Loader ;
20- #[ cfg( target_arch = "x86_64" ) ]
21- use linux_loader:: loader:: elf:: PvhBootCapability ;
22- #[ cfg( target_arch = "aarch64" ) ]
23- use linux_loader:: loader:: pe:: PE as Loader ;
2417use userfaultfd:: Uffd ;
2518use utils:: time:: TimestampUs ;
2619#[ cfg( target_arch = "aarch64" ) ]
@@ -30,7 +23,7 @@ use vmm_sys_util::eventfd::EventFd;
3023
3124#[ cfg( target_arch = "x86_64" ) ]
3225use crate :: acpi;
33- use crate :: arch:: { BootProtocol , EntryPoint } ;
26+ use crate :: arch:: { ConfigurationError , EntryPoint , load_kernel } ;
3427#[ cfg( target_arch = "aarch64" ) ]
3528use crate :: construct_kvm_mpidrs;
3629use crate :: cpu_config:: templates:: {
@@ -66,11 +59,10 @@ use crate::persist::{MicrovmState, MicrovmStateError};
6659use crate :: resources:: VmResources ;
6760use crate :: seccomp:: BpfThreadMap ;
6861use crate :: snapshot:: Persist ;
69- use crate :: vmm_config:: boot_source:: BootConfig ;
7062use crate :: vmm_config:: instance_info:: InstanceInfo ;
7163use crate :: vmm_config:: machine_config:: { MachineConfig , MachineConfigError } ;
7264use crate :: vstate:: kvm:: Kvm ;
73- use crate :: vstate:: memory:: { GuestAddress , GuestMemoryMmap } ;
65+ use crate :: vstate:: memory:: GuestMemoryMmap ;
7466use crate :: vstate:: vcpu:: { Vcpu , VcpuConfig , VcpuError } ;
7567use crate :: vstate:: vm:: Vm ;
7668use crate :: { EventManager , Vmm , VmmError , device_manager} ;
@@ -83,7 +75,7 @@ pub enum StartMicrovmError {
8375 /// Unable to attach the VMGenID device: {0}
8476 AttachVmgenidDevice ( kvm_ioctls:: Error ) ,
8577 /// System configuration error: {0}
86- ConfigureSystem ( crate :: arch :: ConfigurationError ) ,
78+ ConfigureSystem ( ConfigurationError ) ,
8779 /// Failed to create guest config: {0}
8880 CreateGuestConfig ( #[ from] GuestConfigError ) ,
8981 /// Cannot create network device: {0}
@@ -105,8 +97,6 @@ pub enum StartMicrovmError {
10597 GetCpuTemplate ( #[ from] GetCpuTemplateError ) ,
10698 /// Invalid kernel command line: {0}
10799 KernelCmdline ( String ) ,
108- /// Cannot load kernel due to invalid memory configuration or invalid kernel image: {0}
109- KernelLoader ( linux_loader:: loader:: Error ) ,
110100 /// Cannot load command line string: {0}
111101 LoadCommandline ( linux_loader:: loader:: Error ) ,
112102 /// Cannot start microvm without kernel configuration.
@@ -236,7 +226,8 @@ pub fn build_microvm_for_boot(
236226 . allocate_guest_memory ( )
237227 . map_err ( StartMicrovmError :: GuestMemory ) ?;
238228
239- let entry_point = load_kernel ( boot_config, & guest_memory) ?;
229+ let entry_point =
230+ load_kernel ( & boot_config. kernel_file , & guest_memory) . map_err ( ConfigureSystem ) ?;
240231 let initrd = InitrdConfig :: from_config ( boot_config, & guest_memory) . map_err ( Initrd ) ?;
241232 // Clone the command-line so that a failed boot doesn't pollute the original.
242233 #[ allow( unused_mut) ]
@@ -541,64 +532,6 @@ pub fn build_microvm_from_snapshot(
541532 Ok ( vmm)
542533}
543534
544- #[ cfg( target_arch = "x86_64" ) ]
545- fn load_kernel (
546- boot_config : & BootConfig ,
547- guest_memory : & GuestMemoryMmap ,
548- ) -> Result < EntryPoint , StartMicrovmError > {
549- let mut kernel_file = boot_config
550- . kernel_file
551- . try_clone ( )
552- . map_err ( VmmError :: KernelFile ) ?;
553-
554- let entry_addr = Loader :: load :: < std:: fs:: File , GuestMemoryMmap > (
555- guest_memory,
556- None ,
557- & mut kernel_file,
558- Some ( GuestAddress ( crate :: arch:: get_kernel_start ( ) ) ) ,
559- )
560- . map_err ( StartMicrovmError :: KernelLoader ) ?;
561-
562- let mut entry_point_addr: GuestAddress = entry_addr. kernel_load ;
563- let mut boot_prot: BootProtocol = BootProtocol :: LinuxBoot ;
564- if let PvhBootCapability :: PvhEntryPresent ( pvh_entry_addr) = entry_addr. pvh_boot_cap {
565- // Use the PVH kernel entry point to boot the guest
566- entry_point_addr = pvh_entry_addr;
567- boot_prot = BootProtocol :: PvhBoot ;
568- }
569-
570- debug ! ( "Kernel loaded using {boot_prot}" ) ;
571-
572- Ok ( EntryPoint {
573- entry_addr : entry_point_addr,
574- protocol : boot_prot,
575- } )
576- }
577-
578- #[ cfg( target_arch = "aarch64" ) ]
579- fn load_kernel (
580- boot_config : & BootConfig ,
581- guest_memory : & GuestMemoryMmap ,
582- ) -> Result < EntryPoint , StartMicrovmError > {
583- let mut kernel_file = boot_config
584- . kernel_file
585- . try_clone ( )
586- . map_err ( VmmError :: KernelFile ) ?;
587-
588- let entry_addr = Loader :: load :: < std:: fs:: File , GuestMemoryMmap > (
589- guest_memory,
590- Some ( GuestAddress ( crate :: arch:: get_kernel_start ( ) ) ) ,
591- & mut kernel_file,
592- None ,
593- )
594- . map_err ( StartMicrovmError :: KernelLoader ) ?;
595-
596- Ok ( EntryPoint {
597- entry_addr : entry_addr. kernel_load ,
598- protocol : BootProtocol :: LinuxBoot ,
599- } )
600- }
601-
602535/// Sets up the serial device.
603536pub fn setup_serial_device (
604537 event_manager : & mut EventManager ,
@@ -725,7 +658,7 @@ pub fn configure_system_for_boot(
725658
726659 linux_loader:: loader:: load_cmdline :: < crate :: vstate:: memory:: GuestMemoryMmap > (
727660 vmm. guest_memory ( ) ,
728- GuestAddress ( crate :: arch:: x86_64:: layout:: CMDLINE_START ) ,
661+ crate :: vstate :: memory :: GuestAddress ( crate :: arch:: x86_64:: layout:: CMDLINE_START ) ,
729662 & boot_cmdline,
730663 )
731664 . map_err ( LoadCommandline ) ?;
0 commit comments