mirror of https://github.com/wolfSSL/wolfBoot.git
211 lines
6.6 KiB
C
211 lines
6.6 KiB
C
/* hob.h
|
|
*
|
|
* Headers for Hand-off Block (HOB) objects
|
|
*
|
|
* Copyright (C) 2023 wolfSSL Inc.
|
|
*
|
|
* This file is part of wolfBoot.
|
|
*
|
|
* wolfBoot is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 3 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* wolfBoot is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA
|
|
*/
|
|
|
|
#ifndef HOB_H_INCLUDED
|
|
#define HOB_H_INCLUDED
|
|
|
|
#include <stdint.h>
|
|
|
|
typedef int (*hob_mem_map_cb)(uint64_t start, uint64_t length, uint32_t type,
|
|
void *ctx);
|
|
|
|
enum hob_type {
|
|
EFI_HOB_TYPE_HANDOFF = 0x0001,
|
|
EFI_HOB_TYPE_MEMORY_ALLOCATION = 0x0002,
|
|
EFI_HOB_TYPE_RESOURCE_DESCRIPTOR = 0x0003,
|
|
EFI_HOB_TYPE_GUID_EXTENSION = 0x0004,
|
|
EFI_HOB_TYPE_FV = 0x0005,
|
|
EFI_HOB_TYPE_CPU = 0x0006,
|
|
EFI_HOB_TYPE_MEMORY_POOL = 0x0007,
|
|
EFI_HOB_TYPE_FV2 = 0x0009,
|
|
EFI_HOB_TYPE_LOAD_PEIM_UNUSED = 0x000A,
|
|
EFI_HOB_TYPE_UEFI_CAPSULE = 0x000B,
|
|
EFI_HOB_TYPE_FV3 = 0x000C,
|
|
EFI_HOB_TYPE_UNUSED = 0xFFFE,
|
|
EFI_HOB_TYPE_END_OF_HOB_LIST = 0xFFFF,
|
|
};
|
|
|
|
enum boot_type {
|
|
BOOT_WITH_FULL_CONFIGURATION = 0x00,
|
|
BOOT_WITH_MINIMAL_CONFIGURATION = 0x01,
|
|
BOOT_ASSUMING_NO_CONFIGURATION_CHANGES = 0x02,
|
|
BOOT_WITH_FULL_CONFIGURATION_PLUS_DIAGNOSTICS = 0x03,
|
|
BOOT_WITH_DEFAULT_SETTINGS = 0x04,
|
|
BOOT_ON_S4_RESUME = 0x05,
|
|
BOOT_ON_S5_RESUME = 0x06,
|
|
BOOT_WITH_MFG_MODE_SETTINGS = 0x07,
|
|
BOOT_ON_S2_RESUME = 0x10,
|
|
BOOT_ON_S3_RESUME = 0x11,
|
|
BOOT_ON_FLASH_UPDATE = 0x12,
|
|
BOOT_IN_RECOVERY_MODE = 0x20,
|
|
};
|
|
|
|
typedef uint64_t efi_physical_address;
|
|
|
|
struct efi_hob_generic_header {
|
|
uint16_t hob_type;
|
|
uint16_t hob_length;
|
|
uint32_t reserved;
|
|
};
|
|
|
|
struct efi_guid {
|
|
uint32_t data1;
|
|
uint16_t data2;
|
|
uint16_t data3;
|
|
uint8_t data4[8];
|
|
};
|
|
|
|
struct efi_hob_handoff_info_table {
|
|
struct efi_hob_generic_header header;
|
|
uint32_t version;
|
|
uint32_t boot_mode;
|
|
efi_physical_address efi_memory_top;
|
|
efi_physical_address efi_memory_bottom;
|
|
efi_physical_address efi_free_memory_top;
|
|
efi_physical_address efi_free_memory_bottom;
|
|
efi_physical_address efi_end_of_hob_list;
|
|
};
|
|
|
|
typedef enum {
|
|
EfiReservedMemoryType,
|
|
EfiLoaderCode,
|
|
EfiLoaderData,
|
|
EfiBootServicesCode,
|
|
EfiBootServicesData,
|
|
EfiRuntimeServicesCode,
|
|
EfiRuntimeServicesData,
|
|
EfiConventionalMemory,
|
|
EfiUnusableMemory,
|
|
EfiACPIReclaimMemory,
|
|
EfiACPIMemoryNVS,
|
|
EfiMemoryMappedIO,
|
|
EfiMemoryMappedIOPortSpace,
|
|
EfiPalCode,
|
|
EfiPersistentMemory,
|
|
EfiMaxMemoryType
|
|
} efi_memory_type;
|
|
|
|
struct efi_hob_memory_allocation_header {
|
|
struct efi_guid name;
|
|
efi_physical_address memory_base_address;
|
|
uint64_t memory_length;
|
|
efi_memory_type memory_type;
|
|
uint8_t reserved[4];
|
|
};
|
|
|
|
struct efi_hob_memory_allocation {
|
|
struct efi_hob_generic_header header;
|
|
struct efi_hob_memory_allocation_header alloc_descriptor;
|
|
};
|
|
|
|
enum resource_type {
|
|
EFI_RESOURCE_SYSTEM_MEMORY = 0x00000000,
|
|
EFI_RESOURCE_MEMORY_MAPPED_IO = 0x00000001,
|
|
EFI_RESOURCE_IO = 0x00000002,
|
|
EFI_RESOURCE_FIRMWARE_DEVICE = 0x00000003,
|
|
EFI_RESOURCE_MEMORY_MAPPED_IO_PORT = 0x00000004,
|
|
EFI_RESOURCE_MEMORY_RESERVED = 0x00000005,
|
|
EFI_RESOURCE_IO_RESERVED = 0x00000006,
|
|
EFI_RESOURCE_MAX_MEMORY_TYPE = 0x00000007,
|
|
};
|
|
|
|
enum resource_attribute {
|
|
EFI_RESOURCE_ATTRIBUTE_PRESENT = 0x00000001,
|
|
EFI_RESOURCE_ATTRIBUTE_INITIALIZED = 0x00000002,
|
|
EFI_RESOURCE_ATTRIBUTE_TESTED = 0x00000004,
|
|
EFI_RESOURCE_ATTRIBUTE_READ_PROTECTED = 0x00000080,
|
|
EFI_RESOURCE_ATTRIBUTE_WRITE_PROTECTED = 0x00000100,
|
|
EFI_RESOURCE_ATTRIBUTE_EXECUTION_PROTECTED = 0x00000200,
|
|
EFI_RESOURCE_ATTRIBUTE_PERSISTENT = 0x00800000,
|
|
EFI_RESOURCE_ATTRIBUTE_SINGLE_BIT_ECC = 0x00000008,
|
|
EFI_RESOURCE_ATTRIBUTE_MULTIPLE_BIT_ECC = 0x00000010,
|
|
EFI_RESOURCE_ATTRIBUTE_ECC_RESERVED_1 = 0x00000020,
|
|
EFI_RESOURCE_ATTRIBUTE_ECC_RESERVED_2 = 0x00000040,
|
|
EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE = 0x00000400,
|
|
EFI_RESOURCE_ATTRIBUTE_WRITE_COMBINEABLE = 0x00000800,
|
|
EFI_RESOURCE_ATTRIBUTE_WRITE_THROUGH_CACHEABLE = 0x00001000,
|
|
EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE = 0x00002000,
|
|
EFI_RESOURCE_ATTRIBUTE_16_BIT_IO = 0x00004000,
|
|
EFI_RESOURCE_ATTRIBUTE_32_BIT_IO = 0x00008000,
|
|
EFI_RESOURCE_ATTRIBUTE_64_BIT_IO = 0x00010000,
|
|
EFI_RESOURCE_ATTRIBUTE_UNCACHED_EXPORTED = 0x00020000,
|
|
EFI_RESOURCE_ATTRIBUTE_READ_PROTECTABLE = 0x00100000,
|
|
EFI_RESOURCE_ATTRIBUTE_WRITE_PROTECTABLE = 0x00200000,
|
|
EFI_RESOURCE_ATTRIBUTE_EXECUTION_PROTECTABLE = 0x00400000,
|
|
EFI_RESOURCE_ATTRIBUTE_PERSISTABLE = 0x01000000,
|
|
EFI_RESOURCE_ATTRIBUTE_READ_ONLY_PROTECTED = 0x00040000,
|
|
EFI_RESOURCE_ATTRIBUTE_READ_ONLY_PROTECTABLE = 0x00080000,
|
|
EFI_RESOURCE_ATTRIBUTE_MORE_RELIABLE = 0x02000000,
|
|
};
|
|
|
|
struct efi_hob_resource_descriptor {
|
|
struct efi_hob_generic_header header;
|
|
struct efi_guid owner;
|
|
uint32_t resource_type;
|
|
uint32_t resource_attribute;
|
|
efi_physical_address physical_start;
|
|
uint64_t resource_length;
|
|
};
|
|
|
|
struct efi_hob_guid_type {
|
|
struct efi_hob_generic_header header;
|
|
struct efi_guid name;
|
|
};
|
|
|
|
struct efi_hob_cpu {
|
|
struct efi_hob_generic_header header;
|
|
uint8_t size_of_memory_space;
|
|
uint8_t size_of_io_space;
|
|
uint8_t reserved[6];
|
|
};
|
|
|
|
/* Union of all the possible HOB Types. */
|
|
struct efi_hob {
|
|
union {
|
|
struct efi_hob_generic_header header;
|
|
struct efi_hob_handoff_info_table handoff_information_table;
|
|
struct efi_hob_memory_allocation memory_allocation;
|
|
struct efi_hob_resource_descriptor resource_descriptor;
|
|
struct efi_hob_guid_type guid;
|
|
struct efi_hob_cpu cpu;
|
|
uint8_t raw;
|
|
} u;
|
|
};
|
|
|
|
uint16_t hob_get_type(struct efi_hob *hob);
|
|
uint16_t hob_get_length(struct efi_hob *hob);
|
|
struct efi_hob *hob_get_next(struct efi_hob *hob);
|
|
int hob_guid_equals(struct efi_guid *a, struct efi_guid *b);
|
|
|
|
struct efi_hob_resource_descriptor *
|
|
hob_find_resource_by_guid(struct efi_hob *hoblist, struct efi_guid *guid);
|
|
|
|
struct efi_hob_resource_descriptor *
|
|
hob_find_fsp_reserved(struct efi_hob *hoblist);
|
|
int hob_iterate_memory_map(struct efi_hob *hobList, hob_mem_map_cb cb,
|
|
void* ctx);
|
|
#ifdef DEBUG
|
|
void hob_dump_memory_map(struct efi_hob *hobList);
|
|
#endif /* DEBUG */
|
|
#endif
|