Fill info for remaining platforms. Make efi image identical to image of previous grub-mkimage

This commit is contained in:
Vladimir 'phcoder' Serbinenko 2010-04-26 17:19:15 +02:00
parent 962b15b4c1
commit bb3208158a
9 changed files with 101 additions and 45 deletions

View file

@ -82,8 +82,17 @@ struct image_target_desc image_targets[] =
.bigendian = 0,
.id = IMAGE_COREBOOT,
.flags = PLATFORM_FLAGS_NONE,
.prefix = GRUB_KERNEL_I386_COREBOOT_PREFIX,
.data_end = GRUB_KERNEL_I386_COREBOOT_DATA_END,
.raw_size = 0,
.total_module_size = TARGET_NO_FIELD,
.kernel_image_size = TARGET_NO_FIELD,
.compressed_size = TARGET_NO_FIELD,
.section_align = 1,
.vaddr_offset = 0
.vaddr_offset = 0,
.install_dos_part = TARGET_NO_FIELD,
.install_bsd_part = TARGET_NO_FIELD,
.link_addr = GRUB_KERNEL_I386_COREBOOT_LINK_ADDR
},
{
.name = "i386-pc",
@ -109,13 +118,21 @@ struct image_target_desc image_targets[] =
.bigendian = 0,
.id = IMAGE_EFI,
.flags = PLATFORM_FLAGS_NONE,
.prefix = GRUB_KERNEL_I386_EFI_PREFIX,
.data_end = GRUB_KERNEL_I386_EFI_DATA_END,
.raw_size = 0,
.total_module_size = TARGET_NO_FIELD,
.kernel_image_size = TARGET_NO_FIELD,
.compressed_size = TARGET_NO_FIELD,
.section_align = GRUB_PE32_SECTION_ALIGNMENT,
.vaddr_offset = ALIGN_UP (GRUB_PE32_MSDOS_STUB_SIZE
+ GRUB_PE32_SIGNATURE_SIZE
+ sizeof (struct grub_pe32_coff_header)
+ sizeof (struct grub_pe32_optional_header)
+ 4 * sizeof (struct grub_pe32_section_table),
GRUB_PE32_SECTION_ALIGNMENT)
GRUB_PE32_SECTION_ALIGNMENT),
.install_dos_part = TARGET_NO_FIELD,
.install_bsd_part = TARGET_NO_FIELD,
},
{
.name = "i386-ieee1275",
@ -123,8 +140,17 @@ struct image_target_desc image_targets[] =
.bigendian = 0,
.id = IMAGE_I386_IEEE1275,
.flags = PLATFORM_FLAGS_NONE,
.prefix = GRUB_KERNEL_I386_IEEE1275_PREFIX,
.data_end = GRUB_KERNEL_I386_IEEE1275_DATA_END,
.raw_size = 0,
.total_module_size = TARGET_NO_FIELD,
.kernel_image_size = TARGET_NO_FIELD,
.compressed_size = TARGET_NO_FIELD,
.section_align = 1,
.vaddr_offset = 0
.vaddr_offset = 0,
.install_dos_part = TARGET_NO_FIELD,
.install_bsd_part = TARGET_NO_FIELD,
.link_addr = GRUB_KERNEL_I386_IEEE1275_LINK_ADDR
},
{
.name = "i386-qemu",
@ -150,13 +176,21 @@ struct image_target_desc image_targets[] =
.bigendian = 0,
.id = IMAGE_EFI,
.flags = PLATFORM_FLAGS_NONE,
.prefix = GRUB_KERNEL_X86_64_EFI_PREFIX,
.data_end = GRUB_KERNEL_X86_64_EFI_DATA_END,
.raw_size = 0,
.total_module_size = TARGET_NO_FIELD,
.kernel_image_size = TARGET_NO_FIELD,
.compressed_size = TARGET_NO_FIELD,
.section_align = GRUB_PE32_SECTION_ALIGNMENT,
.vaddr_offset = ALIGN_UP (GRUB_PE32_MSDOS_STUB_SIZE
+ GRUB_PE32_SIGNATURE_SIZE
+ sizeof (struct grub_pe32_coff_header)
+ sizeof (struct grub_pe64_optional_header)
+ 4 * sizeof (struct grub_pe32_section_table),
GRUB_PE32_SECTION_ALIGNMENT)
GRUB_PE32_SECTION_ALIGNMENT),
.install_dos_part = TARGET_NO_FIELD,
.install_bsd_part = TARGET_NO_FIELD,
},
{
.name = "mipsel-yeeloong-elf",
@ -184,8 +218,17 @@ struct image_target_desc image_targets[] =
.bigendian = 1,
.id = IMAGE_PPC,
.flags = PLATFORM_FLAGS_NONE,
.prefix = GRUB_KERNEL_POWERPC_IEEE1275_PREFIX,
.data_end = GRUB_KERNEL_POWERPC_IEEE1275_DATA_END,
.raw_size = 0,
.total_module_size = TARGET_NO_FIELD,
.kernel_image_size = TARGET_NO_FIELD,
.compressed_size = TARGET_NO_FIELD,
.section_align = 1,
.vaddr_offset = 0
.vaddr_offset = 0,
.install_dos_part = TARGET_NO_FIELD,
.install_bsd_part = TARGET_NO_FIELD,
.link_addr = GRUB_KERNEL_POWERPC_IEEE1275_LINK_ADDR
},
{
.name = "sparc64-ieee1275-raw",
@ -629,6 +672,7 @@ generate_image (const char *dir, char *prefix, FILE *out, char *mods[],
{
void *pe_img;
grub_uint8_t *header;
void *sections;
size_t pe_size;
struct grub_pe32_coff_header *c;
struct grub_pe32_section_table *text_section, *data_section;
@ -669,7 +713,8 @@ generate_image (const char *dir, char *prefix, FILE *out, char *mods[],
GRUB_PE32_SIGNATURE_SIZE);
/* The COFF file header. */
c = header + GRUB_PE32_MSDOS_STUB_SIZE + GRUB_PE32_SIGNATURE_SIZE;
c = (struct grub_pe32_coff_header *) (header + GRUB_PE32_MSDOS_STUB_SIZE
+ GRUB_PE32_SIGNATURE_SIZE);
if (image_target->voidp_sizeof == 4)
c->machine = grub_host_to_target16 (GRUB_PE32_MACHINE_I386);
else
@ -692,11 +737,13 @@ generate_image (const char *dir, char *prefix, FILE *out, char *mods[],
c->optional_header_size = grub_host_to_target16 (sizeof (struct grub_pe32_optional_header));
o = header + GRUB_PE32_MSDOS_STUB_SIZE + GRUB_PE32_SIGNATURE_SIZE
+ sizeof (struct grub_pe32_coff_header);
o = (struct grub_pe32_optional_header *)
(header + GRUB_PE32_MSDOS_STUB_SIZE + GRUB_PE32_SIGNATURE_SIZE
+ sizeof (struct grub_pe32_coff_header));
o->magic = grub_host_to_target16 (GRUB_PE32_PE32_MAGIC);
o->code_size = grub_host_to_target32 (exec_size);
o->data_size = grub_cpu_to_le32 (reloc_addr - exec_size);
o->data_size = grub_cpu_to_le32 (reloc_addr - exec_size
- header_size);
o->bss_size = grub_cpu_to_le32 (bss_size);
o->entry_addr = grub_cpu_to_le32 (start_address);
o->code_base = grub_cpu_to_le32 (header_size);
@ -720,18 +767,21 @@ generate_image (const char *dir, char *prefix, FILE *out, char *mods[],
o->base_relocation_table.rva = grub_host_to_target32 (reloc_addr);
o->base_relocation_table.size = grub_host_to_target32 (reloc_size);
sections = o + 1;
}
else
{
struct grub_pe64_optional_header *o;
c->optional_header_size = grub_host_to_target16 (sizeof (struct grub_pe32_optional_header));
c->optional_header_size = grub_host_to_target16 (sizeof (struct grub_pe64_optional_header));
o = header + GRUB_PE32_MSDOS_STUB_SIZE + GRUB_PE32_SIGNATURE_SIZE
+ sizeof (struct grub_pe32_coff_header);
o = (struct grub_pe64_optional_header *)
(header + GRUB_PE32_MSDOS_STUB_SIZE + GRUB_PE32_SIGNATURE_SIZE
+ sizeof (struct grub_pe32_coff_header));
o->magic = grub_host_to_target16 (GRUB_PE32_PE64_MAGIC);
o->code_size = grub_host_to_target32 (exec_size);
o->data_size = grub_cpu_to_le32 (reloc_addr - exec_size);
o->data_size = grub_cpu_to_le32 (reloc_addr - exec_size
- header_size);
o->bss_size = grub_cpu_to_le32 (bss_size);
o->entry_addr = grub_cpu_to_le32 (start_address);
o->code_base = grub_cpu_to_le32 (header_size);
@ -753,9 +803,10 @@ generate_image (const char *dir, char *prefix, FILE *out, char *mods[],
o->base_relocation_table.rva = grub_host_to_target32 (reloc_addr);
o->base_relocation_table.size = grub_host_to_target32 (reloc_size);
sections = o + 1;
}
/* The sections. */
text_section = (struct grub_pe32_section_table *) (header + 1);
text_section = sections;
strcpy (text_section->name, ".text");
text_section->virtual_size = grub_cpu_to_le32 (exec_size);
text_section->virtual_address = grub_cpu_to_le32 (header_size);
@ -763,8 +814,7 @@ generate_image (const char *dir, char *prefix, FILE *out, char *mods[],
text_section->raw_data_offset = grub_cpu_to_le32 (header_size);
text_section->characteristics = grub_cpu_to_le32 (GRUB_PE32_SCN_CNT_CODE
| GRUB_PE32_SCN_MEM_EXECUTE
| GRUB_PE32_SCN_MEM_READ
| GRUB_PE32_SCN_ALIGN_64BYTES);
| GRUB_PE32_SCN_MEM_READ);
data_section = text_section + 1;
strcpy (data_section->name, ".data");
@ -775,8 +825,7 @@ generate_image (const char *dir, char *prefix, FILE *out, char *mods[],
data_section->characteristics
= grub_cpu_to_le32 (GRUB_PE32_SCN_CNT_INITIALIZED_DATA
| GRUB_PE32_SCN_MEM_READ
| GRUB_PE32_SCN_MEM_WRITE
| GRUB_PE32_SCN_ALIGN_64BYTES);
| GRUB_PE32_SCN_MEM_WRITE);
#if 0
bss_section = data_section + 1;
@ -802,8 +851,7 @@ generate_image (const char *dir, char *prefix, FILE *out, char *mods[],
mods_section->characteristics
= grub_cpu_to_le32 (GRUB_PE32_SCN_CNT_INITIALIZED_DATA
| GRUB_PE32_SCN_MEM_READ
| GRUB_PE32_SCN_MEM_WRITE
| GRUB_PE32_SCN_ALIGN_64BYTES);
| GRUB_PE32_SCN_MEM_WRITE);
reloc_section = mods_section + 1;
strcpy (reloc_section->name, ".reloc");