[U-Boot] [PATCH 43/82] x86: Add 64-bit start-up code
Simon Glass
sjg at chromium.org
Mon Sep 26 05:33:46 CEST 2016
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 at chromium.org>
---
arch/x86/Makefile | 5 +++++
arch/x86/cpu/Makefile | 4 ++++
arch/x86/cpu/start64.S | 39 +++++++++++++++++++++++++++++++++++++++
3 files changed, 48 insertions(+)
create mode 100644 arch/x86/cpu/start64.S
diff --git a/arch/x86/Makefile b/arch/x86/Makefile
index dd0e22f..4be1c35 100644
--- a/arch/x86/Makefile
+++ b/arch/x86/Makefile
@@ -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
diff --git a/arch/x86/cpu/Makefile b/arch/x86/cpu/Makefile
index fd81310..97b26b0 100644
--- a/arch/x86/cpu/Makefile
+++ b/arch/x86/cpu/Makefile
@@ -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
index 0000000..9eadc35
--- /dev/null
+++ b/arch/x86/cpu/start64.S
@@ -0,0 +1,39 @@
+/*
+ * 64-bit x86 Startup Code
+ *
+ * (C) Copyright 216 Google, Inc
+ * Written by Simon Glass <sjg at chromium.org>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include <config.h>
+#include <asm/global_data.h>
+#include <asm/post.h>
+#include <asm/processor.h>
+#include <asm/processor-flags.h>
+#include <generated/generic-asm-offsets.h>
+#include <generated/asm-offsets.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
+
+ callq board_init_f
+ callq board_init_f_r
+
+ /* Should not return here */
+ jmp .
+
+ /* If the debug UART is being used, it is already set up by SPL */
+ .globl board_debug_uart_init
+board_debug_uart_init:
+ ret
--
2.8.0.rc3.226.g39d4020
More information about the U-Boot
mailing list