IMAGE_SPARC64_AOUT, IMAGE_SPARC64_RAW, IMAGE_I386_IEEE1275,
IMAGE_YEELOONG_ELF, IMAGE_QEMU, IMAGE_PPC
} id;
- enum {FORMAT_RAW, FORMAT_AOUT, FORMAT_ELF, FORMAT_PE} format;
enum
{
PLATFORM_FLAGS_NONE = 0,
struct image_target_desc image_targets[] =
{
- {"i386-coreboot", 4, 0, IMAGE_COREBOOT, FORMAT_ELF, PLATFORM_FLAGS_NONE,
- .section_align = 1,
- .vaddr_offset = 0
+ {
+ .name = "i386-coreboot",
+ .voidp_sizeof = 4,
+ .bigendian = 0,
+ .id = IMAGE_COREBOOT,
+ .flags = PLATFORM_FLAGS_NONE,
+ .section_align = 1,
+ .vaddr_offset = 0
+ },
+ {
+ .name = "i386-pc",
+ .voidp_sizeof = 4,
+ .bigendian = 0,
+ .id = IMAGE_I386_PC,
+ .flags = PLATFORM_FLAGS_LZMA,
+ .prefix = GRUB_KERNEL_I386_PC_PREFIX,
+ .data_end = GRUB_KERNEL_I386_PC_DATA_END,
+ .raw_size = GRUB_KERNEL_I386_PC_RAW_SIZE,
+ .total_module_size = GRUB_KERNEL_I386_PC_TOTAL_MODULE_SIZE,
+ .kernel_image_size = GRUB_KERNEL_I386_PC_KERNEL_IMAGE_SIZE,
+ .compressed_size = GRUB_KERNEL_I386_PC_COMPRESSED_SIZE,
+ .section_align = 1,
+ .vaddr_offset = 0,
+ .install_dos_part = GRUB_KERNEL_I386_PC_INSTALL_DOS_PART,
+ .install_bsd_part = GRUB_KERNEL_I386_PC_INSTALL_BSD_PART,
+ .link_addr = GRUB_KERNEL_I386_PC_LINK_ADDR
+ },
+ {
+ .name = "i386-efi",
+ .voidp_sizeof = 4,
+ .bigendian = 0,
+ .id = IMAGE_EFI,
+ .flags = PLATFORM_FLAGS_NONE,
+ .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)
+ },
+ {
+ .name = "i386-ieee1275",
+ .voidp_sizeof = 4,
+ .bigendian = 0,
+ .id = IMAGE_I386_IEEE1275,
+ .flags = PLATFORM_FLAGS_NONE,
+ .section_align = 1,
+ .vaddr_offset = 0
+ },
+ {
+ .name = "i386-qemu",
+ .voidp_sizeof = 4,
+ .bigendian = 0,
+ .id = IMAGE_QEMU,
+ .flags = PLATFORM_FLAGS_NONE,
+ .prefix = GRUB_KERNEL_I386_QEMU_PREFIX,
+ .data_end = GRUB_KERNEL_I386_QEMU_DATA_END,
+ .raw_size = 0,
+ .total_module_size = TARGET_NO_FIELD,
+ .compressed_size = TARGET_NO_FIELD,
+ .kernel_image_size = GRUB_KERNEL_I386_QEMU_KERNEL_IMAGE_SIZE,
+ .section_align = 1,
+ .vaddr_offset = 0,
+ .install_dos_part = TARGET_NO_FIELD,
+ .install_bsd_part = TARGET_NO_FIELD,
+ .link_addr = GRUB_KERNEL_I386_QEMU_LINK_ADDR
+ },
+ {
+ .name = "x86_64-efi",
+ .voidp_sizeof = 8,
+ .bigendian = 0,
+ .id = IMAGE_EFI,
+ .flags = PLATFORM_FLAGS_NONE,
+ .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)
},
- {"i386-pc", 4, 0, IMAGE_I386_PC, FORMAT_RAW, PLATFORM_FLAGS_LZMA,
- GRUB_KERNEL_I386_PC_PREFIX, GRUB_KERNEL_I386_PC_DATA_END,
- GRUB_KERNEL_I386_PC_RAW_SIZE, GRUB_KERNEL_I386_PC_TOTAL_MODULE_SIZE,
- GRUB_KERNEL_I386_PC_KERNEL_IMAGE_SIZE, GRUB_KERNEL_I386_PC_COMPRESSED_SIZE,
- .section_align = 1,
- .vaddr_offset = 0,
- GRUB_KERNEL_I386_PC_INSTALL_DOS_PART, GRUB_KERNEL_I386_PC_INSTALL_BSD_PART
+ {
+ .name = "mipsel-yeeloong-elf",
+ .voidp_sizeof = 4,
+ .bigendian = 0,
+ .id = IMAGE_YEELOONG_ELF,
+ .flags = PLATFORM_FLAGS_NONE,
+ .prefix = GRUB_KERNEL_MIPS_YEELOONG_PREFIX,
+ .data_end = GRUB_KERNEL_MIPS_YEELOONG_DATA_END,
+ .raw_size = GRUB_KERNEL_MIPS_YEELOONG_RAW_SIZE,
+ .total_module_size = GRUB_KERNEL_MIPS_YEELOONG_TOTAL_MODULE_SIZE,
+ .compressed_size = GRUB_KERNEL_MIPS_YEELOONG_COMPRESSED_SIZE,
+ .kernel_image_size = GRUB_KERNEL_MIPS_YEELOONG_KERNEL_IMAGE_SIZE,
+ .section_align = 1,
+ .vaddr_offset = 0,
+ .install_dos_part = TARGET_NO_FIELD,
+ .install_bsd_part = TARGET_NO_FIELD,
+ .link_addr = GRUB_KERNEL_MIPS_YEELOONG_LINK_ADDR,
+ .elf_target = EM_MIPS,
+ .link_align = GRUB_KERNEL_MIPS_YEELOONG_LINK_ALIGN
},
- {"i386-efi", 4, 0, IMAGE_EFI, FORMAT_PE, PLATFORM_FLAGS_NONE,
- .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)
+ {
+ .name = "powerpc-ieee1275",
+ .voidp_sizeof = 4,
+ .bigendian = 1,
+ .id = IMAGE_PPC,
+ .flags = PLATFORM_FLAGS_NONE,
+ .section_align = 1,
+ .vaddr_offset = 0
+ },
+ {
+ .name = "sparc64-ieee1275-raw",
+ .voidp_sizeof = 8,
+ .bigendian = 1,
+ .id = IMAGE_SPARC64_RAW,
+ .flags = PLATFORM_FLAGS_NONE,
+ .prefix = GRUB_KERNEL_SPARC64_IEEE1275_PREFIX,
+ .data_end = GRUB_KERNEL_SPARC64_IEEE1275_DATA_END,
+ .raw_size = GRUB_KERNEL_SPARC64_IEEE1275_RAW_SIZE,
+ .total_module_size = GRUB_KERNEL_SPARC64_IEEE1275_TOTAL_MODULE_SIZE,
+ .kernel_image_size = GRUB_KERNEL_SPARC64_IEEE1275_KERNEL_IMAGE_SIZE,
+ .compressed_size = GRUB_KERNEL_SPARC64_IEEE1275_COMPRESSED_SIZE,
+ .section_align = 1,
+ .vaddr_offset = 0,
+ .install_dos_part = TARGET_NO_FIELD,
+ .install_bsd_part = TARGET_NO_FIELD,
+ .link_addr = GRUB_KERNEL_SPARC64_IEEE1275_LINK_ADDR
},
- {"i386-ieee1275", 4, 0, IMAGE_I386_IEEE1275, FORMAT_ELF, PLATFORM_FLAGS_NONE,
- .section_align = 1,
- .vaddr_offset = 0},
- {"i386-qemu", 4, 0, IMAGE_QEMU, FORMAT_RAW, PLATFORM_FLAGS_NONE,
- .section_align = 1,
- .vaddr_offset = 0},
- {"x86_64-efi", 8, 0, IMAGE_EFI, FORMAT_PE, PLATFORM_FLAGS_NONE,
- .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)
+ {
+ .name = "sparc64-ieee1275-aout",
+ .voidp_sizeof = 8,
+ .bigendian = 1,
+ .id = IMAGE_SPARC64_AOUT,
+ .flags = PLATFORM_FLAGS_NONE,
+ .prefix = GRUB_KERNEL_SPARC64_IEEE1275_PREFIX,
+ .data_end = GRUB_KERNEL_SPARC64_IEEE1275_DATA_END,
+ .raw_size = GRUB_KERNEL_SPARC64_IEEE1275_RAW_SIZE,
+ .total_module_size = GRUB_KERNEL_SPARC64_IEEE1275_TOTAL_MODULE_SIZE,
+ .kernel_image_size = GRUB_KERNEL_SPARC64_IEEE1275_KERNEL_IMAGE_SIZE,
+ .compressed_size = GRUB_KERNEL_SPARC64_IEEE1275_COMPRESSED_SIZE,
+ .section_align = 1,
+ .vaddr_offset = 0,
+ .install_dos_part = TARGET_NO_FIELD,
+ .install_bsd_part = TARGET_NO_FIELD,
+ .link_addr = GRUB_KERNEL_SPARC64_IEEE1275_LINK_ADDR
},
- {"mipsel-yeeloong-elf", 4, 0, IMAGE_YEELOONG_ELF, FORMAT_ELF, PLATFORM_FLAGS_NONE,
- .section_align = 1,
- .vaddr_offset = 0},
- {"powerpc-ieee1275", 4, 1, IMAGE_PPC, FORMAT_ELF, PLATFORM_FLAGS_NONE,
- .section_align = 1,
- .vaddr_offset = 0},
- {"sparc64-ieee1275-raw", 8, 1, IMAGE_SPARC64_RAW,
- FORMAT_RAW, PLATFORM_FLAGS_NONE,
- .section_align = 1,
- .vaddr_offset = 0},
- {"sparc64-ieee1275-aout", 8, 1, IMAGE_SPARC64_AOUT,
- FORMAT_AOUT, PLATFORM_FLAGS_NONE,
- .section_align = 1,
- .vaddr_offset = 0},
};
#define grub_target_to_host32(x) (grub_target_to_host32_real (image_target, (x)))
return grub_cpu_to_le16 (in);
}
-static inline grub_uint32_t
-grub_host_to_target_addr_real (struct image_target_desc *image_target, grub_uint32_t in)
+static inline grub_uint64_t
+grub_host_to_target_addr_real (struct image_target_desc *image_target, grub_uint64_t in)
{
if (image_target->voidp_sizeof == 8)
return grub_host_to_target64_real (image_target, in);
return grub_host_to_target32_real (image_target, in);
}
-static inline grub_uint32_t
-grub_target_to_host_real (struct image_target_desc *image_target, grub_uint32_t in)
+static inline grub_uint64_t
+grub_target_to_host_real (struct image_target_desc *image_target, grub_uint64_t in)
{
if (image_target->voidp_sizeof == 8)
return grub_target_to_host64_real (image_target, in);
= (Elf_Shdr *) ((char *) sections
+ (grub_target_to_host32 (symtab_section->sh_link)
* section_entsize));
- strtab = (char *) e + grub_target_to_host32 (strtab_section->sh_offset);
+ strtab = (char *) e + grub_target_to_host (strtab_section->sh_offset);
- symtab_size = grub_target_to_host32 (symtab_section->sh_size);
- sym_size = grub_target_to_host32 (symtab_section->sh_entsize);
- symtab_offset = grub_target_to_host32 (symtab_section->sh_offset);
+ symtab_size = grub_target_to_host (symtab_section->sh_size);
+ sym_size = grub_target_to_host (symtab_section->sh_entsize);
+ symtab_offset = grub_target_to_host (symtab_section->sh_offset);
num_syms = symtab_size / sym_size;
for (i = 0, sym = (Elf_Sym *) ((char *) e + symtab_offset);
if (image_target->id != IMAGE_EFI
&& grub_target_to_host32 (s->sh_type) != SHT_PROGBITS)
return 0;
- return ((grub_target_to_host32 (s->sh_flags) & (SHF_EXECINSTR | SHF_ALLOC))
+ return ((grub_target_to_host (s->sh_flags) & (SHF_EXECINSTR | SHF_ALLOC))
== (SHF_EXECINSTR | SHF_ALLOC));
}
if (image_target->id != IMAGE_EFI
&& grub_target_to_host32 (s->sh_type) != SHT_PROGBITS)
return 0;
- return ((grub_target_to_host32 (s->sh_flags) & (SHF_EXECINSTR | SHF_ALLOC))
+ return ((grub_target_to_host (s->sh_flags) & (SHF_EXECINSTR | SHF_ALLOC))
== SHF_ALLOC);
}
{
Elf_Word align = grub_host_to_target32 (s->sh_addralign);
const char *name = strtab + grub_host_to_target32 (s->sh_name);
-
if (align)
current_address = ALIGN_UP (current_address + image_target->vaddr_offset,
align) - image_target->vaddr_offset;
grub_util_info ("locating the section %s at 0x%x",
name, current_address);
section_addresses[i] = current_address;
- current_address += grub_host_to_target32 (s->sh_size);
+ current_address += grub_host_to_target_addr (s->sh_size);
}
current_address = ALIGN_UP (current_address + image_target->vaddr_offset,
grub_util_info ("locating the section %s at 0x%x",
name, current_address);
section_addresses[i] = current_address;
- current_address += grub_host_to_target32 (s->sh_size);
+ current_address += grub_host_to_target_addr (s->sh_size);
}
current_address = ALIGN_UP (current_address + image_target->vaddr_offset,
if (! SUFFIX (check_elf_header) (e, kernel_size, image_target))
grub_util_error ("invalid ELF header");
- section_offset = grub_target_to_host32 (e->e_shoff);
+ section_offset = grub_target_to_host (e->e_shoff);
section_entsize = grub_target_to_host16 (e->e_shentsize);
num_sections = grub_target_to_host16 (e->e_shnum);
grub_util_info ("locating the section %s at 0x%x",
name, current_address);
section_vaddresses[i] = current_address + VADDR_OFFSET;
- current_address += grub_host_to_target32 (s->sh_size);
+ current_address += grub_host_to_target_addr (s->sh_size);
}
current_address = ALIGN_UP (current_address + VADDR_OFFSET, SECTION_ALIGN)
- VADDR_OFFSET;
{
if (grub_target_to_host32 (s->sh_type) == SHT_NOBITS)
memset (out_img + section_addresses[i], 0,
- grub_host_to_target32 (s->sh_size));
+ grub_host_to_target_addr (s->sh_size));
else
memcpy (out_img + section_addresses[i],
- kernel_img + grub_host_to_target32 (s->sh_offset),
- grub_host_to_target32 (s->sh_size));
+ kernel_img + grub_host_to_target_addr (s->sh_offset),
+ grub_host_to_target_addr (s->sh_size));
}
free (kernel_img);