xref: /cloud-hypervisor/devices/src/legacy/fwdebug.rs (revision 88a9f799449c04180c6b9a21d3b9c0c4b57e2bd6)
1e7e0e8acSRob Bradford // Portions Copyright 2017 The Chromium OS Authors. All rights reserved.
2e7e0e8acSRob Bradford // Use of this source code is governed by a BSD-style license that can be
3e7e0e8acSRob Bradford // found in the LICENSE-BSD-3-Clause file.
4e7e0e8acSRob Bradford //
5e7e0e8acSRob Bradford // Copyright © 2020 Intel Corporation
6e7e0e8acSRob Bradford //
7e7e0e8acSRob Bradford // SPDX-License-Identifier: Apache-2.0 AND BSD-3-Clause
8e7e0e8acSRob Bradford //
9e7e0e8acSRob Bradford 
101fc6d50fSRob Bradford use std::sync::{Arc, Barrier};
11*88a9f799SRob Bradford 
1215025d71SRob Bradford use vm_device::BusDevice;
13e7e0e8acSRob Bradford 
14e7e0e8acSRob Bradford /// Provides firmware debug output via I/O port controls
15e7e0e8acSRob Bradford #[derive(Default)]
16e7e0e8acSRob Bradford pub struct FwDebugDevice {}
17e7e0e8acSRob Bradford 
18e7e0e8acSRob Bradford impl FwDebugDevice {
new() -> Self19e7e0e8acSRob Bradford     pub fn new() -> Self {
20e7e0e8acSRob Bradford         Self {}
21e7e0e8acSRob Bradford     }
22e7e0e8acSRob Bradford }
23e7e0e8acSRob Bradford 
24e7e0e8acSRob Bradford /// FwDebugDevice sits on the I/O bus as 0x402 and receives ASCII characters
25e7e0e8acSRob Bradford impl BusDevice for FwDebugDevice {
26e7e0e8acSRob Bradford     /// Upon read return the magic value to indicate that there is a debug port
read(&mut self, _base: u64, _offset: u64, data: &mut [u8])27e7e0e8acSRob Bradford     fn read(&mut self, _base: u64, _offset: u64, data: &mut [u8]) {
28e7e0e8acSRob Bradford         if data.len() == 1 {
29e7e0e8acSRob Bradford             data[0] = 0xe9
30e7e0e8acSRob Bradford         } else {
31e7e0e8acSRob Bradford             error!("Invalid read size on debug port: {}", data.len())
32e7e0e8acSRob Bradford         }
33e7e0e8acSRob Bradford     }
34e7e0e8acSRob Bradford 
write(&mut self, _base: u64, _offset: u64, data: &[u8]) -> Option<Arc<Barrier>>351fc6d50fSRob Bradford     fn write(&mut self, _base: u64, _offset: u64, data: &[u8]) -> Option<Arc<Barrier>> {
36e7e0e8acSRob Bradford         if data.len() == 1 {
37e7e0e8acSRob Bradford             print!("{}", data[0] as char);
38e7e0e8acSRob Bradford         } else {
39e7e0e8acSRob Bradford             error!("Invalid write size on debug port: {}", data.len())
40e7e0e8acSRob Bradford         }
411fc6d50fSRob Bradford 
421fc6d50fSRob Bradford         None
43e7e0e8acSRob Bradford     }
44e7e0e8acSRob Bradford }
45