* grub-core/loader/multiboot.c: Add support for multiboot kernels
quirks.
This commit is contained in:
parent
81afc5cce6
commit
00bfa988fc
6 changed files with 137 additions and 54 deletions
|
@ -160,6 +160,8 @@ grub_multiboot_unload (void)
|
|||
return GRUB_ERR_NONE;
|
||||
}
|
||||
|
||||
static grub_uint64_t highest_load;
|
||||
|
||||
#define MULTIBOOT_LOAD_ELF64
|
||||
#include "multiboot_elfxx.c"
|
||||
#undef MULTIBOOT_LOAD_ELF64
|
||||
|
@ -240,6 +242,26 @@ grub_cmd_multiboot (grub_command_t cmd __attribute__ ((unused)),
|
|||
|
||||
grub_loader_unset ();
|
||||
|
||||
highest_load = 0;
|
||||
|
||||
#ifndef GRUB_USE_MULTIBOOT2
|
||||
grub_multiboot_quirks = GRUB_MULTIBOOT_QUIRKS_NONE;
|
||||
|
||||
if (argc != 0 && grub_strcmp (argv[0], "--quirk-bad-kludge") == 0)
|
||||
{
|
||||
argc--;
|
||||
argv++;
|
||||
grub_multiboot_quirks |= GRUB_MULTIBOOT_QUIRK_BAD_KLUDGE;
|
||||
}
|
||||
|
||||
if (argc != 0 && grub_strcmp (argv[0], "--quirk-modules-after-kernel") == 0)
|
||||
{
|
||||
argc--;
|
||||
argv++;
|
||||
grub_multiboot_quirks |= GRUB_MULTIBOOT_QUIRK_MODULES_AFTER_KERNEL;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (argc == 0)
|
||||
return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("filename expected"));
|
||||
|
||||
|
@ -290,6 +312,7 @@ grub_cmd_module (grub_command_t cmd __attribute__ ((unused)),
|
|||
grub_addr_t target;
|
||||
grub_err_t err;
|
||||
int nounzip = 0;
|
||||
grub_uint64_t lowest_addr = 0;
|
||||
|
||||
if (argc == 0)
|
||||
return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("filename expected"));
|
||||
|
@ -315,12 +338,17 @@ grub_cmd_module (grub_command_t cmd __attribute__ ((unused)),
|
|||
if (! file)
|
||||
return grub_errno;
|
||||
|
||||
#ifndef GRUB_USE_MULTIBOOT2
|
||||
if (grub_multiboot_quirks & GRUB_MULTIBOOT_QUIRK_MODULES_AFTER_KERNEL)
|
||||
lowest_addr = ALIGN_UP (highest_load + 1048576, 4096);
|
||||
#endif
|
||||
|
||||
size = grub_file_size (file);
|
||||
if (size)
|
||||
{
|
||||
grub_relocator_chunk_t ch;
|
||||
err = grub_relocator_alloc_chunk_align (grub_multiboot_relocator, &ch,
|
||||
0, (0xffffffff - size) + 1,
|
||||
lowest_addr, (0xffffffff - size) + 1,
|
||||
size, MULTIBOOT_MOD_ALIGN,
|
||||
GRUB_RELOCATOR_PREFERENCE_NONE, 0);
|
||||
if (err)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue