Quoting Marco Gerards <[EMAIL PROTECTED]>: > [EMAIL PROTECTED] 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 <[EMAIL PROTECTED]> * 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 _______________________________________________ Grub-devel mailing list Grub-devel@gnu.org http://lists.gnu.org/mailman/listinfo/grub-devel