use crate::capsule::CapsuleHeader;
use crate::table::Header;
use crate::table::boot::MemoryDescriptor;
use crate::time::Time;
use crate::{Boolean, Char16, Guid, PhysicalAddress, Status, guid, newtype_enum};
use bitflags::bitflags;
use core::ffi::c_void;
#[derive(Debug)]
#[repr(C)]
pub struct RuntimeServices {
pub header: Header,
pub get_time:
unsafe extern "efiapi" fn(time: *mut Time, capabilities: *mut TimeCapabilities) -> Status,
pub set_time: unsafe extern "efiapi" fn(time: *const Time) -> Status,
pub get_wakeup_time:
unsafe extern "efiapi" fn(enabled: *mut u8, pending: *mut u8, time: *mut Time) -> Status,
pub set_wakeup_time: unsafe extern "efiapi" fn(enable: u8, time: *const Time) -> Status,
pub set_virtual_address_map: unsafe extern "efiapi" fn(
map_size: usize,
desc_size: usize,
desc_version: u32,
virtual_map: *mut MemoryDescriptor,
) -> Status,
pub convert_pointer:
unsafe extern "efiapi" fn(debug_disposition: usize, address: *mut *const c_void) -> Status,
pub get_variable: unsafe extern "efiapi" fn(
variable_name: *const Char16,
vendor_guid: *const Guid,
attributes: *mut VariableAttributes,
data_size: *mut usize,
data: *mut u8,
) -> Status,
pub get_next_variable_name: unsafe extern "efiapi" fn(
variable_name_size: *mut usize,
variable_name: *mut u16,
vendor_guid: *mut Guid,
) -> Status,
pub set_variable: unsafe extern "efiapi" fn(
variable_name: *const Char16,
vendor_guid: *const Guid,
attributes: VariableAttributes,
data_size: usize,
data: *const u8,
) -> Status,
pub get_next_high_monotonic_count: unsafe extern "efiapi" fn(high_count: *mut u32) -> Status,
pub reset_system: unsafe extern "efiapi" fn(
rt: ResetType,
status: Status,
data_size: usize,
data: *const u8,
) -> !,
pub update_capsule: unsafe extern "efiapi" fn(
capsule_header_array: *const *const CapsuleHeader,
capsule_count: usize,
scatter_gather_list: PhysicalAddress,
) -> Status,
pub query_capsule_capabilities: unsafe extern "efiapi" fn(
capsule_header_array: *const *const CapsuleHeader,
capsule_count: usize,
maximum_capsule_size: *mut u64,
reset_type: *mut ResetType,
) -> Status,
pub query_variable_info: unsafe extern "efiapi" fn(
attributes: VariableAttributes,
maximum_variable_storage_size: *mut u64,
remaining_variable_storage_size: *mut u64,
maximum_variable_size: *mut u64,
) -> Status,
}
newtype_enum! {
#[derive(Default)]
pub enum ResetType: u32 => {
COLD = 0,
WARM = 1,
SHUTDOWN = 2,
PLATFORM_SPECIFIC = 3,
}
}
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[repr(C)]
pub struct TimeCapabilities {
pub resolution: u32,
pub accuracy: u32,
pub sets_to_zero: Boolean,
}
bitflags! {
#[repr(transparent)]
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct VariableAttributes: u32 {
const NON_VOLATILE = 0x01;
const BOOTSERVICE_ACCESS = 0x02;
const RUNTIME_ACCESS = 0x04;
const HARDWARE_ERROR_RECORD = 0x08;
const AUTHENTICATED_WRITE_ACCESS = 0x10;
const TIME_BASED_AUTHENTICATED_WRITE_ACCESS = 0x20;
const APPEND_WRITE = 0x40;
const ENHANCED_AUTHENTICATED_ACCESS = 0x80;
}
}
newtype_enum! {
pub enum VariableVendor: Guid => {
GLOBAL_VARIABLE = guid!("8be4df61-93ca-11d2-aa0d-00e098032b8c"),
IMAGE_SECURITY_DATABASE = guid!("d719b2cb-3d3a-4596-a3bc-dad00e67656f"),
}
}