All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] efi/libstub/arm64: avoid image_base value from efi_loaded_image
@ 2020-03-28 20:58 ` Ard Biesheuvel
  0 siblings, 0 replies; 26+ messages in thread
From: Ard Biesheuvel @ 2020-03-28 20:58 UTC (permalink / raw)
  To: linux-arm-kernel; +Cc: linux-efi, leif, mikelley, Boqun.Feng, Ard Biesheuvel

Commit 9f9223778ef3 ("efi/libstub/arm: Make efi_entry() an ordinary
PE/COFF entrypoint") did some code refactoring to get rid of the
EFI entry point assembler code, and in the process, it got rid of the
assignment of image_addr to the value of _text. Instead, it switched
to using the image_base field of the efi_loaded_image struct provided
by UEFI, which should contain the same value.

However, Michael reports that this is not the case: older GRUB builds
corrupt this value in some way, and since we can easily switch back to
referring to _text to discover this value, let's simply do that.

While at it, fix another issue in commit 9f9223778ef3, which may result
in the unassigned image_addr to be misidentified as the preferred load
offset of the kernel, which is unlikely but will cause a boot crash if
it does occur.

Finally, let's add a warning if the _text vs. image_base discrepancy is
detected, so we can tell more easily how widespread this issue actually
is.

Reported-by: Michael Kelley <mikelley@microsoft.com>
Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
---
 drivers/firmware/efi/libstub/arm64-stub.c | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/drivers/firmware/efi/libstub/arm64-stub.c b/drivers/firmware/efi/libstub/arm64-stub.c
index 9254cd8ab2d3..db0c1a9c1699 100644
--- a/drivers/firmware/efi/libstub/arm64-stub.c
+++ b/drivers/firmware/efi/libstub/arm64-stub.c
@@ -116,6 +116,7 @@ efi_status_t handle_kernel_image(unsigned long *image_addr,
 		 * Mustang), we can still place the kernel at the address
 		 * 'dram_base + TEXT_OFFSET'.
 		 */
+		*image_addr = (unsigned long)_text;
 		if (*image_addr == preferred_offset)
 			return EFI_SUCCESS;
 
@@ -140,7 +141,11 @@ efi_status_t handle_kernel_image(unsigned long *image_addr,
 		}
 		*image_addr = *reserve_addr + TEXT_OFFSET;
 	}
-	memcpy((void *)*image_addr, image->image_base, kernel_size);
+
+	if (image->image_base != _text)
+		pr_efi_err("FIRMWARE BUG: efi_loaded_image_t::image_base has bogus value\n");
+
+	memcpy((void *)*image_addr, _text, kernel_size);
 
 	return EFI_SUCCESS;
 }
-- 
2.17.1


^ permalink raw reply related	[flat|nested] 26+ messages in thread

end of thread, other threads:[~2020-04-07  8:08 UTC | newest]

Thread overview: 26+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-03-28 20:58 [PATCH] efi/libstub/arm64: avoid image_base value from efi_loaded_image Ard Biesheuvel
2020-03-28 20:58 ` Ard Biesheuvel
2020-03-28 23:55 ` Michael Kelley
2020-03-28 23:55   ` Michael Kelley
2020-03-30  7:47 ` Leif Lindholm
2020-03-30  7:47   ` Leif Lindholm
2020-03-30  7:50   ` Ard Biesheuvel
2020-03-30  7:50     ` Ard Biesheuvel
2020-03-30  7:51     ` Ard Biesheuvel
2020-03-30  7:51       ` Ard Biesheuvel
2020-03-30 18:12       ` Michael Kelley
2020-03-30 18:12         ` Michael Kelley
2020-03-30 18:24         ` Ard Biesheuvel
2020-03-30 18:24           ` Ard Biesheuvel
2020-03-31  7:56           ` Ard Biesheuvel
2020-03-31  7:56             ` Ard Biesheuvel
2020-03-31 13:37             ` Michael Kelley
2020-03-31 13:37               ` Michael Kelley
2020-04-06 17:13               ` Michael Kelley
2020-04-06 17:13                 ` Michael Kelley
2020-04-07  8:07                 ` Ard Biesheuvel
2020-04-07  8:07                   ` Ard Biesheuvel
2020-03-31 19:20             ` Laszlo Ersek
2020-03-31 19:20               ` Laszlo Ersek
2020-04-01  8:24               ` Ard Biesheuvel
2020-04-01  8:24                 ` Ard Biesheuvel

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.