use alloc::vec::Vec;
use axvm_types::GuestPhysAddr;
#[derive(Debug, Clone)]
pub struct GuestDeviceTree {
load_gpa: GuestPhysAddr,
bytes: Vec<u8>,
}
impl GuestDeviceTree {
pub fn generated(load_gpa: GuestPhysAddr, bytes: Vec<u8>) -> Self {
Self { load_gpa, bytes }
}
pub const fn load_gpa(&self) -> GuestPhysAddr {
self.load_gpa
}
pub fn bytes(&self) -> &[u8] {
&self.bytes
}
pub(crate) fn range(&self) -> (usize, usize) {
(self.load_gpa.as_usize(), self.bytes.len())
}
}
#[derive(Debug, Clone)]
pub struct GuestAcpiTables {
rsdp_gpa: GuestPhysAddr,
bytes: Vec<u8>,
}
impl GuestAcpiTables {
pub fn generated(rsdp_gpa: GuestPhysAddr, bytes: Vec<u8>) -> Self {
Self { rsdp_gpa, bytes }
}
pub const fn rsdp_gpa(&self) -> GuestPhysAddr {
self.rsdp_gpa
}
pub fn bytes(&self) -> &[u8] {
&self.bytes
}
pub(crate) fn range(&self) -> (usize, usize) {
(self.rsdp_gpa.as_usize(), self.bytes.len())
}
}
#[derive(Debug, Default, Clone)]
pub struct GuestBootDescription {
device_tree: Option<GuestDeviceTree>,
acpi_tables: Option<GuestAcpiTables>,
}
impl GuestBootDescription {
pub const fn none() -> Self {
Self {
device_tree: None,
acpi_tables: None,
}
}
pub fn set_device_tree(&mut self, device_tree: GuestDeviceTree) {
self.device_tree = Some(device_tree);
self.acpi_tables = None;
}
pub fn set_acpi_tables(&mut self, acpi_tables: GuestAcpiTables) {
self.acpi_tables = Some(acpi_tables);
self.device_tree = None;
}
pub const fn device_tree(&self) -> Option<&GuestDeviceTree> {
self.device_tree.as_ref()
}
pub const fn acpi_tables(&self) -> Option<&GuestAcpiTables> {
self.acpi_tables.as_ref()
}
pub(crate) fn occupied_ranges(&self) -> impl Iterator<Item = (usize, usize)> + '_ {
self.device_tree
.iter()
.map(GuestDeviceTree::range)
.chain(self.acpi_tables.iter().map(GuestAcpiTables::range))
}
}
#[derive(Debug, Default)]
pub struct GuestFdtBuilder {
bytes: Vec<u8>,
}
impl GuestFdtBuilder {
pub fn from_bytes(bytes: Vec<u8>) -> Self {
Self { bytes }
}
pub fn build(self, load_gpa: GuestPhysAddr) -> GuestDeviceTree {
GuestDeviceTree::generated(load_gpa, self.bytes)
}
}