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

Heinrich Schuchardt xypron.glpk at gmx.de
Tue Aug 27 06:14:35 UTC 2019


On 8/27/19 4:48 AM, Bin Meng wrote:
> Hi Heinrich,
>
> On Tue, Aug 27, 2019 at 10:43 AM Heinrich Schuchardt <xypron.glpk at gmx.de> wrote:
>>
>> 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.
>
> OK, could you please provide a sample EFI image of such to trigger the
> issue? I would like to have a test.

You can elicit the output with

=> setenv efi_selftest exception
=> bootefi selftest

Best regards

Heinrich


More information about the U-Boot mailing list