hypervisor: aarch64: Add init_vm

Gunyah initializes at VM level, not the vCPU level as KVM. Add
VM-generic initialization which happens after build_vm, but before the
VM starts to run.

BUG=b:232360323

Change-Id: Iea38cf63eca9b525e613450fd7bca2d422923063
Signed-off-by: Elliot Berman <quic_eberman@quicinc.com>
Reviewed-on: https://chromium-review.googlesource.com/c/crosvm/crosvm/+/4400669
Reviewed-by: Daniel Verkamp <dverkamp@chromium.org>
diff --git a/aarch64/src/lib.rs b/aarch64/src/lib.rs
index d53648c..06d343c 100644
--- a/aarch64/src/lib.rs
+++ b/aarch64/src/lib.rs
@@ -255,6 +255,8 @@
     InitPvtimeError(base::Error),
     #[error("initrd could not be loaded: {0}")]
     InitrdLoadFailure(arch::LoadImageError),
+    #[error("failed to initialize virtual machine {0}")]
+    InitVmError(base::Error),
     #[error("kernel could not be loaded: {0}")]
     KernelLoadFailure(kernel_loader::Error),
     #[error("error loading Kernel from Elf image: {0}")]
@@ -702,6 +704,13 @@
         )
         .map_err(Error::CreateFdt)?;
 
+        vm.init_arch(
+            payload.entry(),
+            fdt_offset,
+            AARCH64_FDT_MAX_SIZE.try_into().unwrap(),
+        )
+        .map_err(Error::InitVmError)?;
+
         Ok(RunnableLinuxVm {
             vm,
             vcpu_count,
diff --git a/hypervisor/src/aarch64.rs b/hypervisor/src/aarch64.rs
index 712aa2f..a3d3b98 100644
--- a/hypervisor/src/aarch64.rs
+++ b/hypervisor/src/aarch64.rs
@@ -84,6 +84,14 @@
         fdt: &mut FdtWriter,
         phandles: &BTreeMap<&str, u32>,
     ) -> cros_fdt::Result<()>;
+
+    // Initialize a VM. Called after building the VM. Presently called before vCPUs are initialized.
+    fn init_arch(
+        &self,
+        payload_entry_address: GuestAddress,
+        fdt_address: GuestAddress,
+        fdt_size: usize,
+    ) -> Result<()>;
 }
 
 /// A wrapper around creating and using a VCPU on aarch64.
diff --git a/hypervisor/src/geniezone/mod.rs b/hypervisor/src/geniezone/mod.rs
index e19b67a..10c166c 100644
--- a/hypervisor/src/geniezone/mod.rs
+++ b/hypervisor/src/geniezone/mod.rs
@@ -192,6 +192,15 @@
     ) -> cros_fdt::Result<()> {
         Ok(())
     }
+
+    fn init_arch(
+        &self,
+        _payload_entry_address: GuestAddress,
+        _fdt_address: GuestAddress,
+        _fdt_size: usize,
+    ) -> Result<()> {
+        Ok(())
+    }
 }
 
 impl GeniezoneVcpu {
diff --git a/hypervisor/src/kvm/aarch64.rs b/hypervisor/src/kvm/aarch64.rs
index 7ad773e..da8bc77 100644
--- a/hypervisor/src/kvm/aarch64.rs
+++ b/hypervisor/src/kvm/aarch64.rs
@@ -216,6 +216,15 @@
     ) -> cros_fdt::Result<()> {
         Ok(())
     }
+
+    fn init_arch(
+        &self,
+        _payload_entry_address: GuestAddress,
+        _fdt_address: GuestAddress,
+        _fdt_size: usize,
+    ) -> Result<()> {
+        Ok(())
+    }
 }
 
 impl KvmVcpu {