Marco Gerards <[EMAIL PROTECTED]> writes: >> + memory_map = grub_efi_allocate_pages >> + (0, 2 * BYTES_TO_PAGES (memory_map_size + 0x1000)); >> >> I suppose you add 0x1000 to round it up. Maybe we should change >> the BYTES_TO_PAGES macro to do roundup. > > Agreed. Can you make this change as well?
Done. See attached patch. >> Even through this patch is quite trivial and small, I believe we >> need you to sign over the copyright for it to FSF. Okuji, Marco, >> what are your opinions? > > This patch is trivial enough to apply without the paperwork, I > think. OK. I'll commit it after I get a few minutes over to test it. ~j
Index: kern/efi/mm.c =================================================================== RCS file: /sources/grub/grub2/kern/efi/mm.c,v retrieving revision 1.3 diff -u -p -r1.3 mm.c --- kern/efi/mm.c 28 May 2006 23:01:43 -0000 1.3 +++ kern/efi/mm.c 28 Sep 2006 13:57:30 -0000 @@ -27,13 +27,9 @@ #define NEXT_MEMORY_DESCRIPTOR(desc, size) \ ((grub_efi_memory_descriptor_t *) ((char *) (desc) + (size))) -#define BYTES_TO_PAGES(bytes) ((bytes) >> 12) +#define BYTES_TO_PAGES(bytes) (((bytes) + 4095) >> 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_mm_init (void) 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 @@ -355,16 +353,23 @@ grub_efi_mm_init (void) 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)); + /* Prepare a memory region to store two memory maps. Obtain size of + memory map by passing a NULL buffer and a buffer size of + zero. */ + 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)); 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"); @@ -393,7 +398,7 @@ grub_efi_mm_init (void) #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 +411,7 @@ grub_efi_mm_init (void) /* 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)); } void
pgpn2pvoWdXa0.pgp
Description: PGP signature
_______________________________________________ Grub-devel mailing list Grub-devel@gnu.org http://lists.gnu.org/mailman/listinfo/grub-devel