mirror of
https://github.com/cloud-hypervisor/cloud-hypervisor.git
synced 2024-09-29 01:55:45 +00:00
e50a641126
This commit adds the debug-console (or debugcon) device to CHV. It is a very simple device on I/O port 0xe9 supported by QEMU and BOCHS. It is meant for printing information as easy as possible, without any necessary configuration from the guest at all. It is primarily interesting to OS/kernel and firmware developers as they can produce output as soon as the guest starts without any configuration of a serial device or similar. Furthermore, a kernel hacker might use this device for information of type B whereas information of type A are printed to the serial device. This device is not used by default by Linux, Windows, or any other "real" OS, but only by toy kernels and during firmware development. In the CLI, it can be configured similar to --console or --serial with the --debug-console parameter. Signed-off-by: Philipp Schuster <philipp.schuster@cyberus-technology.de>
65 lines
1.6 KiB
Rust
65 lines
1.6 KiB
Rust
// Copyright © 2023 Cyberus Technology
|
|
//
|
|
// SPDX-License-Identifier: Apache-2.0
|
|
//
|
|
|
|
//! Module for [`DebugconState`].
|
|
|
|
use std::io;
|
|
use std::io::Write;
|
|
use std::sync::{Arc, Barrier};
|
|
use vm_device::BusDevice;
|
|
use vm_migration::{Migratable, MigratableError, Pausable, Snapshot, Snapshottable, Transportable};
|
|
|
|
/// I/O-port.
|
|
pub const DEFAULT_PORT: u64 = 0xe9;
|
|
|
|
#[derive(Default)]
|
|
pub struct DebugconState {}
|
|
|
|
/// Emulates a debug console similar to the QEMU debugcon device. This device
|
|
/// is stateless and only prints the bytes (usually text) that are written to
|
|
/// it.
|
|
///
|
|
/// This device is only available on x86.
|
|
///
|
|
/// Reference:
|
|
/// - https://github.com/qemu/qemu/blob/master/hw/char/debugcon.c
|
|
/// - https://phip1611.de/blog/how-to-use-qemus-debugcon-feature-and-write-to-a-file/
|
|
pub struct DebugConsole {
|
|
id: String,
|
|
out: Box<dyn io::Write + Send>,
|
|
}
|
|
|
|
impl DebugConsole {
|
|
pub fn new(id: String, out: Box<dyn io::Write + Send>) -> Self {
|
|
Self { id, out }
|
|
}
|
|
}
|
|
|
|
impl BusDevice for DebugConsole {
|
|
fn read(&mut self, _base: u64, _offset: u64, _data: &mut [u8]) {}
|
|
|
|
fn write(&mut self, _base: u64, _offset: u64, data: &[u8]) -> Option<Arc<Barrier>> {
|
|
if let Err(e) = self.out.write_all(data) {
|
|
// unlikely
|
|
error!("debug-console: failed writing data: {e:?}");
|
|
}
|
|
None
|
|
}
|
|
}
|
|
|
|
impl Snapshottable for DebugConsole {
|
|
fn id(&self) -> String {
|
|
self.id.clone()
|
|
}
|
|
|
|
fn snapshot(&mut self) -> Result<Snapshot, MigratableError> {
|
|
Snapshot::new_from_state(&())
|
|
}
|
|
}
|
|
|
|
impl Pausable for DebugConsole {}
|
|
impl Transportable for DebugConsole {}
|
|
impl Migratable for DebugConsole {}
|