Support console input to VM
createVm accepts a new ParcelFileDescriptor which when set is used as
the console input in the VM. The `vm` tool sets this to stdin unless
explicitly specified via `--console-in`. This will be useful for
bringing up custom OSes.
Note that Java APIs for this is not added in this CL.
Bug: 263360203
Test: Start a vm using the `vm` tool. Type something. Then do `cat
/dev/console` in the VM. It shows the typed characters.
Change-Id: I5d0dfcc4852387ec50897a8dcae2935dd4a2dd9a
diff --git a/virtualizationmanager/src/aidl.rs b/virtualizationmanager/src/aidl.rs
index 86c8596..06274c8 100644
--- a/virtualizationmanager/src/aidl.rs
+++ b/virtualizationmanager/src/aidl.rs
@@ -172,11 +172,18 @@
fn createVm(
&self,
config: &VirtualMachineConfig,
- console_fd: Option<&ParcelFileDescriptor>,
+ console_out_fd: Option<&ParcelFileDescriptor>,
+ console_in_fd: Option<&ParcelFileDescriptor>,
log_fd: Option<&ParcelFileDescriptor>,
) -> binder::Result<Strong<dyn IVirtualMachine>> {
let mut is_protected = false;
- let ret = self.create_vm_internal(config, console_fd, log_fd, &mut is_protected);
+ let ret = self.create_vm_internal(
+ config,
+ console_out_fd,
+ console_in_fd,
+ log_fd,
+ &mut is_protected,
+ );
write_vm_creation_stats(config, is_protected, &ret);
ret
}
@@ -292,7 +299,8 @@
fn create_vm_internal(
&self,
config: &VirtualMachineConfig,
- console_fd: Option<&ParcelFileDescriptor>,
+ console_out_fd: Option<&ParcelFileDescriptor>,
+ console_in_fd: Option<&ParcelFileDescriptor>,
log_fd: Option<&ParcelFileDescriptor>,
is_protected: &mut bool,
) -> binder::Result<Strong<dyn IVirtualMachine>> {
@@ -341,8 +349,9 @@
};
let state = &mut *self.state.lock().unwrap();
- let console_fd =
- clone_or_prepare_logger_fd(&debug_config, console_fd, format!("Console({})", cid))?;
+ let console_out_fd =
+ clone_or_prepare_logger_fd(&debug_config, console_out_fd, format!("Console({})", cid))?;
+ let console_in_fd = console_in_fd.map(clone_file).transpose()?;
let log_fd = clone_or_prepare_logger_fd(&debug_config, log_fd, format!("Log({})", cid))?;
// Counter to generate unique IDs for temporary image files.
@@ -446,7 +455,8 @@
cpus,
host_cpu_topology,
task_profiles: config.taskProfiles.clone(),
- console_fd,
+ console_out_fd,
+ console_in_fd,
log_fd,
ramdump,
indirect_files,