5
5
// Use of this source code is governed by a BSD-style license that can be
6
6
// found in the THIRD-PARTY file.
7
7
8
- use std:: collections:: HashMap ;
9
8
use std:: ffi:: CString ;
10
9
use std:: fmt:: Debug ;
11
10
12
11
use vm_fdt:: { Error as VmFdtError , FdtWriter , FdtWriterNode } ;
13
12
use vm_memory:: GuestMemoryError ;
14
13
15
- use super :: super :: DeviceType ;
16
14
use super :: cache_info:: { CacheEntry , read_cache_config} ;
17
15
use super :: gic:: GICDevice ;
18
16
use crate :: device_manager:: mmio:: MMIODeviceInfo ;
@@ -55,12 +53,15 @@ pub enum FdtError {
55
53
WriteFdtToMemory ( #[ from] GuestMemoryError ) ,
56
54
}
57
55
56
+ #[ allow( clippy:: too_many_arguments) ]
58
57
/// Creates the flattened device tree for this aarch64 microVM.
59
58
pub fn create_fdt (
60
59
guest_mem : & GuestMemoryMmap ,
61
60
vcpu_mpidr : Vec < u64 > ,
62
61
cmdline : CString ,
63
- device_info : & HashMap < ( DeviceType , String ) , MMIODeviceInfo > ,
62
+ virtio_devices : Vec < & MMIODeviceInfo > ,
63
+ rtc : Option < & MMIODeviceInfo > ,
64
+ serial : Option < & MMIODeviceInfo > ,
64
65
gic_device : & GICDevice ,
65
66
vmgenid : & Option < VmGenId > ,
66
67
initrd : & Option < InitrdConfig > ,
@@ -89,7 +90,7 @@ pub fn create_fdt(
89
90
create_timer_node ( & mut fdt_writer) ?;
90
91
create_clock_node ( & mut fdt_writer) ?;
91
92
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 ) ?;
93
94
create_vmgenid_node ( & mut fdt_writer, vmgenid) ?;
94
95
95
96
// End Header node.
@@ -411,25 +412,21 @@ fn create_rtc_node(fdt: &mut FdtWriter, dev_info: &MMIODeviceInfo) -> Result<(),
411
412
412
413
fn create_devices_node (
413
414
fdt : & mut FdtWriter ,
414
- dev_info : & HashMap < ( DeviceType , String ) , MMIODeviceInfo > ,
415
+ mut virtio_devices : Vec < & MMIODeviceInfo > ,
416
+ rtc : Option < & MMIODeviceInfo > ,
417
+ serial : Option < & MMIODeviceInfo > ,
415
418
) -> 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) ?;
428
425
}
429
426
430
427
// 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 ( ..) {
433
430
create_virtio_node ( fdt, ordered_device_info) ?;
434
431
}
435
432
@@ -465,43 +462,32 @@ mod tests {
465
462
fn test_create_fdt_with_devices ( ) {
466
463
let mem = arch_mem ( layout:: FDT_MAX_SIZE + 0x1000 ) ;
467
464
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
+
497
481
let kvm = Kvm :: new ( ) . unwrap ( ) ;
498
482
let vm = kvm. create_vm ( ) . unwrap ( ) ;
499
483
let gic = create_gic ( & vm, 1 , None ) . unwrap ( ) ;
500
484
create_fdt (
501
485
& mem,
502
486
vec ! [ 0 ] ,
503
487
CString :: new ( "console=tty0" ) . unwrap ( ) ,
504
- & dev_info,
488
+ vec ! [ & virtio_device] ,
489
+ Some ( & rtc) ,
490
+ Some ( & serial) ,
505
491
& gic,
506
492
& None ,
507
493
& None ,
@@ -521,7 +507,9 @@ mod tests {
521
507
& mem,
522
508
vec ! [ 0 ] ,
523
509
CString :: new ( "console=tty0" ) . unwrap ( ) ,
524
- & HashMap :: < ( DeviceType , std:: string:: String ) , MMIODeviceInfo > :: new ( ) ,
510
+ Vec :: new ( ) ,
511
+ None ,
512
+ None ,
525
513
& gic,
526
514
& Some ( vmgenid) ,
527
515
& None ,
@@ -546,7 +534,9 @@ mod tests {
546
534
& mem,
547
535
vec ! [ 0 ] ,
548
536
CString :: new ( "console=tty0" ) . unwrap ( ) ,
549
- & HashMap :: < ( DeviceType , std:: string:: String ) , MMIODeviceInfo > :: new ( ) ,
537
+ Vec :: new ( ) ,
538
+ None ,
539
+ None ,
550
540
& gic,
551
541
& None ,
552
542
& None ,
@@ -608,7 +598,9 @@ mod tests {
608
598
& mem,
609
599
vec ! [ 0 ] ,
610
600
CString :: new ( "console=tty0" ) . unwrap ( ) ,
611
- & HashMap :: < ( DeviceType , std:: string:: String ) , MMIODeviceInfo > :: new ( ) ,
601
+ vec ! [ ] ,
602
+ None ,
603
+ None ,
612
604
& gic,
613
605
& None ,
614
606
& Some ( initrd) ,
0 commit comments