On Thu, Jan 12, 2023 at 2:33 PM Ard Biesheuvel <ardb@xxxxxxxxxx> wrote: > > The ACPI PRM address space handler calls efi_call_virt_pointer() to > execute PRM firmware code, but doing so is only permitted when the EFI > runtime environment is available. Otherwise, such calls are guaranteed > to result in a crash, and must therefore be avoided. > > Given that the EFI runtime services may become unavailable after a crash > occurring in the firmware, we need to check this each time the PRM > address space handler is invoked. If the EFI runtime services were not > available at registration time to being with, don't install the address > space handler at all. > > Cc: <stable@xxxxxxxxxxxxxxx> > Cc: "Rafael J. Wysocki" <rafael@xxxxxxxxxx> > Cc: Len Brown <lenb@xxxxxxxxxx> > Cc: linux-acpi@xxxxxxxxxxxxxxx > Signed-off-by: Ard Biesheuvel <ardb@xxxxxxxxxx> > --- > v2: check both at registration and at invocation time > > drivers/acpi/prmt.c | 10 ++++++++++ > 1 file changed, 10 insertions(+) > > diff --git a/drivers/acpi/prmt.c b/drivers/acpi/prmt.c > index 998101cf16e47145..3d4c4620f9f95309 100644 > --- a/drivers/acpi/prmt.c > +++ b/drivers/acpi/prmt.c > @@ -236,6 +236,11 @@ static acpi_status acpi_platformrt_space_handler(u32 function, > efi_status_t status; > struct prm_context_buffer context; > > + if (!efi_enabled(EFI_RUNTIME_SERVICES)) { > + pr_err_ratelimited("PRM: EFI runtime services no longer available\n"); > + return AE_NO_HANDLER; This error code is only used in GPE handling ATM. The one that actually causes ACPICA to log a "no handler" error (in acpi_ex_access_region()) is AE_NOT_EXIST. Should it be used here? > + } > + > /* > * The returned acpi_status will always be AE_OK. Error values will be > * saved in the first byte of the PRM message buffer to be used by ASL. > @@ -325,6 +330,11 @@ void __init init_prmt(void) > > pr_info("PRM: found %u modules\n", mc); > > + if (!efi_enabled(EFI_RUNTIME_SERVICES)) { > + pr_err("PRM: EFI runtime services unavailable\n"); > + return; > + } > + > status = acpi_install_address_space_handler(ACPI_ROOT_OBJECT, > ACPI_ADR_SPACE_PLATFORM_RT, > &acpi_platformrt_space_handler, > -- > 2.39.0 >