grub-devel
[Top][All Lists]
Advanced

[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




reply via email to

[Prev in Thread] Current Thread [Next in Thread]