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