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 <g...@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 _______________________________________________ Grub-devel mailing list Grub-devel@gnu.org https://lists.gnu.org/mailman/listinfo/grub-devel