linux.c: Ensure that initrd is page-aligned.
This commit is contained in:
parent
9f731abc7f
commit
e5b4ba8c2b
1 changed files with 5 additions and 6 deletions
|
@ -69,7 +69,6 @@ static grub_addr_t prot_mode_target;
|
||||||
static void *initrd_mem;
|
static void *initrd_mem;
|
||||||
static grub_addr_t initrd_mem_target;
|
static grub_addr_t initrd_mem_target;
|
||||||
static grub_size_t prot_init_space;
|
static grub_size_t prot_init_space;
|
||||||
static grub_uint32_t initrd_pages;
|
|
||||||
static struct grub_relocator *relocator = NULL;
|
static struct grub_relocator *relocator = NULL;
|
||||||
static void *efi_mmap_buf;
|
static void *efi_mmap_buf;
|
||||||
static grub_size_t maximal_cmdline_size;
|
static grub_size_t maximal_cmdline_size;
|
||||||
|
@ -1046,7 +1045,7 @@ static grub_err_t
|
||||||
grub_cmd_initrd (grub_command_t cmd __attribute__ ((unused)),
|
grub_cmd_initrd (grub_command_t cmd __attribute__ ((unused)),
|
||||||
int argc, char *argv[])
|
int argc, char *argv[])
|
||||||
{
|
{
|
||||||
grub_size_t size = 0;
|
grub_size_t size = 0, aligned_size = 0;
|
||||||
grub_addr_t addr_min, addr_max;
|
grub_addr_t addr_min, addr_max;
|
||||||
grub_addr_t addr;
|
grub_addr_t addr;
|
||||||
grub_err_t err;
|
grub_err_t err;
|
||||||
|
@ -1068,8 +1067,7 @@ grub_cmd_initrd (grub_command_t cmd __attribute__ ((unused)),
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
||||||
size = grub_get_initrd_size (&initrd_ctx);
|
size = grub_get_initrd_size (&initrd_ctx);
|
||||||
|
aligned_size = ALIGN_UP (size, 4096);
|
||||||
initrd_pages = (page_align (size) >> 12);
|
|
||||||
|
|
||||||
/* Get the highest address available for the initrd. */
|
/* Get the highest address available for the initrd. */
|
||||||
if (grub_le_to_cpu16 (linux_params.version) >= 0x0203)
|
if (grub_le_to_cpu16 (linux_params.version) >= 0x0203)
|
||||||
|
@ -1097,7 +1095,7 @@ grub_cmd_initrd (grub_command_t cmd __attribute__ ((unused)),
|
||||||
addr_min = (grub_addr_t) prot_mode_target + prot_init_space;
|
addr_min = (grub_addr_t) prot_mode_target + prot_init_space;
|
||||||
|
|
||||||
/* Put the initrd as high as possible, 4KiB aligned. */
|
/* Put the initrd as high as possible, 4KiB aligned. */
|
||||||
addr = (addr_max - size) & ~0xFFF;
|
addr = (addr_max - aligned_size) & ~0xFFF;
|
||||||
|
|
||||||
if (addr < addr_min)
|
if (addr < addr_min)
|
||||||
{
|
{
|
||||||
|
@ -1108,7 +1106,8 @@ grub_cmd_initrd (grub_command_t cmd __attribute__ ((unused)),
|
||||||
{
|
{
|
||||||
grub_relocator_chunk_t ch;
|
grub_relocator_chunk_t ch;
|
||||||
err = grub_relocator_alloc_chunk_align (relocator, &ch,
|
err = grub_relocator_alloc_chunk_align (relocator, &ch,
|
||||||
addr_min, addr, size, 0x1000,
|
addr_min, addr, aligned_size,
|
||||||
|
0x1000,
|
||||||
GRUB_RELOCATOR_PREFERENCE_HIGH,
|
GRUB_RELOCATOR_PREFERENCE_HIGH,
|
||||||
1);
|
1);
|
||||||
if (err)
|
if (err)
|
||||||
|
|
Loading…
Reference in a new issue