devices/virtio/console/
output.rs1use std::io;
8use std::io::Read;
9
10use base::error;
11
12use crate::virtio::Queue;
13use crate::virtio::Reader;
14
15fn process_transmit_request(reader: &mut Reader, output: &mut dyn io::Write) -> io::Result<()> {
22 let len = reader.available_bytes();
23 let mut data = vec![0u8; len];
24 reader.read_exact(&mut data)?;
25 output.write_all(&data)?;
26 output.flush()?;
27 Ok(())
28}
29
30pub fn process_transmit_queue(transmit_queue: &mut Queue, output: &mut dyn io::Write) {
38 let mut needs_interrupt = false;
39 while let Some(mut avail_desc) = transmit_queue.pop() {
40 if let Err(e) = process_transmit_request(&mut avail_desc.reader, output) {
41 error!("console: process_transmit_request failed: {}", e);
42 }
43
44 transmit_queue.add_used(avail_desc);
45 needs_interrupt = true;
46 }
47
48 if needs_interrupt {
49 transmit_queue.trigger_interrupt();
50 }
51}