Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
google
GitHub Repository: google/crosvm
Path: blob/main/devices/src/virtio/console/input.rs
5394 views
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
19
pub 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
}
44
45