[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