efi: Add 64-bit payload support
Most EFI implementations use 64-bit. Add a way to build U-Boot as a 64-bit EFI payload. The payload unpacks a (32-bit) U-Boot and starts it. This can be enabled for x86 boards at present. Signed-off-by: Simon Glass <sjg@chromium.org> Improvements to how the payload is built: Signed-off-by: Bin Meng <bmeng.cn@gmail.com> Reviewed-by: Bin Meng <bmeng.cn@gmail.com> Tested-by: Bin Meng <bmeng.cn@gmail.com>
This commit is contained in:
@@ -34,14 +34,24 @@ OBJCOPYFLAGS_EFI := -j .text -j .sdata -j .data -j .dynamic -j .dynsym \
|
||||
CFLAGS_NON_EFI := -mregparm=3
|
||||
CFLAGS_EFI := -fpic -fshort-wchar
|
||||
|
||||
ifeq ($(CONFIG_EFI_STUB_64BIT),)
|
||||
CFLAGS_EFI += $(call cc-option, -mno-red-zone)
|
||||
EFIARCH = ia32
|
||||
EFIPAYLOAD_BFDTARGET = elf32-i386
|
||||
else
|
||||
EFIARCH = x86_64
|
||||
EFIPAYLOAD_BFDTARGET = elf64-x86-64
|
||||
endif
|
||||
|
||||
EFIPAYLOAD_BFDARCH = i386
|
||||
|
||||
LDSCRIPT_EFI := $(srctree)/$(CPUDIR)/efi/elf_$(EFIARCH)_efi.lds
|
||||
EFISTUB := crt0-efi-$(EFIARCH).o reloc_$(EFIARCH).o
|
||||
OBJCOPYFLAGS_EFI += --target=efi-app-$(EFIARCH)
|
||||
|
||||
CPPFLAGS_REMOVE_crt0-efi-$(EFIARCH).o += $(CFLAGS_NON_EFI)
|
||||
CPPFLAGS_crt0-efi-$(EFIARCH).o += $(CFLAGS_EFI)
|
||||
|
||||
ifeq ($(CONFIG_EFI_APP),y)
|
||||
|
||||
PLATFORM_CPPFLAGS += $(CFLAGS_EFI)
|
||||
|
||||
@@ -44,8 +44,11 @@ typedef __INT64_TYPE__ s64;
|
||||
typedef __UINT64_TYPE__ u64;
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_EFI_STUB_64BIT
|
||||
#define BITS_PER_LONG 64
|
||||
#else
|
||||
#define BITS_PER_LONG 32
|
||||
|
||||
#endif
|
||||
/* Dma addresses are 32-bits wide. */
|
||||
|
||||
typedef u32 dma_addr_t;
|
||||
|
||||
51
arch/x86/lib/efi/crt0-efi-x86_64.S
Normal file
51
arch/x86/lib/efi/crt0-efi-x86_64.S
Normal file
@@ -0,0 +1,51 @@
|
||||
/*
|
||||
* crt0-efi-x86_64.S - x86_64 EFI startup code.
|
||||
* Copyright (C) 1999 Hewlett-Packard Co.
|
||||
* Contributed by David Mosberger <davidm@hpl.hp.com>.
|
||||
* Copyright (C) 2005 Intel Co.
|
||||
* Contributed by Fenghua Yu <fenghua.yu@intel.com>.
|
||||
*
|
||||
* All rights reserved.
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
*/
|
||||
.text
|
||||
.align 4
|
||||
|
||||
.globl _start
|
||||
_start:
|
||||
subq $8, %rsp
|
||||
pushq %rcx
|
||||
pushq %rdx
|
||||
|
||||
0:
|
||||
lea image_base(%rip), %rdi
|
||||
lea _DYNAMIC(%rip), %rsi
|
||||
|
||||
popq %rcx
|
||||
popq %rdx
|
||||
pushq %rcx
|
||||
pushq %rdx
|
||||
call _relocate
|
||||
|
||||
popq %rdi
|
||||
popq %rsi
|
||||
|
||||
call efi_main
|
||||
addq $8, %rsp
|
||||
|
||||
.exit:
|
||||
ret
|
||||
|
||||
/*
|
||||
* hand-craft a dummy .reloc section so EFI knows it's a relocatable
|
||||
* executable:
|
||||
*/
|
||||
.data
|
||||
dummy: .long 0
|
||||
|
||||
#define IMAGE_REL_ABSOLUTE 0
|
||||
.section .reloc, "a"
|
||||
label1:
|
||||
.long dummy-label1 /* Page RVA */
|
||||
.long 10 /* Block Size (2*4+2) */
|
||||
.word (IMAGE_REL_ABSOLUTE << 12) + 0 /* reloc for dummy */
|
||||
Reference in New Issue
Block a user