diff options
| author | andromeda <andromeda@bsd.my.domain> | 2026-10-19 01:41:59 -0400 |
|---|---|---|
| committer | andromeda <andromeda@bsd.my.domain> | 2026-10-19 01:41:59 -0400 |
| commit | 7ebe14b3275fba00662e0c0ceeabe96343d04c5a (patch) | |
| tree | a594923a4073c1eb1db766d41da297a715220479 /lib/uefi.c3l/src/def.c3i | |
init
Diffstat (limited to 'lib/uefi.c3l/src/def.c3i')
| -rw-r--r-- | lib/uefi.c3l/src/def.c3i | 240 |
1 files changed, 240 insertions, 0 deletions
diff --git a/lib/uefi.c3l/src/def.c3i b/lib/uefi.c3l/src/def.c3i new file mode 100644 index 0000000..f595caa --- /dev/null +++ b/lib/uefi.c3l/src/def.c3i @@ -0,0 +1,240 @@ +module uefi; + + +/* + * EFI_HANDLE alias (sec x.x.x of the UEFI 2.11 specification). + */ +typedef EfiHandle = void*; + +/* + * All UEFI strings are wchar_t strings (Wide-Char types). + */ +alias EfiString = ushort[]; +alias EfiStringRaw = ushort*; + +/* + * ... But ASCII strings can also be used and dynamically converted to wide ones. + */ +alias AsciiString = char[]; +alias AsciiStringRaw = char*; + +/* + * EFI_EVENT alias (sec 7.1.1 of the UEFI 2.11 specification). + */ +typedef EfiEvent = void*; + + +/* + * EFI_TABLE_HEADER structure (sec 4.2.1 of the UEFI 2.11 specification). + * The same section contains the following constant expressions + * as well as the EFI_SYSTEM_TABLE structure. + */ +struct EfiTableHeader @packed +{ + ulong signature; + uint revision; + uint header_size; + uint crc32; + uint _reserved; +} + +const ulong EFI_SYSTEM_TABLE_SIGNATURE = 0x5453595320494249; +const uint EFI_2_100_SYSTEM_TABLE_REVISION = ((2<<16) | (100)); +const uint EFI_2_90_SYSTEM_TABLE_REVISION = ((2<<16) | (90)); +const uint EFI_2_80_SYSTEM_TABLE_REVISION = ((2<<16) | (80)); +const uint EFI_2_70_SYSTEM_TABLE_REVISION = ((2<<16) | (70)); +const uint EFI_2_60_SYSTEM_TABLE_REVISION = ((2<<16) | (60)); +const uint EFI_2_50_SYSTEM_TABLE_REVISION = ((2<<16) | (50)); +const uint EFI_2_40_SYSTEM_TABLE_REVISION = ((2<<16) | (40)); +const uint EFI_2_31_SYSTEM_TABLE_REVISION = ((2<<16) | (31)); +const uint EFI_2_30_SYSTEM_TABLE_REVISION = ((2<<16) | (30)); +const uint EFI_2_20_SYSTEM_TABLE_REVISION = ((2<<16) | (20)); +const uint EFI_2_10_SYSTEM_TABLE_REVISION = ((2<<16) | (10)); +const uint EFI_2_00_SYSTEM_TABLE_REVISION = ((2<<16) | (00)); +const uint EFI_1_10_SYSTEM_TABLE_REVISION = ((1<<16) | (10)); +const uint EFI_1_02_SYSTEM_TABLE_REVISION = ((1<<16) | (02)); +const uint EFI_SYSTEM_TABLE_REVISION = EFI_2_100_SYSTEM_TABLE_REVISION; +const uint EFI_SPECIFICATION_VERSION = EFI_SYSTEM_TABLE_REVISION; + +/* NOTE: Do NOT pack this struct: firmware_revision being 32-bit causes misalignment */ +struct SystemTable +{ + EfiTableHeader header; + EfiStringRaw firmware_vendor; + uint firmware_revision; + EfiHandle conin_handle; + SimpleTextInputProtocol *conin; + EfiHandle conout_handle; + SimpleTextOutputProtocol *conout; + EfiHandle conerr_handle; + SimpleTextOutputProtocol *conerr; + RuntimeServices *runtime_services; + BootServices *boot_services; + usz num_entries; + ConfigurationTable *configuration_table; +} + + +/* + * EFI_CONFIGURATION_TABLE structure (sec 4.6.1 of the UEFI 2.11 specification). + */ +struct ConfigurationTable @packed +{ + EfiGuid vendor_guid; + void *vendor_table; +} + + +/* EFI_BOOT_SERVICES structure (4.4.1) */ +const ulong EFI_BOOT_SERVICES_SIGNATURE = 0x56524553544f4f42; //'BOOTSERV' <- EightCC +const uint EFI_BOOT_SERVICES_REVISION = EFI_SPECIFICATION_VERSION; + +struct BootServices @packed +{ + EfiTableHeader header; + + /* Task priority services (uefi::proto::evt) */ + FnRaiseTpl raise_tpl; + FnRestoreTpl restore_tpl; + + /* Memory services (uefi::proto::mem) */ + FnAllocatePages allocate_pages; + FnFreePages free_pages; + FnGetMemoryMap get_memory_map; + FnAllocatePool allocate_pool; + FnFreePool free_pool; + + /* Event and Timer services (uefi::proto::evt) */ + FnCreateEvent create_event; + FnSetTimer set_timer; + FnWaitForEvent wait_for_event; + FnSignalEvent signal_event; + FnCloseEvent close_event; + FnCheckEvent check_event; + + /* Protocol Handler services (uefi::proto::handler) */ + FnInstallProtocolInterface install_protocol_interface; + FnReinstallProtocolInterface reinstall_protocol_interface; + FnUninstallProtocolInterface uninstall_protocol_interface; + FnHandleProtocol handle_protocol; + void *_reserved; /* alright then */ + FnRegisterProtocolNotify register_protocol_notify; + FnLocateHandle locate_handle; + FnLocateDevicePath locate_device_path; + FnInstallConfigurationTable install_configuration_table; + + /* Image services (uefi::proto::image) */ + FnLoadImage load_image; + FnStartImage start_image; + FnExitImage exit_image; + FnUnloadImage unload_image; + FnExitBootServices exit_boot_services; + + /* Misc services (uefi::proto::misc_bs) */ + FnGetNextMonotonicCount get_next_monotonic_count; + FnStall stall; + FnSetWatchdogTimer set_watchdog_timer; + + /* Driver Support services (uefi::proto::handler) */ + FnConnectController connect_controller; + FnDisconnectController disconnect_controller; + + /* Open/Close Protocol services (uefi::proto::handler) */ + FnOpenProtocol open_protocol; + FnCloseProtocol close_protocol; + FnOpenProtocolInformation open_protocol_information; + + /* Library services (uefi::proto::handler) */ + FnProtocolsPerHandle protocols_per_handle; + FnLocateHandleBuffer locate_handle_buffer; + FnLocateProtocol locate_protocol; + FnInstallMultipleProtocolInterfaces install_multiple_protocol_interfaces; + FnUninstallMultipleProtocolInterfaces uninstall_multiple_protocol_interfaces; + + /* 32-bit CRC services (uefi::proto::misc_bs) */ + FnCalculateCrc32 calculate_crc32; + + /* More misc/trailing services */ + FnCopyMem copy_mem; + FnSetMem set_mem; + FnCreateEventEx create_event_ex; +} + + +struct RuntimeServices @packed +{ + EfiTableHeader header; + + /* Time services (uefi::proto::time) */ + FnGetTime get_time; + FnSetTime set_time; + FnGetWakeupTime get_wakeup_time; + FnSetWakeupTime set_wakeup_time; + + /* Virtual Memory services (uefi::proto::mem) */ + FnSetVirtualAddressMap set_virtual_address_map; + FnConvertPointer convert_pointer; + + /* Variable services (uefi::proto::variable) */ + FnGetVariable get_variable; + FnGetNextVariableName get_next_variable_name; + FnSetVariable set_variable; + + /* Miscellaneous and Capsule services (uefi::proto::misc_rt) */ + FnGetNextHighMonotonicCount get_next_high_monotonic_count; + FnResetSystem reset_system; + FnUpdateCapsule update_capsule; + FnQueryCapsuleCapabilities query_capsule_capabilities; + FnQueryVariableInfo query_variable_info; +} + + + +/* + * EFI_GUID structure (sec x.x.x of the UEFI 2.11 specification). + */ +struct EfiGuid @packed +{ + uint data1; + ushort data2; + ushort data3; + char[8] data4; +} + + +/* + * EFI_TIME structure (sec 8.3.1 of the UEFI 2.11 specification). + */ +struct EfiTime @packed +{ + ushort year; + char month; + char day; + char hour; + char minute; + char second; + char _pad1; + uint nanosecond; + short timezone; + EfiDaylightFlags daylight; + char _pad2; +} + +bitstruct EfiDaylightFlags : char +{ + bool adjust : 0; + bool in_daylight : 1; + char reserved : 2..7; +} + +const short EFI_UNSPECIFIED_TIMEZONE = 0x07FF; + +/* + * EFI_TIME_CAPABILITIES (sec 8.3.1 of the UEFI 2.11 specification). + */ +struct EfiTimeCapabilities @packed +{ + uint resolution; + uint accuracy; + bool sets_to_zero; +} |
