@@ -2,6 +2,7 @@ use crate::acpi;
22use crate :: ap;
33use crate :: apic;
44use crate :: boot_info:: BootInfo ;
5+ use crate :: config;
56use crate :: interrupt;
67use crate :: ioapic;
78use crate :: linux;
@@ -33,10 +34,9 @@ extern "C" {
3334 static IS_MULTIBOOT2_BOOT : u8 ;
3435}
3536
36- // Temporary helper function to create a vm for a single core
37- fn default_vm (
38- core : percore:: CoreId ,
39- mem : u64 ,
37+ // Temporary helper function to create a vm
38+ fn build_vm (
39+ cfg : & config:: UserVmConfig ,
4040 info : & BootInfo ,
4141 add_uart : bool ,
4242) -> Arc < RwLock < vm:: VirtualMachine > > {
@@ -52,8 +52,11 @@ fn default_vm(
5252 }
5353 } ;
5454
55- let mut config =
56- vm:: VirtualMachineConfig :: new ( vec ! [ core] , mem, physical_config) ;
55+ let mut config = vm:: VirtualMachineConfig :: new (
56+ cfg. cpus . clone ( ) ,
57+ cfg. memory ,
58+ physical_config,
59+ ) ;
5760
5861 let mut acpi = acpi:: rsdp:: RSDPBuilder :: < [ _ ; 1024 ] > :: new (
5962 ManagedMap :: Owned ( BTreeMap :: new ( ) ) ,
@@ -112,7 +115,7 @@ fn default_vm(
112115 . register_device ( virtdev:: pos:: ProgrammableOptionSelect :: new ( ) )
113116 . unwrap ( ) ;
114117 device_map
115- . register_device ( virtdev:: rtc:: CmosRtc :: new ( mem ) )
118+ . register_device ( virtdev:: rtc:: CmosRtc :: new ( cfg . memory ) )
116119 . unwrap ( ) ;
117120
118121 //TODO: this should actually be per-vcpu
@@ -141,24 +144,18 @@ fn default_vm(
141144 . expect ( "Failed to build ACPI tables" ) ;
142145
143146 linux:: load_linux (
144- "kernel" ,
145- "initramfs" ,
146- core:: concat!(
147- "rodata=0 nopti disableapic " ,
148- "earlyprintk=serial,0x3f8,115200 " ,
149- "console=ttyS0 debug nokaslr noapic mitigations=off " ,
150- "root=/dev/ram0 rdinit=/bin/sh\0 "
151- )
152- . as_bytes ( ) ,
153- mem,
147+ & cfg. kernel ,
148+ & cfg. initramfs ,
149+ cfg. cmdline . as_bytes ( ) ,
150+ cfg. memory ,
154151 & mut fw_cfg_builder,
155152 info,
156153 )
157154 . unwrap ( ) ;
158155
159156 device_map. register_device ( fw_cfg_builder. build ( ) ) . unwrap ( ) ;
160157
161- vm:: VirtualMachine :: new ( core . raw , config, info)
158+ vm:: VirtualMachine :: new ( cfg . cpus [ 0 ] . raw , config, info)
162159 . expect ( "Failed to create vm" )
163160}
164161
@@ -254,21 +251,28 @@ unsafe fn kmain(mut boot_info: BootInfo) -> ! {
254251
255252 let mut builder = vm:: VirtualMachineBuilder :: new ( ) ;
256253
257- for apic_id in apic_ids. iter ( ) {
254+ let raw_cfg = boot_info
255+ . find_module ( "mythril.cfg" )
256+ . expect ( "Failed to find 'mythril.cfg' in boot information" )
257+ . data ( ) ;
258+
259+ let mythril_cfg: config:: UserConfig = serde_json:: from_slice ( & raw_cfg)
260+ . expect ( "Failed to parse 'mythril.cfg'" ) ;
261+
262+ debug ! ( "mythril.cfg: {:?}" , mythril_cfg) ;
263+
264+ for ( num, vm) in mythril_cfg. vms . into_iter ( ) . enumerate ( ) {
258265 builder
259- . insert_machine ( default_vm (
260- percore:: CoreId :: from ( apic_id. raw ) ,
261- 256 ,
262- & boot_info,
263- apic_id. is_bsp ( ) ,
264- ) )
266+ . insert_machine ( build_vm ( & vm, & boot_info, num == 0 ) )
265267 . expect ( "Failed to insert new vm" ) ;
266268 }
267269
268270 vm:: init_virtual_machines ( builder. finalize ( ) ) ;
269271
270272 debug ! ( "AP_STARTUP address: 0x{:x}" , AP_STARTUP_ADDR ) ;
271273
274+ //TODO(alschwalm): Only the cores that are actually associated with a VM
275+ // should be started
272276 for ( idx, apic_id) in apic_ids. into_iter ( ) . enumerate ( ) {
273277 if apic_id == local_apic. id ( ) {
274278 continue ;
0 commit comments