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

Bin Meng bmeng.cn at gmail.com
Tue Aug 27 01:18:20 UTC 2019


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?

Regards,
Bin


More information about the U-Boot mailing list