Lift up core size limits on some platforms. Fix potential memory
corruption with big core on small memory systems. Document remaining limits.
This commit is contained in:
parent
f6b58fe538
commit
774683685f
9 changed files with 210 additions and 32 deletions
|
@ -991,6 +991,38 @@ generate_image (const char *dir, const char *prefix,
|
|||
core_size = full_size;
|
||||
}
|
||||
|
||||
switch (image_target->id)
|
||||
{
|
||||
case IMAGE_I386_PC:
|
||||
case IMAGE_I386_PC_PXE:
|
||||
if (GRUB_KERNEL_I386_PC_LINK_ADDR + core_size > 0x78000
|
||||
|| (core_size > (0xffff << GRUB_DISK_SECTOR_BITS))
|
||||
|| (kernel_size + bss_size + GRUB_KERNEL_I386_PC_LINK_ADDR > 0x68000))
|
||||
grub_util_error (_("core image is too big (0x%x > 0x%x)"),
|
||||
GRUB_KERNEL_I386_PC_LINK_ADDR + core_size,
|
||||
0x78000);
|
||||
/* fallthrough */
|
||||
case IMAGE_COREBOOT:
|
||||
case IMAGE_QEMU:
|
||||
if (kernel_size + bss_size + GRUB_KERNEL_I386_PC_LINK_ADDR > 0x68000)
|
||||
grub_util_error (_("kernel image is too big (0x%x > 0x%x)"),
|
||||
kernel_size + bss_size + GRUB_KERNEL_I386_PC_LINK_ADDR,
|
||||
0x68000);
|
||||
break;
|
||||
case IMAGE_LOONGSON_ELF:
|
||||
case IMAGE_YEELOONG_FLASH:
|
||||
case IMAGE_FULOONG2F_FLASH:
|
||||
case IMAGE_EFI:
|
||||
case IMAGE_MIPS_ARC:
|
||||
case IMAGE_QEMU_MIPS_FLASH:
|
||||
break;
|
||||
case IMAGE_SPARC64_AOUT:
|
||||
case IMAGE_SPARC64_RAW:
|
||||
case IMAGE_I386_IEEE1275:
|
||||
case IMAGE_PPC:
|
||||
break;
|
||||
}
|
||||
|
||||
switch (image_target->id)
|
||||
{
|
||||
case IMAGE_I386_PC:
|
||||
|
@ -1000,12 +1032,6 @@ generate_image (const char *dir, const char *prefix,
|
|||
char *boot_path, *boot_img;
|
||||
size_t boot_size;
|
||||
|
||||
if (GRUB_KERNEL_I386_PC_LINK_ADDR + core_size > 0x78000
|
||||
|| (core_size > (0xffff << GRUB_DISK_SECTOR_BITS)))
|
||||
grub_util_error (_("core image is too big (0x%x > 0x%x)"),
|
||||
GRUB_KERNEL_I386_PC_LINK_ADDR + core_size,
|
||||
0x78000);
|
||||
|
||||
num = ((core_size + GRUB_DISK_SECTOR_SIZE - 1) >> GRUB_DISK_SECTOR_BITS);
|
||||
if (image_target->id == IMAGE_I386_PC_PXE)
|
||||
{
|
||||
|
@ -1615,9 +1641,12 @@ generate_image (const char *dir, const char *prefix,
|
|||
phdr->p_filesz = phdr->p_memsz
|
||||
= grub_host_to_target32 (core_size - kernel_size);
|
||||
|
||||
target_addr_mods = ALIGN_UP (target_addr + kernel_size + bss_size
|
||||
+ image_target->mod_gap,
|
||||
image_target->mod_align);
|
||||
if (image_target->id == IMAGE_COREBOOT)
|
||||
target_addr_mods = GRUB_KERNEL_I386_COREBOOT_MODULES_ADDR;
|
||||
else
|
||||
target_addr_mods = ALIGN_UP (target_addr + kernel_size + bss_size
|
||||
+ image_target->mod_gap,
|
||||
image_target->mod_align);
|
||||
phdr->p_vaddr = grub_host_to_target32 (target_addr_mods);
|
||||
phdr->p_paddr = grub_host_to_target32 (target_addr_mods);
|
||||
phdr->p_align = grub_host_to_target32 (image_target->link_align);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue