[API][compos] Use VmPayloadService to notify host in compos
Bug: 243512047
Test: m compsvc
Test: atest MicrodroidTests ComposHostTestCases
Change-Id: I5a7dfd19dfbdbddb12ad58fd87fd0705b26fb705
diff --git a/compos/Android.bp b/compos/Android.bp
index ea7c4d6..0890e9d 100644
--- a/compos/Android.bp
+++ b/compos/Android.bp
@@ -7,7 +7,6 @@
edition: "2021",
srcs: ["src/compsvc_main.rs"],
rustlibs: [
- "android.system.virtualmachineservice-rust",
"authfs_aidl_interface-rust",
"compos_aidl_interface-rust",
"libandroid_logger",
@@ -24,6 +23,7 @@
"librpcbinder_rs",
"librustutils",
"libscopeguard",
+ "libvm_payload_bindgen",
],
prefer_rlib: true,
shared_libs: [
diff --git a/compos/src/compsvc_main.rs b/compos/src/compsvc_main.rs
index 16d258e..64e2ced 100644
--- a/compos/src/compsvc_main.rs
+++ b/compos/src/compsvc_main.rs
@@ -22,20 +22,12 @@
mod compsvc;
mod fsverity;
-use android_system_virtualmachineservice::{
- aidl::android::system::virtualmachineservice::IVirtualMachineService::{
- IVirtualMachineService, VM_BINDER_SERVICE_PORT,
- },
- binder::Strong,
-};
-use anyhow::{bail, Context, Result};
+use anyhow::{bail, Result};
use compos_common::COMPOS_VSOCK_PORT;
use log::{debug, error};
-use rpcbinder::{get_vsock_rpc_interface, run_rpc_server};
+use rpcbinder::run_rpc_server;
use std::panic;
-
-/// The CID representing the host VM
-const VMADDR_CID_HOST: u32 = 2;
+use vm_payload_bindgen::notify_payload_ready;
fn main() {
if let Err(e) = try_main() {
@@ -54,14 +46,10 @@
}));
let service = compsvc::new_binder()?.as_binder();
- let vm_service = get_vm_service()?;
-
debug!("compsvc is starting as a rpc service.");
-
- let retval = run_rpc_server(service, COMPOS_VSOCK_PORT, || {
- if let Err(e) = vm_service.notifyPayloadReady() {
- error!("Unable to notify ready: {}", e);
- }
+ // SAFETY: Invokes a method from the bindgen library `vm_payload_bindgen`.
+ let retval = run_rpc_server(service, COMPOS_VSOCK_PORT, || unsafe {
+ notify_payload_ready();
});
if retval {
debug!("RPC server has shut down gracefully");
@@ -70,8 +58,3 @@
bail!("Premature termination of RPC server");
}
}
-
-fn get_vm_service() -> Result<Strong<dyn IVirtualMachineService>> {
- get_vsock_rpc_interface(VMADDR_CID_HOST, VM_BINDER_SERVICE_PORT as u32)
- .context("Connecting to IVirtualMachineService")
-}
diff --git a/microdroid/vm_payload/Android.bp b/microdroid/vm_payload/Android.bp
index 4bfe603..a68595f 100644
--- a/microdroid/vm_payload/Android.bp
+++ b/microdroid/vm_payload/Android.bp
@@ -19,3 +19,15 @@
"com.android.compos",
],
}
+
+rust_bindgen {
+ name: "libvm_payload_bindgen",
+ wrapper_src: "include/vm_payload.h",
+ crate_name: "vm_payload_bindgen",
+ source_stem: "bindings",
+ apex_available: ["com.android.compos"],
+ visibility: ["//packages/modules/Virtualization/compos"],
+ shared_libs: [
+ "libvm_payload",
+ ],
+}
diff --git a/microdroid/vm_payload/include/vm_payload.h b/microdroid/vm_payload/include/vm_payload.h
index 4b77b43..0744146 100644
--- a/microdroid/vm_payload/include/vm_payload.h
+++ b/microdroid/vm_payload/include/vm_payload.h
@@ -28,7 +28,7 @@
* Notifies the host that the payload is ready.
* Returns true if the notification succeeds else false.
*/
-bool notify_payload_ready();
+bool notify_payload_ready(void);
/**
* Get a secret that is uniquely bound to this VM instance. The secrets are 32-byte values and the