You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
59 lines
2.1 KiB
59 lines
2.1 KiB
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 |
|
From: Vladimir Serbinenko <phcoder@gmail.com> |
|
Date: Thu, 7 May 2015 16:23:39 +0200 |
|
Subject: [PATCH] linux.c: Ensure that initrd is page-aligned. |
|
|
|
--- |
|
grub-core/loader/i386/linux.c | 11 +++++------ |
|
1 file changed, 5 insertions(+), 6 deletions(-) |
|
|
|
diff --git a/grub-core/loader/i386/linux.c b/grub-core/loader/i386/linux.c |
|
index 53f74ae0685..764cde20318 100644 |
|
--- a/grub-core/loader/i386/linux.c |
|
+++ b/grub-core/loader/i386/linux.c |
|
@@ -70,7 +70,6 @@ static grub_addr_t prot_mode_target; |
|
static void *initrd_mem; |
|
static grub_addr_t initrd_mem_target; |
|
static grub_size_t prot_init_space; |
|
-static grub_uint32_t initrd_pages; |
|
static struct grub_relocator *relocator = NULL; |
|
static void *efi_mmap_buf; |
|
static grub_size_t maximal_cmdline_size; |
|
@@ -1055,7 +1054,7 @@ static grub_err_t |
|
grub_cmd_initrd (grub_command_t cmd __attribute__ ((unused)), |
|
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; |
|
grub_err_t err; |
|
@@ -1077,8 +1076,7 @@ grub_cmd_initrd (grub_command_t cmd __attribute__ ((unused)), |
|
goto fail; |
|
|
|
size = grub_get_initrd_size (&initrd_ctx); |
|
- |
|
- initrd_pages = (page_align (size) >> 12); |
|
+ aligned_size = ALIGN_UP (size, 4096); |
|
|
|
/* Get the highest address available for the initrd. */ |
|
if (grub_le_to_cpu16 (linux_params.version) >= 0x0203) |
|
@@ -1106,7 +1104,7 @@ grub_cmd_initrd (grub_command_t cmd __attribute__ ((unused)), |
|
addr_min = (grub_addr_t) prot_mode_target + prot_init_space; |
|
|
|
/* Put the initrd as high as possible, 4KiB aligned. */ |
|
- addr = (addr_max - size) & ~0xFFF; |
|
+ addr = (addr_max - aligned_size) & ~0xFFF; |
|
|
|
if (addr < addr_min) |
|
{ |
|
@@ -1117,7 +1115,8 @@ grub_cmd_initrd (grub_command_t cmd __attribute__ ((unused)), |
|
{ |
|
grub_relocator_chunk_t ch; |
|
err = grub_relocator_alloc_chunk_align (relocator, &ch, |
|
- addr_min, addr, size, 0x1000, |
|
+ addr_min, addr, aligned_size, |
|
+ 0x1000, |
|
GRUB_RELOCATOR_PREFERENCE_HIGH, |
|
1); |
|
if (err)
|
|
|