Changeset View
Changeset View
Standalone View
Standalone View
sys/boot/efi/loader/copy.c
Context not available. | |||||
UINT32 dver; | UINT32 dver; | ||||
EFI_STATUS status; | EFI_STATUS status; | ||||
int i, ndesc; | int i, ndesc; | ||||
unsigned long available_pages; | unsigned long available_pages = 0; | ||||
sz = 0; | sz = 0; | ||||
status = BS->GetMemoryMap(&sz, 0, &key, &dsz, &dver); | status = BS->GetMemoryMap(&sz, 0, &key, &dsz, &dver); | ||||
Context not available. | |||||
} | } | ||||
ndesc = sz / dsz; | ndesc = sz / dsz; | ||||
for (i = 0, p = map; i < ndesc; | for (i = 0, p = map; i < ndesc; | ||||
i++, p = NextMemoryDescriptor(p, dsz)) { | i++, p = NextMemoryDescriptor(p, dsz)) { | ||||
start = p->PhysicalStart; | start = p->PhysicalStart; | ||||
Context not available. | |||||
continue; | continue; | ||||
if (p->Type != EfiConventionalMemory) | if (p->Type != EfiConventionalMemory) | ||||
continue; | printf("Warning: wrong EFI memory type: %d\n", | ||||
p->Type); | |||||
available_pages = p->NumberOfPages - | available_pages = p->NumberOfPages - | ||||
((KERNEL_PHYSICAL_BASE - start) >> EFI_PAGE_SHIFT); | ((KERNEL_PHYSICAL_BASE - start) >> EFI_PAGE_SHIFT); | ||||
break; | |||||
} | |||||
if (available_pages == 0) { | |||||
printf("Can't find valid memory map for staging area!\n"); | |||||
goto out; | |||||
} | |||||
if (*nr_pages > available_pages) { | for ( ; i < ndesc; | ||||
printf("staging area size is reduced: %ld -> %ld!\n", | i++, p = NextMemoryDescriptor(p, dsz)) { | ||||
*nr_pages, available_pages); | if (p->Type != EfiConventionalMemory && | ||||
*nr_pages = available_pages; | p->Type != EfiLoaderData) | ||||
} | break; | ||||
break; | if (p->PhysicalStart != end) | ||||
break; | |||||
end = p->PhysicalStart + p->NumberOfPages * EFI_PAGE_SIZE; | |||||
available_pages += p->NumberOfPages; | |||||
} | } | ||||
if (*nr_pages > available_pages) { | |||||
printf("Staging area's size is reduced: %ld -> %ld!\n", | |||||
*nr_pages, available_pages); | |||||
*nr_pages = available_pages; | |||||
} | |||||
out: | out: | ||||
free(map); | free(map); | ||||
} | } | ||||
Context not available. |