|
|
b35c50 |
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
|
b35c50 |
From: Patrick Steinhardt <ps@pks.im>
|
|
|
b35c50 |
Date: Thu, 21 Apr 2022 15:24:22 +1000
|
|
|
b35c50 |
Subject: [PATCH] kern/efi/mm: Implement runtime addition of pages
|
|
|
b35c50 |
|
|
|
b35c50 |
Adjust the interface of grub_efi_mm_add_regions() to take a set of
|
|
|
b35c50 |
GRUB_MM_ADD_REGION_* flags, which most notably is currently only the
|
|
|
b35c50 |
GRUB_MM_ADD_REGION_CONSECUTIVE flag. This allows us to set the function
|
|
|
b35c50 |
up as callback for the memory subsystem and have it call out to us in
|
|
|
b35c50 |
case there's not enough pages available in the current heap.
|
|
|
b35c50 |
|
|
|
b35c50 |
Signed-off-by: Patrick Steinhardt <ps@pks.im>
|
|
|
b35c50 |
Signed-off-by: Daniel Axtens <dja@axtens.net>
|
|
|
b35c50 |
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
|
|
|
b35c50 |
Tested-by: Patrick Steinhardt <ps@pks.im>
|
|
|
b35c50 |
(cherry picked from commit 1df2934822df4c1170dde069d97cfbf7a9572bba)
|
|
|
b35c50 |
---
|
|
|
b35c50 |
grub-core/kern/efi/mm.c | 15 +++++++++++----
|
|
|
b35c50 |
1 file changed, 11 insertions(+), 4 deletions(-)
|
|
|
b35c50 |
|
|
|
b35c50 |
diff --git a/grub-core/kern/efi/mm.c b/grub-core/kern/efi/mm.c
|
|
|
b35c50 |
index e0ebc65dba..016ba6cf2f 100644
|
|
|
b35c50 |
--- a/grub-core/kern/efi/mm.c
|
|
|
b35c50 |
+++ b/grub-core/kern/efi/mm.c
|
|
|
b35c50 |
@@ -518,7 +518,8 @@ static grub_err_t
|
|
|
b35c50 |
add_memory_regions (grub_efi_memory_descriptor_t *memory_map,
|
|
|
b35c50 |
grub_efi_uintn_t desc_size,
|
|
|
b35c50 |
grub_efi_memory_descriptor_t *memory_map_end,
|
|
|
b35c50 |
- grub_efi_uint64_t required_pages)
|
|
|
b35c50 |
+ grub_efi_uint64_t required_pages,
|
|
|
b35c50 |
+ unsigned int flags)
|
|
|
b35c50 |
{
|
|
|
b35c50 |
grub_efi_memory_descriptor_t *desc;
|
|
|
b35c50 |
|
|
|
b35c50 |
@@ -532,6 +533,10 @@ add_memory_regions (grub_efi_memory_descriptor_t *memory_map,
|
|
|
b35c50 |
|
|
|
b35c50 |
start = desc->physical_start;
|
|
|
b35c50 |
pages = desc->num_pages;
|
|
|
b35c50 |
+
|
|
|
b35c50 |
+ if (pages < required_pages && (flags & GRUB_MM_ADD_REGION_CONSECUTIVE))
|
|
|
b35c50 |
+ continue;
|
|
|
b35c50 |
+
|
|
|
b35c50 |
if (pages > required_pages)
|
|
|
b35c50 |
{
|
|
|
b35c50 |
start += PAGES_TO_BYTES (pages - required_pages);
|
|
|
b35c50 |
@@ -672,7 +677,7 @@ grub_nx_init (void)
|
|
|
b35c50 |
}
|
|
|
b35c50 |
|
|
|
b35c50 |
static grub_err_t
|
|
|
b35c50 |
-grub_efi_mm_add_regions (grub_size_t required_bytes)
|
|
|
b35c50 |
+grub_efi_mm_add_regions (grub_size_t required_bytes, unsigned int flags)
|
|
|
b35c50 |
{
|
|
|
b35c50 |
grub_efi_memory_descriptor_t *memory_map;
|
|
|
b35c50 |
grub_efi_memory_descriptor_t *memory_map_end;
|
|
|
b35c50 |
@@ -729,7 +734,8 @@ grub_efi_mm_add_regions (grub_size_t required_bytes)
|
|
|
b35c50 |
/* Allocate memory regions for GRUB's memory management. */
|
|
|
b35c50 |
err = add_memory_regions (filtered_memory_map, desc_size,
|
|
|
b35c50 |
filtered_memory_map_end,
|
|
|
b35c50 |
- BYTES_TO_PAGES (required_bytes));
|
|
|
b35c50 |
+ BYTES_TO_PAGES (required_bytes),
|
|
|
b35c50 |
+ flags);
|
|
|
b35c50 |
if (err != GRUB_ERR_NONE)
|
|
|
b35c50 |
return err;
|
|
|
b35c50 |
|
|
|
b35c50 |
@@ -756,8 +762,9 @@ grub_efi_mm_add_regions (grub_size_t required_bytes)
|
|
|
b35c50 |
void
|
|
|
b35c50 |
grub_efi_mm_init (void)
|
|
|
b35c50 |
{
|
|
|
b35c50 |
- if (grub_efi_mm_add_regions (DEFAULT_HEAP_SIZE) != GRUB_ERR_NONE)
|
|
|
b35c50 |
+ if (grub_efi_mm_add_regions (DEFAULT_HEAP_SIZE, GRUB_MM_ADD_REGION_NONE) != GRUB_ERR_NONE)
|
|
|
b35c50 |
grub_fatal ("%s", grub_errmsg);
|
|
|
b35c50 |
+ grub_mm_add_region_fn = grub_efi_mm_add_regions;
|
|
|
b35c50 |
}
|
|
|
b35c50 |
|
|
|
b35c50 |
#if defined (__aarch64__) || defined (__arm__) || defined (__riscv)
|