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/android/virtmgr/src/crosvm.rs b/android/virtmgr/src/crosvm.rs
index 00858cb..bb7712e 100644
--- a/android/virtmgr/src/crosvm.rs
+++ b/android/virtmgr/src/crosvm.rs
@@ -47,6 +47,8 @@
 use android_system_virtualizationservice::aidl::android::system::virtualizationservice::{
     VirtualMachineAppConfig::DebugLevel::DebugLevel,
     AudioConfig::AudioConfig as AudioConfigParcelable,
+    CpuOptions::CpuOptions,
+    CpuOptions::CpuTopology::CpuTopology,
     DisplayConfig::DisplayConfig as DisplayConfigParcelable,
     GpuConfig::GpuConfig as GpuConfigParcelable,
     UsbConfig::UsbConfig as UsbConfigParcelable,
@@ -113,8 +115,7 @@
     pub debug_config: DebugConfig,
     pub memory_mib: NonZeroU32,
     pub swiotlb_mib: Option<NonZeroU32>,
-    pub cpus: Option<NonZeroU32>,
-    pub host_cpu_topology: bool,
+    pub cpus: CpuOptions,
     pub console_out_fd: Option<File>,
     pub console_in_fd: Option<File>,
     pub log_fd: Option<File>,
@@ -1109,30 +1110,31 @@
 
     command.arg("--mem").arg(memory_mib.to_string());
 
-    if let Some(cpus) = config.cpus {
+    fn cpu_arg_command(command: &mut Command, count: usize) {
         #[cfg(target_arch = "aarch64")]
-        command.arg("--cpus").arg(cpus.to_string() + ",sve=[auto=true]");
+        command.arg("--cpus").arg(count.to_string() + ",sve=[auto=true]");
         #[cfg(not(target_arch = "aarch64"))]
-        command.arg("--cpus").arg(cpus.to_string());
+        command.arg("--cpus").arg(count.to_string());
     }
-
-    if config.host_cpu_topology {
-        if cfg!(virt_cpufreq) && check_if_all_cpus_allowed()? {
-            command.arg("--host-cpu-topology");
-            cfg_if::cfg_if! {
-                if #[cfg(any(target_arch = "aarch64"))] {
+    match config.cpus.cpuTopology {
+        CpuTopology::MatchHost(_) => {
+            if cfg!(virt_cpufreq) && check_if_all_cpus_allowed()? {
+                command.arg("--host-cpu-topology");
+                #[cfg(target_arch = "aarch64")]
+                {
                     command.arg("--virt-cpufreq");
+                    command.arg("--cpus").arg("sve=[auto=true]");
                 }
+            } else {
+                cpu_arg_command(
+                    &mut command,
+                    get_num_cpus()
+                        .context("Could not determine the number of CPUs in the system")?,
+                )
             }
-            #[cfg(target_arch = "aarch64")]
-            command.arg("--cpus").arg("sve=[auto=true]");
-        } else if let Some(cpus) = get_num_cpus() {
-            #[cfg(target_arch = "aarch64")]
-            command.arg("--cpus").arg(cpus.to_string() + ",sve=[auto=true]");
-            #[cfg(not(target_arch = "aarch64"))]
-            command.arg("--cpus").arg(cpus.to_string());
-        } else {
-            bail!("Could not determine the number of CPUs in the system");
+        }
+        CpuTopology::CpuCount(count) => {
+            cpu_arg_command(&mut command, count.try_into().context("invalid cpu count")?)
         }
     }