summaryrefslogtreecommitdiff
path: root/arch/x86/lib/efi/crt0-efi-ia32.S
diff options
context:
space:
mode:
authorBen Stoltz <stoltz@google.com>2015-08-04 12:33:46 -0600
committerSimon Glass <sjg@chromium.org>2015-08-05 08:44:06 -0600
commit3dcdd17b43c5cfd3a216169948dfd08d6741c631 (patch)
tree662ddb941487ea3be651530fc6ad9f74e8f6632d /arch/x86/lib/efi/crt0-efi-ia32.S
parented3b4d37368694e682c2c24f2fd72414d3f645ae (diff)
downloadu-boot-imx-3dcdd17b43c5cfd3a216169948dfd08d6741c631.zip
u-boot-imx-3dcdd17b43c5cfd3a216169948dfd08d6741c631.tar.gz
u-boot-imx-3dcdd17b43c5cfd3a216169948dfd08d6741c631.tar.bz2
x86: Add support for U-Boot as an EFI application
Add the required x86 glue code. This includes the initial start-up, relocation and jumping to efi_main(). We also need to avoid fiddling with interrupts. Signed-off-by: Ben Stoltz <stoltz@google.com> Signed-off-by: Simon Glass <sjg@chromium.org> Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
Diffstat (limited to 'arch/x86/lib/efi/crt0-efi-ia32.S')
-rw-r--r--arch/x86/lib/efi/crt0-efi-ia32.S52
1 files changed, 52 insertions, 0 deletions
diff --git a/arch/x86/lib/efi/crt0-efi-ia32.S b/arch/x86/lib/efi/crt0-efi-ia32.S
new file mode 100644
index 0000000..30e5eb0
--- /dev/null
+++ b/arch/x86/lib/efi/crt0-efi-ia32.S
@@ -0,0 +1,52 @@
+/*
+ * crt0-efi-ia32.S - x86 EFI startup code.
+ *
+ * Copyright (C) 1999 Hewlett-Packard Co.
+ * Contributed by David Mosberger <davidm@hpl.hp.com>.
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+ .text
+ .align 4
+
+ .globl _start
+_start:
+ pushl %ebp
+ movl %esp,%ebp
+
+ pushl 12(%ebp) # copy "image" argument
+ pushl 8(%ebp) # copy "systab" argument
+
+ call 0f
+0: popl %eax
+ movl %eax,%ebx
+
+ addl $image_base-0b,%eax # %eax = ldbase
+ addl $_DYNAMIC-0b,%ebx # %ebx = _DYNAMIC
+
+ pushl %ebx # pass _DYNAMIC as second argument
+ pushl %eax # pass ldbase as first argument
+ call _relocate
+ popl %ebx
+ popl %ebx
+ testl %eax,%eax
+ jne .exit
+ call efi_main # call app with "image" and "systab" argument
+
+.exit: leave
+ 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
+ .long dummy /* Page RVA */
+ .long 10 /* Block Size (2*4+2) */
+ .word (IMAGE_REL_ABSOLUTE << 12) + 0 /* reloc for dummy */