devices/virtio/console/
input.rs

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
7use std::collections::VecDeque;
8use std::io::Write;
9
10use 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
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        if writer.bytes_written() > 0 {
38            let desc = desc.pop();
39            receive_queue.add_used(desc);
40            receive_queue.trigger_interrupt();
41        }
42    }
43}