[syslinux] bzimage: Merge memory types

Maarten Lankhorst m.b.lankhorst at gmail.com
Mon Aug 8 16:44:06 PDT 2011


Fix failure to boot because of >128 e820 entries

Signed-off-by: Maarten Lankhorst <m.b.lankhorst at gmail.com>

---
Unrelated, I'm pretty sure that that print statement of 'invalid
efi memory descriptor type' wont work because of the ExitBootServices
On my system adding a similar print statement for warning of merger
caused it to reboot.

Also can EfiRuntimeServicesCode be changed from unusable to reserved?
and perhaps EfiUnusableMemory to unusable. ;)

diff --git a/loaders/bzimage/bzimage.c b/loaders/bzimage/bzimage.c
index 0b93611..3edf84d 100644
--- a/loaders/bzimage/bzimage.c
+++ b/loaders/bzimage/bzimage.c
@@ -69,7 +69,7 @@ load_kernel(EFI_HANDLE image, CHAR16 *name, char *cmdline)
 	EFI_STATUS err;
 	UINTN size = 0;
 	char *initrd;
-	int i;
+	int i, j = 0;
 
 	err = file_open(name, &file);
 	if (err != EFI_SUCCESS)
@@ -370,13 +370,18 @@ again:
 			continue;
 		}
 
-		e820_map->addr = d->PhysicalStart;
-		e820_map->size = d->NumberOfPages << EFI_PAGE_SHIFT;
-		e820_map->type = e820_type;
-		e820_map++;
+		if (j && e820_map[j-1].type == e820_type &&
+			(e820_map[j-1].addr + e820_map[j-1].size) == d->PhysicalStart) {
+			e820_map[j-1].size += d->NumberOfPages << EFI_PAGE_SHIFT;
+		} else {
+			e820_map[j].addr = d->PhysicalStart;
+			e820_map[j].size = d->NumberOfPages << EFI_PAGE_SHIFT;
+			e820_map[j].type = e820_type;
+			j++;
+		}
 	}
 
-	boot_params->e820_entries = i;
+	boot_params->e820_entries = j;
 
 	asm volatile ("lidt %0" :: "m" (idt));
 	asm volatile ("lgdt %0" :: "m" (gdt));





More information about the Syslinux mailing list