[PATCH] x86: fix EFI memory map parsing
The memory descriptors that comprise the EFI memory map are not fixed in stone such that the size could change in the future. This uses the memory descriptor size obtained from EFI to iterate over the memory map entries during boot. This enables the removal of an x86 specific pad (and ifdef) in the EFI header. I also couldn't stomach the broken up nature of the function to put EFI runtime calls into virtual mode any longer so I fixed that up a bit as well. For reference, this patch only impacts x86. Signed-off-by: Matt Tolentino <matthew.e.tolentino@intel.com> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
committed by
Linus Torvalds
parent
4116c527ea
commit
7ae65fd334
@ -370,12 +370,16 @@ static void __init limit_regions(unsigned long long size)
|
||||
int i;
|
||||
|
||||
if (efi_enabled) {
|
||||
for (i = 0; i < memmap.nr_map; i++) {
|
||||
current_addr = memmap.map[i].phys_addr +
|
||||
(memmap.map[i].num_pages << 12);
|
||||
if (memmap.map[i].type == EFI_CONVENTIONAL_MEMORY) {
|
||||
efi_memory_desc_t *md;
|
||||
void *p;
|
||||
|
||||
for (p = memmap.map, i = 0; p < memmap.map_end;
|
||||
p += memmap.desc_size, i++) {
|
||||
md = p;
|
||||
current_addr = md->phys_addr + (md->num_pages << 12);
|
||||
if (md->type == EFI_CONVENTIONAL_MEMORY) {
|
||||
if (current_addr >= size) {
|
||||
memmap.map[i].num_pages -=
|
||||
md->num_pages -=
|
||||
(((current_addr-size) + PAGE_SIZE-1) >> PAGE_SHIFT);
|
||||
memmap.nr_map = i + 1;
|
||||
return;
|
||||
|
Reference in New Issue
Block a user