misc/efi: Call SetVirtualAddressMap when exiting boot services
This commit is contained in:
parent
6e4b4fd123
commit
7cb5ae20ea
|
@ -151,6 +151,7 @@ error:
|
|||
#endif
|
||||
|
||||
no_unwind bool efi_boot_services_exited = false;
|
||||
no_unwind bool efi_no_va_map = false;
|
||||
|
||||
bool efi_exit_boot_services(void) {
|
||||
EFI_STATUS status;
|
||||
|
@ -199,6 +200,21 @@ retry:
|
|||
goto retry;
|
||||
}
|
||||
|
||||
for (size_t i = 0; i < efi_mmap_size / efi_desc_size; i++) {
|
||||
EFI_MEMORY_DESCRIPTOR *md = (void *)efi_mmap + i * efi_desc_size;
|
||||
if ((md->Attribute & EFI_MEMORY_RUNTIME) == 0) {
|
||||
continue;
|
||||
}
|
||||
|
||||
md->VirtualStart = md->PhysicalStart;
|
||||
}
|
||||
|
||||
status = gRT->SetVirtualAddressMap(efi_mmap_size, efi_desc_size, efi_desc_ver, efi_mmap);
|
||||
if (status != EFI_SUCCESS) {
|
||||
print("efi: Failed to set virtual address map\n");
|
||||
efi_no_va_map = true;
|
||||
}
|
||||
|
||||
#if defined(__x86_64__) || defined(__i386__)
|
||||
asm volatile ("cli" ::: "memory");
|
||||
#elif defined (__aarch64__)
|
||||
|
|
|
@ -25,6 +25,8 @@ extern UINTN efi_mmap_size, efi_desc_size;
|
|||
extern UINT32 efi_desc_ver;
|
||||
|
||||
extern bool efi_boot_services_exited;
|
||||
extern bool efi_no_va_map;
|
||||
|
||||
bool efi_exit_boot_services(void);
|
||||
#endif
|
||||
|
||||
|
|
|
@ -803,6 +803,10 @@ no_fb:;
|
|||
goto fdt_error;
|
||||
}
|
||||
|
||||
if (efi_no_va_map) {
|
||||
goto no_va_map;
|
||||
}
|
||||
|
||||
fdt_val64 = cpu_to_fdt64((uintptr_t)efi_mmap);
|
||||
status = fdt_setprop_inplace(fdt, node, "linux,uefi-mmap-start", &fdt_val64, sizeof(uint64_t));
|
||||
if (status != 0) {
|
||||
|
@ -826,6 +830,8 @@ no_fb:;
|
|||
if (status != 0) {
|
||||
goto fdt_error;
|
||||
}
|
||||
|
||||
no_va_map:;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
|
Loading…
Reference in New Issue