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