x86/efi: Unmap EFI boot services code/data regions from efi_pgd
efi_free_boot_services(), as the name suggests, frees EFI boot services code/data regions but forgets to unmap these regions from efi_pgd. This means that any code that's running in efi_pgd address space (e.g: any EFI runtime service) would still be able to access these regions but the contents of these regions would have long been over written by someone else. So, it's important to unmap these regions. Hence, introduce efi_unmap_pages() to unmap these regions from efi_pgd. After unmapping EFI boot services code/data regions, any illegal access by buggy firmware to these regions would result in page fault which will be handled by EFI specific fault handler. Signed-off-by: Sai Praneeth Prakhya <sai.praneeth.prakhya@intel.com> Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org> Acked-by: Thomas Gleixner <tglx@linutronix.de> Cc: Andy Lutomirski <luto@kernel.org> Cc: Arend van Spriel <arend.vanspriel@broadcom.com> Cc: Bhupesh Sharma <bhsharma@redhat.com> Cc: Borislav Petkov <bp@alien8.de> Cc: Dave Hansen <dave.hansen@intel.com> Cc: Eric Snowberg <eric.snowberg@oracle.com> Cc: Hans de Goede <hdegoede@redhat.com> Cc: Joe Perches <joe@perches.com> Cc: Jon Hunter <jonathanh@nvidia.com> Cc: Julien Thierry <julien.thierry@arm.com> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Marc Zyngier <marc.zyngier@arm.com> Cc: Matt Fleming <matt@codeblueprint.co.uk> Cc: Nathan Chancellor <natechancellor@gmail.com> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Sedat Dilek <sedat.dilek@gmail.com> Cc: YiFei Zhu <zhuyifei1999@gmail.com> Cc: linux-efi@vger.kernel.org Link: http://lkml.kernel.org/r/20181129171230.18699-6-ard.biesheuvel@linaro.org Signed-off-by: Ingo Molnar <mingo@kernel.org>
This commit is contained in:
parent
7e0dabd301
commit
08cfb38f3e
|
@ -369,6 +369,24 @@ void __init efi_reserve_boot_services(void)
|
|||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Apart from having VA mappings for EFI boot services code/data regions,
|
||||
* (duplicate) 1:1 mappings were also created as a quirk for buggy firmware. So,
|
||||
* unmap both 1:1 and VA mappings.
|
||||
*/
|
||||
static void __init efi_unmap_pages(efi_memory_desc_t *md)
|
||||
{
|
||||
pgd_t *pgd = efi_mm.pgd;
|
||||
u64 pa = md->phys_addr;
|
||||
u64 va = md->virt_addr;
|
||||
|
||||
if (kernel_unmap_pages_in_pgd(pgd, pa, md->num_pages))
|
||||
pr_err("Failed to unmap 1:1 mapping for 0x%llx\n", pa);
|
||||
|
||||
if (kernel_unmap_pages_in_pgd(pgd, va, md->num_pages))
|
||||
pr_err("Failed to unmap VA mapping for 0x%llx\n", va);
|
||||
}
|
||||
|
||||
void __init efi_free_boot_services(void)
|
||||
{
|
||||
phys_addr_t new_phys, new_size;
|
||||
|
@ -393,6 +411,13 @@ void __init efi_free_boot_services(void)
|
|||
continue;
|
||||
}
|
||||
|
||||
/*
|
||||
* Before calling set_virtual_address_map(), EFI boot services
|
||||
* code/data regions were mapped as a quirk for buggy firmware.
|
||||
* Unmap them from efi_pgd before freeing them up.
|
||||
*/
|
||||
efi_unmap_pages(md);
|
||||
|
||||
/*
|
||||
* Nasty quirk: if all sub-1MB memory is used for boot
|
||||
* services, we can get here without having allocated the
|
||||
|
|
Loading…
Reference in New Issue