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