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
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;
/* .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
/* .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 */