grub-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: patch for kern/efi/mm.c (big memmap)


From: tgingold
Subject: Re: patch for kern/efi/mm.c (big memmap)
Date: Thu, 28 Sep 2006 15:04:48 +0200
User-agent: Internet Messaging Program (IMP) 3.2.5

Quoting Marco Gerards <address@hidden>:

> address@hidden writes:
>
> Hi,
>
> First of all, thanks a lot for this patch.
>
> > some systems have a really big memmap.
>
> What kind of system are you testing GRUB 2 (EFI) on?  It would be nice
> to know which systems are already supported.
This is on an ia64 system (Tiger).

> > This patch remove the memmap size limit.
>
> Cool.  Can you please send in this patch in unified diff format (diff
> -up) and provide a changelog entry?  And while you on it, most people
> here prefer patches being sent inline so it is easier to read and to
> give feedback on.
Sorry, this is my first patch!

Tristan.

2006-09-28  Tristan Gingold  <address@hidden>

        * kern/efi/mm.c (grub_efi_mm_init): MEMORY_MAP_SIZE removed,
        dynamically get the size of the memory map.


--- grub2.cvs/kern/efi/mm.c     2006-05-29 01:01:43.000000000 +0200
+++ grub2/kern/efi/mm.c 2006-09-28 11:25:47.000000000 +0200
@@ -30,10 +30,6 @@
 #define BYTES_TO_PAGES(bytes)  ((bytes) >> 12)
 #define PAGES_TO_BYTES(pages)  ((pages) << 12)

-/* The size of a memory map obtained from the firmware. This must be
-   a multiplier of 4KB.  */
-#define MEMORY_MAP_SIZE        0x1000
-
 /* Maintain the list of allocated pages.  */
 struct allocated_page
 {
@@ -346,6 +342,8 @@
   grub_efi_uintn_t desc_size;
   grub_efi_uint64_t total_pages;
   grub_efi_uint64_t required_pages;
+  grub_efi_uintn_t memory_map_size;
+  int res;

   /* First of all, allocate pages to maintain allocations.  */
   allocated_pages
@@ -356,15 +354,20 @@
   grub_memset (allocated_pages, 0, ALLOCATED_PAGES_SIZE);

   /* Prepare a memory region to store two memory maps.  */
-  memory_map = grub_efi_allocate_pages (0,
-                                       2 * BYTES_TO_PAGES (MEMORY_MAP_SIZE));
+  memory_map_size = 0;
+  res = grub_efi_get_memory_map (&memory_map_size, NULL, 0, &desc_size, 0);
+  if (res != 0)
+    grub_fatal ("cannot get memory map size");
+
+  memory_map = grub_efi_allocate_pages
+    (0, 2 * BYTES_TO_PAGES (memory_map_size + 0x1000));
   if (! memory_map)
     grub_fatal ("cannot allocate memory");

-  filtered_memory_map = NEXT_MEMORY_DESCRIPTOR (memory_map, MEMORY_MAP_SIZE);
+  filtered_memory_map = NEXT_MEMORY_DESCRIPTOR (memory_map, memory_map_size);

   /* Obtain descriptors for available memory.  */
-  map_size = MEMORY_MAP_SIZE;
+  map_size = memory_map_size;

   if (grub_efi_get_memory_map (&map_size, memory_map, 0, &desc_size, 0) < 0)
     grub_fatal ("cannot get memory map");
@@ -373,7 +376,7 @@

   filtered_memory_map_end = filter_memory_map (memory_map, filtered_memory_map,
                                               desc_size, memory_map_end);
-
+
   /* By default, request a quarter of the available memory.  */
   total_pages = get_total_pages (filtered_memory_map, desc_size,
                                 filtered_memory_map_end);
@@ -393,7 +396,7 @@

 #if 0
   /* For debug.  */
-  map_size = MEMORY_MAP_SIZE;
+  map_size = memory_map_size;

   if (grub_efi_get_memory_map (&map_size, memory_map, 0, &desc_size, 0) < 0)
     grub_fatal ("cannot get memory map");
@@ -406,7 +409,7 @@

   /* Release the memory maps.  */
   grub_efi_free_pages ((grub_addr_t) memory_map,
-                      2 * BYTES_TO_PAGES (MEMORY_MAP_SIZE));
+                      2 * BYTES_TO_PAGES (memory_map_size + 0x1000));
 }

 void





reply via email to

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