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