Hi,
This patch applied with "[PATCH] arm: Align section alignment with manual relocation offset code" seems to work perfect!

I tested as much EFI things as possible, with success in every case (using grub-mkstandalone EFI images).

    --target=arm-linux-gnueabihf --with-platform=efi
        fine with u-boot
        fine with https://efi.akeo.ie/QEMU_EFI/
fine with "AAVMF32_code.fd" available into Debian "qemu-efi-arm" package (buster and experimental) fine with recent versions of : http://snapshots.linaro.org/components/kernel/leg-virt-tianocore-edk2-upstream/latest/QEMU-ARM/

    --target=aarch64-linux-gnu --with-platform=efi
        fine with https://efi.akeo.ie/QEMU_EFI/
fine with "AAVMF_code.fd" available into Debian "qemu-efi-aarch64" package (buster and experimental) fine with "QEMU_EFI.fd" available into Debian "qemu-efi-aarch64" package (buster and experimental) fine with recent versions of : http://snapshots.linaro.org/components/kernel/leg-virt-tianocore-edk2-upstream/latest/QEMU-ARM/
        fine with Asus NovaGo TP370QL (Qualcomm Snapdragon 835)

    --target=i386  --with-platform=efi
fine with OVMF-pure-efi.fd from https://www.kraxel.org/repos/jenkins/edk2/edk2.git-ovmf-ia32-0-20190308.1033.ge2d3a25f1a.noarch.rpm

    --target=x86_64  --with-platform=efi
        fine with OVMF.fd (from debian packages Debian)
        fine with an Asus R510JK-DM086H (Intel Core-i5 4200H)

For arm64, i386 and x86_64, none of the 2 patches changed the size of those 3 efi files resulting from grub-mkstandalone (the size only changed for arm-efi bootarm.efi). Which tends to confirm that the modification only implies arm 32 bits without impacting others efi architectures.

It's a chance we have efficient guys working with success on those complicated things! Thanks and congrats for having it repaired. Even if I'm not the user of arm-efi (32 bits) grub versions, I missed it when tested the patch about aarch64-laptops support so I'm glad those more advanced tests helped everyone.

Of course you can add "Tested-by: Julien ROBIN <julien.robi...@free.fr>" if relevant. If the patch is retouched I can still do some tests, but if you're hurried (or in case someone need it some day) the command lines I used are attached.

Bye !
Julien

On 4/30/19 2:12 AM, Alexander Graf wrote:
When creating T32->A32 transition jumps, the relocation code in grub
will generate trampolines. These trampolines live in the .data section
of our PE binary which means they are not marked as executable.

This misbehavior was unmasked by commit a51f953f4ee87 ("mkimage: Align
efi sections on 4k boundary") which made the X/NX boundary more obvious
because everything became page aligned.

To put things into proper order, let's move the arm trampolines into the
.text section instead. That way everyone knows they are executable.

Fixes: a51f953f4ee87 ("mkimage: Align efi sections on 4k boundary")
Reported-by: Julien ROBIN <julien.robi...@free.fr>
Reported-by: Leif Lindholm <leif.lindh...@linaro.org>

Signed-off-by: Alexander Graf <ag...@csgraf.de>
---
  util/grub-mkimagexx.c | 29 +++++++++++++----------------
  1 file changed, 13 insertions(+), 16 deletions(-)

diff --git a/util/grub-mkimagexx.c b/util/grub-mkimagexx.c
index 2059890c3..af23fae52 100644
--- a/util/grub-mkimagexx.c
+++ b/util/grub-mkimagexx.c
@@ -2197,25 +2197,10 @@ SUFFIX (locate_sections) (Elf_Ehdr *e, const char 
*kernel_path,
          }
        }
- layout->kernel_size = ALIGN_UP (layout->kernel_size + image_target->vaddr_offset,
-                             image_target->section_align)
-    - image_target->vaddr_offset;
-  layout->exec_size = layout->kernel_size;
-
-  /* .data */
-  for (i = 0, s = smd->sections;
-       i < smd->num_sections;
-       i++, s = (Elf_Shdr *) ((char *) s + smd->section_entsize))
-    if (SUFFIX (is_data_section) (s, image_target))
-      layout->kernel_size = SUFFIX (put_section) (s, i, layout->kernel_size, 
smd,
-                                                 image_target);
-
  #ifdef MKIMAGE_ELF32
    if (image_target->elf_target == EM_ARM)
      {
        grub_size_t tramp;
-      layout->kernel_size = ALIGN_UP (layout->kernel_size + 
image_target->vaddr_offset,
-                                     image_target->section_align) - 
image_target->vaddr_offset;
layout->kernel_size = ALIGN_UP (layout->kernel_size, 16); @@ -2223,10 +2208,22 @@ SUFFIX (locate_sections) (Elf_Ehdr *e, const char *kernel_path,
                                       smd->num_sections, image_target);
layout->tramp_off = layout->kernel_size;
-      layout->kernel_size += ALIGN_UP (tramp, 16);
      }
  #endif
+ layout->kernel_size = ALIGN_UP (layout->kernel_size + image_target->vaddr_offset,
+                             image_target->section_align)
+    - image_target->vaddr_offset;
+  layout->exec_size = layout->kernel_size;
+
+  /* .data */
+  for (i = 0, s = smd->sections;
+       i < smd->num_sections;
+       i++, s = (Elf_Shdr *) ((char *) s + smd->section_entsize))
+    if (SUFFIX (is_data_section) (s, image_target))
+      layout->kernel_size = SUFFIX (put_section) (s, i, layout->kernel_size, 
smd,
+                                                 image_target);
+
    layout->bss_start = layout->kernel_size;
    layout->end = layout->kernel_size;
#MASTER / ARM 32 :

        #After having installed
        apt install pkg-config automake autopoint crossbuild-essential-armhf

        git clone git://git.savannah.gnu.org/grub.git && cd grub && ./bootstrap 
&& ./configure --target=arm-linux-gnueabihf --with-platform=efi 
--prefix=/home/user/Desktop/grub/ && make -j 8 && make install
        /home/user/Desktop/grub/bin/grub-mkstandalone -o bootarm.efi -O arm-efi 
--directory /home/user/Desktop/grub/lib/grub/arm-efi

        #Then I created a GPT USB Stick with ESP/FAT32 partition (marked as EFI 
System Partition) in which /EFI/boot/bootarm.efi is placed, unmounted it, and 
made an image of it at /home/user/Desktop/esp/esp-master.img

        cd /home/user/Desktop/esp
        qemu-system-arm -M virt -m 512 -net none -monitor none -parallel none 
-L ./ -bios QEMU_EFI_ARM.fd -drive format=raw,file=esp-master.img

------------------------------------------------------------------------------------------------------
#MASTER / ARM 64 :

        git clone git://git.savannah.gnu.org/grub.git && cd grub && ./bootstrap 
&& ./configure --target=aarch64-linux-gnu --with-platform=efi 
--prefix=/home/user/Desktop/grub-arm64-efi && make -j 8 && make install
        cd ..
        /home/user/Desktop/grub-arm64-efi/bin/grub-mkstandalone -o bootaa64.efi 
-O arm64-efi --directory /home/user/Desktop/grub-arm64-efi/lib/grub/arm64-efi/
        qemu-system-aarch64 -M virt -cpu cortex-a57 -m 2048 -monitor none 
-parallel none -L ./ -bios QEMU_EFI_AA64.fd -drive 
format=raw,file=esp-master.img

------------------------------------------------------------------------------------------------------
QEMU_EFI_ARM firmwares :
        https://efi.akeo.ie/QEMU_EFI/
        https://wiki.linaro.org/LEG/UEFIforQEMU
        wget 
http://snapshots.linaro.org/components/kernel/leg-virt-tianocore-edk2-upstream/latest/QEMU-ARM/DEBUG_GCC5/QEMU_EFI.fd
        wget 
http://snapshots.linaro.org/components/kernel/leg-virt-tianocore-edk2-upstream/latest/QEMU-ARM/RELEASE_GCC5/QEMU_EFI.fd
        
Another one, split in 2 files (the first one can be used as bios) :
        https://packages.debian.org/buster/qemu-efi-arm
        seems that you can use "-flash firstFile -flash secondFile", instead of 
"-bios firstFile"

------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------

Crossbuilding u-boot.bin for ARM, using x86_64 computer (having 
crossbuild-essential-armhf installed)

        git clone git://git.denx.de/u-boot-efi.git
        cd u-boot-efi/
        make ARCH=arm qemu_arm_defconfig
        make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j 8


#Running the /EFI/boot/bootarm.efi (placed into esp-master.img) from u-boot.bin 
bios :
qemu-system-arm -M virt -m 512 -net none -monitor none -parallel none -L U-BOOT 
-bios u-boot.bin -drive format=raw,file=esp-master.img
        virtio scan
        virtio info
        virtio part
        load virtio 0:1 ${kernel_addr_r} EFI/boot/bootarm.efi
        bootefi ${kernel_addr_r}


#Building the RFC modified GRUB
        mkdir /home/user/Desktop/grub-rfc
        cd /home/user/Desktop/grub-rfc
        git clone git://git.savannah.gnu.org/grub.git
        #modifying grub/include/grub/efi/pe32.h 
        cd grub && ./bootstrap && ./configure --target=arm-linux-gnueabihf 
--with-platform=efi --prefix=/home/user/Desktop/grub-rfc/ && make -j 8 && make 
install
        cd ..
        /home/user/Desktop/grub-rfc/bin/grub-mkstandalone -o bootarm-rfc.efi -O 
arm-efi --directory /home/user/Desktop/grub-rfc/lib/grub/arm-efi
        #placing the file into an ESP and doing and image of it, named 
esp-rfc-arm.img

#Running it on QEMU :
        qemu-system-arm -M virt -m 512 -net none -monitor none -parallel none 
-L U-BOOT -bios u-boot.bin -drive format=raw,file=esp-rfc-arm.img

#Once inside QEMU :
        virtio scan
        load virtio 0:1 ${kernel_addr_r} EFI/boot/bootarm-rfc.efi
        bootefi ${kernel_addr_r}

=> Works with modified grub/include/grub/efi/pe32.h.
#arm-efi build (after having the patches applied)
cd grub && ./bootstrap && ./configure --target=arm-linux-gnueabihf 
--with-platform=efi --prefix=/home/user/Desktop/grub-arm-32/ && make -j 8 && 
make install && /home/user/Desktop/grub-arm-32/bin/grub-mkstandalone -o 
bootarm.efi -O arm-efi --directory 
/home/user/Desktop/grub-arm-32/lib/grub/arm-efi/

#arm64-efi build (after having the patches applied)
cd grub && ./bootstrap && ./configure --target=aarch64-linux-gnu 
--with-platform=efi --prefix=/home/user/Desktop/grub-arm-64/ && make -j 8 && 
make install && /home/user/Desktop/grub-arm-64/bin/grub-mkstandalone -o 
bootaa64.efi -O arm64-efi --directory 
/home/user/Desktop/grub-arm-64/lib/grub/arm64-efi/

#i386-efi build (after having the patches applied)
cd grub && ./bootstrap && ./configure --target=i386 --with-platform=efi 
--prefix=/home/user/Desktop/grub-x86_32/ && make -j 8 && make install && 
/home/user/Desktop/grub-x86_32/bin/grub-mkstandalone -o bootia32.efi -O 
i386-efi --directory /home/user/Desktop/grub-x86_32/lib/grub/i386-efi/

#x86_64-efi build (after having the patches applied)
cd grub && ./bootstrap && ./configure --target=x86_64 --with-platform=efi 
--prefix=/home/user/Desktop/grub-x86_64/ && make -j 8 && make install && 
/home/user/Desktop/grub-x86_64/bin/grub-mkstandalone -o bootx64.efi -O 
x86_64-efi --directory /home/user/Desktop/grub-x86_64/lib/grub/x86_64-efi/

#Placed the 4 bootXXX.efi files into /EFI/boot/bootXXX.efi of an USB stick 
(GPT, fat32, marked EFI System Paritition)
#Used it for physical hardware, and made an image of it 
(grub-efi-esp-arm-intel-32-64.img) for QEMU tests

#arm-efi test :
qemu-system-arm -M virt -m 512 -net none -monitor none -parallel none -L 
./arm-efi -bios AAVMF32_CODE_buster.fd -drive 
format=raw,file=../grub-efi-esp-arm-intel-32-64.img
qemu-system-arm -M virt -m 512 -net none -monitor none -parallel none -L 
./arm-efi -bios AAVMF32_CODE_experimental.fd -drive 
format=raw,file=../grub-efi-esp-arm-intel-32-64.img
qemu-system-arm -M virt -m 512 -net none -monitor none -parallel none -L 
./arm-efi -bios QEMU_EFI_ARM_AKEO.fd -drive 
format=raw,file=../grub-efi-esp-arm-intel-32-64.img
qemu-system-arm -M virt -m 512 -net none -monitor none -parallel none -L 
./arm-efi -bios QEMU_EFI_ARM_DEBUG.fd -drive 
format=raw,file=../grub-efi-esp-arm-intel-32-64.img
qemu-system-arm -M virt -m 512 -net none -monitor none -parallel none -L 
./arm-efi -bios QEMU_EFI_ARM_RELEASE.fd -drive 
format=raw,file=../grub-efi-esp-arm-intel-32-64.img
qemu-system-arm -M virt -m 512 -net none -monitor none -parallel none -L 
./arm-efi -bios u-boot.bin -drive 
format=raw,file=../grub-efi-esp-arm-intel-32-64.img


#arm64-efi test :
qemu-system-aarch64 -M virt -cpu cortex-a57 -m 2048 -monitor none -parallel 
none -L ./arm64-efi -bios AAVMF_CODE_buster.fd -drive 
format=raw,file=../grub-efi-esp-arm-intel-32-64.img
qemu-system-aarch64 -M virt -cpu cortex-a57 -m 2048 -monitor none -parallel 
none -L ./arm64-efi -bios AAVMF_CODE_experimental.fd -drive 
format=raw,file=../grub-efi-esp-arm-intel-32-64.img
qemu-system-aarch64 -M virt -cpu cortex-a57 -m 2048 -monitor none -parallel 
none -L ./arm64-efi -bios QEMU_EFI_AA64_AKEO.fd -drive 
format=raw,file=../grub-efi-esp-arm-intel-32-64.img
qemu-system-aarch64 -M virt -cpu cortex-a57 -m 2048 -monitor none -parallel 
none -L ./arm64-efi -bios QEMU_EFI_AA64_buster.fd -drive 
format=raw,file=../grub-efi-esp-arm-intel-32-64.img
qemu-system-aarch64 -M virt -cpu cortex-a57 -m 2048 -monitor none -parallel 
none -L ./arm64-efi -bios QEMU_EFI_AA64_experimental.fd -drive 
format=raw,file=../grub-efi-esp-arm-intel-32-64.img
qemu-system-aarch64 -M virt -cpu cortex-a57 -m 2048 -monitor none -parallel 
none -L ./arm64-efi -bios QEMU_EFI_AA64_DEBUG.fd -drive 
format=raw,file=../grub-efi-esp-arm-intel-32-64.img
qemu-system-aarch64 -M virt -cpu cortex-a57 -m 2048 -monitor none -parallel 
none -L ./arm64-efi -bios QEMU_EFI_AA64_RELEASE.fd -drive 
format=raw,file=../grub-efi-esp-arm-intel-32-64.img

#i386-efi test :
qemu-system-i386 -m 2048 -smp 4 -L ./i386-efi -bios OVMF-pure-efi.fd -vga 
virtio -drive format=raw,file=../grub-efi-esp-arm-intel-32-64.img

#x86_64-efi test :
qemu-system-x86_64 -m 2048 -smp 4 -L /usr/share/ovmf -bios OVMF.fd -vga virtio 
-drive format=raw,file=../grub-efi-esp-arm-intel-32-64.img
_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/grub-devel

Reply via email to