
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