Message ID | 1376090777-20090-12-git-send-email-roy.franz@linaro.org (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Fri, 2013-08-09 at 16:26 -0700, Roy Franz wrote: > The x86/AMD64 EFI stubs must us a call wrapper to convert between > the Linux and EFI ABIs, so void pointers are sufficient. For ARM, > the ABIs are compatible, so we can directly invoke the function > pointers. The functions that are used by the ARM stub are updated > to match the EFI definitions. > > Signed-off-by: Roy Franz <roy.franz@linaro.org> > --- Tested on arm64. Acked-by: Mark Salter <msalter@redhat.com>
On Fri, 9 Aug 2013 16:26:12 -0700, Roy Franz <roy.franz@linaro.org> wrote: > The x86/AMD64 EFI stubs must us a call wrapper to convert between > the Linux and EFI ABIs, so void pointers are sufficient. For ARM, > the ABIs are compatible, so we can directly invoke the function > pointers. The functions that are used by the ARM stub are updated > to match the EFI definitions. > > Signed-off-by: Roy Franz <roy.franz@linaro.org> Looks reasonable. Reviewed-by: Grant Likely <grant.likely@linaro.org> > --- > arch/x86/boot/compressed/eboot.h | 2 -- > include/linux/efi.h | 45 ++++++++++++++++++++++++-------------- > 2 files changed, 28 insertions(+), 19 deletions(-) > > diff --git a/arch/x86/boot/compressed/eboot.h b/arch/x86/boot/compressed/eboot.h > index bafbd94..81b6b65 100644 > --- a/arch/x86/boot/compressed/eboot.h > +++ b/arch/x86/boot/compressed/eboot.h > @@ -11,8 +11,6 @@ > > #define DESC_TYPE_CODE_DATA (1 << 0) > > -#define EFI_PAGE_SIZE (1UL << EFI_PAGE_SHIFT) > - > #define EFI_CONSOLE_OUT_DEVICE_GUID \ > EFI_GUID(0xd3b36f2c, 0xd551, 0x11d4, 0x9a, 0x46, 0x0, 0x90, 0x27, \ > 0x3f, 0xc1, 0x4d) > diff --git a/include/linux/efi.h b/include/linux/efi.h > index 51f5641..1a7ae34 100644 > --- a/include/linux/efi.h > +++ b/include/linux/efi.h > @@ -39,6 +39,8 @@ > typedef unsigned long efi_status_t; > typedef u8 efi_bool_t; > typedef u16 efi_char16_t; /* UNICODE character */ > +typedef u64 efi_physical_addr_t; > +typedef void *efi_handle_t; > > > typedef struct { > @@ -96,6 +98,7 @@ typedef struct { > #define EFI_MEMORY_DESCRIPTOR_VERSION 1 > > #define EFI_PAGE_SHIFT 12 > +#define EFI_PAGE_SIZE (1UL << EFI_PAGE_SHIFT) > > typedef struct { > u32 type; > @@ -157,11 +160,13 @@ typedef struct { > efi_table_hdr_t hdr; > void *raise_tpl; > void *restore_tpl; > - void *allocate_pages; > - void *free_pages; > - void *get_memory_map; > - void *allocate_pool; > - void *free_pool; > + efi_status_t (*allocate_pages)(int, int, unsigned long, > + efi_physical_addr_t *); > + efi_status_t (*free_pages)(efi_physical_addr_t, unsigned long); > + efi_status_t (*get_memory_map)(unsigned long *, void *, unsigned long *, > + unsigned long *, u32 *); > + efi_status_t (*allocate_pool)(int, unsigned long, void **); > + efi_status_t (*free_pool)(void *); > void *create_event; > void *set_timer; > void *wait_for_event; > @@ -171,7 +176,7 @@ typedef struct { > void *install_protocol_interface; > void *reinstall_protocol_interface; > void *uninstall_protocol_interface; > - void *handle_protocol; > + efi_status_t (*handle_protocol)(efi_handle_t, efi_guid_t *, void **); > void *__reserved; > void *register_protocol_notify; > void *locate_handle; > @@ -181,7 +186,7 @@ typedef struct { > void *start_image; > void *exit; > void *unload_image; > - void *exit_boot_services; > + efi_status_t (*exit_boot_services)(efi_handle_t, unsigned long); > void *get_next_monotonic_count; > void *stall; > void *set_watchdog_timer; > @@ -488,10 +493,6 @@ typedef struct { > unsigned long unload; > } efi_loaded_image_t; > > -typedef struct { > - u64 revision; > - void *open_volume; > -} efi_file_io_interface_t; > > typedef struct { > u64 size; > @@ -504,20 +505,30 @@ typedef struct { > efi_char16_t filename[1]; > } efi_file_info_t; > > -typedef struct { > +typedef struct _efi_file_handle { > u64 revision; > - void *open; > - void *close; > + efi_status_t (*open)(struct _efi_file_handle *, > + struct _efi_file_handle **, > + efi_char16_t *, u64, u64); > + efi_status_t (*close)(struct _efi_file_handle *); > void *delete; > - void *read; > + efi_status_t (*read)(struct _efi_file_handle *, unsigned long *, > + void *); > void *write; > void *get_position; > void *set_position; > - void *get_info; > + efi_status_t (*get_info)(struct _efi_file_handle *, efi_guid_t *, > + unsigned long *, void *); > void *set_info; > void *flush; > } efi_file_handle_t; > > +typedef struct _efi_file_io_interface { > + u64 revision; > + int (*open_volume)(struct _efi_file_io_interface *, > + efi_file_handle_t **); > +} efi_file_io_interface_t; > + > #define EFI_FILE_MODE_READ 0x0000000000000001 > #define EFI_FILE_MODE_WRITE 0x0000000000000002 > #define EFI_FILE_MODE_CREATE 0x8000000000000000 > @@ -787,7 +798,7 @@ struct efivar_entry { > > struct efi_simple_text_output_protocol { > void *reset; > - void *output_string; > + efi_status_t (*output_string)(void *, void *); > void *test_string; > }; > > -- > 1.7.10.4 > > -- > To unsubscribe from this list: send the line "unsubscribe linux-kernel" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html > Please read the FAQ at http://www.tux.org/lkml/
diff --git a/arch/x86/boot/compressed/eboot.h b/arch/x86/boot/compressed/eboot.h index bafbd94..81b6b65 100644 --- a/arch/x86/boot/compressed/eboot.h +++ b/arch/x86/boot/compressed/eboot.h @@ -11,8 +11,6 @@ #define DESC_TYPE_CODE_DATA (1 << 0) -#define EFI_PAGE_SIZE (1UL << EFI_PAGE_SHIFT) - #define EFI_CONSOLE_OUT_DEVICE_GUID \ EFI_GUID(0xd3b36f2c, 0xd551, 0x11d4, 0x9a, 0x46, 0x0, 0x90, 0x27, \ 0x3f, 0xc1, 0x4d) diff --git a/include/linux/efi.h b/include/linux/efi.h index 51f5641..1a7ae34 100644 --- a/include/linux/efi.h +++ b/include/linux/efi.h @@ -39,6 +39,8 @@ typedef unsigned long efi_status_t; typedef u8 efi_bool_t; typedef u16 efi_char16_t; /* UNICODE character */ +typedef u64 efi_physical_addr_t; +typedef void *efi_handle_t; typedef struct { @@ -96,6 +98,7 @@ typedef struct { #define EFI_MEMORY_DESCRIPTOR_VERSION 1 #define EFI_PAGE_SHIFT 12 +#define EFI_PAGE_SIZE (1UL << EFI_PAGE_SHIFT) typedef struct { u32 type; @@ -157,11 +160,13 @@ typedef struct { efi_table_hdr_t hdr; void *raise_tpl; void *restore_tpl; - void *allocate_pages; - void *free_pages; - void *get_memory_map; - void *allocate_pool; - void *free_pool; + efi_status_t (*allocate_pages)(int, int, unsigned long, + efi_physical_addr_t *); + efi_status_t (*free_pages)(efi_physical_addr_t, unsigned long); + efi_status_t (*get_memory_map)(unsigned long *, void *, unsigned long *, + unsigned long *, u32 *); + efi_status_t (*allocate_pool)(int, unsigned long, void **); + efi_status_t (*free_pool)(void *); void *create_event; void *set_timer; void *wait_for_event; @@ -171,7 +176,7 @@ typedef struct { void *install_protocol_interface; void *reinstall_protocol_interface; void *uninstall_protocol_interface; - void *handle_protocol; + efi_status_t (*handle_protocol)(efi_handle_t, efi_guid_t *, void **); void *__reserved; void *register_protocol_notify; void *locate_handle; @@ -181,7 +186,7 @@ typedef struct { void *start_image; void *exit; void *unload_image; - void *exit_boot_services; + efi_status_t (*exit_boot_services)(efi_handle_t, unsigned long); void *get_next_monotonic_count; void *stall; void *set_watchdog_timer; @@ -488,10 +493,6 @@ typedef struct { unsigned long unload; } efi_loaded_image_t; -typedef struct { - u64 revision; - void *open_volume; -} efi_file_io_interface_t; typedef struct { u64 size; @@ -504,20 +505,30 @@ typedef struct { efi_char16_t filename[1]; } efi_file_info_t; -typedef struct { +typedef struct _efi_file_handle { u64 revision; - void *open; - void *close; + efi_status_t (*open)(struct _efi_file_handle *, + struct _efi_file_handle **, + efi_char16_t *, u64, u64); + efi_status_t (*close)(struct _efi_file_handle *); void *delete; - void *read; + efi_status_t (*read)(struct _efi_file_handle *, unsigned long *, + void *); void *write; void *get_position; void *set_position; - void *get_info; + efi_status_t (*get_info)(struct _efi_file_handle *, efi_guid_t *, + unsigned long *, void *); void *set_info; void *flush; } efi_file_handle_t; +typedef struct _efi_file_io_interface { + u64 revision; + int (*open_volume)(struct _efi_file_io_interface *, + efi_file_handle_t **); +} efi_file_io_interface_t; + #define EFI_FILE_MODE_READ 0x0000000000000001 #define EFI_FILE_MODE_WRITE 0x0000000000000002 #define EFI_FILE_MODE_CREATE 0x8000000000000000 @@ -787,7 +798,7 @@ struct efivar_entry { struct efi_simple_text_output_protocol { void *reset; - void *output_string; + efi_status_t (*output_string)(void *, void *); void *test_string; };
The x86/AMD64 EFI stubs must us a call wrapper to convert between the Linux and EFI ABIs, so void pointers are sufficient. For ARM, the ABIs are compatible, so we can directly invoke the function pointers. The functions that are used by the ARM stub are updated to match the EFI definitions. Signed-off-by: Roy Franz <roy.franz@linaro.org> --- arch/x86/boot/compressed/eboot.h | 2 -- include/linux/efi.h | 45 ++++++++++++++++++++++++-------------- 2 files changed, 28 insertions(+), 19 deletions(-)