aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMaarten Lankhorst <m.b.lankhorst@gmail.com>2011-08-09 01:44:06 +0200
committerMatt Fleming <matt.fleming@intel.com>2011-08-09 23:10:30 +0100
commitd0efc62a079f7c2de0c9b5acb74515ac44d97f2d (patch)
tree3e882f301651f1bf2e4746172aa17f323379ec5a
parentb9680f1c1dee2905d77ae8c3e16485e90dc400b2 (diff)
downloadefilinux-d0efc62a079f7c2de0c9b5acb74515ac44d97f2d.tar.gz
bzimage: Merge memory types
Fix failure to boot because of >128 e820 entries Signed-off-by: Maarten Lankhorst <m.b.lankhorst@gmail.com> Signed-off-by: Matt Fleming <matt.fleming@intel.com>
-rw-r--r--loaders/bzimage/bzimage.c17
1 files changed, 11 insertions, 6 deletions
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));