diff mbox series

arm-bsp/edk2-firmware: work around alignment problem with EDK/qemu

Message ID 20240617132630.520988-1-ross.burton@arm.com
State New
Headers show
Series arm-bsp/edk2-firmware: work around alignment problem with EDK/qemu | expand

Commit Message

Ross Burton June 17, 2024, 1:26 p.m. UTC
Since switching to master, EDK2 is doing an unaligned access to memory
when drawing the boot logo which causes qemu 9.0.0 (since 728b923f54) to
raise an exception.

There is upstream discussion about where and what the underling bug here
actually is, but until that is resolved we can simply align the logo.

Signed-off-by: Ross Burton <ross.burton@arm.com>
---
 .../uefi/edk2-firmware-sbsa-ref.inc           |   7 +
 ...LogoLib-align-logo-coords-to-be-even.patch | 302 ++++++++++++++++++
 2 files changed, 309 insertions(+)
 create mode 100644 meta-arm-bsp/recipes-bsp/uefi/files/0001-BootLogoLib-align-logo-coords-to-be-even.patch

Comments

Jon Mason June 18, 2024, 5:56 p.m. UTC | #1
On Mon, 17 Jun 2024 13:26:30 +0000, Ross Burton wrote:
> Since switching to master, EDK2 is doing an unaligned access to memory
> when drawing the boot logo which causes qemu 9.0.0 (since 728b923f54) to
> raise an exception.
> 
> There is upstream discussion about where and what the underling bug here
> actually is, but until that is resolved we can simply align the logo.
> 
> [...]

Applied, thanks!

[1/1] arm-bsp/edk2-firmware: work around alignment problem with EDK/qemu
      commit: e6796bf18ac6db2eb7afc8430e01e694f4f03ea6

Best regards,
diff mbox series

Patch

diff --git a/meta-arm-bsp/recipes-bsp/uefi/edk2-firmware-sbsa-ref.inc b/meta-arm-bsp/recipes-bsp/uefi/edk2-firmware-sbsa-ref.inc
index 450f6af2..f251aa46 100644
--- a/meta-arm-bsp/recipes-bsp/uefi/edk2-firmware-sbsa-ref.inc
+++ b/meta-arm-bsp/recipes-bsp/uefi/edk2-firmware-sbsa-ref.inc
@@ -1,5 +1,11 @@ 
 COMPATIBLE_MACHINE:sbsa-ref = "sbsa-ref"
 
+FILESEXTRAPATHS:prepend := "${THISDIR}/files:"
+
+SRC_URI:append = " file://0001-BootLogoLib-align-logo-coords-to-be-even.patch"
+# Need to use git as the BootLogo fix includes a binary patch, which quilt cannot handle
+PATCHTOOL = "git"
+
 DEPENDS:append:sbsa-ref     = " trusted-firmware-a coreutils-native"
 
 EDK2_PLATFORM:sbsa-ref      = "SbsaQemu"
@@ -17,3 +23,4 @@  do_install:append:sbsa-ref() {
     # QEMU requires that the images be minimum of 256M in size
     truncate -s 256M ${D}/firmware/SBSA_FLASH*.fd
 }
+
diff --git a/meta-arm-bsp/recipes-bsp/uefi/files/0001-BootLogoLib-align-logo-coords-to-be-even.patch b/meta-arm-bsp/recipes-bsp/uefi/files/0001-BootLogoLib-align-logo-coords-to-be-even.patch
new file mode 100644
index 00000000..bb8abdd6
--- /dev/null
+++ b/meta-arm-bsp/recipes-bsp/uefi/files/0001-BootLogoLib-align-logo-coords-to-be-even.patch
@@ -0,0 +1,302 @@ 
+From 84195804a1631c88c1356438d22f4a51681d8c55 Mon Sep 17 00:00:00 2001
+From: Marcin Juszkiewicz <marcin.juszkiewicz@linaro.org>
+Date: Mon, 17 Jun 2024 10:30:07 +0200
+Subject: [PATCH] BootLogoLib: align logo coords to be even
+
+If we draw logo at odd coords then BootLogoLib goes into exception and
+boot process ends:
+
+Synchronous Exception at 0x00000101FB943E48
+PC 0x0101FB943E48 (0x0101FB93F000+0x00004E48) [ 0] QemuVideoDxe.dll
+PC 0x0101FB943314 (0x0101FB93F000+0x00004314) [ 0] QemuVideoDxe.dll
+PC 0x0101FB92F798 (0x0101FB92D000+0x00002798) [ 1] ConSplitterDxe.dll
+PC 0x0101FBA96BC4 (0x0101FBA8E000+0x00008BC4) [ 2] BdsDxe.dll
+PC 0x0101FF7FDF50 (0x0101FF7F3000+0x0000AF50) [ 3] DxeCore.dll
+
+This change resizes logo from 193x58 to 194x58px to make it's sizes
+even. And if coords are odd then they are bumped a bit to make things
+work.
+
+Signed-off-by: Marcin Juszkiewicz <marcin.juszkiewicz@linaro.org>
+
+This is a temporary workaround for an alignment problem in EDK2/qemu, see  the
+discussion at https://mail.gnu.org/archive/html/qemu-devel/2024-06/msg02964.html.
+
+Upstream-Status: Inappropriate [workaround]
+Signed-off-by: Ross Burton <ross.burton@arm.com>
+---
+ .../Library/BootLogoLib/BootLogoLib.c         |   4 ++++
+ MdeModulePkg/Logo/Logo.bmp                    | Bin 12446 -> 34010 bytes
+ 2 files changed, 4 insertions(+)
+
+diff --git a/MdeModulePkg/Library/BootLogoLib/BootLogoLib.c b/MdeModulePkg/Library/BootLogoLib/BootLogoLib.c
+index 478ec2d40e..3b7b5f3146 100644
+--- a/MdeModulePkg/Library/BootLogoLib/BootLogoLib.c
++++ b/MdeModulePkg/Library/BootLogoLib/BootLogoLib.c
+@@ -205,6 +205,10 @@ BootLogoEnableLogo (
+     DestX += OffsetX;
+     DestY += OffsetY;
+ 
++    // align logo to even coords
++    if (DestX % 2 != 0) DestX++;
++    if (DestY % 2 != 0) DestY++;
++
+     if ((DestX >= 0) && (DestY >= 0)) {
+       if (GraphicsOutput != NULL) {
+         Status = GraphicsOutput->Blt (
+diff --git a/MdeModulePkg/Logo/Logo.bmp b/MdeModulePkg/Logo/Logo.bmp
+index 3e85229e17595ba1f9c59e13692a4f8362ebc850..136345a56ac44e3ea8d3c91114b5a2676dc90e2a 100644
+GIT binary patch
+literal 34010
+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
+
+literal 12446
+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
+
+-- 
+2.34.1
+