On 12/18/18 2:04 PM, Dominik Adamski wrote: > On 12/14/18 9:15 PM, Heinrich Schuchardt wrote: >> On 12/14/18 3:58 PM, Dominik Adamski wrote: >>> On 12/12/18 7:11 PM, Heinrich Schuchardt wrote: >>>> On 12/12/18 3:02 PM, Dominik Adamski wrote: >>>>> Hello, >>>>> I think that I have found a bug in U-Boot UEFI implementation for >>>>> BeagleBone Black board. >>>>> >>>>> I have tested U-Boot UEFI implementation for BeagleBone Black. I am >>>>> able >>>>> to load Linux successfully via GRUB bootloader with U-Boot >>>>> v2018.09-rc2 >>>>> . U-Boot v2018.09-rc3 and above versions cause that the platform >>>>> restarts over and over again. It starts booting, then it loads GRUB >>>>> and >>>>> when GRUB finishes its work an error occurs and the board restarts. >>>>> >>>>> I have looked through U-Boot repository and I have found the commit, >>>>> which breaks booting. It's name is as follows: "efi_loader: update >>>>> runtime services table crc32" (commit ID: >>>>> a39f39cdd8be5cd3e7a8b696a463b621e3d827e0 ) . I have figured out, that >>>>> when I comment out function call: >>>>> efi_update_table_header_crc32(&efi_runtime_services.hdr); in function >>>>> efi_runtime_detach then I am able to launch Linux successfully. >>>>> >>>>> My setup of U-Boot, GRUB and Linux was as follows: >>>>> https://github.com/DominikAdamski/Beaglebone_GRUB_Manual . For U-Boot >>>>> v2018.09 I get following log when booting: >>>>> >>>>> U-Boot 2018.09 (Dec 11 2018 - 11:11:16 +0100) >>>>> >>>>> CPU : AM335X-GP rev 2.1 >>>>> Model: TI AM335x BeagleBone Black >>>>> DRAM: 512 MiB >>>>> NAND: 0 MiB >>>>> MMC: OMAP SD/MMC: 0, OMAP SD/MMC: 1 >>>>> Loading Environment from FAT... *** Warning - bad CRC, using default >>>>> environment >>>>> >>>>> No USB device found >>>>> <ethaddr> not set. Validating first E-fuse MAC >>>>> Net: eth0: ethernet@4a100000 >>>>> Hit any key to stop autoboot: 2 ^H^H^H 1 ^H^H^H 0 >>>>> switch to partitions #0, OK >>>>> mmc0 is current device >>>>> SD/MMC found on device 0 >>>>> ** Unable to read file boot.scr ** >>>>> 85 bytes read in 1 ms (83 KiB/s) >>>>> Loaded env from uEnv.txt >>>>> Importing environment from mmc0 ... >>>>> Running uenvcmd ... >>>>> 403968 bytes read in 28 ms (13.8 MiB/s) >>>>> ^[[18tScanning disks on usb... >>>>> Disk usb0 not ready >>>>> Disk usb1 not ready >>>>> Disk usb2 not ready >>>>> Disk usb3 not ready >>>>> Scanning disks on mmc... >>>>> MMC Device 2 not found >>>>> MMC Device 3 not found >>>>> Found 4 disks >>>>> WARNING: booting without device tree >>>>> ## Starting EFI application at 82000000 ... >>>>> ^[[?25h^[[0;30;47mWelcome to GRUB! >>>>> ^M >>>>> ^M^[[0;37;40m^[[0;37;40m^[[0;37;40mEFI stub: Booting Linux Kernel...^M >>>>> EFI stub: Using DTB from configuration table^M >>>>> EFI stub: Exiting boot services and installing virtual address >>>>> map...^M >>>>> U-Boot EFI: Relocation at 9ff4a8a8 is out of range (2008214f) >>>>> data abort >>>>> pc : [<9ff4a7cc>] lr : [<9ff4a8b9>] >>>>> reloc pc : [<808007cc>] lr : [<808008b9>] >>>>> sp : 9df1ebac ip : 00000020 fp : 00000000 >>>>> r10: 00001000 r9 : 9df29eb8 r8 : 00000028 >>>>> r7 : 9ff4aa10 r6 : 9ff4aec4 r5 : 00000003 r4 : 9ff4aa70 >>>>> r3 : 2002aac0 r2 : 00000050 r1 : 9ff4aa70 r0 : ffffffff >>>>> Flags: NzCv IRQs off FIQs on Mode SVC_32 >>>>> Code: 61204621 f876f000 bd106120 b5f04b36 (b31c681c) >>>>> UEFI image [0x9ceb1000:0x9cf139ff] '/\grub.efi' >>>>> UEFI image [0x94728000:0x9510bfff] >>>>> Resetting CPU ... >>>>> >>>>> resetting ... >>>>> >>>>> Please let me know, if I should add more detailed logs. >>>>> >>>>> Dominik Adamski >>>>> >>>>> >>>> Hello Dominik, >>>> >>>> you refer to an outdated release candidate v2018.09-rc2. >>>> >>>> The following patch is missing in the release candidate: >>>> >>>> commit 483dbab9f9318149e5ea97daacbfae320f53e35a >>>> Author: Heinrich Schuchardt <xypron.g...@gmx.de> >>>> Date: Sun Jul 29 09:49:03 2018 +0200 >>>> >>>> lib: crc32: mark function crc32() as __efi_runtime >>>> >>>> It is contained in the v2018.09 release. Please, update your page >>>> https://github.com/DominikAdamski/Beaglebone_GRUB_Manual accordingly. >>>> >>>> The latest release is v2018.11. Release v2018.11 will require a recent >>>> GRUB (later than patch d0c070179d4d). Or apply the following patch >>>> http://git.denx.de/?p=u-boot.git;a=commit;h=f31239acff61f7def88a06eef1f091fce74ecd61 >>>> >>>> >>>> Revert "efi_loader: remove efi_exit_caches()" >>>> >>>> Best regards >>>> >>>> Heinrich >>> Hello Heinrich, >>> >>> I am resending my mail, because I haven't noticed that I should answer >>> below your response. I am also adding some more information just to be >>> sure, that everything is clear. >>> >>> I have build the newest GRUB from master branch and I have checked out >>> U-Boot with this patch: >>> >>> http://git.denx.de/?p=u-boot.git;a=commit;h=f31239acff61f7def88a06eef1f091fce74ecd61 >>> >>> >>> Revert "efi_loader: remove efi_exit_caches()" >>> >>> and I still get an error while Linux booting : >>> >>> EFI stub: Booting Linux Kernel... >>> EFI stub: Using DTB from configuration table >>> EFI stub: Exiting boot services and installing virtual address map... >>> efi_runtime_relocate: Relocation at 9ff57a20 is out of range (20081092) >>> data abort >>> pc : [<9ff57944>] lr : [<9ff57a31>] >>> reloc pc : [<80800944>] lr : [<80800a31>] >>> sp : 9df2b594 ip : 1f757000 fp : 00000000 >>> r10: 00002000 r9 : 9df36eb8 r8 : 00000028 >>> r7 : 9ff57bc8 r6 : 9ff5807c r5 : 00000003 r4 : 9ff57c28 >>> r3 : 20027c78 r2 : 00000050 r1 : 9ff57c28 r0 : ffffffff >>> Flags: NzCv IRQs off FIQs on Mode SVC_32 >>> Code: 46216120 f876f000 bd106120 4b36b5f0 (b31c681c) >>> UEFI image [0x9cebf000:0x9cf21bff] '/\grub.efi' >>> UEFI image [0x94732000:0x95115fff] >>> Resetting CPU ... >>> >>> resetting ... >>> >>> I can boot Linux only when I remove line: >>> efi_update_table_header_crc32(&efi_runtime_services.hdr); (file >>> lib/efi_loader/efi_runtime.c line: 344 ) . >>> >>> In my manual I referred to version v2018.09-rc2 because it is the last >>> tagged version which works fine on BeagleBone with GRUB. v2018.09 >>> version does not cooperate with GRUB for BB. It restarts BB over and >>> over again. The problem is caused by this patch: >>> >>> commit a39f39cdd8be5cd3e7a8b696a463b621e3d827e0 (HEAD) >>> Author: Heinrich Schuchardt <xypron.g...@gmx.de> >>> Date: Sun Jul 29 09:49:04 2018 +0200 >>> >>> efi_loader: update runtime services table crc32 >>> >>> This patch is a child of the patch, which you have mentioned: >>> >>> commit 483dbab9f9318149e5ea97daacbfae320f53e35a >>> Author: Heinrich Schuchardt <xypron.g...@gmx.de> >>> Date: Sun Jul 29 09:49:03 2018 +0200 >>> >>> lib: crc32: mark function crc32() as __efi_runtime >>> >>> >>> The revert patch which you have mentioned: >>> http://git.denx.de/?p=u-boot.git;a=commit;h=f31239acff61f7def88a06eef1f091fce74ecd61 >>> >>> Revert "efi_loader: remove efi_exit_caches()" does not solve the >>> problem. I can boot Linux only if I revert this patch: >>> >>> commit a39f39cdd8be5cd3e7a8b696a463b621e3d827e0 (HEAD) >>> Author: Heinrich Schuchardt <xypron.g...@gmx.de> >>> Date: Sun Jul 29 09:49:04 2018 +0200 >>> >>> efi_loader: update runtime services table crc32 >>> >>> When I revert the wrong patch ( a39f39cdd8be5cd3e7a8b696a463b621e3d827e0 >>> ), then I can boot Linux with U-Boot sources younger than v2018.09-rc2 . >>> >>> Best regards, >>> Dominik >>> >>> >> Hello Dominik, >> >> the message >> efi_runtime_relocate: Relocation at 9ff57a20 is out of range (20081092) >> looks like a runtime function trying to call a non-runtime function. >> >> Actual addresses depend on compiler versions. >> >> Please, supply the following files to Alex and me for further analysis: >> >> .config >> u-boot.map >> u-boot >> lib/crc32.o >> lib/efi_loader/efi_runtime.o >> >> which match the U-Boot version you use together with the matching error >> output. Please, also provide the output of the U-Boot command line tool >> bdinfo. >> >> Do I understand you right in that the code you compiled is >> commit f31239acff61f7def88a06eef1f091fce74ecd61 with no further patches >> applied and the .config file is generated with am335x_evm_defconfig? >> >> Best regards >> >> Heinrich > > Hello Heinrich, > Yes, my code is commit f31239acff61f7def88a06eef1f091fce74ecd61 with no > further patches applied and the .config file is generated with > am335x_evm_defconfig . > > Here is output of bdinfo command: > > => bdinfo > arch_number = 0x00000e05 > boot_params = 0x80000100 > DRAM bank = 0x00000000 > -> start = 0x80000000 > -> size = 0x20000000 > baudrate = 115200 bps > TLB addr = 0x9fff0000 > relocaddr = 0x9ff57000 > reloc off = 0x1f757000 > irq_sp = 0x9df2bb00 > sp start = 0x9df2baf0 > Early malloc usage: 1fc / 1000 > fdt_blob = 0x9df2bb18 > => > > I attach logs from booting and other files which you have requested. > > Please let me know if you don't receive binary files. > > Best regards, > Dominik >
Hello Dominik, thanks for the files. am335x_evm_defconfig is one of the boards with CONFIG_DYNAMIC_CRC_TABLE=y. Lets analyze the log: efi_runtime_relocate: Relocation at 9ff57a20 is out of range (20081092) data abort pc : [<9ff57944>] lr : [<9ff57a31>] reloc pc : [<80800944>] lr : [<80800a31>] 9ff57a20 - pc + reloc pc = 80800A20. Looking at u-boot.map this is 0xE0 after the start of crc32_to_comp(). In `objdump -S arm-linux-gnueabihf-objdump -S crc32.o' we find these lines: 8080094a: 2601 movs r6, #1 for (n = 0; n < sizeof(p)/sizeof(Byte); n++) 8080094c: 463d mov r5, r7 8080094e: f8df c0d0 ldr.w ip, [pc, #208] ; 80800a20 <crc32_no_comp+0xe0> poly |= 1L << (31 - p[n]); 80800952: f815 400c ldrb.w r4, [r5, ip] 80800956: 3501 adds r5, #1 So the optimization in gcc has inlined function make_crc_table() as it is only used once. 80800a20 holds the pointer to: static const Byte p[] = {0,1,2,4,5,7,8,10,11,12,16,22,23,26}; Please, observe that it is static but not marked as __efi_runtime_data. By chance pointer p contains an odd address and we get a data abort. I will send out a patch now. Could you, please, test it. Thanks for your patience and support to analyze the problem. Best regards Heinrich _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de https://lists.denx.de/listinfo/u-boot