uefi_raw/table/
runtime.rs1use crate::capsule::CapsuleHeader;
4use crate::table::boot::MemoryDescriptor;
5use crate::table::Header;
6use crate::time::Time;
7use crate::{guid, Char16, Guid, PhysicalAddress, Status};
8use bitflags::bitflags;
9use core::ffi::c_void;
10
11#[derive(Debug)]
16#[repr(C)]
17pub struct RuntimeServices {
18 pub header: Header,
19 pub get_time:
20 unsafe extern "efiapi" fn(time: *mut Time, capabilities: *mut TimeCapabilities) -> Status,
21 pub set_time: unsafe extern "efiapi" fn(time: *const Time) -> Status,
22 pub get_wakeup_time:
23 unsafe extern "efiapi" fn(enabled: *mut u8, pending: *mut u8, time: *mut Time) -> Status,
24 pub set_wakeup_time: unsafe extern "efiapi" fn(enable: u8, time: *const Time) -> Status,
25 pub set_virtual_address_map: unsafe extern "efiapi" fn(
26 map_size: usize,
27 desc_size: usize,
28 desc_version: u32,
29 virtual_map: *mut MemoryDescriptor,
30 ) -> Status,
31 pub convert_pointer:
32 unsafe extern "efiapi" fn(debug_disposition: usize, address: *mut *const c_void) -> Status,
33 pub get_variable: unsafe extern "efiapi" fn(
34 variable_name: *const Char16,
35 vendor_guid: *const Guid,
36 attributes: *mut VariableAttributes,
37 data_size: *mut usize,
38 data: *mut u8,
39 ) -> Status,
40 pub get_next_variable_name: unsafe extern "efiapi" fn(
41 variable_name_size: *mut usize,
42 variable_name: *mut u16,
43 vendor_guid: *mut Guid,
44 ) -> Status,
45 pub set_variable: unsafe extern "efiapi" fn(
46 variable_name: *const Char16,
47 vendor_guid: *const Guid,
48 attributes: VariableAttributes,
49 data_size: usize,
50 data: *const u8,
51 ) -> Status,
52 pub get_next_high_monotonic_count: unsafe extern "efiapi" fn(high_count: *mut u32) -> Status,
53 pub reset_system: unsafe extern "efiapi" fn(
54 rt: ResetType,
55 status: Status,
56 data_size: usize,
57 data: *const u8,
58 ) -> !,
59
60 pub update_capsule: unsafe extern "efiapi" fn(
62 capsule_header_array: *const *const CapsuleHeader,
63 capsule_count: usize,
64 scatter_gather_list: PhysicalAddress,
65 ) -> Status,
66 pub query_capsule_capabilities: unsafe extern "efiapi" fn(
67 capsule_header_array: *const *const CapsuleHeader,
68 capsule_count: usize,
69 maximum_capsule_size: *mut u64,
70 reset_type: *mut ResetType,
71 ) -> Status,
72
73 pub query_variable_info: unsafe extern "efiapi" fn(
75 attributes: VariableAttributes,
76 maximum_variable_storage_size: *mut u64,
77 remaining_variable_storage_size: *mut u64,
78 maximum_variable_size: *mut u64,
79 ) -> Status,
80}
81
82newtype_enum! {
83 #[derive(Default)]
84 pub enum ResetType: u32 => {
86 COLD = 0,
90
91 WARM = 1,
96
97 SHUTDOWN = 2,
99
100 PLATFORM_SPECIFIC = 3,
102 }
103}
104
105#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
107#[repr(C)]
108pub struct TimeCapabilities {
109 pub resolution: u32,
112
113 pub accuracy: u32,
115
116 pub sets_to_zero: bool,
119}
120
121bitflags! {
122 #[repr(transparent)]
124 #[derive(Clone, Copy, Debug, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
125 pub struct VariableAttributes: u32 {
126 const NON_VOLATILE = 0x01;
128
129 const BOOTSERVICE_ACCESS = 0x02;
132
133 const RUNTIME_ACCESS = 0x04;
136
137 const HARDWARE_ERROR_RECORD = 0x08;
140
141 const AUTHENTICATED_WRITE_ACCESS = 0x10;
143
144 const TIME_BASED_AUTHENTICATED_WRITE_ACCESS = 0x20;
147
148 const APPEND_WRITE = 0x40;
153
154 const ENHANCED_AUTHENTICATED_ACCESS = 0x80;
157 }
158}
159
160newtype_enum! {
161 pub enum VariableVendor: Guid => {
165 GLOBAL_VARIABLE = guid!("8be4df61-93ca-11d2-aa0d-00e098032b8c"),
167
168 IMAGE_SECURITY_DATABASE = guid!("d719b2cb-3d3a-4596-a3bc-dad00e67656f"),
170 }
171}