[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH 1/2] kern/efi/mm: Extract function to get the filtered memory map
From: |
Gary Lin |
Subject: |
[PATCH 1/2] kern/efi/mm: Extract function to get the filtered memory map |
Date: |
Tue, 6 Sep 2022 16:22:55 +0800 |
In preparation for setting the default memory region size based on the
available memory, this patch extracts the logic to get the filtered
memory map from grub_efi_mm_add_regions() so that we can reuse it later.
Signed-off-by: Gary Lin <glin@suse.com>
---
grub-core/kern/efi/mm.c | 53 ++++++++++++++++++++++++++---------------
1 file changed, 34 insertions(+), 19 deletions(-)
diff --git a/grub-core/kern/efi/mm.c b/grub-core/kern/efi/mm.c
index d290c9a76..8fd89b7d4 100644
--- a/grub-core/kern/efi/mm.c
+++ b/grub-core/kern/efi/mm.c
@@ -566,53 +566,68 @@ print_memory_map (grub_efi_memory_descriptor_t
*memory_map,
#endif
static grub_err_t
-grub_efi_mm_add_regions (grub_size_t required_bytes, unsigned int flags)
+get_filtered_memory_map (grub_efi_memory_descriptor_t **memory_map,
+ grub_efi_memory_descriptor_t **filtered_memory_map,
+ grub_efi_memory_descriptor_t
**filtered_memory_map_end,
+ grub_efi_uintn_t *desc_size)
{
- grub_efi_memory_descriptor_t *memory_map;
grub_efi_memory_descriptor_t *memory_map_end;
- grub_efi_memory_descriptor_t *filtered_memory_map;
- grub_efi_memory_descriptor_t *filtered_memory_map_end;
grub_efi_uintn_t map_size;
- grub_efi_uintn_t desc_size;
- grub_err_t err;
int mm_status;
/* Prepare a memory region to store two memory maps. */
- memory_map = grub_efi_allocate_any_pages (2 * BYTES_TO_PAGES
(MEMORY_MAP_SIZE));
- if (! memory_map)
+ *memory_map = grub_efi_allocate_any_pages (2 * BYTES_TO_PAGES
(MEMORY_MAP_SIZE));
+ if (! *memory_map)
return grub_error (GRUB_ERR_OUT_OF_MEMORY, "cannot allocate memory for
memory map");
/* Obtain descriptors for available memory. */
map_size = MEMORY_MAP_SIZE;
- mm_status = grub_efi_get_memory_map (&map_size, memory_map, 0, &desc_size,
0);
+ mm_status = grub_efi_get_memory_map (&map_size, *memory_map, 0, desc_size,
0);
if (mm_status == 0)
{
grub_efi_free_pages
- ((grub_efi_physical_address_t) ((grub_addr_t) memory_map),
+ ((grub_efi_physical_address_t) ((grub_addr_t) *memory_map),
2 * BYTES_TO_PAGES (MEMORY_MAP_SIZE));
/* Freeing/allocating operations may increase memory map size. */
- map_size += desc_size * 32;
+ map_size += *desc_size * 32;
- memory_map = grub_efi_allocate_any_pages (2 * BYTES_TO_PAGES (map_size));
- if (! memory_map)
+ *memory_map = grub_efi_allocate_any_pages (2 * BYTES_TO_PAGES
(map_size));
+ if (! *memory_map)
return grub_error (GRUB_ERR_OUT_OF_MEMORY, "cannot allocate memory for
new memory map");
- mm_status = grub_efi_get_memory_map (&map_size, memory_map, 0,
- &desc_size, 0);
+ mm_status = grub_efi_get_memory_map (&map_size, *memory_map, 0,
+ desc_size, 0);
}
if (mm_status < 0)
return grub_error (GRUB_ERR_OUT_OF_MEMORY, "error fetching memory map from
EFI");
- memory_map_end = NEXT_MEMORY_DESCRIPTOR (memory_map, map_size);
+ memory_map_end = NEXT_MEMORY_DESCRIPTOR (*memory_map, map_size);
- filtered_memory_map = memory_map_end;
+ *filtered_memory_map = memory_map_end;
+
+ *filtered_memory_map_end = filter_memory_map (*memory_map,
*filtered_memory_map,
+ *desc_size, memory_map_end);
+
+ return GRUB_ERR_NONE;
+}
- filtered_memory_map_end = filter_memory_map (memory_map, filtered_memory_map,
- desc_size, memory_map_end);
+static grub_err_t
+grub_efi_mm_add_regions (grub_size_t required_bytes, unsigned int flags)
+{
+ grub_efi_memory_descriptor_t *memory_map = NULL;
+ grub_efi_memory_descriptor_t *filtered_memory_map = NULL;
+ grub_efi_memory_descriptor_t *filtered_memory_map_end = NULL;
+ grub_efi_uintn_t desc_size = 0;
+ grub_err_t err;
+
+ err = get_filtered_memory_map (&memory_map, &filtered_memory_map,
+ &filtered_memory_map_end, &desc_size);
+ if (err != GRUB_ERR_NONE)
+ return err;
/* Sort the filtered descriptors, so that GRUB can allocate pages
from smaller regions. */
--
2.35.3