blob: 099b68a6f7cae3bdc4a0cfa7e119d05bbd564f8f [file]
// Copyright 2018 The ChromiumOS Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//! Manages system resources that can be allocated to VMs and their devices.
use remain::sorted;
use serde::Deserialize;
use serde::Serialize;
use thiserror::Error;
pub use crate::address_range::AddressRange;
pub use crate::pci_address::Error as PciAddressError;
pub use crate::pci_address::PciAddress;
pub use crate::system_allocator::AllocOptions;
pub use crate::system_allocator::MmioType;
pub use crate::system_allocator::SystemAllocator;
pub use crate::system_allocator::SystemAllocatorConfig;
pub mod address_allocator;
mod address_range;
mod pci_address;
mod system_allocator;
/// Used to tag SystemAllocator allocations.
#[derive(Debug, Eq, PartialEq, Hash, Copy, Clone, Serialize, Deserialize)]
pub enum Alloc {
/// An anonymous resource allocation.
/// Should only be instantiated through `SystemAllocator::get_anon_alloc()`.
/// Avoid using these. Instead, use / create a more descriptive Alloc variant.
Anon(usize),
/// A PCI BAR region with associated bus, device, function and bar numbers.
PciBar { bus: u8, dev: u8, func: u8, bar: u8 },
/// GPU render node region.
GpuRenderNode,
/// Pmem device region with associated device index.
PmemDevice(usize),
/// pstore region.
Pstore,
/// A PCI bridge window with associated bus, dev, function.
PciBridgeWindow { bus: u8, dev: u8, func: u8 },
/// A PCI bridge prefetch window with associated bus, dev, function.
PciBridgePrefetchWindow { bus: u8, dev: u8, func: u8 },
/// File-backed memory mapping.
FileBacked(u64),
}
#[sorted]
#[derive(Error, Debug, Eq, PartialEq)]
pub enum Error {
#[error("Allocation cannot have size of 0")]
AllocSizeZero,
#[error("Pool alignment must be a power of 2")]
BadAlignment,
#[error("Alloc does not exist: {0:?}")]
BadAlloc(Alloc),
#[error("Alloc already exists: {0:?}")]
ExistingAlloc(Alloc),
#[error("Invalid Alloc: {0:?}")]
InvalidAlloc(Alloc),
#[error("IO port out of range: {0}")]
IOPortOutOfRange(AddressRange),
#[error("Platform MMIO address range not specified")]
MissingPlatformMMIOAddresses,
#[error("No IO address range specified")]
NoIoAllocator,
#[error("Out of bounds")]
OutOfBounds,
#[error("Out of space")]
OutOfSpace,
#[error("base={base} + size={size} overflows")]
PoolOverflow { base: u64, size: u64 },
#[error("Overlapping region {0}")]
RegionOverlap(AddressRange),
}
pub type Result<T> = std::result::Result<T, Error>;