xref: /cloud-hypervisor/devices/src/lib.rs (revision 0042447fb99175be322d409c6aef3e1d7e3c01ed)
11853b350SSamuel Ortiz // Copyright 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved.
21853b350SSamuel Ortiz // SPDX-License-Identifier: Apache-2.0
31853b350SSamuel Ortiz //
41853b350SSamuel Ortiz // Portions Copyright 2017 The Chromium OS Authors. All rights reserved.
51853b350SSamuel Ortiz // Use of this source code is governed by a BSD-style license that can be
6040ea543SSamuel Ortiz // found in the LICENSE-BSD-3-Clause file.
71853b350SSamuel Ortiz 
81853b350SSamuel Ortiz //! Emulates virtual and hardware devices.
9496ceed1SRob Bradford 
107310ab6fSRob Bradford #[macro_use]
117310ab6fSRob Bradford extern crate bitflags;
12950bd205SSebastien Boeuf #[macro_use]
133acb988cSYi Wang extern crate event_monitor;
143acb988cSYi Wang #[macro_use]
15950bd205SSebastien Boeuf extern crate log;
161853b350SSamuel Ortiz 
1728ab6ceaSRob Bradford pub mod acpi;
18e8c330e2SRuoqing He #[cfg(target_arch = "riscv64")]
19e8c330e2SRuoqing He pub mod aia;
20e50a6411SPhilipp Schuster #[cfg(target_arch = "x86_64")]
21e50a6411SPhilipp Schuster pub mod debug_console;
228f1f9d9eSMichael Zhao #[cfg(target_arch = "aarch64")]
238f1f9d9eSMichael Zhao pub mod gic;
24b32d3025SMichael Zhao pub mod interrupt_controller;
258f1f9d9eSMichael Zhao #[cfg(target_arch = "x86_64")]
26950bd205SSebastien Boeuf pub mod ioapic;
271853b350SSamuel Ortiz pub mod legacy;
285f18ac3bSYuanchu Xie #[cfg(feature = "pvmemcontrol")]
295f18ac3bSYuanchu Xie pub mod pvmemcontrol;
30ef67eab8SYi Wang pub mod pvpanic;
31*0042447fSRuoqing He // TODO: TPM is not yet supported
32*0042447fSRuoqing He #[cfg(not(target_arch = "riscv64"))]
33d0b253d1SPraveen K Paladugu pub mod tpm;
341853b350SSamuel Ortiz 
35c5d15fd9SRob Bradford pub use self::acpi::{AcpiGedDevice, AcpiPmTimerDevice, AcpiShutdownDevice};
36d99c0c0dSYi Wang pub use self::pvpanic::{PvPanicDevice, PVPANIC_DEVICE_MMIO_SIZE};
37c8c4a4d4SSebastien Boeuf 
387310ab6fSRob Bradford bitflags! {
397b376fa8SRob Bradford     pub struct AcpiNotificationFlags: u8 {
407310ab6fSRob Bradford         const NO_DEVICES_CHANGED = 0;
417310ab6fSRob Bradford         const CPU_DEVICES_CHANGED = 0b1;
427310ab6fSRob Bradford         const MEMORY_DEVICES_CHANGED = 0b10;
43d0218e94SSebastien Boeuf         const PCI_DEVICES_CHANGED = 0b100;
4474a4aba2SRob Bradford         const POWER_BUTTON_CHANGED = 0b1000;
457310ab6fSRob Bradford     }
46623755ccSRob Bradford }
47fd95acc6SHenry Wang 
48fd95acc6SHenry Wang #[cfg(target_arch = "aarch64")]
49fd95acc6SHenry Wang macro_rules! generate_read_fn {
50fd95acc6SHenry Wang     ($fn_name: ident, $data_type: ty, $byte_type: ty, $type_size: expr, $endian_type: ident) => {
51fd95acc6SHenry Wang         pub fn $fn_name(input: &[$byte_type]) -> $data_type {
52fd95acc6SHenry Wang             assert!($type_size == std::mem::size_of::<$data_type>());
53fd95acc6SHenry Wang             let mut array = [0u8; $type_size];
54fd95acc6SHenry Wang             for (byte, read) in array.iter_mut().zip(input.iter().cloned()) {
55fd95acc6SHenry Wang                 *byte = read as u8;
56fd95acc6SHenry Wang             }
57fd95acc6SHenry Wang             <$data_type>::$endian_type(array)
58fd95acc6SHenry Wang         }
59fd95acc6SHenry Wang     };
60fd95acc6SHenry Wang }
61fd95acc6SHenry Wang 
62fd95acc6SHenry Wang #[cfg(target_arch = "aarch64")]
63fd95acc6SHenry Wang macro_rules! generate_write_fn {
64fd95acc6SHenry Wang     ($fn_name: ident, $data_type: ty, $byte_type: ty, $endian_type: ident) => {
65fd95acc6SHenry Wang         pub fn $fn_name(buf: &mut [$byte_type], n: $data_type) {
66fd95acc6SHenry Wang             for (byte, read) in buf
67fd95acc6SHenry Wang                 .iter_mut()
68fd95acc6SHenry Wang                 .zip(<$data_type>::$endian_type(n).iter().cloned())
69fd95acc6SHenry Wang             {
70fd95acc6SHenry Wang                 *byte = read as $byte_type;
71fd95acc6SHenry Wang             }
72fd95acc6SHenry Wang         }
73fd95acc6SHenry Wang     };
74fd95acc6SHenry Wang }
75fd95acc6SHenry Wang 
76fd95acc6SHenry Wang #[cfg(target_arch = "aarch64")]
77fd95acc6SHenry Wang generate_read_fn!(read_le_u16, u16, u8, 2, from_le_bytes);
78fd95acc6SHenry Wang #[cfg(target_arch = "aarch64")]
79fd95acc6SHenry Wang generate_read_fn!(read_le_u32, u32, u8, 4, from_le_bytes);
80fd95acc6SHenry Wang #[cfg(target_arch = "aarch64")]
81fd95acc6SHenry Wang generate_read_fn!(read_le_u64, u64, u8, 8, from_le_bytes);
82fd95acc6SHenry Wang #[cfg(target_arch = "aarch64")]
83fd95acc6SHenry Wang generate_read_fn!(read_le_i32, i32, i8, 4, from_le_bytes);
84fd95acc6SHenry Wang 
85fd95acc6SHenry Wang #[cfg(target_arch = "aarch64")]
86fd95acc6SHenry Wang generate_read_fn!(read_be_u16, u16, u8, 2, from_be_bytes);
87fd95acc6SHenry Wang #[cfg(target_arch = "aarch64")]
88fd95acc6SHenry Wang generate_read_fn!(read_be_u32, u32, u8, 4, from_be_bytes);
89fd95acc6SHenry Wang 
90fd95acc6SHenry Wang #[cfg(target_arch = "aarch64")]
91fd95acc6SHenry Wang generate_write_fn!(write_le_u16, u16, u8, to_le_bytes);
92fd95acc6SHenry Wang #[cfg(target_arch = "aarch64")]
93fd95acc6SHenry Wang generate_write_fn!(write_le_u32, u32, u8, to_le_bytes);
94fd95acc6SHenry Wang #[cfg(target_arch = "aarch64")]
95fd95acc6SHenry Wang generate_write_fn!(write_le_u64, u64, u8, to_le_bytes);
96fd95acc6SHenry Wang #[cfg(target_arch = "aarch64")]
97fd95acc6SHenry Wang generate_write_fn!(write_le_i32, i32, i8, to_le_bytes);
98fd95acc6SHenry Wang 
99fd95acc6SHenry Wang #[cfg(target_arch = "aarch64")]
100fd95acc6SHenry Wang generate_write_fn!(write_be_u16, u16, u8, to_be_bytes);
101fd95acc6SHenry Wang #[cfg(target_arch = "aarch64")]
102fd95acc6SHenry Wang generate_write_fn!(write_be_u32, u32, u8, to_be_bytes);
103