231 lines
8.0 KiB
Zig
231 lines
8.0 KiB
Zig
const uefi = @import("std").os.uefi;
|
|
const Event = uefi.Event;
|
|
const Guid = uefi.Guid;
|
|
const Handle = uefi.Handle;
|
|
const Status = uefi.Status;
|
|
const TableHeader = uefi.tables.TableHeader;
|
|
const DevicePathProtocol = uefi.protocols.DevicePathProtocol;
|
|
|
|
/// Boot services are services provided by the system's firmware until the operating system takes
|
|
/// over control over the hardware by calling exitBootServices.
|
|
///
|
|
/// Boot Services must not be used after exitBootServices has been called. The only exception is
|
|
/// getMemoryMap, which may be used after the first unsuccessful call to exitBootServices.
|
|
/// After successfully calling exitBootServices, system_table.console_in_handle, system_table.con_in,
|
|
/// system_table.console_out_handle, system_table.con_out, system_table.standard_error_handle,
|
|
/// system_table.std_err, and system_table.boot_services should be set to null. After setting these
|
|
/// attributes to null, system_table.hdr.crc32 must be recomputed.
|
|
///
|
|
/// As the boot_services table may grow with new UEFI versions, it is important to check hdr.header_size.
|
|
pub const BootServices = extern struct {
|
|
hdr: TableHeader,
|
|
|
|
/// Raises a task's priority level and returns its previous level.
|
|
raiseTpl: fn (usize) callconv(.C) usize,
|
|
|
|
/// Restores a task's priority level to its previous value.
|
|
restoreTpl: fn (usize) callconv(.C) void,
|
|
|
|
/// Allocates memory pages from the system.
|
|
allocatePages: fn (AllocateType, MemoryType, usize, *[*]align(4096) u8) callconv(.C) Status,
|
|
|
|
/// Frees memory pages.
|
|
freePages: fn ([*]align(4096) u8, usize) callconv(.C) Status,
|
|
|
|
/// Returns the current memory map.
|
|
getMemoryMap: fn (*usize, [*]MemoryDescriptor, *usize, *usize, *u32) callconv(.C) Status,
|
|
|
|
/// Allocates pool memory.
|
|
allocatePool: fn (MemoryType, usize, *[*]align(8) u8) callconv(.C) Status,
|
|
|
|
/// Returns pool memory to the system.
|
|
freePool: fn ([*]align(8) u8) callconv(.C) Status,
|
|
|
|
/// Creates an event.
|
|
createEvent: fn (u32, usize, ?fn (Event, ?*c_void) callconv(.C) void, ?*const c_void, *Event) callconv(.C) Status,
|
|
|
|
/// Sets the type of timer and the trigger time for a timer event.
|
|
setTimer: fn (Event, TimerDelay, u64) callconv(.C) Status,
|
|
|
|
/// Stops execution until an event is signaled.
|
|
waitForEvent: fn (usize, [*]const Event, *usize) callconv(.C) Status,
|
|
|
|
/// Signals an event.
|
|
signalEvent: fn (Event) callconv(.C) Status,
|
|
|
|
/// Closes an event.
|
|
closeEvent: fn (Event) callconv(.C) Status,
|
|
|
|
/// Checks whether an event is in the signaled state.
|
|
checkEvent: fn (Event) callconv(.C) Status,
|
|
|
|
installProtocolInterface: Status, // TODO
|
|
reinstallProtocolInterface: Status, // TODO
|
|
uninstallProtocolInterface: Status, // TODO
|
|
|
|
/// Queries a handle to determine if it supports a specified protocol.
|
|
handleProtocol: fn (Handle, *align(8) const Guid, *?*c_void) callconv(.C) Status,
|
|
|
|
reserved: *c_void,
|
|
|
|
registerProtocolNotify: Status, // TODO
|
|
|
|
/// Returns an array of handles that support a specified protocol.
|
|
locateHandle: fn (LocateSearchType, ?*align(8) const Guid, ?*const c_void, *usize, [*]Handle) callconv(.C) Status,
|
|
|
|
locateDevicePath: Status, // TODO
|
|
installConfigurationTable: Status, // TODO
|
|
|
|
/// Loads an EFI image into memory.
|
|
loadImage: fn (bool, Handle, ?*const DevicePathProtocol, ?[*]const u8, usize, *?Handle) callconv(.C) Status,
|
|
|
|
/// Transfers control to a loaded image's entry point.
|
|
startImage: fn (Handle, ?*usize, ?*[*]u16) callconv(.C) Status,
|
|
|
|
/// Terminates a loaded EFI image and returns control to boot services.
|
|
exit: fn (Handle, Status, usize, ?*const c_void) callconv(.C) Status,
|
|
|
|
/// Unloads an image.
|
|
unloadImage: fn (Handle) callconv(.C) Status,
|
|
|
|
/// Terminates all boot services.
|
|
exitBootServices: fn (Handle, usize) callconv(.C) Status,
|
|
|
|
/// Returns a monotonically increasing count for the platform.
|
|
getNextMonotonicCount: fn (*u64) callconv(.C) Status,
|
|
|
|
/// Induces a fine-grained stall.
|
|
stall: fn (usize) callconv(.C) Status,
|
|
|
|
/// Sets the system's watchdog timer.
|
|
setWatchdogTimer: fn (usize, u64, usize, ?[*]const u16) callconv(.C) Status,
|
|
|
|
connectController: Status, // TODO
|
|
disconnectController: Status, // TODO
|
|
|
|
/// Queries a handle to determine if it supports a specified protocol.
|
|
openProtocol: fn (Handle, *align(8) const Guid, *?*c_void, ?Handle, ?Handle, OpenProtocolAttributes) callconv(.C) Status,
|
|
|
|
/// Closes a protocol on a handle that was opened using openProtocol().
|
|
closeProtocol: fn (Handle, *align(8) const Guid, Handle, ?Handle) callconv(.C) Status,
|
|
|
|
/// Retrieves the list of agents that currently have a protocol interface opened.
|
|
openProtocolInformation: fn (Handle, *align(8) const Guid, *[*]ProtocolInformationEntry, *usize) callconv(.C) Status,
|
|
|
|
/// Retrieves the list of protocol interface GUIDs that are installed on a handle in a buffer allocated from pool.
|
|
protocolsPerHandle: fn (Handle, *[*]*align(8) const Guid, *usize) callconv(.C) Status,
|
|
|
|
/// Returns an array of handles that support the requested protocol in a buffer allocated from pool.
|
|
locateHandleBuffer: fn (LocateSearchType, ?*align(8) const Guid, ?*const c_void, *usize, *[*]Handle) callconv(.C) Status,
|
|
|
|
/// Returns the first protocol instance that matches the given protocol.
|
|
locateProtocol: fn (*align(8) const Guid, ?*const c_void, *?*c_void) callconv(.C) Status,
|
|
|
|
installMultipleProtocolInterfaces: Status, // TODO
|
|
uninstallMultipleProtocolInterfaces: Status, // TODO
|
|
|
|
/// Computes and returns a 32-bit CRC for a data buffer.
|
|
calculateCrc32: fn ([*]const u8, usize, *u32) callconv(.C) Status,
|
|
|
|
/// Copies the contents of one buffer to another buffer
|
|
copyMem: fn ([*]u8, [*]const u8, usize) callconv(.C) void,
|
|
|
|
/// Fills a buffer with a specified value
|
|
setMem: fn ([*]u8, usize, u8) callconv(.C) void,
|
|
|
|
createEventEx: Status, // TODO
|
|
|
|
pub const signature: u64 = 0x56524553544f4f42;
|
|
|
|
pub const event_timer: u32 = 0x80000000;
|
|
pub const event_runtime: u32 = 0x40000000;
|
|
pub const event_notify_wait: u32 = 0x00000100;
|
|
pub const event_notify_signal: u32 = 0x00000200;
|
|
pub const event_signal_exit_boot_services: u32 = 0x00000201;
|
|
pub const event_signal_virtual_address_change: u32 = 0x00000202;
|
|
|
|
pub const tpl_application: usize = 4;
|
|
pub const tpl_callback: usize = 8;
|
|
pub const tpl_notify: usize = 16;
|
|
pub const tpl_high_level: usize = 31;
|
|
};
|
|
|
|
pub const TimerDelay = extern enum(u32) {
|
|
TimerCancel,
|
|
TimerPeriodic,
|
|
TimerRelative,
|
|
};
|
|
|
|
pub const MemoryType = extern enum(u32) {
|
|
ReservedMemoryType,
|
|
LoaderCode,
|
|
LoaderData,
|
|
BootServicesCode,
|
|
BootServicesData,
|
|
RuntimeServicesCode,
|
|
RuntimeServicesData,
|
|
ConventionalMemory,
|
|
UnusableMemory,
|
|
ACPIReclaimMemory,
|
|
ACPIMemoryNVS,
|
|
MemoryMappedIO,
|
|
MemoryMappedIOPortSpace,
|
|
PalCode,
|
|
PersistentMemory,
|
|
MaxMemoryType,
|
|
};
|
|
|
|
pub const MemoryDescriptor = extern struct {
|
|
type: MemoryType,
|
|
physical_start: u64,
|
|
virtual_start: u64,
|
|
number_of_pages: usize,
|
|
attribute: packed struct {
|
|
uc: bool,
|
|
wc: bool,
|
|
wt: bool,
|
|
wb: bool,
|
|
uce: bool,
|
|
_pad1: u7,
|
|
wp: bool,
|
|
rp: bool,
|
|
xp: bool,
|
|
nv: bool,
|
|
more_reliable: bool,
|
|
ro: bool,
|
|
sp: bool,
|
|
cpu_crypto: bool,
|
|
_pad2: u43,
|
|
memory_runtime: bool,
|
|
},
|
|
};
|
|
|
|
pub const LocateSearchType = extern enum(u32) {
|
|
AllHandles,
|
|
ByRegisterNotify,
|
|
ByProtocol,
|
|
};
|
|
|
|
pub const OpenProtocolAttributes = packed struct {
|
|
by_handle_protocol: bool = false,
|
|
get_protocol: bool = false,
|
|
test_protocol: bool = false,
|
|
by_child_controller: bool = false,
|
|
by_driver: bool = false,
|
|
exclusive: bool = false,
|
|
_pad: u26 = undefined,
|
|
};
|
|
|
|
pub const ProtocolInformationEntry = extern struct {
|
|
agent_handle: ?Handle,
|
|
controller_handle: ?Handle,
|
|
attributes: OpenProtocolAttributes,
|
|
open_count: u32,
|
|
};
|
|
|
|
pub const AllocateType = extern enum(u32) {
|
|
AllocateAnyPages,
|
|
AllocateMaxAddress,
|
|
AllocateAddress,
|
|
};
|