blob: 4117e00199ca87bcbbf41c944fcd709e98d97cfa [file] [log] [blame]
// Copyright 2016 The Fuchsia Authors
//
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file or at
// https://opensource.org/licenses/MIT
#ifndef ZIRCON_KERNEL_LIB_EFI_INCLUDE_EFI_RUNTIME_SERVICES_H_
#define ZIRCON_KERNEL_LIB_EFI_INCLUDE_EFI_RUNTIME_SERVICES_H_
#include <zircon/compiler.h>
#include <efi/boot-services.h>
#include <efi/types.h>
__BEGIN_CDECLS
#define EFI_RUNTIME_SERVICES_SIGNATURE 0x56524553544e5552
#define EFI_RUNTIME_SERVICES_REVISION EFI_SPECIFICATION_VERSION
#define EFI_VARIABLE_NON_VOLATILE 0x00000001
#define EFI_VARIABLE_BOOTSERVICE_ACCESS 0x00000002
#define EFI_VARIABLE_RUNTIME_ACCESS 0x00000004
#define EFI_VARIABLE_HARDWARE_ERROR_RECORD 0x00000008
#define EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS 0x00000010
#define EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS 0x00000020
#define EFI_VARIABLE_APPEND_WRITE 0x00000040
// TODO: implement the win_certificate structs if we need them
// typedef struct {
// uint64_t MonotonicCount;
// win_certificate_uefi_guid AuthInfo;
//} efi_variable_authentication;
//
// typedef struct {
// efi_time TimeStamp;
// win_certificate_uefi_guid AuthInfo;
//} efi_variable_authentication_2;
#define EFI_HARDWARE_ERROR_VARIABLE \
{ \
0x414e6bdd, 0xe47b, 0x47cc, { 0xb2, 0x44, 0xbb, 0x61, 0x02, 0x0c, 0xf5, 0x16 } \
}
typedef struct {
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;
} efi_time;
#define EFI_TIME_ADJUST_DAYLIGHT 0x01
#define EFI_TIME_IN_DAYLIGHT 0x02
#define EFI_UNSPECIFIED_TIMEZONE 0x07FF
typedef struct {
uint32_t Resolution;
uint32_t Accuracy;
bool SetsToZero;
} efi_time_capabilities;
#define EFI_OPTIONAL_PTR 0x00000001
typedef enum {
EfiResetCold,
EfiResetWarm,
EfiResetShutdown,
EfiResetPlatformSpecific
} efi_reset_type;
typedef struct {
uint64_t Length;
union {
efi_physical_addr DataBlock;
efi_physical_addr ContinuationPointer;
} Union;
} efi_capsule_block_descriptor;
typedef struct {
efi_guid CapsuleGuid;
uint32_t HeaderSize;
uint32_t Flags;
uint32_t CapsuleImageSize;
} efi_capsule_header;
#define CAPSULE_FLAGS_PERSIST_ACROSS_RESET 0x00010000
#define CAPSULE_FLAGS_POPULATE_SYSTEM_TABLE 0x00020000
#define CAPSULE_FLAGS_INITIATE_RESET 0x00040000
#define EFI_OS_INDICATIONS_BOOT_TO_FW_UI 0x0000000000000001
#define EFI_OS_INDICATIONS_TIMESTAMP_REVOCATION 0x0000000000000002
#define EFI_OS_INDICATIONS_FILE_CAPSULE_DELIVERY_SUPPORTED 0x0000000000000004
#define EFI_OS_INDICATIONS_FMP_CAPSULE_SUPPORTED 0x0000000000000008
#define EFI_OS_INDICATIONS_CAPSULE_RESULT_VAR_SUPPORTED 0x0000000000000010
#define EFI_OS_INDICATIONS_START_OS_RECOVERY 0x0000000000000020
#define EFI_OS_INDICATIONS_START_PLATFORM_RECOVERY 0x0000000000000040
#define EFI_CAPSULE_REPORT_GUID \
{ \
0x39b68c46, 0xf7fb, 0x441b, { 0xb6, 0xec, 0x16, 0xb0, 0xf6, 0x98, 0x21, 0xf3 } \
}
typedef struct {
uint32_t VariableTotalSize;
uint32_t Reserved;
efi_guid CapsuleGuid;
efi_time CapsuleProcessed;
efi_status CapsuleStatus;
} efi_capsule_result_variable_header;
typedef struct {
efi_table_header Hdr;
efi_status (*GetTime)(efi_time* time, efi_time_capabilities* capabilities) EFIAPI;
efi_status (*SetTime)(efi_time* time) EFIAPI;
efi_status (*GetWakeupTime)(bool* enabled, bool* pending, efi_time* time) EFIAPI;
efi_status (*SetWakeupTime)(bool enable, efi_time* time) EFIAPI;
efi_status (*SetVirtualAddressMap)(size_t memory_map_size, size_t desc_size,
uint32_t desc_version,
efi_memory_descriptor* virtual_map) EFIAPI;
efi_status (*ConvertPointer)(size_t debug_disposition, void** addr) EFIAPI;
efi_status (*GetVariable)(char16_t* var_name, efi_guid* vendor_guid, uint32_t* attributes,
size_t* data_size, void* data) EFIAPI;
efi_status (*GetNextVariableName)(size_t* var_name_size, char16_t* var_name,
efi_guid* vendor_guid) EFIAPI;
efi_status (*SetVariable)(char16_t* var_name, efi_guid* vendor_guid, uint32_t attributes,
size_t data_size, const void* data) EFIAPI;
efi_status (*GetNextHighMonotonicCount)(uint32_t* high_count) EFIAPI;
efi_status (*ResetSystem)(efi_reset_type reset_type, efi_status reset_status, size_t data_size,
void* reset_data) EFIAPI;
efi_status (*UpdateCapsule)(efi_capsule_header** capsule_header_array, size_t capsule_count,
efi_physical_addr scatter_gather_list) EFIAPI;
efi_status (*QueryCapsuleCapabilities)(efi_capsule_header** capsule_header_array,
size_t capsule_count, uint64_t* max_capsule_size,
efi_reset_type* reset_type) EFIAPI;
efi_status (*QueryVariableInfo)(uint32_t attributes, uint64_t* max_var_storage_size,
uint64_t* remaining_var_storage_size,
uint64_t* max_var_size) EFIAPI;
} efi_runtime_services;
__END_CDECLS
#endif // ZIRCON_KERNEL_LIB_EFI_INCLUDE_EFI_RUNTIME_SERVICES_H_