[boot] Fix missing last memory map entry

The bootloader was dropping the last memory map entry of the kernel map.
This commit is contained in:
Justin C. Miller
2021-01-31 22:54:14 -08:00
parent 634a1c5f6a
commit 8575939b20

View File

@@ -276,7 +276,7 @@ build_kernel_mem_map(kernel::args::header *args, uefi::boot_services *bs)
for (auto desc : map) { for (auto desc : map) {
/* /*
// EFI map dump // EFI map dump
console::print(L" Range %lx (%lx) %x(%s) [%lu]\r\n", console::print(L" eRange %lx (%lx) %x(%s) [%lu]\r\n",
desc->physical_start, desc->attribute, desc->type, memory_type_name(desc->type), desc->number_of_pages); desc->physical_start, desc->attribute, desc->type, memory_type_name(desc->type), desc->number_of_pages);
*/ */
@@ -323,18 +323,19 @@ build_kernel_mem_map(kernel::args::header *args, uefi::boot_services *bs)
// TODO: validate uefi's map is sorted // TODO: validate uefi's map is sorted
if (first) { if (first) {
first = false; first = false;
kernel_map[nent].start = desc->physical_start; mem_entry &ent = kernel_map[nent++];
kernel_map[nent].pages = desc->number_of_pages; ent.start = desc->physical_start;
kernel_map[nent].type = type; ent.pages = desc->number_of_pages;
kernel_map[nent].attr = (desc->attribute & 0xffffffff); ent.type = type;
ent.attr = (desc->attribute & 0xffffffff);
continue; continue;
} }
mem_entry &prev = kernel_map[nent]; mem_entry &prev = kernel_map[nent - 1];
if (can_merge(prev, type, desc)) { if (can_merge(prev, type, desc)) {
prev.pages += desc->number_of_pages; prev.pages += desc->number_of_pages;
} else { } else {
mem_entry &next = kernel_map[++nent]; mem_entry &next = kernel_map[nent++];
next.start = desc->physical_start; next.start = desc->physical_start;
next.pages = desc->number_of_pages; next.pages = desc->number_of_pages;
next.type = type; next.type = type;
@@ -350,7 +351,7 @@ build_kernel_mem_map(kernel::args::header *args, uefi::boot_services *bs)
// kernel map dump // kernel map dump
for (unsigned i = 0; i < nent; ++i) { for (unsigned i = 0; i < nent; ++i) {
const kernel::args::mem_entry &e = kernel_map[i]; const kernel::args::mem_entry &e = kernel_map[i];
console::print(L" Range %lx (%lx) %x(%s) [%lu]\r\n", console::print(L" kRange %lx (%lx) %x(%s) [%lu]\r\n",
e.start, e.attr, e.type, kernel_memory_type_name(e.type), e.pages); e.start, e.attr, e.type, kernel_memory_type_name(e.type), e.pages);
} }
*/ */