Message ID | 20181221185222.21423-2-dann.frazier@canonical.com |
---|---|
State | New |
Headers | show |
Series | Fix booting armhf guests in EFI mode | expand |
On 12/21/18 7:52 PM, dann frazier wrote: > From: Ard Biesheuvel <ard.biesheuvel@linaro.org> > > BugLink: https://bugs.launchpad.net/bugs/1809488 > > Commit: > > 3ea86495aef2 ("efi/arm: preserve early mapping of UEFI memory map longer for BGRT") > > deferred the unmap of the early mapping of the UEFI memory map to > accommodate the ACPI BGRT code, which looks up the memory type that > backs the BGRT table to validate it against the requirements of the UEFI spec. > > Unfortunately, this causes problems on ARM, which does not permit > early mappings to persist after paging_init() is called, resulting > in a WARN() splat. Since we don't support the BGRT table on ARM anway, > let's revert ARM to the old behaviour, which is to take down the > early mapping at the end of efi_init(). > > Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org> > Cc: Linus Torvalds <torvalds@linux-foundation.org> > Cc: Peter Zijlstra <peterz@infradead.org> > Cc: Thomas Gleixner <tglx@linutronix.de> > Cc: linux-efi@vger.kernel.org > Fixes: 3ea86495aef2 ("efi/arm: preserve early mapping of UEFI memory ...") > Link: http://lkml.kernel.org/r/20181114175544.12860-3-ard.biesheuvel@linaro.org > Signed-off-by: Ingo Molnar <mingo@kernel.org> > (cherry picked from commit 33412b8673135b18ea42beb7f5117ed0091798b6) > Signed-off-by: dann frazier <dann.frazier@canonical.com> Clean cherry-pick, limited to arm/efi and fixes a regression. Acked-by: Kleber Sacilotto de Souza <kleber.souza@canonical.com> > --- > drivers/firmware/efi/arm-init.c | 4 ++++ > drivers/firmware/efi/arm-runtime.c | 2 +- > drivers/firmware/efi/memmap.c | 3 +++ > 3 files changed, 8 insertions(+), 1 deletion(-) > > diff --git a/drivers/firmware/efi/arm-init.c b/drivers/firmware/efi/arm-init.c > index 388a929baf95d..1a6a77df8a5e8 100644 > --- a/drivers/firmware/efi/arm-init.c > +++ b/drivers/firmware/efi/arm-init.c > @@ -265,6 +265,10 @@ void __init efi_init(void) > (params.mmap & ~PAGE_MASK))); > > init_screen_info(); > + > + /* ARM does not permit early mappings to persist across paging_init() */ > + if (IS_ENABLED(CONFIG_ARM)) > + efi_memmap_unmap(); > } > > static int __init register_gop_device(void) > diff --git a/drivers/firmware/efi/arm-runtime.c b/drivers/firmware/efi/arm-runtime.c > index 922cfb813109a..a00934d263c51 100644 > --- a/drivers/firmware/efi/arm-runtime.c > +++ b/drivers/firmware/efi/arm-runtime.c > @@ -110,7 +110,7 @@ static int __init arm_enable_runtime_services(void) > { > u64 mapsize; > > - if (!efi_enabled(EFI_BOOT) || !efi_enabled(EFI_MEMMAP)) { > + if (!efi_enabled(EFI_BOOT)) { > pr_info("EFI services will not be available.\n"); > return 0; > } > diff --git a/drivers/firmware/efi/memmap.c b/drivers/firmware/efi/memmap.c > index 5fc70520e04c4..1907db2b38d81 100644 > --- a/drivers/firmware/efi/memmap.c > +++ b/drivers/firmware/efi/memmap.c > @@ -118,6 +118,9 @@ int __init efi_memmap_init_early(struct efi_memory_map_data *data) > > void __init efi_memmap_unmap(void) > { > + if (!efi_enabled(EFI_MEMMAP)) > + return; > + > if (!efi.memmap.late) { > unsigned long size; >
On 21.12.18 19:52, dann frazier wrote: > From: Ard Biesheuvel <ard.biesheuvel@linaro.org> > > BugLink: https://bugs.launchpad.net/bugs/1809488 > > Commit: > > 3ea86495aef2 ("efi/arm: preserve early mapping of UEFI memory map longer for BGRT") > > deferred the unmap of the early mapping of the UEFI memory map to > accommodate the ACPI BGRT code, which looks up the memory type that > backs the BGRT table to validate it against the requirements of the UEFI spec. > > Unfortunately, this causes problems on ARM, which does not permit > early mappings to persist after paging_init() is called, resulting > in a WARN() splat. Since we don't support the BGRT table on ARM anway, > let's revert ARM to the old behaviour, which is to take down the > early mapping at the end of efi_init(). > > Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org> > Cc: Linus Torvalds <torvalds@linux-foundation.org> > Cc: Peter Zijlstra <peterz@infradead.org> > Cc: Thomas Gleixner <tglx@linutronix.de> > Cc: linux-efi@vger.kernel.org > Fixes: 3ea86495aef2 ("efi/arm: preserve early mapping of UEFI memory ...") > Link: http://lkml.kernel.org/r/20181114175544.12860-3-ard.biesheuvel@linaro.org > Signed-off-by: Ingo Molnar <mingo@kernel.org> > (cherry picked from commit 33412b8673135b18ea42beb7f5117ed0091798b6) > Signed-off-by: dann frazier <dann.frazier@canonical.com> Acked-by: Stefan Bader <stefan.bader@canonical.com> > --- > drivers/firmware/efi/arm-init.c | 4 ++++ > drivers/firmware/efi/arm-runtime.c | 2 +- > drivers/firmware/efi/memmap.c | 3 +++ > 3 files changed, 8 insertions(+), 1 deletion(-) > > diff --git a/drivers/firmware/efi/arm-init.c b/drivers/firmware/efi/arm-init.c > index 388a929baf95d..1a6a77df8a5e8 100644 > --- a/drivers/firmware/efi/arm-init.c > +++ b/drivers/firmware/efi/arm-init.c > @@ -265,6 +265,10 @@ void __init efi_init(void) > (params.mmap & ~PAGE_MASK))); > > init_screen_info(); > + > + /* ARM does not permit early mappings to persist across paging_init() */ > + if (IS_ENABLED(CONFIG_ARM)) > + efi_memmap_unmap(); > } > > static int __init register_gop_device(void) > diff --git a/drivers/firmware/efi/arm-runtime.c b/drivers/firmware/efi/arm-runtime.c > index 922cfb813109a..a00934d263c51 100644 > --- a/drivers/firmware/efi/arm-runtime.c > +++ b/drivers/firmware/efi/arm-runtime.c > @@ -110,7 +110,7 @@ static int __init arm_enable_runtime_services(void) > { > u64 mapsize; > > - if (!efi_enabled(EFI_BOOT) || !efi_enabled(EFI_MEMMAP)) { > + if (!efi_enabled(EFI_BOOT)) { > pr_info("EFI services will not be available.\n"); > return 0; > } > diff --git a/drivers/firmware/efi/memmap.c b/drivers/firmware/efi/memmap.c > index 5fc70520e04c4..1907db2b38d81 100644 > --- a/drivers/firmware/efi/memmap.c > +++ b/drivers/firmware/efi/memmap.c > @@ -118,6 +118,9 @@ int __init efi_memmap_init_early(struct efi_memory_map_data *data) > > void __init efi_memmap_unmap(void) > { > + if (!efi_enabled(EFI_MEMMAP)) > + return; > + > if (!efi.memmap.late) { > unsigned long size; > >
diff --git a/drivers/firmware/efi/arm-init.c b/drivers/firmware/efi/arm-init.c index 388a929baf95d..1a6a77df8a5e8 100644 --- a/drivers/firmware/efi/arm-init.c +++ b/drivers/firmware/efi/arm-init.c @@ -265,6 +265,10 @@ void __init efi_init(void) (params.mmap & ~PAGE_MASK))); init_screen_info(); + + /* ARM does not permit early mappings to persist across paging_init() */ + if (IS_ENABLED(CONFIG_ARM)) + efi_memmap_unmap(); } static int __init register_gop_device(void) diff --git a/drivers/firmware/efi/arm-runtime.c b/drivers/firmware/efi/arm-runtime.c index 922cfb813109a..a00934d263c51 100644 --- a/drivers/firmware/efi/arm-runtime.c +++ b/drivers/firmware/efi/arm-runtime.c @@ -110,7 +110,7 @@ static int __init arm_enable_runtime_services(void) { u64 mapsize; - if (!efi_enabled(EFI_BOOT) || !efi_enabled(EFI_MEMMAP)) { + if (!efi_enabled(EFI_BOOT)) { pr_info("EFI services will not be available.\n"); return 0; } diff --git a/drivers/firmware/efi/memmap.c b/drivers/firmware/efi/memmap.c index 5fc70520e04c4..1907db2b38d81 100644 --- a/drivers/firmware/efi/memmap.c +++ b/drivers/firmware/efi/memmap.c @@ -118,6 +118,9 @@ int __init efi_memmap_init_early(struct efi_memory_map_data *data) void __init efi_memmap_unmap(void) { + if (!efi_enabled(EFI_MEMMAP)) + return; + if (!efi.memmap.late) { unsigned long size;