summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--arch/x86/boot/compressed/eboot.c14
-rw-r--r--arch/x86/boot/header.S2
-rw-r--r--arch/x86/boot/tools/build.c25
3 files changed, 34 insertions, 7 deletions
diff --git a/arch/x86/boot/compressed/eboot.c b/arch/x86/boot/compressed/eboot.c
index fec216f4fbc3..01cbb8707a31 100644
--- a/arch/x86/boot/compressed/eboot.c
+++ b/arch/x86/boot/compressed/eboot.c
@@ -904,11 +904,19 @@ struct boot_params *efi_main(void *handle, efi_system_table_t *_table)
memset(boot_params, 0x0, 0x4000);
- /* Copy first two sectors to boot_params */
- memcpy(boot_params, image->image_base, 1024);
-
hdr = &boot_params->hdr;
+ /* Copy the second sector to boot_params */
+ memcpy(&hdr->jump, image->image_base + 512, 512);
+
+ /*
+ * Fill out some of the header fields ourselves because the
+ * EFI firmware loader doesn't load the first sector.
+ */
+ hdr->root_flags = 1;
+ hdr->vid_mode = 0xffff;
+ hdr->boot_flag = 0xAA55;
+
/*
* The EFI firmware loader could have placed the kernel image
* anywhere in memory, but the kernel has various restrictions
diff --git a/arch/x86/boot/header.S b/arch/x86/boot/header.S
index 4e9124b148c2..4ceb56e9a4ce 100644
--- a/arch/x86/boot/header.S
+++ b/arch/x86/boot/header.S
@@ -147,7 +147,7 @@ optional_header:
# Filled in by build.c
.long 0x0000 # AddressOfEntryPoint
- .long 0x0000 # BaseOfCode
+ .long 0x0200 # BaseOfCode
#ifdef CONFIG_X86_32
.long 0 # data
#endif
diff --git a/arch/x86/boot/tools/build.c b/arch/x86/boot/tools/build.c
index 4e9bd6bcafa6..2aeab3dc9e5f 100644
--- a/arch/x86/boot/tools/build.c
+++ b/arch/x86/boot/tools/build.c
@@ -202,12 +202,19 @@ int main(int argc, char ** argv)
pe_header = *(unsigned int *)&buf[0x3c];
- /* Size of code */
- *(unsigned int *)&buf[pe_header + 0x1c] = file_sz;
-
/* Size of image */
*(unsigned int *)&buf[pe_header + 0x50] = file_sz;
+ /*
+ * Subtract the size of the first section (512 bytes) which
+ * includes the header and .reloc section. The remaining size
+ * is that of the .text section.
+ */
+ file_sz -= 512;
+
+ /* Size of code */
+ *(unsigned int *)&buf[pe_header + 0x1c] = file_sz;
+
#ifdef CONFIG_X86_32
/* Address of entry point */
*(unsigned int *)&buf[pe_header + 0x28] = i;
@@ -215,8 +222,14 @@ int main(int argc, char ** argv)
/* .text size */
*(unsigned int *)&buf[pe_header + 0xb0] = file_sz;
+ /* .text vma */
+ *(unsigned int *)&buf[pe_header + 0xb4] = 0x200;
+
/* .text size of initialised data */
*(unsigned int *)&buf[pe_header + 0xb8] = file_sz;
+
+ /* .text file offset */
+ *(unsigned int *)&buf[pe_header + 0xbc] = 0x200;
#else
/*
* Address of entry point. startup_32 is at the beginning and
@@ -228,8 +241,14 @@ int main(int argc, char ** argv)
/* .text size */
*(unsigned int *)&buf[pe_header + 0xc0] = file_sz;
+ /* .text vma */
+ *(unsigned int *)&buf[pe_header + 0xc4] = 0x200;
+
/* .text size of initialised data */
*(unsigned int *)&buf[pe_header + 0xc8] = file_sz;
+
+ /* .text file offset */
+ *(unsigned int *)&buf[pe_header + 0xcc] = 0x200;
#endif /* CONFIG_X86_32 */
#endif /* CONFIG_EFI_STUB */