@@ -274,8 +274,6 @@ pub mod aarch64 {
274274 vcpus. push ( vcpu) ;
275275 }
276276
277- setup_interrupt_controller ( vm, vcpu_count) ?;
278-
279277 Ok ( vcpus)
280278 }
281279
@@ -317,6 +315,9 @@ pub mod aarch64 {
317315 let vcpus = create_vcpus ( & mut vmm. vm , vm_config. vcpu_count , & vmm. vcpus_exit_evt )
318316 . map_err ( StartMicrovmError :: Internal ) ?;
319317
318+ setup_interrupt_controller ( & mut vmm. vm , vm_config. vcpu_count )
319+ . map_err ( StartMicrovmError :: Internal ) ?;
320+
320321 Ok ( ( vmm, vcpus) )
321322 }
322323}
@@ -459,6 +460,11 @@ pub mod x86_64 {
459460 kvm_capabilities,
460461 ) ?;
461462
463+ setup_interrupt_controller ( & mut vmm. vm ) . map_err ( StartMicrovmError :: Internal ) ?;
464+ vmm. pio_device_manager
465+ . register_devices ( vmm. vm . fd ( ) )
466+ . unwrap ( ) ;
467+
462468 let vcpus = create_vcpus ( & mut vmm. vm , vm_config. vcpu_count , & vmm. vcpus_exit_evt )
463469 . map_err ( StartMicrovmError :: Internal ) ?;
464470
@@ -478,9 +484,7 @@ fn build_vmm(
478484 // Set up Kvm Vm and register memory regions.
479485 // Build custom CPU config if a custom template is provided.
480486 //
481- // allow unused_mut for the aarch64 platform.
482- #[ allow( unused_mut) ]
483- let mut vm = Vm :: new ( kvm_capabilities)
487+ let vm = Vm :: new ( kvm_capabilities)
484488 . map_err ( VmmError :: Vm )
485489 . map_err ( Internal ) ?;
486490 vm. memory_init ( & guest_memory, vm_config. track_dirty_pages )
@@ -499,8 +503,6 @@ fn build_vmm(
499503 // Instantiate ACPI device manager.
500504 let acpi_device_manager = ACPIDeviceManager :: new ( ) ;
501505
502- // For x86_64 we need to create the interrupt controller before calling `KVM_CREATE_VCPUS`
503- // while on aarch64 we need to do it the other way around.
504506 #[ cfg( target_arch = "x86_64" ) ]
505507 let pio_device_manager = {
506508 // Serial device setup.
@@ -513,17 +515,9 @@ fn build_vmm(
513515 . map_err ( VmmError :: EventFd )
514516 . map_err ( Internal ) ?;
515517
516- x86_64:: setup_interrupt_controller ( & mut vm) . map_err ( Internal ) ?;
517-
518518 // create pio dev manager with legacy devices
519- let pio_device_manager = {
520- // TODO Remove these unwraps.
521- let mut pio_dev_mgr = PortIODeviceManager :: new ( serial_device, reset_evt) . unwrap ( ) ;
522- pio_dev_mgr. register_devices ( vm. fd ( ) ) . unwrap ( ) ;
523- pio_dev_mgr
524- } ;
525-
526- pio_device_manager
519+ // TODO Remove this unwraps.
520+ PortIODeviceManager :: new ( serial_device, reset_evt) . unwrap ( )
527521 } ;
528522
529523 Ok ( Vmm {
@@ -802,6 +796,7 @@ pub fn build_microvm_from_snapshot(
802796 ) ?;
803797 #[ cfg( target_arch = "x86_64" ) ]
804798 event_manager. add_subscriber ( vmm. pio_device_manager . stdio_serial . clone ( ) ) ;
799+
805800 #[ cfg( target_arch = "aarch64" ) ]
806801 let ( mut vmm, mut vcpus) = aarch64:: create_vmm_and_vcpus (
807802 instance_info,
0 commit comments