blob: 3e280517877d8308c3364b2d059764182df7e8a8 [file] [log] [blame]
/*
* Copyright (c) 2020 Intel Corporation
*
* SPDX-License-Identifier: Apache-2.0
*/
#ifndef ZEPHYR_ARCH_X86_EFI_H_
#define ZEPHYR_ARCH_X86_EFI_H_
#ifndef _ASMLANGUAGE
#include <stdbool.h>
#include <zephyr/sys/util.h>
#define __abi __attribute__((ms_abi))
/*
* This is a quick installment of EFI structures and functions.
* Only a very minimal subset will be used and documented, thus the
* lack of documentation at the moment.
* See the UEFI 2.8b specifications for more information
* at https://www.uefi.org/specifications
*/
/* Note: all specified attributes/parameters of type char16_t have been
* translated to uint16_t as, for now, we don't have char16_t and we don't
* care being pedantic, plus we do not use it yet.
* This will need to be changed if required.
*/
typedef uintptr_t efi_status_t;
#define EFI_STATUS(_status) (_status | BIT((BITS_PER_LONG-1)))
#define EFI_SUCCESS 0
#define EFI_LOAD_ERROR EFI_STATUS(1)
#define EFI_INVALID_PARAMETER EFI_STATUS(2)
#define EFI_UNSUPPORTED EFI_STATUS(3)
#define EFI_BAD_BUFFER_SIZE EFI_STATUS(4)
#define EFI_BUFFER_TOO_SMALL EFI_STATUS(5)
#define EFI_NOT_READY EFI_STATUS(6)
#define EFI_DEVICE_ERROR EFI_STATUS(7)
#define EFI_WRITE_PROTECTED EFI_STATUS(8)
#define EFI_OUT_OF_RESOURCES EFI_STATUS(9)
#define EFI_VOLUME_CORRUPTED EFI_STATUS(10)
#define EFI_VOLUME_FULL EFI_STATUS(11)
#define EFI_NO_MEDIA EFI_STATUS(12)
#define EFI_MEDIA_CHANGED EFI_STATUS(13)
#define EFI_NOT_FOUND EFI_STATUS(14)
#define EFI_ACCESS_DENIED EFI_STATUS(15)
#define EFI_NO_RESPONSE EFI_STATUS(16)
#define EFI_NO_MAPPING EFI_STATUS(17)
#define EFI_TIMEOUT EFI_STATUS(18)
#define EFI_NOT_STARTED EFI_STATUS(19)
#define EFI_ALREADY_STARTED EFI_STATUS(20)
#define EFI_ABORTED EFI_STATUS(21)
#define EFI_ICMP_ERROR EFI_STATUS(22)
#define EFI_TFTP_ERROR EFI_STATUS(23)
#define EFI_PROTOCOL_ERROR EFI_STATUS(24)
#define EFI_INCOMPATIBLE_VERSION EFI_STATUS(25)
#define EFI_SECURITY_VIOLATION EFI_STATUS(26)
#define EFI_CRC_ERROR EFI_STATUS(27)
#define EFI_END_OF_MEDIA EFI_STATUS(28)
#define EFI_END_OF_FILE EFI_STATUS(31)
#define EFI_INVALID_LANGUAGE EFI_STATUS(32)
#define EFI_COMPROMISED_DATA EFI_STATUS(33)
#define EFI_IP_ADDRESS_CONFLICT EFI_STATUS(34)
#define EFI_HTTP_ERROR EFI_STATUS(35)
typedef struct {
union {
struct {
uint32_t Data1;
uint16_t Data2;
uint16_t Data3;
uint8_t Data4[8];
};
/* Easier for comparison */
struct {
uint64_t Part1;
uint64_t Part2;
};
};
} efi_guid_t;
struct efi_input_key {
uint16_t ScanCode;
uint16_t UnicodeChar;
};
struct efi_table_header {
uint64_t Signature;
uint32_t Revision;
uint32_t HeaderSize;
uint32_t CRC32;
uint32_t Reserved;
};
struct efi_simple_text_input;
typedef efi_status_t __abi (*efi_input_reset_t)(
struct efi_simple_text_input *This,
bool ExtendedVerification);
typedef efi_status_t __abi (*efi_input_read_key_t)(
struct efi_simple_text_input *This,
struct efi_input_key *Key);
struct efi_simple_text_input {
efi_input_reset_t Reset;
efi_input_read_key_t ReadKeyStroke;
void *WaitForKey;
};
struct efi_simple_text_output_mode {
int32_t MaxMode;
int32_t Mode;
int32_t Attribute;
int32_t CursorColumn;
int32_t CursorRow;
bool CursorVisible;
};
struct efi_simple_text_output;
typedef efi_status_t __abi (*efi_text_reset_t)(
struct efi_simple_text_output *This,
bool ExtendedVerification);
typedef efi_status_t __abi (*efi_text_string_t)(
struct efi_simple_text_output *This,
uint16_t *String);
typedef efi_status_t __abi (*efi_text_test_string_t)(
struct efi_simple_text_output *This,
uint16_t *String);
typedef efi_status_t __abi (*efi_text_query_mode_t)(
struct efi_simple_text_output *This,
uintptr_t ModeNumber,
uintptr_t *Columns,
uintptr_t *Rows);
typedef efi_status_t __abi (*efi_text_set_mode_t)(
struct efi_simple_text_output *This,
uintptr_t ModeNumber);
typedef efi_status_t __abi (*efi_text_set_attribute_t)(
struct efi_simple_text_output *This,
uintptr_t Attribute);
typedef efi_status_t __abi (*efi_text_clear_screen_t)(
struct efi_simple_text_output *This);
typedef efi_status_t __abi (*efi_text_cursor_position_t)(
struct efi_simple_text_output *This,
uintptr_t Column,
uintptr_t Row);
typedef efi_status_t __abi (*efi_text_enable_cursor_t)(
struct efi_simple_text_output *This,
bool Visible);
struct efi_simple_text_output {
efi_text_reset_t Reset;
efi_text_string_t OutputString;
efi_text_test_string_t TestString;
efi_text_query_mode_t QueryMode;
efi_text_set_mode_t SetMode;
efi_text_set_attribute_t SetAttribute;
efi_text_clear_screen_t ClearScreen;
efi_text_cursor_position_t SetCursorPosition;
efi_text_enable_cursor_t EnableCursor;
struct efi_simple_text_output_mode *Mode;
};
struct efi_time {
uint16_t Year;
uint8_t Month;
uint8_t Day;
uint8_t Hour;
uint8_t Minute;
uint8_t Second;
uint8_t Pad1;
uint32_t NanoSecond;
int16_t TimeZone;
uint8_t DayLight;
uint8_t Pad2;
};
struct efi_time_capabilities {
uint32_t Resolution;
uint32_t Accuracy;
bool SetsToZero;
};
struct efi_memory_descriptor {
uint32_t Type;
uint64_t PhysicalStart;
uint64_t VirtualStart;
uint64_t NumberOfPages;
uint64_t Attribute;
};
typedef efi_status_t __abi (*efi_get_time_t)(
struct efi_time *Time,
struct efi_time_capabilities *Capabilities);
typedef efi_status_t __abi (*efi_set_time_t)(struct efi_time *Time);
typedef efi_status_t __abi (*efi_get_wakeup_time_t)(bool *Enabled,
bool *Pending,
struct efi_time *Time);
typedef efi_status_t __abi (*efi_set_wakeup_time_t)(bool Enabled,
struct efi_time *Time);
typedef efi_status_t __abi (*efi_set_virtual_address_map_t)(
uintptr_t MemoryMapSize,
uintptr_t DescriptorSize,
uint32_t DescriptorVersion,
struct efi_memory_descriptor *VirtualMap);
typedef efi_status_t __abi (*efi_convert_pointer_t)(uintptr_t DebugDisposition,
void **Address);
typedef efi_status_t __abi (*efi_get_variable_t)(uint16_t *VariableName,
efi_guid_t *VendorGuid,
uint32_t *Attributes,
uintptr_t *DataSize,
void *Data);
typedef efi_status_t __abi (*efi_get_next_variable_name_t)(
uintptr_t *VariableNameSize,
uint16_t *VariableName,
efi_guid_t *VendorGuid);
typedef efi_status_t __abi (*efi_set_variable_t)(uint16_t *VariableName,
efi_guid_t *VendorGuid,
uint32_t *Attributes,
uintptr_t *DataSize,
void *Data);
typedef efi_status_t __abi (*efi_get_next_high_monotonic_count_t)(
uint32_t *HighCount);
enum efi_reset_type {
EfiResetCold,
EfiResetWarm,
EfiResetShutdown,
EfiResetPlatformSpecific
};
typedef efi_status_t __abi (*efi_reset_system_t)(
enum efi_reset_type ResetType,
uintptr_t ResetStatus,
uintptr_t DataSize,
void *ResetData);
struct efi_capsule_header {
efi_guid_t CapsuleGuid;
uint32_t HeaderSize;
uint32_t Flags;
uint32_t CapsuleImageSize;
};
typedef efi_status_t __abi (*efi_update_capsule_t)(
struct efi_capsule_header **CapsuleHeaderArray,
uintptr_t CapsuleCount,
uint64_t ScatterGatherList);
typedef efi_status_t __abi (*efi_query_capsule_capabilities_t)(
struct efi_capsule_header **CapsuleHeaderArray,
uintptr_t CapsuleCount,
uint64_t *MaximumCapsuleSize,
enum efi_reset_type ResetType);
typedef efi_status_t __abi (*efi_query_variable_info_t)(
uint32_t Attributes,
uint64_t *MaximumVariableStorageSize,
uint64_t *RemainingVariableStorageSize,
uint64_t *MaximumVariableSize);
struct efi_runtime_services {
struct efi_table_header Hdr;
efi_get_time_t GetTime;
efi_set_time_t SetTime;
efi_get_wakeup_time_t GetWakeupTime;
efi_set_wakeup_time_t SetWakeupTime;
efi_set_virtual_address_map_t SetVirtualAddressMap;
efi_convert_pointer_t ConvertPointer;
efi_get_variable_t GetVariable;
efi_get_next_variable_name_t GetNextVariableName;
efi_set_variable_t SetVariable;
efi_get_next_high_monotonic_count_t GetNextHighMonotonicCount;
efi_reset_system_t ResetSystem;
efi_update_capsule_t UpdateCapsule;
efi_query_capsule_capabilities_t QueryCapsuleCapabilities;
efi_query_variable_info_t QueryVariableInfo;
};
typedef uintptr_t __abi (*efi_raise_tpl_t)(uintptr_t NewTpl);
typedef void __abi (*efi_restore_tpl_t)(uintptr_t OldTpl);
enum efi_allocate_type {
AllocateAnyPages,
AllocateMaxAddress,
AllocateAddress,
MaxAllocateType
};
enum efi_memory_type {
EfiReservedMemoryType,
EfiLoaderCode,
EfiLoaderData,
EfiBootServicesCode,
EfiBootServicesData,
EfiRuntimeServicesCode,
EfiRuntimeServicesData,
EfiConventionalMemory,
EfiUnusableMemory,
EfiACPIReclaimMemory,
EfiACPIMemoryNVS,
EfiMemoryMappedIO,
EfiMemoryMappedIOPortSpace,
EfiPalCode,
EfiPersistentMemory,
EfiMaxMemoryType
};
typedef efi_status_t __abi (*efi_allocate_pages_t)(
enum efi_allocate_type Type,
enum efi_memory_type MemoryType,
uintptr_t Pages,
uint64_t *Memory);
typedef efi_status_t __abi (*efi_free_pages_t)(uint64_t Memory,
uintptr_t Pages);
typedef efi_status_t __abi (*efi_get_memory_map_t)(
uintptr_t *MemoryMapSize,
struct efi_memory_descriptor *MemoryMap,
uintptr_t *MapKey,
uintptr_t *DescriptorSize,
uint32_t *DescriptorVersion);
typedef efi_status_t __abi (*efi_allocate_pool_t)(
enum efi_memory_type PoolType,
uintptr_t Size,
void **Buffer);
typedef efi_status_t __abi (*efi_free_pool_t)(void *Buffer);
typedef void __abi (*efi_notify_function_t)(void *Event,
void *context);
typedef efi_status_t __abi (*efi_create_event_t)(
uint32_t Type,
uintptr_t NotifyTpl,
efi_notify_function_t NotifyFunction,
void *NotifyContext,
void **Event);
enum efi_timer_delay {
TimerCancel,
TimerPeriodic,
TimerRelative
};
typedef efi_status_t __abi (*efi_set_timer_t)(void *Event,
enum efi_timer_delay Type,
uint64_t TriggerTime);
typedef efi_status_t __abi (*efi_wait_for_event_t)(uintptr_t NumberOfEvents,
void **Event,
uintptr_t *Index);
typedef efi_status_t __abi (*efi_signal_event_t)(void *Event);
typedef efi_status_t __abi (*efi_close_event_t)(void *Event);
typedef efi_status_t __abi (*efi_check_event_t)(void *Event);
enum efi_interface_type {
EFI_NATIVE_INTERFACE
};
typedef efi_status_t __abi (*efi_install_protocol_interface_t)(
void **Handle,
efi_guid_t *Protocol,
enum efi_interface_type InterfaceType,
void *Interface);
typedef efi_status_t __abi (*efi_reinstall_protocol_interface_t)(
void **Handle,
efi_guid_t *Protocol,
void *OldInterface,
void *NewInterface);
typedef efi_status_t __abi (*efi_uninstall_protocol_interface_t)(
void **Handle,
efi_guid_t *Protocol,
void *Interface);
typedef efi_status_t __abi (*efi_handle_protocol_t)(
void **Handle,
efi_guid_t *Protocol,
void **Interface);
typedef efi_status_t __abi (*efi_register_protocol_notify_t)(
efi_guid_t *Protocol,
void *Event,
void **Registration);
enum efi_locate_search_type {
AllHandles,
ByRegisterNotify,
ByProtocol
};
typedef efi_status_t __abi (*efi_locate_handle_t)(
enum efi_locate_search_type SearchType,
efi_guid_t *Protocol,
void *SearchKey,
uintptr_t *BufferSize,
void **Buffer);
struct efi_device_path_protocol {
uint8_t Type;
uint8_t SubType;
uint8_t Length[2];
};
typedef efi_status_t __abi (*efi_locate_device_path_t)(
efi_guid_t *Protocol,
struct efi_device_path_protocol **DevicePath,
void **Handle);
typedef efi_status_t __abi (*efi_install_configuration_table_t)(
efi_guid_t *Guid,
void *Table);
typedef efi_status_t __abi (*efi_load_image_t)(
bool BootPolicy,
void *ParentImageHandle,
struct efi_device_path_protocol *DevicePath,
void *SourceBuffer,
uintptr_t SourceSize,
void **ImageHandle);
typedef efi_status_t __abi (*efi_start_image_t)(void *ImageHandle,
uintptr_t *ExitDataSize,
uint16_t **ExitData);
typedef efi_status_t __abi (*efi_exit_t)(void *ImageHandle,
uintptr_t ExitStatus,
uintptr_t ExitDataSize,
uint16_t *ExitData);
typedef efi_status_t __abi (*efi_unload_image_t)(void *ImageHandle);
typedef efi_status_t __abi (*efi_exit_boot_services_t)(void *ImageHandle,
uintptr_t MapKey);
typedef efi_status_t __abi (*efi_get_next_monotonic_count_t)(uint64_t *Count);
typedef efi_status_t __abi (*efi_stall_t)(uintptr_t Microseconds);
typedef efi_status_t __abi (*efi_set_watchdog_timer_t)(uintptr_t Timeout,
uint64_t WatchdogCode,
uintptr_t DataSize,
uint16_t *WatchdogData);
typedef efi_status_t __abi (*efi_connect_controller_t)(
void *ControllerHandle,
void **DriverImageHandle,
struct efi_device_path_protocol *RemainingDevicePath,
bool Recursive);
typedef efi_status_t __abi (*efi_disconnect_controller_t)(
void *ControllerHandle,
void *DriverImageHandle,
void *ChildHandle);
typedef efi_status_t __abi (*efi_open_protocol_t)(void *Handle,
efi_guid_t *Protocol,
void **Interface,
void *AgentHandle,
void *ControllerHandle,
uint32_t Attributes);
typedef efi_status_t __abi (*efi_close_protocol_t)(void *Handle,
efi_guid_t *Protocol,
void *AgentHandle,
void *ControllerHandle);
struct efi_open_protocol_information_entry {
void *AgentHandle;
void *ControllerHandle;
uint32_t Attributes;
uint32_t OpenCount;
};
typedef efi_status_t __abi (*efi_open_protocol_information_t)(
void *Handle,
efi_guid_t *Protocol,
struct efi_open_protocol_information_entry **EntryBuffer,
uintptr_t *EntryCount);
typedef efi_status_t __abi (*efi_protocols_per_handle_t)(
void *Handle,
efi_guid_t ***ProtocolBuffer,
uintptr_t *ProtocolBufferCount);
typedef efi_status_t __abi (*efi_locate_handle_buffer_t)(
enum efi_locate_search_type SearchType,
efi_guid_t *Protocol,
void *SearchKey,
uintptr_t *NoHandles,
void ***Buffer);
typedef efi_status_t __abi (*efi_locate_protocol_t)(efi_guid_t *Protocol,
void *Registration,
void **Interface);
typedef efi_status_t __abi (*efi_multiple_protocol_interface_t)(
void *Handle, ...);
typedef efi_status_t __abi (*efi_calculate_crc32_t)(void *Data,
uintptr_t DataSize,
uint32_t CRC32);
typedef efi_status_t __abi (*efi_copy_mem_t)(void *Destination,
void *Source,
uintptr_t Size);
typedef efi_status_t __abi (*efi_set_mem_t)(void *Buffer,
uintptr_t Size,
uint8_t Value);
typedef efi_status_t __abi (*efi_create_event_ex_t)(
uint32_t Type,
uintptr_t NotifyTpl,
efi_notify_function_t NotifyFunction,
const void *NotifyContext,
const efi_guid_t *EventGroup,
void **Event);
struct efi_boot_services {
struct efi_table_header Hdr;
efi_raise_tpl_t RaiseTPL;
efi_restore_tpl_t RestoreTPL;
efi_allocate_pages_t AllocatePages;
efi_free_pages_t FreePages;
efi_get_memory_map_t GetMemoryMap;
efi_allocate_pool_t AllocatePool;
efi_free_pool_t FreePool;
efi_create_event_t CreateEvent;
efi_set_timer_t SetTimer;
efi_wait_for_event_t WaitForEvent;
efi_signal_event_t SignalEvent;
efi_close_event_t CloseEvent;
efi_check_event_t CheckEvent;
efi_install_protocol_interface_t InstallProtocolInterface;
efi_reinstall_protocol_interface_t ReinstallProtocolInterface;
efi_uninstall_protocol_interface_t UninstallProtocolInterface;
efi_handle_protocol_t HandleProtocol;
efi_register_protocol_notify_t RegisterProtocolNotify;
efi_locate_handle_t LocateHandle;
efi_locate_device_path_t LocateDevicePath;
efi_install_configuration_table_t InstallConfigurationTable;
efi_load_image_t LoadImage;
efi_start_image_t StartImage;
efi_exit_t Exit;
efi_unload_image_t UnloadImage;
efi_exit_boot_services_t ExitBootServices;
efi_get_next_monotonic_count_t GetNextMonotonicCount;
efi_stall_t Stall;
efi_set_watchdog_timer_t SetWatchdogTimer;
efi_connect_controller_t ConnectController;
efi_disconnect_controller_t DisconnectController;
efi_open_protocol_t OpenProtocol;
efi_close_protocol_t CloseProtocol;
efi_open_protocol_information_t OpenProtocolInformation;
efi_protocols_per_handle_t ProtocolsPerHandle;
efi_locate_handle_buffer_t LocateHandleBuffer;
efi_locate_protocol_t LocateProtocol;
efi_multiple_protocol_interface_t InstallMultipleProtocolInterfaces;
efi_multiple_protocol_interface_t UninstallMultipleProtocolInterfaces;
efi_calculate_crc32_t CalculateCrc32;
efi_copy_mem_t CopyMem;
efi_set_mem_t SetMem;
efi_create_event_ex_t CreateEventEx;
};
struct efi_configuration_table {
/** Vendor EFI GUID Identifier */
efi_guid_t VendorGuid;
/** Vendor table pointer */
void *VendorTable;
};
struct efi_system_table {
struct efi_table_header Hdr;
uint16_t *FirmwareVendor;
uint32_t FirmwareRevision;
void *ConsoleInHandle;
struct efi_simple_text_input *ConIn;
void *ConsoleOutHandle;
struct efi_simple_text_output *ConOut;
void *StandardErrorHandle;
struct efi_simple_text_output *StdErr;
struct efi_runtime_services *RuntimeServices;
struct efi_boot_services *BootServices;
/** The amount of entries to expect in the next attribute */
uint64_t NumberOfTableEntries;
/** A pointer to the configuration table(s) */
struct efi_configuration_table *ConfigurationTable;
};
#endif /* _ASMLANGUAGE */
#endif /* ZEPHYR_INCLUDE_ARCH_X86_EFI_H_ */