Move CpuTopology to CpuOptions

Add CpuOptions for easier expansion of options relating to CPUs.

Bug: N/A
Test: TH, /apex/com.android.virt/bin/vm run-microdroid --cpu-topology cpu_count=#|one_cpu|match_host

Change-Id: I24bc31211448ad9fa5fb80382fcc4626216fe08f
diff --git a/libs/framework-virtualization/src/android/system/virtualmachine/VirtualMachineConfig.java b/libs/framework-virtualization/src/android/system/virtualmachine/VirtualMachineConfig.java
index 6311168..83b234d 100644
--- a/libs/framework-virtualization/src/android/system/virtualmachine/VirtualMachineConfig.java
+++ b/libs/framework-virtualization/src/android/system/virtualmachine/VirtualMachineConfig.java
@@ -41,6 +41,7 @@
 import android.os.PersistableBundle;
 import android.sysprop.HypervisorProperties;
 import android.system.virtualizationservice.AssignedDevices;
+import android.system.virtualizationservice.CpuOptions;
 import android.system.virtualizationservice.DiskImage;
 import android.system.virtualizationservice.Partition;
 import android.system.virtualizationservice.SharedPath;
@@ -806,7 +807,16 @@
                         .orElse(null);
         config.protectedVm = this.mProtectedVm;
         config.memoryMib = bytesToMebiBytes(mMemoryBytes);
-        config.cpuTopology = (byte) this.mCpuTopology;
+        switch (this.mCpuTopology) {
+            case CPU_TOPOLOGY_MATCH_HOST:
+                config.cpuOptions = new CpuOptions();
+                config.cpuOptions.cpuTopology = CpuOptions.CpuTopology.matchHost(true);
+                break;
+            default:
+                config.cpuOptions = new CpuOptions();
+                config.cpuOptions.cpuTopology = CpuOptions.CpuTopology.cpuCount(1);
+                break;
+        }
         config.consoleInputDevice = mConsoleInputDevice;
         config.devices = AssignedDevices.devices(EMPTY_STRING_ARRAY);
         config.platformVersion = "~1.0";
@@ -867,10 +877,12 @@
         vsConfig.memoryMib = bytesToMebiBytes(mMemoryBytes);
         switch (mCpuTopology) {
             case CPU_TOPOLOGY_MATCH_HOST:
-                vsConfig.cpuTopology = android.system.virtualizationservice.CpuTopology.MATCH_HOST;
+                vsConfig.cpuOptions = new CpuOptions();
+                vsConfig.cpuOptions.cpuTopology = CpuOptions.CpuTopology.matchHost(true);
                 break;
             default:
-                vsConfig.cpuTopology = android.system.virtualizationservice.CpuTopology.ONE_CPU;
+                vsConfig.cpuOptions = new CpuOptions();
+                vsConfig.cpuOptions.cpuTopology = CpuOptions.CpuTopology.cpuCount(1);
                 break;
         }
 
diff --git a/libs/libavf/src/lib.rs b/libs/libavf/src/lib.rs
index 6532ace..3fa1b75 100644
--- a/libs/libavf/src/lib.rs
+++ b/libs/libavf/src/lib.rs
@@ -23,7 +23,8 @@
 
 use android_system_virtualizationservice::{
     aidl::android::system::virtualizationservice::{
-        AssignedDevices::AssignedDevices, CpuTopology::CpuTopology, DiskImage::DiskImage,
+        AssignedDevices::AssignedDevices, CpuOptions::CpuOptions,
+        CpuOptions::CpuTopology::CpuTopology, DiskImage::DiskImage,
         IVirtualizationService::IVirtualizationService, VirtualMachineConfig::VirtualMachineConfig,
         VirtualMachineRawConfig::VirtualMachineRawConfig,
     },
@@ -218,8 +219,7 @@
     // SAFETY: `config` is assumed to be a valid, non-null pointer returned by
     // AVirtualMachineRawConfig_create. It's the only reference to the object.
     let config = unsafe { &mut *config };
-    config.cpuTopology = CpuTopology::CUSTOM;
-    config.customVcpuCount = n;
+    config.cpuOptions = CpuOptions { cpuTopology: CpuTopology::CpuCount(n) };
 }
 
 /// Set whether a virtual machine is protected or not.
diff --git a/libs/libcompos_common/compos_client.rs b/libs/libcompos_common/compos_client.rs
index 6872582..a52104d 100644
--- a/libs/libcompos_common/compos_client.rs
+++ b/libs/libcompos_common/compos_client.rs
@@ -22,7 +22,8 @@
     COMPOS_APEX_ROOT, COMPOS_VSOCK_PORT,
 };
 use android_system_virtualizationservice::aidl::android::system::virtualizationservice::{
-    CpuTopology::CpuTopology,
+    CpuOptions::CpuOptions,
+    CpuOptions::CpuTopology::CpuTopology,
     IVirtualizationService::IVirtualizationService,
     VirtualMachineAppConfig::{
         CustomConfig::CustomConfig, DebugLevel::DebugLevel, Payload::Payload,
@@ -120,9 +121,10 @@
         let debug_level = if parameters.debug_mode { DebugLevel::FULL } else { DebugLevel::NONE };
 
         let cpu_topology = match parameters.cpu_topology {
-            VmCpuTopology::OneCpu => CpuTopology::ONE_CPU,
-            VmCpuTopology::MatchHost => CpuTopology::MATCH_HOST,
+            VmCpuTopology::OneCpu => CpuTopology::CpuCount(1),
+            VmCpuTopology::MatchHost => CpuTopology::MatchHost(true),
         };
+        let cpu_options = CpuOptions { cpuTopology: cpu_topology };
 
         // The CompOS VM doesn't need to be updatable (by design it should run exactly twice,
         // with the same APKs and APEXes each time). And having it so causes some interesting
@@ -141,7 +143,7 @@
             extraIdsigs: extra_idsigs,
             protectedVm: true,
             memoryMib: parameters.memory_mib.unwrap_or(0), // 0 means use the default
-            cpuTopology: cpu_topology,
+            cpuOptions: cpu_options,
             customConfig: custom_config,
             ..Default::default()
         });
diff --git a/libs/libservice_vm_manager/src/lib.rs b/libs/libservice_vm_manager/src/lib.rs
index 0f322bb..667731f 100644
--- a/libs/libservice_vm_manager/src/lib.rs
+++ b/libs/libservice_vm_manager/src/lib.rs
@@ -17,7 +17,7 @@
 
 use android_system_virtualizationservice::{
     aidl::android::system::virtualizationservice::{
-        CpuTopology::CpuTopology, DiskImage::DiskImage,
+        CpuOptions::CpuOptions, CpuOptions::CpuTopology::CpuTopology, DiskImage::DiskImage,
         IVirtualizationService::IVirtualizationService, Partition::Partition,
         PartitionType::PartitionType, VirtualMachineConfig::VirtualMachineConfig,
         VirtualMachineRawConfig::VirtualMachineRawConfig,
@@ -226,6 +226,7 @@
         writable: true,
         guid: None,
     }];
+    let cpu_options = CpuOptions { cpuTopology: CpuTopology::CpuCount(1) };
     let rialto = File::open(RIALTO_PATH).context("Failed to open Rialto kernel binary")?;
     let instance_id_file = Path::new(VIRT_DATA_DIR).join(INSTANCE_ID_FILENAME);
     let instance_id = get_or_allocate_instance_id(service.as_ref(), instance_id_file)?;
@@ -236,7 +237,7 @@
         instanceId: instance_id,
         protectedVm: true,
         memoryMib: VM_MEMORY_MB,
-        cpuTopology: CpuTopology::ONE_CPU,
+        cpuOptions: cpu_options,
         platformVersion: "~1.0".to_string(),
         gdbPort: 0, // No gdb
         ..Default::default()
diff --git a/libs/vmconfig/src/lib.rs b/libs/vmconfig/src/lib.rs
index 8357f99..859ca77 100644
--- a/libs/vmconfig/src/lib.rs
+++ b/libs/vmconfig/src/lib.rs
@@ -15,14 +15,14 @@
 //! Struct for VM configuration with JSON (de)serialization and AIDL parcelables
 
 use android_system_virtualizationservice::{
-    aidl::android::system::virtualizationservice::AssignedDevices::AssignedDevices,
-    aidl::android::system::virtualizationservice::CpuTopology::CpuTopology,
-    aidl::android::system::virtualizationservice::DiskImage::DiskImage as AidlDiskImage,
-    aidl::android::system::virtualizationservice::Partition::Partition as AidlPartition,
-    aidl::android::system::virtualizationservice::UsbConfig::UsbConfig as AidlUsbConfig,
-    aidl::android::system::virtualizationservice::VirtualMachineAppConfig::DebugLevel::DebugLevel,
-    aidl::android::system::virtualizationservice::VirtualMachineConfig::VirtualMachineConfig,
-    aidl::android::system::virtualizationservice::VirtualMachineRawConfig::VirtualMachineRawConfig,
+    aidl::android::system::virtualizationservice::{
+        AssignedDevices::AssignedDevices, CpuOptions::CpuOptions,
+        CpuOptions::CpuTopology::CpuTopology, DiskImage::DiskImage as AidlDiskImage,
+        Partition::Partition as AidlPartition, UsbConfig::UsbConfig as AidlUsbConfig,
+        VirtualMachineAppConfig::DebugLevel::DebugLevel,
+        VirtualMachineConfig::VirtualMachineConfig,
+        VirtualMachineRawConfig::VirtualMachineRawConfig,
+    },
     binder::ParcelFileDescriptor,
 };
 
@@ -109,11 +109,12 @@
             0
         };
         let cpu_topology = match self.cpu_topology.as_deref() {
-            None => CpuTopology::ONE_CPU,
-            Some("one_cpu") => CpuTopology::ONE_CPU,
-            Some("match_host") => CpuTopology::MATCH_HOST,
+            None => CpuTopology::CpuCount(1),
+            Some("one_cpu") => CpuTopology::CpuCount(1),
+            Some("match_host") => CpuTopology::MatchHost(true),
             Some(cpu_topology) => bail!("Invalid cpu topology {}", cpu_topology),
         };
+        let cpu_options = CpuOptions { cpuTopology: cpu_topology };
         let usb_config = self.usb_config.clone().map(|x| x.to_parcelable()).transpose()?;
         Ok(VirtualMachineRawConfig {
             kernel: maybe_open_parcel_file(&self.kernel, false)?,
@@ -123,7 +124,7 @@
             disks: self.disks.iter().map(DiskImage::to_parcelable).collect::<Result<_, Error>>()?,
             protectedVm: self.protected,
             memoryMib: memory_mib,
-            cpuTopology: cpu_topology,
+            cpuOptions: cpu_options,
             platformVersion: self.platform_version.to_string(),
             devices: AssignedDevices::Devices(
                 self.devices