x86: Add 64-bit start-up code
authorSimon Glass <sjg@chromium.org>
Mon, 16 Jan 2017 14:03:48 +0000 (07:03 -0700)
committerBin Meng <bmeng.cn@gmail.com>
Mon, 6 Feb 2017 03:38:46 +0000 (11:38 +0800)
Add code to start up U-Boot in 64-bit mode. It is fairly simple since we are
running from RAM and SPL has done the low-level init.

Signed-off-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
arch/x86/Makefile
arch/x86/cpu/Makefile
arch/x86/cpu/start64.S [new file with mode: 0644]

index dd0e22f970d0b6158721cf044a33f98bfb6bcb3b..4be1c353cc9e2bcb1a396938a28f355136a1caaf 100644 (file)
@@ -3,8 +3,13 @@
 #
 
 ifeq ($(CONFIG_EFI_APP),)
+ifdef CONFIG_$(SPL_)X86_64
+head-y := arch/x86/cpu/start64.o
+else
 head-y := arch/x86/cpu/start.o
 endif
+endif
+
 head-$(CONFIG_$(SPL_)X86_16BIT_INIT) += arch/x86/cpu/start16.o
 head-$(CONFIG_$(SPL_)X86_16BIT_INIT) += arch/x86/cpu/resetvec.o
 
index fd81310df6934cd8cad6e9aa71c2e86a76de59fc..97b26b0fe760a4ed28898e38ccdb2517c87d0016 100644 (file)
@@ -8,7 +8,11 @@
 # SPDX-License-Identifier:     GPL-2.0+
 #
 
+ifeq ($(CONFIG_$(SPL_)X86_64),y)
+extra-y        = start64.o
+else
 extra-y        = start.o
+endif
 extra-$(CONFIG_$(SPL_)X86_16BIT_INIT) += resetvec.o start16.o
 obj-y  += interrupts.o cpu.o cpu_x86.o call64.o setjmp.o
 
diff --git a/arch/x86/cpu/start64.S b/arch/x86/cpu/start64.S
new file mode 100644 (file)
index 0000000..651f16a
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * 64-bit x86 Startup Code
+ *
+ * (C) Copyright 216 Google, Inc
+ * Written by Simon Glass <sjg@chromium.org>
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#include <config.h>
+
+.section .text
+.code64
+.globl _start
+.type _start, @function
+_start:
+       /* Set up memory using the existing stack */
+       mov     %rsp, %rdi
+       call    board_init_f_alloc_reserve
+       mov     %rax, %rsp
+
+       call    board_init_f_init_reserve
+
+       call    board_init_f
+       call    board_init_f_r
+
+       /* Should not return here */
+       jmp     .