diff mbox

[U-Boot,v2,18/47] x86: Allow use of global_data with EFI

Message ID 1438356724-6561-19-git-send-email-sjg@chromium.org
State Accepted
Delegated to: Simon Glass
Headers show

Commit Message

Simon Glass July 31, 2015, 3:31 p.m. UTC
On x86 the global_data pointer is provided through a somewhat-bizarre and
x86-specific mechanism: the F segment register is set to a pointer to the
start of global_data, so that accesses can use this build-in register.

When running as an EFI payload we don't want to mess with the Global
Descriptor Table (GDT) and there is little advantage (in terms of code size)
to doing so.

Allow global_data to be a simple variable in this case.

Signed-off-by: Simon Glass <sjg@chromium.org>
---

Changes in v2:
- Move this patch to before the EFI start-up code patch
- Refer to FS as F segment register instead of frame segment register
- Rename CONFIG_ARCH_EFI to CONFIG_EFI_APP

 arch/x86/include/asm/global_data.h | 7 +++++++
 1 file changed, 7 insertions(+)

Comments

Bin Meng Aug. 2, 2015, 2:32 p.m. UTC | #1
Hi Simon,

On Fri, Jul 31, 2015 at 11:31 PM, Simon Glass <sjg@chromium.org> wrote:
> On x86 the global_data pointer is provided through a somewhat-bizarre and
> x86-specific mechanism: the F segment register is set to a pointer to the
> start of global_data, so that accesses can use this build-in register.
>
> When running as an EFI payload we don't want to mess with the Global

Nits: running as an EFI application

> Descriptor Table (GDT) and there is little advantage (in terms of code size)
> to doing so.
>
> Allow global_data to be a simple variable in this case.
>
> Signed-off-by: Simon Glass <sjg@chromium.org>
> ---

Reviewed-by: Bin Meng <bmeng.cn@gmail.com>

>
> Changes in v2:
> - Move this patch to before the EFI start-up code patch
> - Refer to FS as F segment register instead of frame segment register
> - Rename CONFIG_ARCH_EFI to CONFIG_EFI_APP
>
>  arch/x86/include/asm/global_data.h | 7 +++++++
>  1 file changed, 7 insertions(+)
>
> diff --git a/arch/x86/include/asm/global_data.h b/arch/x86/include/asm/global_data.h
> index 3db9a4c..80ebe3e 100644
> --- a/arch/x86/include/asm/global_data.h
> +++ b/arch/x86/include/asm/global_data.h
> @@ -76,6 +76,12 @@ struct arch_global_data {
>  #include <asm-generic/global_data.h>
>
>  #ifndef __ASSEMBLY__
> +# ifdef CONFIG_EFI_APP
> +
> +#define gd global_data_ptr
> +
> +#define DECLARE_GLOBAL_DATA_PTR   extern struct global_data *global_data_ptr
> +# else
>  static inline __attribute__((no_instrument_function)) gd_t *get_fs_gd_ptr(void)
>  {
>         gd_t *gd_ptr;
> @@ -88,6 +94,7 @@ static inline __attribute__((no_instrument_function)) gd_t *get_fs_gd_ptr(void)
>  #define gd     get_fs_gd_ptr()
>
>  #define DECLARE_GLOBAL_DATA_PTR
> +# endif
>
>  #endif
>
> --

Regards,
Bin
Simon Glass Aug. 2, 2015, 11:37 p.m. UTC | #2
On 2 August 2015 at 08:32, Bin Meng <bmeng.cn@gmail.com> wrote:
> Hi Simon,
>
> On Fri, Jul 31, 2015 at 11:31 PM, Simon Glass <sjg@chromium.org> wrote:
>> On x86 the global_data pointer is provided through a somewhat-bizarre and
>> x86-specific mechanism: the F segment register is set to a pointer to the
>> start of global_data, so that accesses can use this build-in register.
>>
>> When running as an EFI payload we don't want to mess with the Global
>
> Nits: running as an EFI application
>
>> Descriptor Table (GDT) and there is little advantage (in terms of code size)
>> to doing so.
>>
>> Allow global_data to be a simple variable in this case.
>>
>> Signed-off-by: Simon Glass <sjg@chromium.org>
>> ---
>
> Reviewed-by: Bin Meng <bmeng.cn@gmail.com>

Applied to u-boot-x86.

>
>>
>> Changes in v2:
>> - Move this patch to before the EFI start-up code patch
>> - Refer to FS as F segment register instead of frame segment register
>> - Rename CONFIG_ARCH_EFI to CONFIG_EFI_APP
>>
>>  arch/x86/include/asm/global_data.h | 7 +++++++
>>  1 file changed, 7 insertions(+)
diff mbox

Patch

diff --git a/arch/x86/include/asm/global_data.h b/arch/x86/include/asm/global_data.h
index 3db9a4c..80ebe3e 100644
--- a/arch/x86/include/asm/global_data.h
+++ b/arch/x86/include/asm/global_data.h
@@ -76,6 +76,12 @@  struct arch_global_data {
 #include <asm-generic/global_data.h>
 
 #ifndef __ASSEMBLY__
+# ifdef CONFIG_EFI_APP
+
+#define gd global_data_ptr
+
+#define DECLARE_GLOBAL_DATA_PTR   extern struct global_data *global_data_ptr
+# else
 static inline __attribute__((no_instrument_function)) gd_t *get_fs_gd_ptr(void)
 {
 	gd_t *gd_ptr;
@@ -88,6 +94,7 @@  static inline __attribute__((no_instrument_function)) gd_t *get_fs_gd_ptr(void)
 #define gd	get_fs_gd_ptr()
 
 #define DECLARE_GLOBAL_DATA_PTR
+# endif
 
 #endif