5454#include " cuttlefish/host/commands/assemble_cvd/flags/initramfs_path.h"
5555#include " cuttlefish/host/commands/assemble_cvd/flags/kernel_path.h"
5656#include " cuttlefish/host/commands/assemble_cvd/flags/system_image_dir.h"
57+ #include " cuttlefish/host/commands/assemble_cvd/flags/vm_manager.h"
5758#include " cuttlefish/host/commands/assemble_cvd/graphics_flags.h"
5859#include " cuttlefish/host/commands/assemble_cvd/guest_config.h"
5960#include " cuttlefish/host/commands/assemble_cvd/network_flags.h"
@@ -410,31 +411,16 @@ Result<CuttlefishConfig> InitializeCuttlefishConfiguration(
410411 auto instance_nums =
411412 CF_EXPECT (InstanceNumsCalculator ().FromGlobalGflags ().Calculate ());
412413
413- // TODO(weihsu), b/250988697:
414- // FLAGS_vm_manager used too early, have to handle this vectorized string early
415- // Currently, all instances should use same vmm, added checking here
416- std::vector<std::string> vm_manager_vec =
417- android::base::Split (FLAGS_vm_manager, " ," );
418- for (int i=1 ; i<vm_manager_vec.size (); i++) {
419- CF_EXPECT (
420- vm_manager_vec[0 ] == vm_manager_vec[i],
421- " All instances should have same vm_manager, " << FLAGS_vm_manager);
422- }
423- CF_EXPECT_GT (vm_manager_vec.size (), 0 );
424- while (vm_manager_vec.size () < instance_nums.size ()) {
425- vm_manager_vec.emplace_back (vm_manager_vec[0 ]);
426- }
427-
428414 // TODO(weihsu), b/250988697: moved bootconfig_supported and hctr2_supported
429415 // into each instance, but target_arch is still in todo
430416 // target_arch should be in instance later
431- auto vmm_mode = CF_EXPECT ( ParseVmm (vm_manager_vec[ 0 ]));
432- auto vmm = GetVmManager (vmm_mode, guest_configs[ 0 ]. target_arch );
433- if (! vmm) {
434- LOG (FATAL) << " Invalid vm_manager: " << vm_manager_vec [0 ];
435- }
436- tmp_config_obj.set_vm_manager (vmm_mode);
437- tmp_config_obj. set_ap_vm_manager (vm_manager_vec[ 0 ] + " _openwrt" );
417+ VmManagerFlag vm_manager_flag =
418+ CF_EXPECT ( VmManagerFlag::FromGlobalGflags ( guest_configs) );
419+ std::unique_ptr<vm_manager::VmManager> vmm =
420+ GetVmManager (vm_manager_flag. Mode (), guest_configs [0 ]. target_arch ) ;
421+ tmp_config_obj. set_vm_manager (vm_manager_flag. Mode ());
422+ tmp_config_obj.set_ap_vm_manager ( ToString (vm_manager_flag. Mode ()) +
423+ " _openwrt" );
438424
439425 // TODO: schuffelen - fix behavior on riscv64
440426 if (guest_configs[0 ].target_arch == Arch::RiscV64) {
@@ -1092,7 +1078,7 @@ Result<CuttlefishConfig> InitializeCuttlefishConfiguration(
10921078 gpu_renderer_features_vec[instance_index],
10931079 gpu_context_types_vec[instance_index],
10941080 guest_hwui_renderer_vec[instance_index],
1095- guest_renderer_preload_vec[instance_index], vmm_mode ,
1081+ guest_renderer_preload_vec[instance_index], vm_manager_flag. Mode () ,
10961082 guest_configs[instance_index], instance));
10971083 calculated_gpu_mode_vec[instance_index] = gpu_mode_vec[instance_index];
10981084
@@ -1175,7 +1161,7 @@ Result<CuttlefishConfig> InitializeCuttlefishConfiguration(
11751161
11761162 bool os_overlay = true ;
11771163 // Gem5 already uses CoW wrappers around disk images
1178- os_overlay &= vmm_mode != VmmMode::kGem5 ;
1164+ os_overlay &= vm_manager_flag. Mode () != VmmMode::kGem5 ;
11791165 os_overlay &= FLAGS_use_overlay;
11801166 if (os_overlay) {
11811167 auto path = const_instance.PerInstancePath (" overlay.img" );
@@ -1184,7 +1170,7 @@ Result<CuttlefishConfig> InitializeCuttlefishConfiguration(
11841170 virtual_disk_paths.push_back (const_instance.os_composite_disk_path ());
11851171 }
11861172
1187- bool persistent_disk = vmm_mode != VmmMode::kGem5 ;
1173+ bool persistent_disk = vm_manager_flag. Mode () != VmmMode::kGem5 ;
11881174 if (persistent_disk) {
11891175#ifdef __APPLE__
11901176 const std::string persistent_composite_img_base =
@@ -1305,7 +1291,7 @@ Result<CuttlefishConfig> InitializeCuttlefishConfiguration(
13051291 auto external_network_mode = CF_EXPECT (
13061292 ParseExternalNetworkMode (device_external_network_vec[instance_index]));
13071293 CF_EXPECT (external_network_mode == ExternalNetworkMode::kTap ||
1308- vmm_mode == VmmMode::kQemu ,
1294+ vm_manager_flag. Mode () == VmmMode::kQemu ,
13091295 " TODO(b/286284441): slirp only works on QEMU" );
13101296 instance.set_external_network_mode (external_network_mode);
13111297
@@ -1601,50 +1587,30 @@ Result<std::vector<GuestConfig>> GetGuestConfigAndSetDefaults(
16011587 std::vector<GuestConfig> guest_configs =
16021588 CF_EXPECT (ReadGuestConfig (boot_image, kernel_path, system_image_dir));
16031589
1604- // TODO(weihsu), b/250988697:
1605- // assume all instances are using same VM manager/app/arch,
1606- // later that multiple instances may use different VM manager/app/arch
1607-
1608- // Temporary add this checking to make sure all instances have same target_arch.
1609- // This checking should be removed later.
1610- for (int instance_index = 1 ; instance_index < guest_configs.size (); instance_index++) {
1611- CF_EXPECT (guest_configs[0 ].target_arch == guest_configs[instance_index].target_arch ,
1612- " all instance target_arch should be same" );
1613- }
1614- if (FLAGS_vm_manager.empty ()) {
1615- if (IsHostCompatible (guest_configs[0 ].target_arch )) {
1616- FLAGS_vm_manager = ToString (VmmMode::kCrosvm );
1617- } else {
1618- FLAGS_vm_manager = ToString (VmmMode::kQemu );
1619- }
1620- }
1621-
1622- std::vector<std::string> vm_manager_vec =
1623- android::base::Split (FLAGS_vm_manager, " ," );
1624-
1625- // TODO(weihsu), b/250988697:
1626- // Currently, all instances should use same vmm
1627- auto vmm = CF_EXPECT (ParseVmm (vm_manager_vec[0 ]));
1590+ VmManagerFlag vm_manager_flag =
1591+ CF_EXPECT (VmManagerFlag::FromGlobalGflags (guest_configs));
16281592
16291593 // get flag default values and store into map
16301594 auto name_to_default_value = CurrentFlagsToDefaultValue ();
16311595
1632- if (vmm == VmmMode::kQemu ) {
1633- CF_EXPECT (SetDefaultFlagsForQemu (system_image_dir, guest_configs,
1634- name_to_default_value));
1635- } else if (vmm == VmmMode::kCrosvm ) {
1636- CF_EXPECT (SetDefaultFlagsForCrosvm (system_image_dir, guest_configs,
1596+ switch (vm_manager_flag.Mode ()) {
1597+ case VmmMode::kQemu :
1598+ CF_EXPECT (SetDefaultFlagsForQemu (system_image_dir, guest_configs,
16371599 name_to_default_value));
1638- } else if (vmm == VmmMode::kGem5 ) {
1639- // TODO: Get the other architectures working
1640- if (guest_configs[0 ].target_arch != Arch::Arm64) {
1641- return CF_ERR (" Gem5 only supports ARM64" );
1642- }
1643- SetDefaultFlagsForGem5 ();
1644- } else {
1645- return CF_ERR (" Unknown Virtual Machine Manager: " << FLAGS_vm_manager);
1600+ break ;
1601+ case VmmMode::kCrosvm :
1602+ CF_EXPECT (SetDefaultFlagsForCrosvm (system_image_dir, guest_configs,
1603+ name_to_default_value));
1604+ break ;
1605+ case VmmMode::kGem5 :
1606+ CF_EXPECT_EQ (guest_configs[0 ].target_arch , Arch::Arm64,
1607+ " Gem5 only supports ARM64" );
1608+ SetDefaultFlagsForGem5 ();
1609+ break ;
1610+ case VmmMode::kUnknown :
1611+ return CF_ERR (" Unknown VM manager" );
16461612 }
1647- if (vmm != VmmMode::kGem5 ) {
1613+ if (vm_manager_flag. Mode () != VmmMode::kGem5 ) {
16481614 // After SetCommandLineOptionWithMode in SetDefaultFlagsForCrosvm/Qemu,
16491615 // default flag values changed, need recalculate name_to_default_value
16501616 name_to_default_value = CurrentFlagsToDefaultValue ();
0 commit comments