Re: [U-Boot] [PATCH v4 13/18] efi_loader: fix StartImage bootservice
On 24.01.18 00:16, Heinrich Schuchardt wrote: > On 01/24/2018 12:04 AM, Alexander Graf wrote: >> >> >> On 23.01.18 22:35, Heinrich Schuchardt wrote: >>> On 01/19/2018 09:16 PM, xypron.g...@gmx.de wrote: From: Heinrich SchuchardtThe calling convention for the entry point of an EFI image is always 'asmlinkage'. Signed-off-by: Heinrich Schuchardt --- v4 rebase according to https://github.com/agraf/efi_next v3 Use efi_handle_t as type of the image handle. v2 no change --- lib/efi_loader/efi_boottime.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/efi_loader/efi_boottime.c b/lib/efi_loader/efi_boottime.c index 7c61dfb3a7..324abe4d48 100644 --- a/lib/efi_loader/efi_boottime.c +++ b/lib/efi_loader/efi_boottime.c @@ -1530,7 +1530,8 @@ static efi_status_t EFIAPI efi_start_image(efi_handle_t image_handle, unsigned long *exit_data_size, s16 **exit_data) { - ulong (*entry)(efi_handle_t image_handle, struct efi_system_table *st); + asmlinkage ulong (*entry)(efi_handle_t image_handle, +struct efi_system_table *st); >>> >>> Alex, >>> >>> could you once again carefully review this change. >>> >>> Have a look at the definition of EFIAPI in include/efi.h >>> >>> In cmd/bootefi.c we assume the entry point is asmlinkage. >>> In lib/efi_loader/helloworld.c we assume it is EFIAPI. >>> >>> The definition of EFIAPI depends on CONFIG_EFI_STUB_64BIT, which is only >>> defined in configs/qemu-x86_efi_payload64_defconfig. >>> >>> Why should the definition of EFIAPI depend on whether we are consuming >>> or offering the API? Shouldn't EFIAPI have the same definition when >>> compiling qemu-x86_64_defconfig? >> >> Because EFI supported started as payload support. >> >>> >>> Am I right that the entry point should in cmd/bootefi.c, helloworld.c, >>> efi_start_image() should always be defined as >>> >>> EFIAPI efi_status_t (*entry)(efi_handle_t image_handle >>> >>> and further when compiling for x86_64 we should always define EFIAPI as >>> >>> __attribute__((ms_abi)) >>> >>> and on other systems as >>> >>> asmlinkage >> >> Not quite. I guess we basically want to have EFI_LOADER select >> EFI_STUB_64BIT on x86_64. So maybe something like the patch below? >> >> >> Alex >> >> >> diff --git a/cmd/bootefi.c b/cmd/bootefi.c >> index 51213c0293..c579b76b4b 100644 >> --- a/cmd/bootefi.c >> +++ b/cmd/bootefi.c >> @@ -126,8 +126,8 @@ static void *copy_fdt(void *fdt) >> >> static efi_status_t efi_do_enter( >> efi_handle_t image_handle, struct efi_system_table *st, >> -asmlinkage ulong (*entry)(efi_handle_t image_handle, >> - struct efi_system_table *st)) >> +EFIAPI ulong (*entry)(efi_handle_t image_handle, >> + struct efi_system_table *st)) >> { >> efi_status_t ret = EFI_LOAD_ERROR; >> >> @@ -138,7 +138,7 @@ static efi_status_t efi_do_enter( >> } >> >> #ifdef CONFIG_ARM64 >> -static efi_status_t efi_run_in_el2(asmlinkage ulong (*entry)( >> +static efi_status_t efi_run_in_el2(EFIAPI ulong (*entry)( > > We should use efi_status_t and not ulong here (and below). It dislike if > the same property gets different names. Sure. > >> efi_handle_t image_handle, struct efi_system_table *st), >> efi_handle_t image_handle, struct efi_system_table *st) >> { >> @@ -163,7 +163,7 @@ static efi_status_t do_bootefi_exec(void *efi, void >> *fdt, >> ulong ret; >> >> ulong (*entry)(efi_handle_t image_handle, struct efi_system_table *st) >> -asmlinkage; >> +EFIAPI; >> ulong fdt_pages, fdt_size, fdt_start, fdt_end; >> const efi_guid_t fdt_guid = EFI_FDT_GUID; >> bootm_headers_t img = { 0 }; >> diff --git a/include/efi.h b/include/efi.h >> index 2f0be9c86c..29f6930f53 100644 >> --- a/include/efi.h >> +++ b/include/efi.h >> @@ -19,7 +19,7 @@ >> #include >> #include >> >> -#ifdef CONFIG_EFI_STUB_64BIT >> +#if CONFIG_EFI_STUB_64BIT || (!defined(CONFIG_EFI_STUB) && defined >> (__x86_64__)) >> /* EFI uses the Microsoft ABI which is not the default for GCC */ >> #define EFIAPI __attribute__((ms_abi)) >> #else >> diff --git a/lib/efi_loader/Kconfig b/lib/efi_loader/Kconfig >> index d2b6327119..827c267b60 100644 >> --- a/lib/efi_loader/Kconfig >> +++ b/lib/efi_loader/Kconfig >> @@ -1,6 +1,10 @@ >> config EFI_LOADER >> bool "Support running EFI Applications in U-Boot" >> depends on (ARM || X86) && OF_LIBFDT >> +# We need EFI_STUB_64BIT to be set on x86_64 with EFI_STUB >> +depends on !EFI_STUB || !X86_64 || EFI_STUB_64BIT >> +# We need EFI_STUB_32BIT to be set
Re: [U-Boot] [PATCH v4 13/18] efi_loader: fix StartImage bootservice
On 01/24/2018 12:04 AM, Alexander Graf wrote: > > > On 23.01.18 22:35, Heinrich Schuchardt wrote: >> On 01/19/2018 09:16 PM, xypron.g...@gmx.de wrote: >>> From: Heinrich Schuchardt>>> >>> The calling convention for the entry point of an EFI image >>> is always 'asmlinkage'. >>> >>> Signed-off-by: Heinrich Schuchardt >>> --- >>> v4 >>> rebase according to https://github.com/agraf/efi_next >>> v3 >>> Use efi_handle_t as type of the image handle. >>> v2 >>> no change >>> --- >>> >>> lib/efi_loader/efi_boottime.c | 3 ++- >>> 1 file changed, 2 insertions(+), 1 deletion(-) >>> >>> diff --git a/lib/efi_loader/efi_boottime.c b/lib/efi_loader/efi_boottime.c >>> index 7c61dfb3a7..324abe4d48 100644 >>> --- a/lib/efi_loader/efi_boottime.c >>> +++ b/lib/efi_loader/efi_boottime.c >>> @@ -1530,7 +1530,8 @@ static efi_status_t EFIAPI >>> efi_start_image(efi_handle_t image_handle, >>>unsigned long *exit_data_size, >>>s16 **exit_data) >>> { >>> - ulong (*entry)(efi_handle_t image_handle, struct efi_system_table *st); >>> + asmlinkage ulong (*entry)(efi_handle_t image_handle, >>> + struct efi_system_table *st); >> >> Alex, >> >> could you once again carefully review this change. >> >> Have a look at the definition of EFIAPI in include/efi.h >> >> In cmd/bootefi.c we assume the entry point is asmlinkage. >> In lib/efi_loader/helloworld.c we assume it is EFIAPI. >> >> The definition of EFIAPI depends on CONFIG_EFI_STUB_64BIT, which is only >> defined in configs/qemu-x86_efi_payload64_defconfig. >> >> Why should the definition of EFIAPI depend on whether we are consuming >> or offering the API? Shouldn't EFIAPI have the same definition when >> compiling qemu-x86_64_defconfig? > > Because EFI supported started as payload support. > >> >> Am I right that the entry point should in cmd/bootefi.c, helloworld.c, >> efi_start_image() should always be defined as >> >> EFIAPI efi_status_t (*entry)(efi_handle_t image_handle >> >> and further when compiling for x86_64 we should always define EFIAPI as >> >> __attribute__((ms_abi)) >> >> and on other systems as >> >> asmlinkage > > Not quite. I guess we basically want to have EFI_LOADER select > EFI_STUB_64BIT on x86_64. So maybe something like the patch below? > > > Alex > > > diff --git a/cmd/bootefi.c b/cmd/bootefi.c > index 51213c0293..c579b76b4b 100644 > --- a/cmd/bootefi.c > +++ b/cmd/bootefi.c > @@ -126,8 +126,8 @@ static void *copy_fdt(void *fdt) > > static efi_status_t efi_do_enter( > efi_handle_t image_handle, struct efi_system_table *st, > - asmlinkage ulong (*entry)(efi_handle_t image_handle, > - struct efi_system_table *st)) > + EFIAPI ulong (*entry)(efi_handle_t image_handle, > + struct efi_system_table *st)) > { > efi_status_t ret = EFI_LOAD_ERROR; > > @@ -138,7 +138,7 @@ static efi_status_t efi_do_enter( > } > > #ifdef CONFIG_ARM64 > -static efi_status_t efi_run_in_el2(asmlinkage ulong (*entry)( > +static efi_status_t efi_run_in_el2(EFIAPI ulong (*entry)( We should use efi_status_t and not ulong here (and below). It dislike if the same property gets different names. > efi_handle_t image_handle, struct efi_system_table *st), > efi_handle_t image_handle, struct efi_system_table *st) > { > @@ -163,7 +163,7 @@ static efi_status_t do_bootefi_exec(void *efi, void > *fdt, > ulong ret; > > ulong (*entry)(efi_handle_t image_handle, struct efi_system_table *st) > - asmlinkage; > + EFIAPI; > ulong fdt_pages, fdt_size, fdt_start, fdt_end; > const efi_guid_t fdt_guid = EFI_FDT_GUID; > bootm_headers_t img = { 0 }; > diff --git a/include/efi.h b/include/efi.h > index 2f0be9c86c..29f6930f53 100644 > --- a/include/efi.h > +++ b/include/efi.h > @@ -19,7 +19,7 @@ > #include > #include > > -#ifdef CONFIG_EFI_STUB_64BIT > +#if CONFIG_EFI_STUB_64BIT || (!defined(CONFIG_EFI_STUB) && defined > (__x86_64__)) > /* EFI uses the Microsoft ABI which is not the default for GCC */ > #define EFIAPI __attribute__((ms_abi)) > #else > diff --git a/lib/efi_loader/Kconfig b/lib/efi_loader/Kconfig > index d2b6327119..827c267b60 100644 > --- a/lib/efi_loader/Kconfig > +++ b/lib/efi_loader/Kconfig > @@ -1,6 +1,10 @@ > config EFI_LOADER > bool "Support running EFI Applications in U-Boot" > depends on (ARM || X86) && OF_LIBFDT > + # We need EFI_STUB_64BIT to be set on x86_64 with EFI_STUB > + depends on !EFI_STUB || !X86_64 || EFI_STUB_64BIT > + # We need EFI_STUB_32BIT to be set on x86_32 with EFI_STUB > + depends on !EFI_STUB || !X86 || X86_64 || EFI_STUB_32BIT Wouldn't it be better to let EFI_API depend on CONFIG_X86_64? Why
Re: [U-Boot] [PATCH v4 13/18] efi_loader: fix StartImage bootservice
On 23.01.18 22:35, Heinrich Schuchardt wrote: > On 01/19/2018 09:16 PM, xypron.g...@gmx.de wrote: >> From: Heinrich Schuchardt>> >> The calling convention for the entry point of an EFI image >> is always 'asmlinkage'. >> >> Signed-off-by: Heinrich Schuchardt >> --- >> v4 >> rebase according to https://github.com/agraf/efi_next >> v3 >> Use efi_handle_t as type of the image handle. >> v2 >> no change >> --- >> >> lib/efi_loader/efi_boottime.c | 3 ++- >> 1 file changed, 2 insertions(+), 1 deletion(-) >> >> diff --git a/lib/efi_loader/efi_boottime.c b/lib/efi_loader/efi_boottime.c >> index 7c61dfb3a7..324abe4d48 100644 >> --- a/lib/efi_loader/efi_boottime.c >> +++ b/lib/efi_loader/efi_boottime.c >> @@ -1530,7 +1530,8 @@ static efi_status_t EFIAPI >> efi_start_image(efi_handle_t image_handle, >> unsigned long *exit_data_size, >> s16 **exit_data) >> { >> -ulong (*entry)(efi_handle_t image_handle, struct efi_system_table *st); >> +asmlinkage ulong (*entry)(efi_handle_t image_handle, >> + struct efi_system_table *st); > > Alex, > > could you once again carefully review this change. > > Have a look at the definition of EFIAPI in include/efi.h > > In cmd/bootefi.c we assume the entry point is asmlinkage. > In lib/efi_loader/helloworld.c we assume it is EFIAPI. > > The definition of EFIAPI depends on CONFIG_EFI_STUB_64BIT, which is only > defined in configs/qemu-x86_efi_payload64_defconfig. > > Why should the definition of EFIAPI depend on whether we are consuming > or offering the API? Shouldn't EFIAPI have the same definition when > compiling qemu-x86_64_defconfig? Because EFI supported started as payload support. > > Am I right that the entry point should in cmd/bootefi.c, helloworld.c, > efi_start_image() should always be defined as > > EFIAPI efi_status_t (*entry)(efi_handle_t image_handle > > and further when compiling for x86_64 we should always define EFIAPI as > > __attribute__((ms_abi)) > > and on other systems as > > asmlinkage Not quite. I guess we basically want to have EFI_LOADER select EFI_STUB_64BIT on x86_64. So maybe something like the patch below? Alex diff --git a/cmd/bootefi.c b/cmd/bootefi.c index 51213c0293..c579b76b4b 100644 --- a/cmd/bootefi.c +++ b/cmd/bootefi.c @@ -126,8 +126,8 @@ static void *copy_fdt(void *fdt) static efi_status_t efi_do_enter( efi_handle_t image_handle, struct efi_system_table *st, - asmlinkage ulong (*entry)(efi_handle_t image_handle, - struct efi_system_table *st)) + EFIAPI ulong (*entry)(efi_handle_t image_handle, + struct efi_system_table *st)) { efi_status_t ret = EFI_LOAD_ERROR; @@ -138,7 +138,7 @@ static efi_status_t efi_do_enter( } #ifdef CONFIG_ARM64 -static efi_status_t efi_run_in_el2(asmlinkage ulong (*entry)( +static efi_status_t efi_run_in_el2(EFIAPI ulong (*entry)( efi_handle_t image_handle, struct efi_system_table *st), efi_handle_t image_handle, struct efi_system_table *st) { @@ -163,7 +163,7 @@ static efi_status_t do_bootefi_exec(void *efi, void *fdt, ulong ret; ulong (*entry)(efi_handle_t image_handle, struct efi_system_table *st) - asmlinkage; + EFIAPI; ulong fdt_pages, fdt_size, fdt_start, fdt_end; const efi_guid_t fdt_guid = EFI_FDT_GUID; bootm_headers_t img = { 0 }; diff --git a/include/efi.h b/include/efi.h index 2f0be9c86c..29f6930f53 100644 --- a/include/efi.h +++ b/include/efi.h @@ -19,7 +19,7 @@ #include #include -#ifdef CONFIG_EFI_STUB_64BIT +#if CONFIG_EFI_STUB_64BIT || (!defined(CONFIG_EFI_STUB) && defined (__x86_64__)) /* EFI uses the Microsoft ABI which is not the default for GCC */ #define EFIAPI __attribute__((ms_abi)) #else diff --git a/lib/efi_loader/Kconfig b/lib/efi_loader/Kconfig index d2b6327119..827c267b60 100644 --- a/lib/efi_loader/Kconfig +++ b/lib/efi_loader/Kconfig @@ -1,6 +1,10 @@ config EFI_LOADER bool "Support running EFI Applications in U-Boot" depends on (ARM || X86) && OF_LIBFDT + # We need EFI_STUB_64BIT to be set on x86_64 with EFI_STUB + depends on !EFI_STUB || !X86_64 || EFI_STUB_64BIT + # We need EFI_STUB_32BIT to be set on x86_32 with EFI_STUB + depends on !EFI_STUB || !X86 || X86_64 || EFI_STUB_32BIT default y help Select this option if you want to run EFI applications (like grub2) diff --git a/lib/efi_loader/efi_boottime.c b/lib/efi_loader/efi_boottime.c index 39d8511fe3..5b78740bff 100644 --- a/lib/efi_loader/efi_boottime.c +++ b/lib/efi_loader/efi_boottime.c @@ -1534,8 +1534,8 @@ static efi_status_t EFIAPI efi_start_image(efi_handle_t
Re: [U-Boot] [PATCH v4 13/18] efi_loader: fix StartImage bootservice
On 01/19/2018 09:16 PM, xypron.g...@gmx.de wrote: > From: Heinrich Schuchardt> > The calling convention for the entry point of an EFI image > is always 'asmlinkage'. > > Signed-off-by: Heinrich Schuchardt > --- > v4 > rebase according to https://github.com/agraf/efi_next > v3 > Use efi_handle_t as type of the image handle. > v2 > no change > --- > > lib/efi_loader/efi_boottime.c | 3 ++- > 1 file changed, 2 insertions(+), 1 deletion(-) > > diff --git a/lib/efi_loader/efi_boottime.c b/lib/efi_loader/efi_boottime.c > index 7c61dfb3a7..324abe4d48 100644 > --- a/lib/efi_loader/efi_boottime.c > +++ b/lib/efi_loader/efi_boottime.c > @@ -1530,7 +1530,8 @@ static efi_status_t EFIAPI efi_start_image(efi_handle_t > image_handle, > unsigned long *exit_data_size, > s16 **exit_data) > { > - ulong (*entry)(efi_handle_t image_handle, struct efi_system_table *st); > + asmlinkage ulong (*entry)(efi_handle_t image_handle, > + struct efi_system_table *st); Alex, could you once again carefully review this change. Have a look at the definition of EFIAPI in include/efi.h In cmd/bootefi.c we assume the entry point is asmlinkage. In lib/efi_loader/helloworld.c we assume it is EFIAPI. The definition of EFIAPI depends on CONFIG_EFI_STUB_64BIT, which is only defined in configs/qemu-x86_efi_payload64_defconfig. Why should the definition of EFIAPI depend on whether we are consuming or offering the API? Shouldn't EFIAPI have the same definition when compiling qemu-x86_64_defconfig? Am I right that the entry point should in cmd/bootefi.c, helloworld.c, efi_start_image() should always be defined as EFIAPI efi_status_t (*entry)(efi_handle_t image_handle and further when compiling for x86_64 we should always define EFIAPI as __attribute__((ms_abi)) and on other systems as asmlinkage Best regards Heinrich > struct efi_loaded_image *info = image_handle; > efi_status_t ret; > > ___ U-Boot mailing list U-Boot@lists.denx.de https://lists.denx.de/listinfo/u-boot