1 // Copyright 2024 The ChromiumOS Authors 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 //! Virtio console device input handling. 6 7 use std::collections::VecDeque; 8 use std::io::Write; 9 10 use crate::virtio::Queue; 11 12 /// Checks for input from `buffer` and transfers it to the receive queue, if any. 13 /// 14 /// # Arguments 15 /// 16 /// * `interrupt` - Interrupt used to signal that the queue has been used 17 /// * `buffer` - Ring buffer providing data to put into the guest 18 /// * `receive_queue` - The receive virtio Queue process_receive_queue(buffer: &mut VecDeque<u8>, receive_queue: &mut Queue)19pub fn process_receive_queue(buffer: &mut VecDeque<u8>, receive_queue: &mut Queue) { 20 while let Some(mut desc) = receive_queue.peek() { 21 if buffer.is_empty() { 22 break; 23 } 24 25 let writer = &mut desc.writer; 26 while writer.available_bytes() > 0 && !buffer.is_empty() { 27 let (buffer_front, buffer_back) = buffer.as_slices(); 28 let buffer_chunk = if !buffer_front.is_empty() { 29 buffer_front 30 } else { 31 buffer_back 32 }; 33 let written = writer.write(buffer_chunk).unwrap(); 34 drop(buffer.drain(..written)); 35 } 36 37 let bytes_written = writer.bytes_written() as u32; 38 39 if bytes_written > 0 { 40 let desc = desc.pop(); 41 receive_queue.add_used(desc, bytes_written); 42 receive_queue.trigger_interrupt(); 43 } 44 } 45 } 46