@@ -4,11 +4,12 @@ use super::AddrSpace;
44use alloc:: { collections:: BTreeMap , string:: String , vec:: Vec } ;
55
66use crate :: {
7- GuestPhysAddr ,
8- arch :: { RunData , cpu :: VCpu } ,
9- config :: AxVMConfig ,
10- vhal:: cpu:: CpuId ,
7+ arch :: cpu :: VCpu ,
8+ config :: { AxVMConfig , MemoryKind } ,
9+ region :: Region ,
10+ vhal:: { cpu:: CpuId , phys_to_virt } ,
1111 vm:: { Status , VmId , VmOps } ,
12+ { GuestPhysAddr , HostPhysAddr , HostVirtAddr } ,
1213} ;
1314
1415const VM_ASPACE_BASE : usize = 0x0 ;
@@ -47,11 +48,6 @@ impl ArchVm {
4748
4849 // Create vCPUs
4950 let mut vcpus = Vec :: new ( ) ;
50- // let dtb_addr = config
51- // .image_config
52- // .dtb_load_gpa
53- // .map(|d| d.as_usize())
54- // .unwrap_or_default();
5551
5652 let dtb_addr = GuestPhysAddr :: from_usize ( 0 ) ;
5753
@@ -94,8 +90,24 @@ impl ArchVm {
9490 )
9591 . map_err ( |e| anyhow:: anyhow!( "Failed to create address space: {:?}" , e) ) ?;
9692
97- // // Initialize devices
98- // let mut devices = BTreeMap::new();
93+ let mut run_data = RunData {
94+ vcpus,
95+ address_space,
96+ regions : Vec :: new ( ) ,
97+ devices : BTreeMap :: new ( ) ,
98+ } ;
99+
100+ debug ! ( "Mapping memory regions for VM {} ({})" , self . id, self . name) ;
101+ for memory_cfg in config. memory_regions {
102+ run_data. add_memory_region ( memory_cfg) ?;
103+ }
104+
105+ debug ! (
106+ "Mapped {} memory regions for VM {} ({})" ,
107+ run_data. regions. len( ) ,
108+ self . id,
109+ self . name
110+ ) ;
99111
100112 // // Add emulated devices
101113 // for emu_device in config.emu_devices() {
@@ -184,11 +196,7 @@ impl ArchVm {
184196 // .map_err(|e| anyhow::anyhow!("Failed to setup vCPU {}: {:?}", vcpu_id, e))?;
185197 // }
186198
187- // self.state = Some(StateMachine::Inited(RunData {
188- // vcpus,
189- // address_space,
190- // devices,
191- // }));
199+ self . state = Some ( StateMachine :: Inited ( run_data) ) ;
192200
193201 Ok ( ( ) )
194202 }
@@ -499,3 +507,36 @@ enum StateMachine {
499507 ShuttingDown ( RunData ) ,
500508 PoweredOff ,
501509}
510+
511+ /// Data needed when VM is running
512+ pub struct RunData {
513+ vcpus : Vec < VCpu > ,
514+ address_space : AddrSpace ,
515+ regions : Vec < Region > ,
516+ devices : BTreeMap < String , DeviceInfo > ,
517+ }
518+
519+ impl RunData {
520+ fn add_memory_region ( & mut self , config : MemoryKind ) -> anyhow:: Result < ( ) > {
521+ let region = Region :: new ( config) ;
522+ self . address_space
523+ . map_linear (
524+ region. gpa . as_usize ( ) . into ( ) ,
525+ region. hva . as_usize ( ) . into ( ) ,
526+ region. size ,
527+ axaddrspace:: MappingFlags :: READ
528+ | axaddrspace:: MappingFlags :: WRITE
529+ | axaddrspace:: MappingFlags :: EXECUTE
530+ | axaddrspace:: MappingFlags :: USER ,
531+ )
532+ . map_err ( |e| anyhow:: anyhow!( "Failed to map memory region: {:?}" , e) ) ?;
533+
534+ self . regions . push ( region) ;
535+
536+ Ok ( ( ) )
537+ }
538+ }
539+
540+ /// Information about a device in the VM
541+ #[ derive( Debug , Clone ) ]
542+ pub struct DeviceInfo { }
0 commit comments