uefi: Even saner handling of exiting boot services

This commit is contained in:
mintsuki 2021-07-06 08:21:20 +02:00
parent 05bc7c5bda
commit e6cc0e4b93
3 changed files with 7 additions and 27 deletions

View File

@ -86,6 +86,10 @@ bool efi_exit_boot_services(void) {
efi_mmap_size += 4096;
status = uefi_call_wrapper(gBS->FreePool, 1, efi_mmap);
if (status)
goto fail;
status = uefi_call_wrapper(gBS->AllocatePool, 3,
EfiLoaderData, efi_mmap_size, &efi_mmap);
if (status)
@ -112,19 +116,8 @@ bool efi_exit_boot_services(void) {
for (size_t i = 0; i < entry_count; i++) {
EFI_MEMORY_DESCRIPTOR *entry = (void *)efi_mmap + i * efi_desc_size;
uint64_t base = entry->PhysicalStart;
uint64_t length = entry->NumberOfPages * 4096;
// Find for a match in the untouched memory map
for (size_t j = 0; j < untouched_memmap_entries; j++) {
if (untouched_memmap[j].type != MEMMAP_USABLE)
continue;
if (untouched_memmap[j].base == base && untouched_memmap[j].length == length) {
// It's a match!
entry->Type = EfiConventionalMemory;
break;
}
if (entry->Type == 0x80000000) {
entry->Type = EfiConventionalMemory;
}
}

View File

@ -19,11 +19,6 @@
extern struct e820_entry_t memmap[];
extern size_t memmap_entries;
#if defined (uefi)
extern struct e820_entry_t untouched_memmap[];
extern size_t untouched_memmap_entries;
#endif
void init_memmap(void);
struct e820_entry_t *get_memmap(size_t *entries);
struct e820_entry_t *get_raw_memmap(size_t *entry_count);

View File

@ -51,11 +51,6 @@ void *conv_mem_alloc(size_t count) {
struct e820_entry_t memmap[MEMMAP_MAX_ENTRIES];
size_t memmap_entries = 0;
#if defined (uefi)
struct e820_entry_t untouched_memmap[MEMMAP_MAX_ENTRIES];
size_t untouched_memmap_entries = 0;
#endif
static const char *memmap_type(uint32_t type) {
switch (type) {
case MEMMAP_USABLE:
@ -315,9 +310,6 @@ void init_memmap(void) {
sanitise_entries(memmap, &memmap_entries, false);
memcpy(untouched_memmap, memmap, memmap_entries * sizeof(struct e820_entry_t));
untouched_memmap_entries = memmap_entries;
allocations_disallowed = false;
// Let's leave 64MiB to the firmware
@ -331,7 +323,7 @@ void init_memmap(void) {
EFI_PHYSICAL_ADDRESS base = memmap[i].base;
status = uefi_call_wrapper(gBS->AllocatePages, 4,
AllocateAddress, EfiLoaderData, memmap[i].length / 4096, &base);
AllocateAddress, 0x80000000, memmap[i].length / 4096, &base);
if (status)
panic("pmm: AllocatePages failure (%x)", status);