diff mbox

[U-Boot,v2,34/63] x86: Support global_data on x86_64

Message ID 1479587152-25065-35-git-send-email-sjg@chromium.org
State Superseded
Delegated to: Bin Meng
Headers show

Commit Message

Simon Glass Nov. 19, 2016, 8:25 p.m. UTC
At present this is just an ordinary variable. We may consider making it a
fixed register in the future.

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

Changes in v2: None

 arch/x86/cpu/x86_64/cpu.c          | 13 +++++++++++++
 arch/x86/include/asm/global_data.h |  6 +++++-
 2 files changed, 18 insertions(+), 1 deletion(-)

Comments

Bin Meng Jan. 14, 2017, 1:31 p.m. UTC | #1
Hi Simon,

On Sun, Nov 20, 2016 at 4:25 AM, Simon Glass <sjg@chromium.org> wrote:
> At present this is just an ordinary variable. We may consider making it a
> fixed register in the future.
>
> Signed-off-by: Simon Glass <sjg@chromium.org>
> ---
>
> Changes in v2: None
>
>  arch/x86/cpu/x86_64/cpu.c          | 13 +++++++++++++
>  arch/x86/include/asm/global_data.h |  6 +++++-
>  2 files changed, 18 insertions(+), 1 deletion(-)
>
> diff --git a/arch/x86/cpu/x86_64/cpu.c b/arch/x86/cpu/x86_64/cpu.c
> index c1d3788..da2ad11 100644
> --- a/arch/x86/cpu/x86_64/cpu.c
> +++ b/arch/x86/cpu/x86_64/cpu.c
> @@ -8,6 +8,19 @@
>  #include <common.h>
>  #include <debug_uart.h>
>
> +DECLARE_GLOBAL_DATA_PTR;
> +
> +/* Global declaration of gd */
> +struct global_data *global_data_ptr;
> +
> +void arch_setup_gd(gd_t *new_gd)
> +{
> +       global_data_ptr = new_gd;
> +
> +       /* TODO(sjg@chromium.org): Why is this needed? */

What happens if this is not needed? Can you explain a little bit about the TODO?

> +       printch(' ');
> +}
> +
>  int cpu_has_64bit(void)
>  {
>         return true;
> diff --git a/arch/x86/include/asm/global_data.h b/arch/x86/include/asm/global_data.h
> index 7434f77..ce9e5cc 100644
> --- a/arch/x86/include/asm/global_data.h
> +++ b/arch/x86/include/asm/global_data.h
> @@ -104,7 +104,7 @@ struct arch_global_data {
>  #include <asm-generic/global_data.h>
>
>  #ifndef __ASSEMBLY__
> -# ifdef CONFIG_EFI_APP
> +# if defined(CONFIG_EFI_APP) || CONFIG_IS_ENABLED(X86_64)
>
>  #define gd global_data_ptr
>
> @@ -114,7 +114,11 @@ static inline __attribute__((no_instrument_function)) gd_t *get_fs_gd_ptr(void)
>  {
>         gd_t *gd_ptr;
>
> +#if CONFIG_IS_ENABLED(X86_64)
> +       asm volatile("fs mov 0, %0\n" : "=r" (gd_ptr));
> +#else
>         asm volatile("fs movl 0, %0\n" : "=r" (gd_ptr));
> +#endif

Can both of them be consolidated as one: asm volatile("fs mov 0, %0\n"
: "=r" (gd_ptr));

>
>         return gd_ptr;
>  }
> --

Regards,
Bin
diff mbox

Patch

diff --git a/arch/x86/cpu/x86_64/cpu.c b/arch/x86/cpu/x86_64/cpu.c
index c1d3788..da2ad11 100644
--- a/arch/x86/cpu/x86_64/cpu.c
+++ b/arch/x86/cpu/x86_64/cpu.c
@@ -8,6 +8,19 @@ 
 #include <common.h>
 #include <debug_uart.h>
 
+DECLARE_GLOBAL_DATA_PTR;
+
+/* Global declaration of gd */
+struct global_data *global_data_ptr;
+
+void arch_setup_gd(gd_t *new_gd)
+{
+	global_data_ptr = new_gd;
+
+	/* TODO(sjg@chromium.org): Why is this needed? */
+	printch(' ');
+}
+
 int cpu_has_64bit(void)
 {
 	return true;
diff --git a/arch/x86/include/asm/global_data.h b/arch/x86/include/asm/global_data.h
index 7434f77..ce9e5cc 100644
--- a/arch/x86/include/asm/global_data.h
+++ b/arch/x86/include/asm/global_data.h
@@ -104,7 +104,7 @@  struct arch_global_data {
 #include <asm-generic/global_data.h>
 
 #ifndef __ASSEMBLY__
-# ifdef CONFIG_EFI_APP
+# if defined(CONFIG_EFI_APP) || CONFIG_IS_ENABLED(X86_64)
 
 #define gd global_data_ptr
 
@@ -114,7 +114,11 @@  static inline __attribute__((no_instrument_function)) gd_t *get_fs_gd_ptr(void)
 {
 	gd_t *gd_ptr;
 
+#if CONFIG_IS_ENABLED(X86_64)
+	asm volatile("fs mov 0, %0\n" : "=r" (gd_ptr));
+#else
 	asm volatile("fs movl 0, %0\n" : "=r" (gd_ptr));
+#endif
 
 	return gd_ptr;
 }