xref: /openbmc/u-boot/arch/x86/lib/crt0_x86_64_efi.S (revision 6250098655809b4e149d74bff50af86c6209ce8f)
183d290c5STom Rini/* SPDX-License-Identifier: BSD-3-Clause */
22dcd4e9eSSimon Glass/*
32dcd4e9eSSimon Glass * crt0-efi-x86_64.S - x86_64 EFI startup code.
42dcd4e9eSSimon Glass * Copyright (C) 1999 Hewlett-Packard Co.
52dcd4e9eSSimon Glass * Contributed by David Mosberger <davidm@hpl.hp.com>.
6*9f0b0113SIvan Gorinov * Copyright (C) 2005 Intel Corporation
72dcd4e9eSSimon Glass * Contributed by Fenghua Yu <fenghua.yu@intel.com>.
82dcd4e9eSSimon Glass *
92dcd4e9eSSimon Glass * All rights reserved.
102dcd4e9eSSimon Glass */
112dcd4e9eSSimon Glass	.text
122dcd4e9eSSimon Glass	.align 4
132dcd4e9eSSimon Glass
142dcd4e9eSSimon Glass	.globl _start
152dcd4e9eSSimon Glass_start:
162dcd4e9eSSimon Glass	subq $8, %rsp
17*9f0b0113SIvan Gorinov
182dcd4e9eSSimon Glass	pushq %rcx
192dcd4e9eSSimon Glass	pushq %rdx
202dcd4e9eSSimon Glass
21*9f0b0113SIvan Gorinov	lea image_base(%rip), %rcx
22*9f0b0113SIvan Gorinov	lea _DYNAMIC(%rip), %rdx
23*9f0b0113SIvan Gorinov
242dcd4e9eSSimon Glass	call _relocate
252dcd4e9eSSimon Glass
26*9f0b0113SIvan Gorinov	popq %rdx
27*9f0b0113SIvan Gorinov	popq %rcx
28*9f0b0113SIvan Gorinov
29*9f0b0113SIvan Gorinov	testq %rax, %rax
30*9f0b0113SIvan Gorinov	jnz .exit
312dcd4e9eSSimon Glass
322dcd4e9eSSimon Glass	call efi_main
33*9f0b0113SIvan Gorinov.exit:
342dcd4e9eSSimon Glass	addq $8, %rsp
352dcd4e9eSSimon Glass
362dcd4e9eSSimon Glass	ret
372dcd4e9eSSimon Glass
382dcd4e9eSSimon Glass	/*
392dcd4e9eSSimon Glass	 * hand-craft a dummy .reloc section so EFI knows it's a relocatable
402dcd4e9eSSimon Glass	 * executable:
412dcd4e9eSSimon Glass	 */
422dcd4e9eSSimon Glass	.data
432dcd4e9eSSimon Glassdummy:	.long	0
442dcd4e9eSSimon Glass
452dcd4e9eSSimon Glass#define IMAGE_REL_ABSOLUTE	0
462dcd4e9eSSimon Glass	.section .reloc, "a"
472dcd4e9eSSimon Glasslabel1:
482dcd4e9eSSimon Glass	.long	dummy-label1				/* Page RVA */
492dcd4e9eSSimon Glass	.long	10					/* Block Size (2*4+2) */
502dcd4e9eSSimon Glass	.word	(IMAGE_REL_ABSOLUTE << 12) +  0		/* reloc for dummy */
51