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:21 +1000
ed1787d
Subject: [PATCH] kern/efi/mm: Pass up errors from add_memory_regions()
ed1787d
ed1787d
The function add_memory_regions() is currently only called on system
ed1787d
initialization to allocate a fixed amount of pages. As such, it didn't
ed1787d
need to return any errors: in case it failed, we cannot proceed anyway.
ed1787d
This will change with the upcoming support for requesting more memory
ed1787d
from the firmware at runtime, where it doesn't make sense anymore to
ed1787d
fail hard.
ed1787d
ed1787d
Refactor the function to return an error to prepare for this. Note that
ed1787d
this does not change the behaviour when initializing the memory system
ed1787d
because grub_efi_mm_init() knows to call grub_fatal() in case
ed1787d
grub_efi_mm_add_regions() returns an error.
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 15a015698921240adc1ac266a3b5bc5fcbd81521)
ed1787d
---
ed1787d
 grub-core/kern/efi/mm.c | 22 +++++++++++++++-------
ed1787d
 1 file changed, 15 insertions(+), 7 deletions(-)
ed1787d
ed1787d
diff --git a/grub-core/kern/efi/mm.c b/grub-core/kern/efi/mm.c
ed1787d
index a1d3b51fe6..e0ebc65dba 100644
ed1787d
--- a/grub-core/kern/efi/mm.c
ed1787d
+++ b/grub-core/kern/efi/mm.c
ed1787d
@@ -514,7 +514,7 @@ filter_memory_map (grub_efi_memory_descriptor_t *memory_map,
ed1787d
 }
ed1787d
 
ed1787d
 /* Add memory regions.  */
ed1787d
-static void
ed1787d
+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
@@ -542,9 +542,9 @@ add_memory_regions (grub_efi_memory_descriptor_t *memory_map,
ed1787d
 					   GRUB_EFI_ALLOCATE_ADDRESS,
ed1787d
 					   GRUB_EFI_LOADER_CODE);      
ed1787d
       if (! addr)
ed1787d
-	grub_fatal ("cannot allocate conventional memory %p with %u pages",
ed1787d
-		    (void *) ((grub_addr_t) start),
ed1787d
-		    (unsigned) pages);
ed1787d
+	return grub_error (GRUB_ERR_OUT_OF_MEMORY,
ed1787d
+			    "Memory starting at %p (%u pages) marked as free, but EFI would not allocate",
ed1787d
+			    (void *) ((grub_addr_t) start), (unsigned) pages);
ed1787d
 
ed1787d
       grub_mm_init_region (addr, PAGES_TO_BYTES (pages));
ed1787d
 
ed1787d
@@ -554,7 +554,11 @@ add_memory_regions (grub_efi_memory_descriptor_t *memory_map,
ed1787d
     }
ed1787d
 
ed1787d
   if (required_pages > 0)
ed1787d
-    grub_fatal ("too little memory");
ed1787d
+    return grub_error (GRUB_ERR_OUT_OF_MEMORY,
ed1787d
+                       "could not allocate all requested memory: %" PRIuGRUB_UINT64_T " pages still required after iterating EFI memory map",
ed1787d
+                       required_pages);
ed1787d
+
ed1787d
+  return GRUB_ERR_NONE;
ed1787d
 }
ed1787d
 
ed1787d
 void
ed1787d
@@ -676,6 +680,7 @@ grub_efi_mm_add_regions (grub_size_t required_bytes)
ed1787d
   grub_efi_memory_descriptor_t *filtered_memory_map_end;
ed1787d
   grub_efi_uintn_t map_size;
ed1787d
   grub_efi_uintn_t desc_size;
ed1787d
+  grub_err_t err;
ed1787d
   int mm_status;
ed1787d
 
ed1787d
   grub_nx_init ();
ed1787d
@@ -722,8 +727,11 @@ grub_efi_mm_add_regions (grub_size_t required_bytes)
ed1787d
   sort_memory_map (filtered_memory_map, desc_size, filtered_memory_map_end);
ed1787d
 
ed1787d
   /* Allocate memory regions for GRUB's memory management.  */
ed1787d
-  add_memory_regions (filtered_memory_map, desc_size,
ed1787d
-		      filtered_memory_map_end, BYTES_TO_PAGES (required_bytes));
ed1787d
+  err = add_memory_regions (filtered_memory_map, desc_size,
ed1787d
+			    filtered_memory_map_end,
ed1787d
+			    BYTES_TO_PAGES (required_bytes));
ed1787d
+  if (err != GRUB_ERR_NONE)
ed1787d
+    return err;
ed1787d
 
ed1787d
 #if 0
ed1787d
   /* For debug.  */