[U-Boot] [PATCH 1/1] x86: show UEFI images involved in crash

Heinrich Schuchardt xypron.glpk at gmx.de
Tue Aug 27 02:43:08 UTC 2019


On 8/27/19 3:18 AM, Bin Meng wrote:
> Hi Heinrich,
>
> On Tue, Aug 27, 2019 at 1:26 AM Heinrich Schuchardt <xypron.glpk at gmx.de> wrote:
>>
>> On 8/26/19 8:13 AM, Bin Meng wrote:
>>> Hi Heinrich,
>>>
>>> On Mon, Aug 26, 2019 at 1:55 AM Heinrich Schuchardt <xypron.glpk at gmx.de> wrote:
>>>>
>>>> If a crash occurs, show the loaded UEFI images to facilitate analysis.
>>>>
>>>> This is an example output:
>>>>
>>>> => bootefi 0x1000000
>>>> Found 0 disks
>>>> Hello world of bugs!
>>>> Invalid Opcode (Undefined Opcode)
>>>> EIP: 0010:[<06ceb06e>] EFLAGS: 00010206
>>>> Original EIP :[<fec9906e>]
>>>> EAX: 00000000 EBX: 06cec000 ECX: 00000fd0 EDX: 00000001
>>>> ESI: 06ced18a EDI: 07d0fe10 EBP: 07fe27a0 ESP: 07d0fde0
>>>>    DS: 0018 ES: 0018 FS: 0020 GS: 0018 SS: 0018
>>>> CR0: 00000033 CR2: 00000000 CR3: 00000000 CR4: 00000000
>>>> DR0: 00000000 DR1: 00000000 DR2: 00000000 DR3: 00000000
>>>> DR6: ffff0ff0 DR7: 00000400
>>>> Stack:
>>>>       0x07d0fde8 : 0x00000000
>>>>       0x07d0fde4 : 0x06ced040
>>>> --->0x07d0fde0 : 0x07fe27a0
>>>>       0x07d0fddc : 0x00010206
>>>>       0x07d0fdd8 : 0x00000010
>>>>       0x07d0fdd4 : 0x06ceb06e
>>>> UEFI image [0x06cea000:0x06cf0fff] pc=0x106e '/bug-i386.efi'
>>>> ### ERROR ### Please RESET the board ###
>>>>
>>>> With the additional information provided by this patch we know that the
>>>> problem occurred 0x106e after the load address of bug-i386.efi.
>>>>
>>>> Signed-off-by: Heinrich Schuchardt <xypron.glpk at gmx.de>
>>>> ---
>>>>    arch/x86/cpu/i386/interrupt.c | 14 ++++++++++++++
>>>>    1 file changed, 14 insertions(+)
>>>>
>>>> diff --git a/arch/x86/cpu/i386/interrupt.c b/arch/x86/cpu/i386/interrupt.c
>>>> index 47df3172b7..1445204878 100644
>>>> --- a/arch/x86/cpu/i386/interrupt.c
>>>> +++ b/arch/x86/cpu/i386/interrupt.c
>>>> @@ -12,6 +12,7 @@
>>>>
>>>>    #include <common.h>
>>>>    #include <dm.h>
>>>> +#include <efi_loader.h>
>>>>    #include <asm/control_regs.h>
>>>>    #include <asm/i8259.h>
>>>>    #include <asm/interrupt.h>
>>>> @@ -64,6 +65,18 @@ static char *exceptions[] = {
>>>>           "Reserved"
>>>>    };
>>>>
>>>> +/**
>>>> + * show_efi_loaded_images() - show loaded UEFI images
>>>> + *
>>>> + * List all loaded UEFI images.
>>>> + *
>>>> + * @eip:       instruction pointer
>>>> + */
>>>> +static void show_efi_loaded_images(uintptr_t eip)
>>>> +{
>>>> +       efi_print_image_infos((void *)eip);
>>>> +}
>>>> +
>>>>    static void dump_regs(struct irq_regs *regs)
>>>>    {
>>>>           unsigned long cs, eip, eflags;
>>>> @@ -144,6 +157,7 @@ static void dump_regs(struct irq_regs *regs)
>>>>                   printf("0x%8.8lx : 0x%8.8lx\n", sp, (ulong)readl(sp));
>>>>                   sp -= 4;
>>>>           }
>>>> +       show_efi_loaded_images(eip);
>>>
>>> Should we wrap the call with #ifdef CONFIG_EFI_LOADER or something?
>>
>> In include/efi_loader.h we have
>>
>> static inline void efi_print_image_infos(void *pc) { }
>>
>> if EFI_LOADER is not defined.
>>
>> Best regards
>>
>
> I feel a little bit strange of show_efi_loaded_images() being called
> in the dump_regs(). The dump_regs() is called in the exception
> handler. It's a bit odd we show the EFI image info in the exception
> handler. Shouldn't we print the EFI image info from the command line
> interface?

We have a command to  display loaded images from the command line
(efidebug images). But when a crash occurs in an UEFI application, I
cannot reach the command line anymore.

When running complex UEFI applications like the SCT multiple UEFI images
are involved with loading addresses which I cannot control from the
command line. So it is hard to find out where a crash occurred.

For ARM we already have the same information in crash dumps.

If not UEFI image is loaded, no line is added to the crash dump.

Best regards

Heinrich



More information about the U-Boot mailing list