From mboxrd@z Thu Jan 1 00:00:00 1970 From: AKASHI Takahiro Date: Thu, 11 Apr 2019 14:07:32 +0900 Subject: [U-Boot] [PATCH 1/1] arm: print information about loaded UEFI images In-Reply-To: <6815f44b-e9dd-bafc-3542-098c3dbda8e2@gmx.de> References: <20190404202347.17041-1-xypron.glpk@gmx.de> <20190409013136.GB21650@linaro.org> <6815f44b-e9dd-bafc-3542-098c3dbda8e2@gmx.de> Message-ID: <20190411050731.GB7158@linaro.org> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de On Tue, Apr 09, 2019 at 06:02:05AM +0200, Heinrich Schuchardt wrote: > On 4/9/19 3:31 AM, AKASHI Takahiro wrote: > > On Thu, Apr 04, 2019 at 10:23:47PM +0200, Heinrich Schuchardt wrote: > >> If an exception occurs in a UEFI loaded image we need the start address of > >> the image to determine the relocation offset. > >> > >> This patch adds the necessary lines after the registers in the crash dump > >> for armv8. A possible output would be: > >> > >> UEFI image [0x00000000bffe6000:0x00000000bffe631f] pc=0x138 '/\snp.efi' > >> > >> With the offset 0x138 we can now find the relevant instruction in the > > > > 'pc' is misleading, it is just an offset from the start address of > > loaded image (reloc_base, in this case, 0xbffe6000). Why do we need this > > field? > > Yes, this is the position of the program counter (pc) where the failure > occurred relative to the start of the image. As described above you need > this offset to find the violating code in the objdump output of your EFI > image. > > You could of cause calculate the offset by hand from the other available > information. As we already show addresses relative to gc->reloc_off it > seems to be consistent to show the program counter relative to the > loaded image address here. > > If you have a better idea for a label than "pc" I am open to your > suggestion but this would be a patch for efi_print_image_infos() and > does not directly relate to the current patch. crash at 0x138 in [0x00000000bffe6000:0x00000000bffe631f] '/\snp.efi' or crash at 0x00000000bffe6000+0x138 in '/\snp.efi' Adding function name would be better, back trace of stack would be much better. I know no way. -Takahiro Akashi > Best regards > > Heinrich > > > > > -Takahiro Akashi > > > >> disassembled 'snp.efi' binary. > >> > >> Signed-off-by: Heinrich Schuchardt > >> --- > >> arch/arm/lib/interrupts_64.c | 13 +++++++++++++ > >> 1 file changed, 13 insertions(+) > >> > >> diff --git a/arch/arm/lib/interrupts_64.c b/arch/arm/lib/interrupts_64.c > >> index 458319ab48..0bfdb8d93d 100644 > >> --- a/arch/arm/lib/interrupts_64.c > >> +++ b/arch/arm/lib/interrupts_64.c > >> @@ -25,6 +25,11 @@ int disable_interrupts(void) > >> return 0; > >> } > >> > >> +static void show_efi_loaded_images(struct pt_regs *regs) > >> +{ > >> + efi_print_image_infos((void *)regs->elr); > >> +} > >> + > >> void show_regs(struct pt_regs *regs) > >> { > >> int i; > >> @@ -49,6 +54,7 @@ void do_bad_sync(struct pt_regs *pt_regs, unsigned int esr) > >> efi_restore_gd(); > >> printf("Bad mode in \"Synchronous Abort\" handler, esr 0x%08x\n", esr); > >> show_regs(pt_regs); > >> + show_efi_loaded_images(pt_regs); > >> panic("Resetting CPU ...\n"); > >> } > >> > >> @@ -60,6 +66,7 @@ void do_bad_irq(struct pt_regs *pt_regs, unsigned int esr) > >> efi_restore_gd(); > >> printf("Bad mode in \"Irq\" handler, esr 0x%08x\n", esr); > >> show_regs(pt_regs); > >> + show_efi_loaded_images(pt_regs); > >> panic("Resetting CPU ...\n"); > >> } > >> > >> @@ -71,6 +78,7 @@ void do_bad_fiq(struct pt_regs *pt_regs, unsigned int esr) > >> efi_restore_gd(); > >> printf("Bad mode in \"Fiq\" handler, esr 0x%08x\n", esr); > >> show_regs(pt_regs); > >> + show_efi_loaded_images(pt_regs); > >> panic("Resetting CPU ...\n"); > >> } > >> > >> @@ -82,6 +90,7 @@ void do_bad_error(struct pt_regs *pt_regs, unsigned int esr) > >> efi_restore_gd(); > >> printf("Bad mode in \"Error\" handler, esr 0x%08x\n", esr); > >> show_regs(pt_regs); > >> + show_efi_loaded_images(pt_regs); > >> panic("Resetting CPU ...\n"); > >> } > >> > >> @@ -93,6 +102,7 @@ void do_sync(struct pt_regs *pt_regs, unsigned int esr) > >> efi_restore_gd(); > >> printf("\"Synchronous Abort\" handler, esr 0x%08x\n", esr); > >> show_regs(pt_regs); > >> + show_efi_loaded_images(pt_regs); > >> panic("Resetting CPU ...\n"); > >> } > >> > >> @@ -104,6 +114,7 @@ void do_irq(struct pt_regs *pt_regs, unsigned int esr) > >> efi_restore_gd(); > >> printf("\"Irq\" handler, esr 0x%08x\n", esr); > >> show_regs(pt_regs); > >> + show_efi_loaded_images(pt_regs); > >> panic("Resetting CPU ...\n"); > >> } > >> > >> @@ -115,6 +126,7 @@ void do_fiq(struct pt_regs *pt_regs, unsigned int esr) > >> efi_restore_gd(); > >> printf("\"Fiq\" handler, esr 0x%08x\n", esr); > >> show_regs(pt_regs); > >> + show_efi_loaded_images(pt_regs); > >> panic("Resetting CPU ...\n"); > >> } > >> > >> @@ -129,5 +141,6 @@ void __weak do_error(struct pt_regs *pt_regs, unsigned int esr) > >> efi_restore_gd(); > >> printf("\"Error\" handler, esr 0x%08x\n", esr); > >> show_regs(pt_regs); > >> + show_efi_loaded_images(pt_regs); > >> panic("Resetting CPU ...\n"); > >> } > >> -- > >> 2.20.1 > >> > > >