55// Use of this source code is governed by a BSD-style license that can be
66// found in the THIRD-PARTY file.
77
8- use std:: collections:: HashMap ;
98use std:: ffi:: CString ;
109use std:: fmt:: Debug ;
1110
1211use vm_fdt:: { Error as VmFdtError , FdtWriter , FdtWriterNode } ;
1312use vm_memory:: GuestMemoryError ;
1413
15- use super :: super :: DeviceType ;
1614use super :: cache_info:: { CacheEntry , read_cache_config} ;
1715use super :: gic:: GICDevice ;
1816use crate :: device_manager:: mmio:: MMIODeviceInfo ;
@@ -55,12 +53,15 @@ pub enum FdtError {
5553 WriteFdtToMemory ( #[ from] GuestMemoryError ) ,
5654}
5755
56+ #[ allow( clippy:: too_many_arguments) ]
5857/// Creates the flattened device tree for this aarch64 microVM.
5958pub fn create_fdt (
6059 guest_mem : & GuestMemoryMmap ,
6160 vcpu_mpidr : Vec < u64 > ,
6261 cmdline : CString ,
63- device_info : & HashMap < ( DeviceType , String ) , MMIODeviceInfo > ,
62+ virtio_devices : Vec < & MMIODeviceInfo > ,
63+ rtc : Option < & MMIODeviceInfo > ,
64+ serial : Option < & MMIODeviceInfo > ,
6465 gic_device : & GICDevice ,
6566 vmgenid : & Option < VmGenId > ,
6667 initrd : & Option < InitrdConfig > ,
@@ -89,7 +90,7 @@ pub fn create_fdt(
8990 create_timer_node ( & mut fdt_writer) ?;
9091 create_clock_node ( & mut fdt_writer) ?;
9192 create_psci_node ( & mut fdt_writer) ?;
92- create_devices_node ( & mut fdt_writer, device_info ) ?;
93+ create_devices_node ( & mut fdt_writer, virtio_devices , rtc , serial ) ?;
9394 create_vmgenid_node ( & mut fdt_writer, vmgenid) ?;
9495
9596 // End Header node.
@@ -411,25 +412,21 @@ fn create_rtc_node(fdt: &mut FdtWriter, dev_info: &MMIODeviceInfo) -> Result<(),
411412
412413fn create_devices_node (
413414 fdt : & mut FdtWriter ,
414- dev_info : & HashMap < ( DeviceType , String ) , MMIODeviceInfo > ,
415+ mut virtio_devices : Vec < & MMIODeviceInfo > ,
416+ rtc : Option < & MMIODeviceInfo > ,
417+ serial : Option < & MMIODeviceInfo > ,
415418) -> Result < ( ) , FdtError > {
416- // Create one temp Vec to store all virtio devices
417- let mut ordered_virtio_device: Vec < & MMIODeviceInfo > = Vec :: new ( ) ;
418-
419- for ( ( device_type, _device_id) , info) in dev_info {
420- match device_type {
421- DeviceType :: BootTimer => ( ) , // since it's not a real device
422- DeviceType :: Rtc => create_rtc_node ( fdt, info) ?,
423- DeviceType :: Serial => create_serial_node ( fdt, info) ?,
424- DeviceType :: Virtio ( _) => {
425- ordered_virtio_device. push ( info) ;
426- }
427- }
419+ if let Some ( device_info) = rtc {
420+ create_rtc_node ( fdt, device_info) ?;
421+ }
422+
423+ if let Some ( device_info) = serial {
424+ create_serial_node ( fdt, device_info) ?;
428425 }
429426
430427 // Sort out virtio devices by address from low to high and insert them into fdt table.
431- ordered_virtio_device . sort_by_key ( |a| a. addr ) ;
432- for ordered_device_info in ordered_virtio_device . drain ( ..) {
428+ virtio_devices . sort_by_key ( |a| a. addr ) ;
429+ for ordered_device_info in virtio_devices . drain ( ..) {
433430 create_virtio_node ( fdt, ordered_device_info) ?;
434431 }
435432
@@ -465,43 +462,32 @@ mod tests {
465462 fn test_create_fdt_with_devices ( ) {
466463 let mem = arch_mem ( layout:: FDT_MAX_SIZE + 0x1000 ) ;
467464
468- let dev_info: HashMap < ( DeviceType , std:: string:: String ) , MMIODeviceInfo > = [
469- (
470- ( DeviceType :: Serial , DeviceType :: Serial . to_string ( ) ) ,
471- MMIODeviceInfo {
472- addr : 0x00 ,
473- irq : NonZeroU32 :: new ( 1 ) ,
474- len : LEN ,
475- } ,
476- ) ,
477- (
478- ( DeviceType :: Virtio ( 1 ) , "virtio" . to_string ( ) ) ,
479- MMIODeviceInfo {
480- addr : LEN ,
481- irq : NonZeroU32 :: new ( 2 ) ,
482- len : LEN ,
483- } ,
484- ) ,
485- (
486- ( DeviceType :: Rtc , "rtc" . to_string ( ) ) ,
487- MMIODeviceInfo {
488- addr : 2 * LEN ,
489- irq : NonZeroU32 :: new ( 3 ) ,
490- len : LEN ,
491- } ,
492- ) ,
493- ]
494- . iter ( )
495- . cloned ( )
496- . collect ( ) ;
465+ let serial = MMIODeviceInfo {
466+ addr : 0x00 ,
467+ irq : NonZeroU32 :: new ( 1 ) ,
468+ len : LEN ,
469+ } ;
470+ let virtio_device = MMIODeviceInfo {
471+ addr : LEN ,
472+ irq : NonZeroU32 :: new ( 2 ) ,
473+ len : LEN ,
474+ } ;
475+ let rtc = MMIODeviceInfo {
476+ addr : 2 * LEN ,
477+ irq : NonZeroU32 :: new ( 3 ) ,
478+ len : LEN ,
479+ } ;
480+
497481 let kvm = Kvm :: new ( ) . unwrap ( ) ;
498482 let vm = kvm. create_vm ( ) . unwrap ( ) ;
499483 let gic = create_gic ( & vm, 1 , None ) . unwrap ( ) ;
500484 create_fdt (
501485 & mem,
502486 vec ! [ 0 ] ,
503487 CString :: new ( "console=tty0" ) . unwrap ( ) ,
504- & dev_info,
488+ vec ! [ & virtio_device] ,
489+ Some ( & rtc) ,
490+ Some ( & serial) ,
505491 & gic,
506492 & None ,
507493 & None ,
@@ -521,7 +507,9 @@ mod tests {
521507 & mem,
522508 vec ! [ 0 ] ,
523509 CString :: new ( "console=tty0" ) . unwrap ( ) ,
524- & HashMap :: < ( DeviceType , std:: string:: String ) , MMIODeviceInfo > :: new ( ) ,
510+ Vec :: new ( ) ,
511+ None ,
512+ None ,
525513 & gic,
526514 & Some ( vmgenid) ,
527515 & None ,
@@ -546,7 +534,9 @@ mod tests {
546534 & mem,
547535 vec ! [ 0 ] ,
548536 CString :: new ( "console=tty0" ) . unwrap ( ) ,
549- & HashMap :: < ( DeviceType , std:: string:: String ) , MMIODeviceInfo > :: new ( ) ,
537+ Vec :: new ( ) ,
538+ None ,
539+ None ,
550540 & gic,
551541 & None ,
552542 & None ,
@@ -608,7 +598,9 @@ mod tests {
608598 & mem,
609599 vec ! [ 0 ] ,
610600 CString :: new ( "console=tty0" ) . unwrap ( ) ,
611- & HashMap :: < ( DeviceType , std:: string:: String ) , MMIODeviceInfo > :: new ( ) ,
601+ vec ! [ ] ,
602+ None ,
603+ None ,
612604 & gic,
613605 & None ,
614606 & Some ( initrd) ,
0 commit comments