mirror of
https://source.denx.de/u-boot/u-boot.git
synced 2026-06-13 15:03:58 +03:00
Merge tag 'signed-efi-next' of git://github.com/agraf/u-boot
Patch queue for efi - 2018-12-03 This release is fully packed with lots of glorious improvements in UEFI land again! - Make PE images more standards compliant - Improve sandbox support - Improve correctness - Fix RISC-V execution on virt model - Honor board defined top of ram (fixes a few boards) - Imply DM USB access when distro boot is available - Code cleanups
This commit is contained in:
@@ -11,6 +11,24 @@
|
||||
#ifndef _ASM_PE_H
|
||||
#define _ASM_PE_H
|
||||
|
||||
/* Characteristics */
|
||||
#define IMAGE_FILE_RELOCS_STRIPPED 0x0001
|
||||
#define IMAGE_FILE_EXECUTABLE_IMAGE 0x0002
|
||||
#define IMAGE_FILE_LINE_NUMS_STRIPPED 0x0004
|
||||
#define IMAGE_FILE_LOCAL_SYMS_STRIPPED 0x0008
|
||||
#define IMAGE_FILE_AGGRESSIVE_WS_TRIM 0x0010
|
||||
#define IMAGE_FILE_LARGE_ADDRESS_AWARE 0x0020
|
||||
/* Reserved 0x0040 */
|
||||
#define IMAGE_FILE_BYTES_REVERSED_LO 0x0080
|
||||
#define IMAGE_FILE_32BIT_MACHINE 0x0100
|
||||
#define IMAGE_FILE_DEBUG_STRIPPED 0x0200
|
||||
#define IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP 0x0400
|
||||
#define IMAGE_FILE_NET_RUN_FROM_SWAP 0x0800
|
||||
#define IMAGE_FILE_SYSTEM 0x1000
|
||||
#define IMAGE_FILE_DLL 0x2000
|
||||
#define IMAGE_FILE_UP_SYSTEM_ONLY 0x4000
|
||||
#define IMAGE_FILE_BYTES_REVERSED_HI 0x8000
|
||||
|
||||
/* Subsystem type */
|
||||
#define IMAGE_SUBSYSTEM_EFI_APPLICATION 10
|
||||
#define IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER 11
|
||||
|
||||
@@ -105,6 +105,17 @@ int mdm_init(void);
|
||||
*/
|
||||
void board_show_dram(phys_size_t size);
|
||||
|
||||
/**
|
||||
* Get the uppermost pointer that is valid to access
|
||||
*
|
||||
* Some systems may not map all of their address space. This function allows
|
||||
* boards to indicate what their highest support pointer value is for DRAM
|
||||
* access.
|
||||
*
|
||||
* @param total_size Size of U-Boot (unused?)
|
||||
*/
|
||||
ulong board_get_usable_ram_top(ulong total_size);
|
||||
|
||||
/**
|
||||
* arch_fixup_fdt() - Write arch-specific information to fdt
|
||||
*
|
||||
|
||||
@@ -96,7 +96,7 @@ typedef struct {
|
||||
typedef unsigned long efi_status_t;
|
||||
typedef u64 efi_physical_addr_t;
|
||||
typedef u64 efi_virtual_addr_t;
|
||||
typedef void *efi_handle_t;
|
||||
typedef struct efi_object *efi_handle_t;
|
||||
|
||||
#define EFI_GUID(a, b, c, d0, d1, d2, d3, d4, d5, d6, d7) \
|
||||
{{ (a) & 0xff, ((a) >> 8) & 0xff, ((a) >> 16) & 0xff, \
|
||||
|
||||
@@ -85,10 +85,10 @@ struct efi_boot_services {
|
||||
efi_status_t (EFIAPI *check_event)(struct efi_event *event);
|
||||
#define EFI_NATIVE_INTERFACE 0x00000000
|
||||
efi_status_t (EFIAPI *install_protocol_interface)(
|
||||
void **handle, const efi_guid_t *protocol,
|
||||
efi_handle_t *handle, const efi_guid_t *protocol,
|
||||
int protocol_interface_type, void *protocol_interface);
|
||||
efi_status_t (EFIAPI *reinstall_protocol_interface)(
|
||||
void *handle, const efi_guid_t *protocol,
|
||||
efi_handle_t handle, const efi_guid_t *protocol,
|
||||
void *old_interface, void *new_interface);
|
||||
efi_status_t (EFIAPI *uninstall_protocol_interface)(
|
||||
efi_handle_t handle, const efi_guid_t *protocol,
|
||||
@@ -164,9 +164,9 @@ struct efi_boot_services {
|
||||
efi_status_t (EFIAPI *locate_protocol)(const efi_guid_t *protocol,
|
||||
void *registration, void **protocol_interface);
|
||||
efi_status_t (EFIAPI *install_multiple_protocol_interfaces)(
|
||||
void **handle, ...);
|
||||
efi_handle_t *handle, ...);
|
||||
efi_status_t (EFIAPI *uninstall_multiple_protocol_interfaces)(
|
||||
void *handle, ...);
|
||||
efi_handle_t handle, ...);
|
||||
efi_status_t (EFIAPI *calculate_crc32)(const void *data,
|
||||
efi_uintn_t data_size,
|
||||
u32 *crc32);
|
||||
@@ -241,8 +241,8 @@ struct efi_runtime_services {
|
||||
efi_status_t (EFIAPI *query_capsule_caps)(
|
||||
struct efi_capsule_header **capsule_header_array,
|
||||
efi_uintn_t capsule_count,
|
||||
u64 maximum_capsule_size,
|
||||
u32 reset_type);
|
||||
u64 *maximum_capsule_size,
|
||||
u32 *reset_type);
|
||||
efi_status_t (EFIAPI *query_variable_info)(
|
||||
u32 attributes,
|
||||
u64 *maximum_variable_storage_size,
|
||||
@@ -965,7 +965,7 @@ struct efi_file_info {
|
||||
struct efi_time last_access_time;
|
||||
struct efi_time modification_time;
|
||||
u64 attribute;
|
||||
s16 file_name[0];
|
||||
u16 file_name[0];
|
||||
};
|
||||
|
||||
struct efi_file_system_info {
|
||||
|
||||
@@ -167,28 +167,41 @@ struct efi_handler {
|
||||
struct list_head open_infos;
|
||||
};
|
||||
|
||||
/*
|
||||
* UEFI has a poor man's OO model where one "object" can be polymorphic and have
|
||||
* multiple different protocols (classes) attached to it.
|
||||
/**
|
||||
* struct efi_object - dereferenced EFI handle
|
||||
*
|
||||
* This struct is the parent struct for all of our actual implementation objects
|
||||
* that can include it to make themselves an EFI object
|
||||
* @link: pointers to put the handle into a linked list
|
||||
* @protocols: linked list with the protocol interfaces installed on this
|
||||
* handle
|
||||
*
|
||||
* UEFI offers a flexible and expandable object model. The objects in the UEFI
|
||||
* API are devices, drivers, and loaded images. struct efi_object is our storage
|
||||
* structure for these objects.
|
||||
*
|
||||
* When including this structure into a larger structure always put it first so
|
||||
* that when deleting a handle the whole encompassing structure can be freed.
|
||||
*
|
||||
* A pointer to this structure is referred to as a handle. Typedef efi_handle_t
|
||||
* has been created for such pointers.
|
||||
*/
|
||||
struct efi_object {
|
||||
/* Every UEFI object is part of a global object list */
|
||||
struct list_head link;
|
||||
/* The list of protocols */
|
||||
struct list_head protocols;
|
||||
/* The object spawner can either use this for data or as identifier */
|
||||
void *handle;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct efi_loaded_image_obj - handle of a loaded image
|
||||
*
|
||||
* @header: EFI object header
|
||||
* @reloc_base: base address for the relocated image
|
||||
* @reloc_size: size of the relocated image
|
||||
* @exit_jmp: long jump buffer for returning form started image
|
||||
* @entry: entry address of the relocated image
|
||||
*/
|
||||
struct efi_loaded_image_obj {
|
||||
/* Generic EFI object parent class data */
|
||||
struct efi_object parent;
|
||||
struct efi_object header;
|
||||
void *reloc_base;
|
||||
aligned_u64 reloc_size;
|
||||
efi_status_t exit_status;
|
||||
@@ -290,11 +303,11 @@ void efi_runtime_relocate(ulong offset, struct efi_mem_desc *map);
|
||||
/* Call this to set the current device name */
|
||||
void efi_set_bootdev(const char *dev, const char *devnr, const char *path);
|
||||
/* Add a new object to the object list. */
|
||||
void efi_add_handle(struct efi_object *obj);
|
||||
void efi_add_handle(efi_handle_t obj);
|
||||
/* Create handle */
|
||||
efi_status_t efi_create_handle(efi_handle_t *handle);
|
||||
/* Delete handle */
|
||||
void efi_delete_handle(struct efi_object *obj);
|
||||
void efi_delete_handle(efi_handle_t obj);
|
||||
/* Call this to validate a handle and find the EFI object for it */
|
||||
struct efi_object *efi_search_obj(const efi_handle_t handle);
|
||||
/* Find a protocol on a handle */
|
||||
@@ -331,7 +344,16 @@ struct efi_simple_file_system_protocol *efi_simple_file_system(
|
||||
/* open file from device-path: */
|
||||
struct efi_file_handle *efi_file_from_path(struct efi_device_path *fp);
|
||||
|
||||
|
||||
/**
|
||||
* efi_size_in_pages() - convert size in bytes to size in pages
|
||||
*
|
||||
* This macro returns the number of EFI memory pages required to hold 'size'
|
||||
* bytes.
|
||||
*
|
||||
* @size: size in bytes
|
||||
* Return: size in pages
|
||||
*/
|
||||
#define efi_size_in_pages(size) ((size + EFI_PAGE_MASK) >> EFI_PAGE_SHIFT)
|
||||
/* Generic EFI memory allocator, call this to get memory */
|
||||
void *efi_alloc(uint64_t len, int memory_type);
|
||||
/* More specific EFI memory allocator, called by EFI payloads */
|
||||
@@ -419,6 +441,10 @@ const struct efi_device_path *efi_dp_last_node(
|
||||
efi_status_t efi_dp_split_file_path(struct efi_device_path *full_path,
|
||||
struct efi_device_path **device_path,
|
||||
struct efi_device_path **file_path);
|
||||
efi_status_t efi_dp_from_name(const char *dev, const char *devnr,
|
||||
const char *path,
|
||||
struct efi_device_path **device,
|
||||
struct efi_device_path **file);
|
||||
|
||||
#define EFI_DP_TYPE(_dp, _type, _subtype) \
|
||||
(((_dp)->type == DEVICE_PATH_TYPE_##_type) && \
|
||||
@@ -492,6 +518,29 @@ efi_status_t EFIAPI efi_set_variable(u16 *variable_name, efi_guid_t *vendor,
|
||||
u32 attributes, efi_uintn_t data_size,
|
||||
void *data);
|
||||
|
||||
/*
|
||||
* See section 3.1.3 in the v2.7 UEFI spec for more details on
|
||||
* the layout of EFI_LOAD_OPTION. In short it is:
|
||||
*
|
||||
* typedef struct _EFI_LOAD_OPTION {
|
||||
* UINT32 Attributes;
|
||||
* UINT16 FilePathListLength;
|
||||
* // CHAR16 Description[]; <-- variable length, NULL terminated
|
||||
* // EFI_DEVICE_PATH_PROTOCOL FilePathList[];
|
||||
* <-- FilePathListLength bytes
|
||||
* // UINT8 OptionalData[];
|
||||
* } EFI_LOAD_OPTION;
|
||||
*/
|
||||
struct efi_load_option {
|
||||
u32 attributes;
|
||||
u16 file_path_length;
|
||||
u16 *label;
|
||||
struct efi_device_path *file_path;
|
||||
u8 *optional_data;
|
||||
};
|
||||
|
||||
void efi_deserialize_load_option(struct efi_load_option *lo, u8 *data);
|
||||
unsigned long efi_serialize_load_option(struct efi_load_option *lo, u8 **data);
|
||||
void *efi_bootmgr_load(struct efi_device_path **device_path,
|
||||
struct efi_device_path **file_path);
|
||||
|
||||
|
||||
@@ -129,7 +129,6 @@ u16 efi_st_get_key(void);
|
||||
* @setup: set up the unit test
|
||||
* @teardown: tear down the unit test
|
||||
* @execute: execute the unit test
|
||||
* @setup_ok: setup was successful (set at runtime)
|
||||
* @on_request: test is only executed on request
|
||||
*/
|
||||
struct efi_unit_test {
|
||||
@@ -139,7 +138,6 @@ struct efi_unit_test {
|
||||
const struct efi_system_table *systable);
|
||||
int (*execute)(void);
|
||||
int (*teardown)(void);
|
||||
int setup_ok;
|
||||
bool on_request;
|
||||
};
|
||||
|
||||
|
||||
@@ -88,10 +88,8 @@
|
||||
#define PSCI_RET_DISABLED -8
|
||||
|
||||
#ifdef CONFIG_ARM_PSCI_FW
|
||||
typedef unsigned long (psci_fn)(unsigned long, unsigned long,
|
||||
unsigned long, unsigned long);
|
||||
|
||||
extern psci_fn *invoke_psci_fn;
|
||||
unsigned long invoke_psci_fn(unsigned long a0, unsigned long a1,
|
||||
unsigned long a2, unsigned long a3);
|
||||
#else
|
||||
unsigned long invoke_psci_fn(unsigned long a0, unsigned long a1,
|
||||
unsigned long a2, unsigned long a3)
|
||||
|
||||
Reference in New Issue
Block a user