Re: [PATCH v2 06/13] x86/efi: Build our own EFI services pointer table

Roy Franz
2014-03-25T22:47:28Z

On Sat, Mar 22, 2014 at 1:16 PM, Roy Franz <roy.franz@linaro.org> wrote:
> On Sat, Mar 22, 2014 at 4:05 AM, Matt Fleming <matt@console-pimps.org> wrote:
>> On Fri, 21 Mar, at 05:52:29PM, Roy Franz wrote:
>>>
>>> For both arm32 and arm64 the Linux and EFI calling conventions are the
>>> same, so we are directly invoking the function pointers in the
>>> boot_services table. This gives us type checking of those calls,
>>> which is nice.The efi_call_physN macros for ARM are currently simply:
>>> #define efi_call_phys2(f, a1, a2) f(a1, a2)
>>>
>>> With the changes in this patch, we can't do this anymore, as we were
>>> relying on some macro processing to handle this differently on ARM.
>>
>> But on the plus side, you no longer have to implement all those
>> efi_call_physX() macros ;-)
>>
>>> I'd like to propose something like for following (my variadic macros
>>> may not be quite right....)
>>>
>>> for x86:
>>> #define efi_call_early(...) efi_early->call(__VA_ARGS__)
>>>
>>> for arm it would be:
>>> #define efi_call_early(function, ...) efi_early->function(__VA_ARGS__)
>>
>> Close enough.
>>
>>> This would allow us to define the efi_config struct with typed
>>> function pointers for ARM, and retain the direct invocation along with
>>> type checking. This returns to using a macro, but I think we should
>>> be able to use a variadic macro instead of the 6 separate macros we
>>> had before.
>>>
>>> I plan to use the above technique to incorporate these changes into
>>> arm64/arm32, barring any better ideas or objections.
>>
>> Actually, this should be enough to fix this up on ARM,
>>
>> #define efi_call_early(f, ...) \
>> sys_table_arg->boottime->f(__VA_ARGS__);
>>
>> Then you don't need any of the efi_config stuff.
>
> Even better. I had overlooked that the efi_config variables had identical names
> as the boot services.

I have sent a patch (attempted to reply using git-send-email) that
adds the macro
for x86 and updates efi-stub-helper.c. If you could add this to your series for
3.15 that would be great, as then we would not have any x86 changes in
the ARM EFI stub series.

Thanks,
Roy

>>
>> Yes, the fact that we're making use of the sys_table_arg is invisible at
>> the call-site, but meh. Not sure that's a big deal. It allows us to use
>> efi_call_early() in the x86 code without needlessly passing 'sys_table'
>> around, since we've got a global pointer to it anyhow.
>>
>> ------ >8 ------
>>
>> From 5fcc1036d143802e321a745b2c3d793ddb8369ac Mon Sep 17 00:00:00 2001
>> From: Matt Fleming <matt.fleming@intel.com>
>> Date: Sat, 22 Mar 2014 10:09:01 +0000
>> Subject: [PATCH] efi: Abstract x86 efi_early calls
>>
>> The ARM EFI boot stub doesn't need to care about the efi_early
>> infrastructure that x86 requires in order to do mixed mode thunking. So
>> wrap everything up in an efi_call_early() macro, which saves ARM having
>> to implement efi_config.
>>
>> This allows x86 to do the necessary indirect jumps to call whatever
>> firmware interface is available (native or mixed mode), and at the same
>> time allows ARM to use the C type system for parameter checking by
>> implementing efi_early_call() like so,
>>
>> #define efi_call_early(f, ...) \
>> system_table_arg->boottime->f(__VA_ARGS__);
>>
>> Signed-off-by: Matt Fleming <matt.fleming@intel.com>
>> ---
>> arch/x86/boot/compressed/eboot.c | 155 ++++++++++++++++-----------------
>> drivers/firmware/efi/efi-stub-helper.c | 44 +++++-----
>> 2 files changed, 98 insertions(+), 101 deletions(-)
>>
>> diff --git a/arch/x86/boot/compressed/eboot.c b/arch/x86/boot/compressed/eboot.c
>> index 5e1ba4fa3f79..1e6146137f8e 100644
>> --- a/arch/x86/boot/compressed/eboot.c
>> +++ b/arch/x86/boot/compressed/eboot.c
>> @@ -21,6 +21,9 @@ static efi_system_table_t *sys_table;
>>
>> static struct efi_config *efi_early;
>>
>> +#define efi_call_early(f, ...) \
>> + efi_early->call(efi_early->f, __VA_ARGS__);
>> +
>> #define BOOT_SERVICES(bits) \
>> static void setup_boot_services##bits(struct efi_config *c) \
>> { \
>> @@ -78,8 +81,8 @@ __file_size32(void *__fh, efi_char16_t *filename_16,
>> }
>>
>> grow:
>> - status = efi_early->call(efi_early->allocate_pool, EFI_LOADER_DATA,
>> - info_sz, (void **)&info);
>> + status = efi_call_early(allocate_pool, EFI_LOADER_DATA,
>> + info_sz, (void **)&info);
>> if (status != EFI_SUCCESS) {
>> efi_printk(sys_table, "Failed to alloc mem for file info\n");
>> return status;
>> @@ -88,12 +91,12 @@ grow:
>> status = efi_early->call((unsigned long)h->get_info, h, &info_guid,
>> &info_sz, info);
>> if (status == EFI_BUFFER_TOO_SMALL) {
>> - efi_early->call(efi_early->free_pool, info);
>> + efi_call_early(free_pool, info);
>> goto grow;
>> }
>>
>> *file_sz = info->file_size;
>> - efi_early->call(efi_early->free_pool, info);
>> + efi_call_early(free_pool, info);
>>
>> if (status != EFI_SUCCESS)
>> efi_printk(sys_table, "Failed to get initrd info\n");
>> @@ -131,8 +134,8 @@ __file_size64(void *__fh, efi_char16_t *filename_16,
>> }
>>
>> grow:
>> - status = efi_early->call(efi_early->allocate_pool, EFI_LOADER_DATA,
>> - info_sz, (void **)&info);
>> + status = efi_call_early(allocate_pool, EFI_LOADER_DATA,
>> + info_sz, (void **)&info);
>> if (status != EFI_SUCCESS) {
>> efi_printk(sys_table, "Failed to alloc mem for file info\n");
>> return status;
>> @@ -141,12 +144,12 @@ grow:
>> status = efi_early->call((unsigned long)h->get_info, h, &info_guid,
>> &info_sz, info);
>> if (status == EFI_BUFFER_TOO_SMALL) {
>> - efi_early->call(efi_early->free_pool, info);
>> + efi_call_early(free_pool, info);
>> goto grow;
>> }
>>
>> *file_sz = info->file_size;
>> - efi_early->call(efi_early->free_pool, info);
>> + efi_call_early(free_pool, info);
>>
>> if (status != EFI_SUCCESS)
>> efi_printk(sys_table, "Failed to get initrd info\n");
>> @@ -204,8 +207,8 @@ static inline efi_status_t __open_volume32(void *__image, void **__fh)
>> void *handle = (void *)(unsigned long)image->device_handle;
>> unsigned long func;
>>
>> - status = efi_early->call(efi_early->handle_protocol, handle,
>> - &fs_proto, (void **)&io);
>> + status = efi_call_early(handle_protocol, handle,
>> + &fs_proto, (void **)&io);
>> if (status != EFI_SUCCESS) {
>> efi_printk(sys_table, "Failed to handle fs_proto\n");
>> return status;
>> @@ -230,8 +233,8 @@ static inline efi_status_t __open_volume64(void *__image, void **__fh)
>> void *handle = (void *)(unsigned long)image->device_handle;
>> unsigned long func;
>>
>> - status = efi_early->call(efi_early->handle_protocol, handle,
>> - &fs_proto, (void **)&io);
>> + status = efi_call_early(handle_protocol, handle,
>> + &fs_proto, (void **)&io);
>> if (status != EFI_SUCCESS) {
>> efi_printk(sys_table, "Failed to handle fs_proto\n");
>> return status;
>> @@ -325,9 +328,7 @@ __setup_efi_pci32(efi_pci_io_protocol_32 *pci, struct pci_setup_rom **__rom)
>>
>> size = pci->romsize + sizeof(*rom);
>>
>> - status = efi_early->call(efi_early->allocate_pool,
>> - EFI_LOADER_DATA, size, &rom);
>> -
>> + status = efi_call_early(allocate_pool, EFI_LOADER_DATA, size, &rom);
>> if (status != EFI_SUCCESS)
>> return status;
>>
>> @@ -361,7 +362,7 @@ __setup_efi_pci32(efi_pci_io_protocol_32 *pci, struct pci_setup_rom **__rom)
>> return status;
>>
>> free_struct:
>> - efi_early->call(efi_early->free_pool, rom);
>> + efi_call_early(free_pool, rom);
>> return status;
>> }
>>
>> @@ -387,8 +388,8 @@ setup_efi_pci32(struct boot_params *params, void **pci_handle,
>> struct pci_setup_rom *rom = NULL;
>> u32 h = handles[i];
>>
>> - status = efi_early->call(efi_early->handle_protocol, h,
>> - &pci_proto, (void **)&pci);
>> + status = efi_call_early(handle_protocol, h,
>> + &pci_proto, (void **)&pci);
>>
>> if (status != EFI_SUCCESS)
>> continue;
>> @@ -431,9 +432,7 @@ __setup_efi_pci64(efi_pci_io_protocol_64 *pci, struct pci_setup_rom **__rom)
>>
>> size = pci->romsize + sizeof(*rom);
>>
>> - status = efi_early->call(efi_early->allocate_pool,
>> - EFI_LOADER_DATA, size, &rom);
>> -
>> + status = efi_call_early(allocate_pool, EFI_LOADER_DATA, size, &rom);
>> if (status != EFI_SUCCESS)
>> return status;
>>
>> @@ -465,7 +464,7 @@ __setup_efi_pci64(efi_pci_io_protocol_64 *pci, struct pci_setup_rom **__rom)
>> return status;
>>
>> free_struct:
>> - efi_early->call(efi_early->free_pool, rom);
>> + efi_call_early(free_pool, rom);
>> return status;
>>
>> }
>> @@ -492,8 +491,8 @@ setup_efi_pci64(struct boot_params *params, void **pci_handle,
>> struct pci_setup_rom *rom = NULL;
>> u64 h = handles[i];
>>
>> - status = efi_early->call(efi_early->handle_protocol, h,
>> - &pci_proto, (void **)&pci);
>> + status = efi_call_early(handle_protocol, h,
>> + &pci_proto, (void **)&pci);
>>
>> if (status != EFI_SUCCESS)
>> continue;
>> @@ -524,21 +523,21 @@ static efi_status_t setup_efi_pci(struct boot_params *params)
>> efi_guid_t pci_proto = EFI_PCI_IO_PROTOCOL_GUID;
>> unsigned long size = 0;
>>
>> - status = efi_early->call(efi_early->locate_handle,
>> - EFI_LOCATE_BY_PROTOCOL,
>> - &pci_proto, NULL, &size, pci_handle);
>> + status = efi_call_early(locate_handle,
>> + EFI_LOCATE_BY_PROTOCOL,
>> + &pci_proto, NULL, &size, pci_handle);
>>
>> if (status == EFI_BUFFER_TOO_SMALL) {
>> - status = efi_early->call(efi_early->allocate_pool,
>> - EFI_LOADER_DATA,
>> - size, (void **)&pci_handle);
>> + status = efi_call_early(allocate_pool,
>> + EFI_LOADER_DATA,
>> + size, (void **)&pci_handle);
>>
>> if (status != EFI_SUCCESS)
>> return status;
>>
>> - status = efi_early->call(efi_early->locate_handle,
>> - EFI_LOCATE_BY_PROTOCOL, &pci_proto,
>> - NULL, &size, pci_handle);
>> + status = efi_call_early(locate_handle,
>> + EFI_LOCATE_BY_PROTOCOL, &pci_proto,
>> + NULL, &size, pci_handle);
>> }
>>
>> if (status != EFI_SUCCESS)
>> @@ -550,7 +549,7 @@ static efi_status_t setup_efi_pci(struct boot_params *params)
>> status = setup_efi_pci32(params, pci_handle, size);
>>
>> free_handle:
>> - efi_early->call(efi_early->free_pool, pci_handle);
>> + efi_call_early(free_pool, pci_handle);
>> return status;
>> }
>>
>> @@ -651,13 +650,13 @@ setup_gop32(struct screen_info *si, efi_guid_t *proto,
>> void *dummy = NULL;
>> u32 h = handles[i];
>>
>> - status = efi_early->call(efi_early->handle_protocol, h,
>> - proto, (void **)&gop32);
>> + status = efi_call_early(handle_protocol, h,
>> + proto, (void **)&gop32);
>> if (status != EFI_SUCCESS)
>> continue;
>>
>> - status = efi_early->call(efi_early->handle_protocol, h,
>> - &conout_proto, &dummy);
>> + status = efi_call_early(handle_protocol, h,
>> + &conout_proto, &dummy);
>> if (status == EFI_SUCCESS)
>> conout_found = true;
>>
>> @@ -754,13 +753,13 @@ setup_gop64(struct screen_info *si, efi_guid_t *proto,
>> void *dummy = NULL;
>> u64 h = handles[i];
>>
>> - status = efi_early->call(efi_early->handle_protocol, h,
>> - proto, (void **)&gop64);
>> + status = efi_call_early(handle_protocol, h,
>> + proto, (void **)&gop64);
>> if (status != EFI_SUCCESS)
>> continue;
>>
>> - status = efi_early->call(efi_early->handle_protocol, h,
>> - &conout_proto, &dummy);
>> + status = efi_call_early(handle_protocol, h,
>> + &conout_proto, &dummy);
>> if (status == EFI_SUCCESS)
>> conout_found = true;
>>
>> @@ -819,14 +818,14 @@ static efi_status_t setup_gop(struct screen_info *si, efi_guid_t *proto,
>> efi_status_t status;
>> void **gop_handle = NULL;
>>
>> - status = efi_early->call(efi_early->allocate_pool, EFI_LOADER_DATA,
>> - size, (void **)&gop_handle);
>> + status = efi_call_early(allocate_pool, EFI_LOADER_DATA,
>> + size, (void **)&gop_handle);
>> if (status != EFI_SUCCESS)
>> return status;
>>
>> - status = efi_early->call(efi_early->locate_handle,
>> - EFI_LOCATE_BY_PROTOCOL,
>> - proto, NULL, &size, gop_handle);
>> + status = efi_call_early(locate_handle,
>> + EFI_LOCATE_BY_PROTOCOL,
>> + proto, NULL, &size, gop_handle);
>> if (status != EFI_SUCCESS)
>> goto free_handle;
>>
>> @@ -836,7 +835,7 @@ static efi_status_t setup_gop(struct screen_info *si, efi_guid_t *proto,
>> status = setup_gop32(si, proto, size, gop_handle);
>>
>> free_handle:
>> - efi_early->call(efi_early->free_pool, gop_handle);
>> + efi_call_early(free_pool, gop_handle);
>> return status;
>> }
>>
>> @@ -858,13 +857,12 @@ setup_uga32(void **uga_handle, unsigned long size, u32 *width, u32 *height)
>> void *pciio;
>> u32 handle = handles[i];
>>
>> - status = efi_early->call(efi_early->handle_protocol, handle,
>> - &uga_proto, (void **)&uga);
>> + status = efi_call_early(handle_protocol, handle,
>> + &uga_proto, (void **)&uga);
>> if (status != EFI_SUCCESS)
>> continue;
>>
>> - efi_early->call(efi_early->handle_protocol, handle,
>> - &pciio_proto, &pciio);
>> + efi_call_early(handle_protocol, handle, &pciio_proto, &pciio);
>>
>> status = efi_early->call((unsigned long)uga->get_mode, uga,
>> &w, &h, &depth, &refresh);
>> @@ -904,13 +902,12 @@ setup_uga64(void **uga_handle, unsigned long size, u32 *width, u32 *height)
>> void *pciio;
>> u64 handle = handles[i];
>>
>> - status = efi_early->call(efi_early->handle_protocol, handle,
>> - &uga_proto, (void **)&uga);
>> + status = efi_call_early(handle_protocol, handle,
>> + &uga_proto, (void **)&uga);
>> if (status != EFI_SUCCESS)
>> continue;
>>
>> - efi_early->call(efi_early->handle_protocol, handle,
>> - &pciio_proto, &pciio);
>> + efi_call_early(handle_protocol, handle, &pciio_proto, &pciio);
>>
>> status = efi_early->call((unsigned long)uga->get_mode, uga,
>> &w, &h, &depth, &refresh);
>> @@ -942,14 +939,14 @@ static efi_status_t setup_uga(struct screen_info *si, efi_guid_t *uga_proto,
>> u32 width, height;
>> void **uga_handle = NULL;
>>
>> - status = efi_early->call(efi_early->allocate_pool, EFI_LOADER_DATA,
>> - size, (void **)&uga_handle);
>> + status = efi_call_early(allocate_pool, EFI_LOADER_DATA,
>> + size, (void **)&uga_handle);
>> if (status != EFI_SUCCESS)
>> return status;
>>
>> - status = efi_early->call(efi_early->locate_handle,
>> - EFI_LOCATE_BY_PROTOCOL,
>> - uga_proto, NULL, &size, uga_handle);
>> + status = efi_call_early(locate_handle,
>> + EFI_LOCATE_BY_PROTOCOL,
>> + uga_proto, NULL, &size, uga_handle);
>> if (status != EFI_SUCCESS)
>> goto free_handle;
>>
>> @@ -981,7 +978,7 @@ static efi_status_t setup_uga(struct screen_info *si, efi_guid_t *uga_proto,
>> si->rsvd_pos = 24;
>>
>> free_handle:
>> - efi_early->call(efi_early->free_pool, uga_handle);
>> + efi_call_early(free_pool, uga_handle);
>> return status;
>> }
>>
>> @@ -999,17 +996,17 @@ void setup_graphics(struct boot_params *boot_params)
>> memset(si, 0, sizeof(*si));
>>
>> size = 0;
>> - status = efi_early->call(efi_early->locate_handle,
>> - EFI_LOCATE_BY_PROTOCOL,
>> - &graphics_proto, NULL, &size, gop_handle);
>> + status = efi_call_early(locate_handle,
>> + EFI_LOCATE_BY_PROTOCOL,
>> + &graphics_proto, NULL, &size, gop_handle);
>> if (status == EFI_BUFFER_TOO_SMALL)
>> status = setup_gop(si, &graphics_proto, size);
>>
>> if (status != EFI_SUCCESS) {
>> size = 0;
>> - status = efi_early->call(efi_early->locate_handle,
>> - EFI_LOCATE_BY_PROTOCOL,
>> - &uga_proto, NULL, &size, uga_handle);
>> + status = efi_call_early(locate_handle,
>> + EFI_LOCATE_BY_PROTOCOL,
>> + &uga_proto, NULL, &size, uga_handle);
>> if (status == EFI_BUFFER_TOO_SMALL)
>> setup_uga(si, &uga_proto, size);
>> }
>> @@ -1052,8 +1049,8 @@ struct boot_params *make_boot_params(struct efi_config *c)
>> else
>> setup_boot_services32(efi_early);
>>
>> - status = efi_early->call(efi_early->handle_protocol, handle,
>> - &proto, (void *)&image);
>> + status = efi_call_early(handle_protocol, handle,
>> + &proto, (void *)&image);
>> if (status != EFI_SUCCESS) {
>> efi_printk(sys_table, "Failed to get handle for LOADED_IMAGE_PROTOCOL\n");
>> return NULL;
>> @@ -1242,13 +1239,13 @@ static efi_status_t alloc_e820ext(u32 nr_desc, struct setup_data **e820ext,
>> sizeof(struct e820entry) * nr_desc;
>>
>> if (*e820ext) {
>> - efi_early->call(efi_early->free_pool, *e820ext);
>> + efi_call_early(free_pool, *e820ext);
>> *e820ext = NULL;
>> *e820ext_size = 0;
>> }
>>
>> - status = efi_early->call(efi_early->allocate_pool, EFI_LOADER_DATA,
>> - size, (void **)e820ext);
>> + status = efi_call_early(allocate_pool, EFI_LOADER_DATA,
>> + size, (void **)e820ext);
>> if (status == EFI_SUCCESS)
>> *e820ext_size = size;
>>
>> @@ -1292,7 +1289,7 @@ get_map:
>> if (status != EFI_SUCCESS)
>> goto free_mem_map;
>>
>> - efi_early->call(efi_early->free_pool, mem_map);
>> + efi_call_early(free_pool, mem_map);
>> goto get_map; /* Allocated memory, get map again */
>> }
>>
>> @@ -1311,7 +1308,7 @@ get_map:
>> #endif
>>
>> /* Might as well exit boot services now */
>> - status = efi_early->call(efi_early->exit_boot_services, handle, key);
>> + status = efi_call_early(exit_boot_services, handle, key);
>> if (status != EFI_SUCCESS) {
>> /*
>> * ExitBootServices() will fail if any of the event
>> @@ -1324,7 +1321,7 @@ get_map:
>> goto free_mem_map;
>>
>> called_exit = true;
>> - efi_early->call(efi_early->free_pool, mem_map);
>> + efi_call_early(free_pool, mem_map);
>> goto get_map;
>> }
>>
>> @@ -1338,7 +1335,7 @@ get_map:
>> return EFI_SUCCESS;
>>
>> free_mem_map:
>> - efi_early->call(efi_early->free_pool, mem_map);
>> + efi_call_early(free_pool, mem_map);
>> return status;
>> }
>>
>> @@ -1379,8 +1376,8 @@ struct boot_params *efi_main(struct efi_config *c,
>>
>> setup_efi_pci(boot_params);
>>
>> - status = efi_early->call(efi_early->allocate_pool, EFI_LOADER_DATA,
>> - sizeof(*gdt), (void **)&gdt);
>> + status = efi_call_early(allocate_pool, EFI_LOADER_DATA,
>> + sizeof(*gdt), (void **)&gdt);
>> if (status != EFI_SUCCESS) {
>> efi_printk(sys_table, "Failed to alloc mem for gdt structure\n");
>> goto fail;
>> diff --git a/drivers/firmware/efi/efi-stub-helper.c b/drivers/firmware/efi/efi-stub-helper.c
>> index a0282872d97d..ff50aeebf0d9 100644
>> --- a/drivers/firmware/efi/efi-stub-helper.c
>> +++ b/drivers/firmware/efi/efi-stub-helper.c
>> @@ -53,22 +53,22 @@ again:
>> * allocation which may be in a new descriptor region.
>> */
>> *map_size += sizeof(*m);
>> - status = efi_early->call(efi_early->allocate_pool, EFI_LOADER_DATA,
>> - *map_size, (void **)&m);
>> + status = efi_call_early(allocate_pool, EFI_LOADER_DATA,
>> + *map_size, (void **)&m);
>> if (status != EFI_SUCCESS)
>> goto fail;
>>
>> *desc_size = 0;
>> key = 0;
>> - status = efi_early->call(efi_early->get_memory_map, map_size, m,
>> - &key, desc_size, &desc_version);
>> + status = efi_call_early(get_memory_map, map_size, m,
>> + &key, desc_size, &desc_version);
>> if (status == EFI_BUFFER_TOO_SMALL) {
>> - efi_early->call(efi_early->free_pool, m);
>> + efi_call_early(free_pool, m);
>> goto again;
>> }
>>
>> if (status != EFI_SUCCESS)
>> - efi_early->call(efi_early->free_pool, m);
>> + efi_call_early(free_pool, m);
>>
>> if (key_ptr && status == EFI_SUCCESS)
>> *key_ptr = key;
>> @@ -149,9 +149,9 @@ again:
>> if (!max_addr)
>> status = EFI_NOT_FOUND;
>> else {
>> - status = efi_early->call(efi_early->allocate_pages,
>> - EFI_ALLOCATE_ADDRESS, EFI_LOADER_DATA,
>> - nr_pages, &max_addr);
>> + status = efi_call_early(allocate_pages,
>> + EFI_ALLOCATE_ADDRESS, EFI_LOADER_DATA,
>> + nr_pages, &max_addr);
>> if (status != EFI_SUCCESS) {
>> max = max_addr;
>> max_addr = 0;
>> @@ -161,7 +161,7 @@ again:
>> *addr = max_addr;
>> }
>>
>> - efi_early->call(efi_early->free_pool, map);
>> + efi_call_early(free_pool, map);
>> fail:
>> return status;
>> }
>> @@ -221,9 +221,9 @@ static efi_status_t efi_low_alloc(efi_system_table_t *sys_table_arg,
>> if ((start + size) > end)
>> continue;
>>
>> - status = efi_early->call(efi_early->allocate_pages,
>> - EFI_ALLOCATE_ADDRESS, EFI_LOADER_DATA,
>> - nr_pages, &start);
>> + status = efi_call_early(allocate_pages,
>> + EFI_ALLOCATE_ADDRESS, EFI_LOADER_DATA,
>> + nr_pages, &start);
>> if (status == EFI_SUCCESS) {
>> *addr = start;
>> break;
>> @@ -233,7 +233,7 @@ static efi_status_t efi_low_alloc(efi_system_table_t *sys_table_arg,
>> if (i == map_size / desc_size)
>> status = EFI_NOT_FOUND;
>>
>> - efi_early->call(efi_early->free_pool, map);
>> + efi_call_early(free_pool, map);
>> fail:
>> return status;
>> }
>> @@ -247,7 +247,7 @@ static void efi_free(efi_system_table_t *sys_table_arg, unsigned long size,
>> return;
>>
>> nr_pages = round_up(size, EFI_PAGE_SIZE) / EFI_PAGE_SIZE;
>> - efi_early->call(efi_early->free_pages, addr, nr_pages);
>> + efi_call_early(free_pages, addr, nr_pages);
>> }
>>
>>
>> @@ -307,8 +307,8 @@ static efi_status_t handle_cmdline_files(efi_system_table_t *sys_table_arg,
>> if (!nr_files)
>> return EFI_SUCCESS;
>>
>> - status = efi_early->call(efi_early->allocate_pool, EFI_LOADER_DATA,
>> - nr_files * sizeof(*files), (void **)&files);
>> + status = efi_call_early(allocate_pool, EFI_LOADER_DATA,
>> + nr_files * sizeof(*files), (void **)&files);
>> if (status != EFI_SUCCESS) {
>> efi_printk(sys_table_arg, "Failed to alloc mem for file handle list\n");
>> goto fail;
>> @@ -413,7 +413,7 @@ static efi_status_t handle_cmdline_files(efi_system_table_t *sys_table_arg,
>>
>> }
>>
>> - efi_early->call(efi_early->free_pool, files);
>> + efi_call_early(free_pool, files);
>>
>> *load_addr = file_addr;
>> *load_size = file_size_total;
>> @@ -427,7 +427,7 @@ close_handles:
>> for (k = j; k < i; k++)
>> efi_file_close(fh, files[k].handle);
>> free_files:
>> - efi_early->call(efi_early->free_pool, files);
>> + efi_call_early(free_pool, files);
>> fail:
>> *load_addr = 0;
>> *load_size = 0;
>> @@ -473,9 +473,9 @@ static efi_status_t efi_relocate_kernel(efi_system_table_t *sys_table_arg,
>> * as possible while respecting the required alignment.
>> */
>> nr_pages = round_up(alloc_size, EFI_PAGE_SIZE) / EFI_PAGE_SIZE;
>> - status = efi_early->call(efi_early->allocate_pages,
>> - EFI_ALLOCATE_ADDRESS, EFI_LOADER_DATA,
>> - nr_pages, &efi_addr);
>> + status = efi_call_early(allocate_pages,
>> + EFI_ALLOCATE_ADDRESS, EFI_LOADER_DATA,
>> + nr_pages, &efi_addr);
>> new_addr = efi_addr;
>> /*
>> * If preferred address allocation failed allocate as low as
>> --
>> 1.8.5.3
>>
>>
>> --
>> Matt Fleming, Intel Open Source Technology Center