
Hi Simon,
On Sun, Nov 20, 2016 at 4:25 AM, Simon Glass sjg@chromium.org wrote:
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
Changes in v2: None
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@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>
I guess not every header file above is being used, can you double check and remove useless includes?
+.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
for consistency, can we just use "call"
/* Should not return here */
jmp .
/* If the debug UART is being used, it is already set up by SPL */
.globl board_debug_uart_init
This function looks useless, is it a must?
+board_debug_uart_init:
ret
--
Regards, Bin