use core::{default::Default, ffi::c_void};
use r_efi::{
efi::{Guid, Handle, PhysicalAddress, Status},
system::TableHeader,
};
pub const DXE_SERVICES_TABLE_GUID: Guid =
Guid::from_fields(0x5ad34ba, 0x6f02, 0x4214, 0x95, 0x2e, &[0x4d, 0xa0, 0x39, 0x8e, 0x2b, 0xb9]);
pub type AddMemorySpace = extern "efiapi" fn(GcdMemoryType, PhysicalAddress, u64, u64) -> Status;
pub type AllocateMemorySpace =
extern "efiapi" fn(GcdAllocateType, GcdMemoryType, usize, u64, *mut PhysicalAddress, Handle, Handle) -> Status;
pub type FreeMemorySpace = extern "efiapi" fn(PhysicalAddress, u64) -> Status;
pub type RemoveMemorySpace = extern "efiapi" fn(PhysicalAddress, u64) -> Status;
pub type GetMemorySpaceDescriptor = extern "efiapi" fn(PhysicalAddress, *mut MemorySpaceDescriptor) -> Status;
pub type SetMemorySpaceAttributes = extern "efiapi" fn(PhysicalAddress, u64, u64) -> Status;
pub type SetMemorySpaceCapabilities = extern "efiapi" fn(PhysicalAddress, u64, u64) -> Status;
pub type GetMemorySpaceMap = extern "efiapi" fn(*mut usize, *mut *mut MemorySpaceDescriptor) -> Status;
pub type AddIoSpace = extern "efiapi" fn(GcdIoType, PhysicalAddress, u64) -> Status;
pub type AllocateIoSpace =
extern "efiapi" fn(GcdAllocateType, GcdIoType, usize, u64, *mut PhysicalAddress, Handle, Handle) -> Status;
pub type FreeIoSpace = extern "efiapi" fn(PhysicalAddress, u64) -> Status;
pub type RemoveIoSpace = extern "efiapi" fn(PhysicalAddress, u64) -> Status;
pub type GetIoSpaceDescriptor = extern "efiapi" fn(PhysicalAddress, *mut IoSpaceDescriptor) -> Status;
pub type GetIoSpaceMap = extern "efiapi" fn(*mut usize, *mut *mut IoSpaceDescriptor) -> Status;
pub type Dispatch = extern "efiapi" fn() -> Status;
pub type Schedule = extern "efiapi" fn(Handle, *const Guid) -> Status;
pub type Trust = extern "efiapi" fn(Handle, *const Guid) -> Status;
pub type ProcessFirmwareVolume = extern "efiapi" fn(*const c_void, usize, *mut Handle) -> Status;
#[repr(C)]
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum GcdMemoryType {
#[default]
NonExistent = 0,
Reserved,
SystemMemory,
MemoryMappedIo,
Persistent,
MoreReliable,
Unaccepted,
}
#[repr(C)]
#[derive(Debug, Clone, Copy, Default)]
pub enum GcdAllocateType {
#[default]
AnySearchBottomUp,
MaxAddressSearchBottomUp,
Address,
AnySearchTopDown,
MaxAddressSearchTopDown,
MaxAllocateType,
}
#[repr(C)]
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct MemorySpaceDescriptor {
pub base_address: PhysicalAddress,
pub length: u64,
pub capabilities: u64,
pub attributes: u64,
pub memory_type: GcdMemoryType,
pub image_handle: Handle,
pub device_handle: Handle,
}
#[repr(C)]
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum GcdIoType {
#[default]
NonExistent = 0,
Reserved,
Io,
Maximum,
}
#[repr(C)]
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct IoSpaceDescriptor {
pub base_address: PhysicalAddress,
pub length: u64,
pub io_type: GcdIoType,
pub image_handle: Handle,
pub device_handle: Handle,
}
#[repr(C)]
pub struct DxeServicesTable {
pub header: TableHeader,
pub add_memory_space: AddMemorySpace,
pub allocate_memory_space: AllocateMemorySpace,
pub free_memory_space: FreeMemorySpace,
pub remove_memory_space: RemoveMemorySpace,
pub get_memory_space_descriptor: GetMemorySpaceDescriptor,
pub set_memory_space_attributes: SetMemorySpaceAttributes,
pub get_memory_space_map: GetMemorySpaceMap,
pub add_io_space: AddIoSpace,
pub allocate_io_space: AllocateIoSpace,
pub free_io_space: FreeIoSpace,
pub remove_io_space: RemoveIoSpace,
pub get_io_space_descriptor: GetIoSpaceDescriptor,
pub get_io_space_map: GetIoSpaceMap,
pub dispatch: Dispatch,
pub schedule: Schedule,
pub trust: Trust,
pub process_firmware_volume: ProcessFirmwareVolume,
pub set_memory_space_capabilities: SetMemorySpaceCapabilities,
}
impl Default for MemorySpaceDescriptor {
fn default() -> Self {
Self {
base_address: Default::default(),
length: Default::default(),
capabilities: Default::default(),
attributes: Default::default(),
memory_type: Default::default(),
image_handle: 0 as Handle,
device_handle: 0 as Handle,
}
}
}
impl Default for IoSpaceDescriptor {
fn default() -> Self {
Self {
base_address: Default::default(),
length: Default::default(),
io_type: Default::default(),
image_handle: 0 as Handle,
device_handle: 0 as Handle,
}
}
}