| From 48cf128e7b03658b3841e837d413e83e07f0b6e0 Mon Sep 17 00:00:00 2001 |
| From: Ard Biesheuvel <ard.biesheuvel@linaro.org> |
| Date: Wed, 2 Oct 2019 18:58:59 +0200 |
| Subject: [PATCH] efivar/ssdt: Don't iterate over EFI vars if no SSDT override |
| was specified |
| |
| commit c05f8f92b701576b615f30aac31fabdc0648649b upstream. |
| |
| The kernel command line option efivar_ssdt= allows the name to be |
| specified of an EFI variable containing an ACPI SSDT table that should |
| be loaded into memory by the OS, and treated as if it was provided by |
| the firmware. |
| |
| Currently, that code will always iterate over the EFI variables and |
| compare each name with the provided name, even if the command line |
| option wasn't set to begin with. |
| |
| So bail early when no variable name was provided. This works around a |
| boot regression on the 2012 Mac Pro, as reported by Scott. |
| |
| Tested-by: Scott Talbert <swt@techie.net> |
| Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org> |
| Cc: <stable@vger.kernel.org> # v4.9+ |
| Cc: Ben Dooks <ben.dooks@codethink.co.uk> |
| Cc: Dave Young <dyoung@redhat.com> |
| Cc: Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com> |
| Cc: Jerry Snitselaar <jsnitsel@redhat.com> |
| Cc: Linus Torvalds <torvalds@linux-foundation.org> |
| Cc: Lukas Wunner <lukas@wunner.de> |
| Cc: Lyude Paul <lyude@redhat.com> |
| Cc: Matthew Garrett <mjg59@google.com> |
| Cc: Octavian Purdila <octavian.purdila@intel.com> |
| Cc: Peter Jones <pjones@redhat.com> |
| Cc: Peter Zijlstra <peterz@infradead.org> |
| Cc: Thomas Gleixner <tglx@linutronix.de> |
| Cc: linux-efi@vger.kernel.org |
| Cc: linux-integrity@vger.kernel.org |
| Fixes: 475fb4e8b2f4 ("efi / ACPI: load SSTDs from EFI variables") |
| Link: https://lkml.kernel.org/r/20191002165904.8819-3-ard.biesheuvel@linaro.org |
| Signed-off-by: Ingo Molnar <mingo@kernel.org> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/drivers/firmware/efi/efi.c b/drivers/firmware/efi/efi.c |
| index 4b7cf7bc0ded..b338e799e00d 100644 |
| --- a/drivers/firmware/efi/efi.c |
| +++ b/drivers/firmware/efi/efi.c |
| @@ -281,6 +281,9 @@ static __init int efivar_ssdt_load(void) |
| void *data; |
| int ret; |
| |
| + if (!efivar_ssdt[0]) |
| + return 0; |
| + |
| ret = efivar_init(efivar_ssdt_iter, &entries, true, &entries); |
| |
| list_for_each_entry_safe(entry, aux, &entries, list) { |
| -- |
| 2.7.4 |
| |