Message ID | 1479587152-25065-25-git-send-email-sjg@chromium.org |
---|---|
State | Superseded |
Delegated to: | Bin Meng |
Headers | show |
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
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> + +.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
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