1 // Copyright 2018 The ChromiumOS Authors 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 //! Manages system resources that can be allocated to VMs and their devices. 6 7 use remain::sorted; 8 use serde::Deserialize; 9 use serde::Serialize; 10 use thiserror::Error; 11 12 pub use crate::address_range::AddressRange; 13 pub use crate::pci_address::Error as PciAddressError; 14 pub use crate::pci_address::PciAddress; 15 pub use crate::system_allocator::AllocOptions; 16 pub use crate::system_allocator::MmioType; 17 pub use crate::system_allocator::SystemAllocator; 18 pub use crate::system_allocator::SystemAllocatorConfig; 19 20 pub mod address_allocator; 21 mod address_range; 22 mod pci_address; 23 mod system_allocator; 24 25 /// Used to tag SystemAllocator allocations. 26 #[derive(Debug, Eq, PartialEq, Hash, Copy, Clone, Serialize, Deserialize)] 27 pub enum Alloc { 28 /// An anonymous resource allocation. 29 /// Should only be instantiated through `SystemAllocator::get_anon_alloc()`. 30 /// Avoid using these. Instead, use / create a more descriptive Alloc variant. 31 Anon(usize), 32 /// A PCI BAR region with associated bus, device, function and bar numbers. 33 PciBar { bus: u8, dev: u8, func: u8, bar: u8 }, 34 /// GPU render node region. 35 GpuRenderNode, 36 /// Pmem device region with associated device index. 37 PmemDevice(usize), 38 /// pstore region. 39 Pstore, 40 /// A PCI bridge window with associated bus, dev, function. 41 PciBridgeWindow { bus: u8, dev: u8, func: u8 }, 42 /// A PCI bridge prefetch window with associated bus, dev, function. 43 PciBridgePrefetchWindow { bus: u8, dev: u8, func: u8 }, 44 /// File-backed memory mapping. 45 FileBacked(u64), 46 } 47 48 #[sorted] 49 #[derive(Error, Debug, Eq, PartialEq)] 50 pub enum Error { 51 #[error("Allocation cannot have size of 0")] 52 AllocSizeZero, 53 #[error("Pool alignment must be a power of 2")] 54 BadAlignment, 55 #[error("Alloc does not exist: {0:?}")] 56 BadAlloc(Alloc), 57 #[error("Alloc already exists: {0:?}")] 58 ExistingAlloc(Alloc), 59 #[error("Invalid Alloc: {0:?}")] 60 InvalidAlloc(Alloc), 61 #[error("IO port out of range: {0}")] 62 IOPortOutOfRange(AddressRange), 63 #[error("Platform MMIO address range not specified")] 64 MissingPlatformMMIOAddresses, 65 #[error("No IO address range specified")] 66 NoIoAllocator, 67 #[error("Out of bounds")] 68 OutOfBounds, 69 #[error("Out of space")] 70 OutOfSpace, 71 #[error("base={base} + size={size} overflows")] 72 PoolOverflow { base: u64, size: u64 }, 73 #[error("Overlapping region {0}")] 74 RegionOverlap(AddressRange), 75 } 76 77 pub type Result<T> = std::result::Result<T, Error>; 78