mirror of
https://github.com/cloud-hypervisor/cloud-hypervisor.git
synced 2024-09-12 01:54:55 +00:00
This can be uses to indicate to the caller that it should wait on the barrier before returning as there is some asynchronous activity triggered by the write which requires the KVM exit to block until it's completed. This is useful for having vCPU thread wait for the VMM thread to proceed to activate the virtio devices. See #1863 Signed-off-by: Rob Bradford <robert.bradford@intel.com>
44 lines
1.2 KiB
Rust
44 lines
1.2 KiB
Rust
// Portions Copyright 2017 The Chromium OS Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
// found in the LICENSE-BSD-3-Clause file.
|
|
//
|
|
// Copyright © 2020 Intel Corporation
|
|
//
|
|
// SPDX-License-Identifier: Apache-2.0 AND BSD-3-Clause
|
|
//
|
|
|
|
use std::sync::{Arc, Barrier};
|
|
use vm_device::BusDevice;
|
|
|
|
/// Provides firmware debug output via I/O port controls
|
|
#[derive(Default)]
|
|
pub struct FwDebugDevice {}
|
|
|
|
impl FwDebugDevice {
|
|
pub fn new() -> Self {
|
|
Self {}
|
|
}
|
|
}
|
|
|
|
/// FwDebugDevice sits on the I/O bus as 0x402 and receives ASCII characters
|
|
impl BusDevice for FwDebugDevice {
|
|
/// Upon read return the magic value to indicate that there is a debug port
|
|
fn read(&mut self, _base: u64, _offset: u64, data: &mut [u8]) {
|
|
if data.len() == 1 {
|
|
data[0] = 0xe9
|
|
} else {
|
|
error!("Invalid read size on debug port: {}", data.len())
|
|
}
|
|
}
|
|
|
|
fn write(&mut self, _base: u64, _offset: u64, data: &[u8]) -> Option<Arc<Barrier>> {
|
|
if data.len() == 1 {
|
|
print!("{}", data[0] as char);
|
|
} else {
|
|
error!("Invalid write size on debug port: {}", data.len())
|
|
}
|
|
|
|
None
|
|
}
|
|
}
|