x86: Support global_data on x86_64
authorSimon Glass <sjg@chromium.org>
Mon, 16 Jan 2017 14:03:59 +0000 (07:03 -0700)
committerBin Meng <bmeng.cn@gmail.com>
Mon, 6 Feb 2017 03:38:46 +0000 (11:38 +0800)
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>
Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
arch/x86/cpu/x86_64/cpu.c
arch/x86/include/asm/global_data.h

index b12eab1cb699480a1dd7bbad8dee84c75bd3ff80..36272296e638a9a8fde6c87d33a6c9c3dbf0d9f6 100644 (file)
@@ -6,6 +6,33 @@
  */
 
 #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): For some reason U-Boot does not boot
+        * without this line. It fails to start up U-Boot proper and instead
+        * restarts SPL. Need to figure out why:
+        *
+        * U-Boot SPL 2017.01
+        *
+        * U-Boot SPL 2017.01
+        * CPU:   Intel(R) Core(TM) i5-3427U CPU @ 1.80GHz
+        * Trying to boot from SPIJumping to 64-bit U-Boot: Note many
+        * features are missing
+        *
+        * U-Boot SPL 2017.01
+        */
+       printch(' ');
+}
 
 int cpu_has_64bit(void)
 {
index 7434f779b663d7d6b22782320f9ffa5a136609c8..34e19efd1459ee61205fe200d6f95f698dd49f68 100644 (file)
@@ -104,8 +104,9 @@ 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)
 
+/* TODO(sjg@chromium.org): Consider using a fixed register for gd on x86_64 */
 #define gd global_data_ptr
 
 #define DECLARE_GLOBAL_DATA_PTR   extern struct global_data *global_data_ptr
@@ -114,7 +115,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;
 }