diff --git a/devices/src/legacy/serial.rs b/devices/src/legacy/serial.rs index c6554c770..ff4074a27 100644 --- a/devices/src/legacy/serial.rs +++ b/devices/src/legacy/serial.rs @@ -124,6 +124,10 @@ impl Serial { Self::new(id, interrupt, None) } + pub fn set_out(&mut self, out: Box) { + self.out = Some(out); + } + /// Queues raw bytes for the guest to read and signals the interrupt if the line status would /// change. pub fn queue_input_bytes(&mut self, c: &[u8]) -> Result<()> { @@ -134,6 +138,13 @@ impl Serial { Ok(()) } + pub fn flush_output(&mut self) -> result::Result<(), io::Error> { + if let Some(out) = self.out.as_mut() { + out.flush()?; + } + Ok(()) + } + fn is_dlab_set(&self) -> bool { (self.line_control & LCR_DLAB_BIT) != 0 } diff --git a/devices/src/legacy/uart_pl011.rs b/devices/src/legacy/uart_pl011.rs index e4e2379c7..39e7a1cee 100644 --- a/devices/src/legacy/uart_pl011.rs +++ b/devices/src/legacy/uart_pl011.rs @@ -138,6 +138,10 @@ impl Pl011 { } } + pub fn set_out(&mut self, out: Box) { + self.out = Some(out); + } + fn state(&self) -> Pl011State { Pl011State { flags: self.flags, @@ -192,6 +196,13 @@ impl Pl011 { Ok(()) } + pub fn flush_output(&mut self) -> result::Result<(), io::Error> { + if let Some(out) = self.out.as_mut() { + out.flush()?; + } + Ok(()) + } + fn pl011_get_baudrate(&self) -> u32 { if self.fbrd == 0 { return 0;