]> git.baikalelectronics.ru Git - kernel.git/commit
efi/x86: Handle page faults occurring while running EFI runtime services
authorSai Praneeth <sai.praneeth.prakhya@intel.com>
Tue, 11 Sep 2018 19:15:22 +0000 (12:15 -0700)
committerArd Biesheuvel <ard.biesheuvel@linaro.org>
Wed, 26 Sep 2018 10:14:55 +0000 (12:14 +0200)
commit68cd2d877ea301afa96f10286d10bdcce2ee8375
treeb7127ae04326c7e9bab17c8c812d5bb21b527827
parent2f61c6f9a6cec11ed6eac2e8f7bb8d62624ed966
efi/x86: Handle page faults occurring while running EFI runtime services

Memory accesses performed by UEFI runtime services should be limited to:
- reading/executing from EFI_RUNTIME_SERVICES_CODE memory regions
- reading/writing from/to EFI_RUNTIME_SERVICES_DATA memory regions
- reading/writing by-ref arguments
- reading/writing from/to the stack.

Accesses outside these regions may cause the kernel to hang because the
memory region requested by the firmware isn't mapped in efi_pgd, which
causes a page fault in ring 0 and the kernel fails to handle it, leading
to die(). To save kernel from hanging, add an EFI specific page fault
handler which recovers from such faults by
1. If the efi runtime service is efi_reset_system(), reboot the machine
   through BIOS.
2. If the efi runtime service is _not_ efi_reset_system(), then freeze
   efi_rts_wq and schedule a new process.

The EFI page fault handler offers us two advantages:
1. Avoid potential hangs caused by buggy firmware.
2. Shout loud that the firmware is buggy and hence is not a kernel bug.

Tested-by: Bhupesh Sharma <bhsharma@redhat.com>
Suggested-by: Matt Fleming <matt@codeblueprint.co.uk>
Based-on-code-from: Ricardo Neri <ricardo.neri@intel.com>
Signed-off-by: Sai Praneeth Prakhya <sai.praneeth.prakhya@intel.com>
Reviewed-by: Thomas Gleixner <tglx@linutronix.de>
[ardb: clarify commit log]
Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
arch/x86/include/asm/efi.h
arch/x86/mm/fault.c
arch/x86/platform/efi/quirks.c
drivers/firmware/efi/runtime-wrappers.c
include/linux/efi.h