pvmfw: Boot the verified kernel instead of x1

As we currently support receiving the payload address through the DT or
the legacy ABI (i.e. register x1, set by the VMM), make sure that the
kernel address used during verification is the one pvmfw executes as
previously, we were always booting from the x1 value, even if a kernel
location was found in the DT (and verified).

Functionally, this allows pvmfw to boot pVMs spawned by crosvm with
--protected-vm-with-firmware, a mode where pKVM prevents the VMM from
setting other registers than x0 (i.e. where x1 is forced to 0).

Test: crosvm --protected-vm-with-firmware pvmfw.bin <...>
Change-Id: I0b6cd590a49d693a31443bfe8a2e8cce40960acd
diff --git a/pvmfw/src/entry.rs b/pvmfw/src/entry.rs
index 4f30902..53701a6 100644
--- a/pvmfw/src/entry.rs
+++ b/pvmfw/src/entry.rs
@@ -61,7 +61,7 @@
     // - can't access MMIO (therefore, no logging)
 
     match main_wrapper(fdt_address as usize, payload_start as usize, payload_size as usize) {
-        Ok(_) => jump_to_payload(fdt_address, payload_start),
+        Ok(entry) => jump_to_payload(fdt_address, entry.try_into().unwrap()),
         Err(_) => reboot(), // TODO(b/220071963) propagate the reason back to the host.
     }
 
@@ -213,7 +213,7 @@
 ///
 /// Provide the abstractions necessary for start() to abort the pVM boot and for main() to run with
 /// the assumption that its environment has been properly configured.
-fn main_wrapper(fdt: usize, payload: usize, payload_size: usize) -> Result<(), RebootReason> {
+fn main_wrapper(fdt: usize, payload: usize, payload_size: usize) -> Result<usize, RebootReason> {
     // Limitations in this function:
     // - only access MMIO once (and while) it has been mapped and configured
     // - only perform logging once the logger has been initialized
@@ -298,7 +298,7 @@
         RebootReason::InternalError
     })?;
 
-    Ok(())
+    Ok(slices.kernel.as_ptr() as usize)
 }
 
 fn jump_to_payload(fdt_address: u64, payload_start: u64) -> ! {