VM payload's stdout/err is /dev/kmsg in debuggable VMs
This has been the intention (see stdio_to_kmsg in microdroid_manager.rc)
, but it didn't work in user builds because stdio_to_kmsg is essentially
a no-op in user builds.
This fixes the bug by explicitly using /dev/kmsg as stdout and stderr
(but not for stdin for obvious reason).
Bug: 382292481
Test: testRunEmptyPayload run user builds
Change-Id: I69c08360402c10439f9bfc7e87385a9f2388db4e
diff --git a/guest/microdroid_manager/microdroid_manager.rc b/guest/microdroid_manager/microdroid_manager.rc
index da38564..9fa8a9d 100644
--- a/guest/microdroid_manager/microdroid_manager.rc
+++ b/guest/microdroid_manager/microdroid_manager.rc
@@ -2,8 +2,6 @@
disabled
# print android log to kmsg
file /dev/kmsg w
- # redirect stdout/stderr to kmsg_debug
- stdio_to_kmsg
setenv RUST_LOG info
# TODO(jooyung) remove this when microdroid_manager becomes a daemon
oneshot
diff --git a/guest/microdroid_manager/src/main.rs b/guest/microdroid_manager/src/main.rs
index 4b261c4..451c3c8 100644
--- a/guest/microdroid_manager/src/main.rs
+++ b/guest/microdroid_manager/src/main.rs
@@ -670,9 +670,20 @@
});
}
- if !is_debuggable()? {
- command.stdin(Stdio::null()).stdout(Stdio::null()).stderr(Stdio::null());
- }
+ // Never accept input from outside
+ command.stdin(Stdio::null());
+
+ // If the VM is debuggable, let stdout/stderr go outside via /dev/kmsg to ease the debugging
+ let (stdout, stderr) = if is_debuggable()? {
+ use std::os::fd::FromRawFd;
+ let kmsg_fd = env::var("ANDROID_FILE__dev_kmsg").unwrap().parse::<i32>().unwrap();
+ // SAFETY: no one closes kmsg_fd
+ unsafe { (Stdio::from_raw_fd(kmsg_fd), Stdio::from_raw_fd(kmsg_fd)) }
+ } else {
+ (Stdio::null(), Stdio::null())
+ };
+ command.stdout(stdout);
+ command.stderr(stderr);
info!("notifying payload started");
service.notifyPayloadStarted()?;