]> git.karo-electronics.de Git - karo-tx-uboot.git/blobdiff - arch/arm/lib/interrupts_64.c
arm64: print pre-relocation addresses in register dump
[karo-tx-uboot.git] / arch / arm / lib / interrupts_64.c
index b4767225564f97627ac39f09137206a5e1c0bbcf..17807822158423ab23c44c66fafacb95fa13bee9 100644 (file)
@@ -7,7 +7,9 @@
 
 #include <common.h>
 #include <linux/compiler.h>
+#include <efi_loader.h>
 
+DECLARE_GLOBAL_DATA_PTR;
 
 int interrupt_init(void)
 {
@@ -28,8 +30,15 @@ void show_regs(struct pt_regs *regs)
 {
        int i;
 
-       printf("ELR:     %lx\n", regs->elr);
-       printf("LR:      %lx\n", regs->regs[30]);
+       if (gd->flags & GD_FLG_RELOC) {
+               printf("ELR:     %08lx (pre-reloc: %08lx)\n",
+                       regs->elr, regs->elr - gd->reloc_off);
+               printf("LR:      %08lx (pre-reloc: %08lx)\n",
+                       regs->regs[30], regs->regs[30] - gd->reloc_off);
+       } else {
+               printf("ELR:     %08lx\n", regs->elr);
+               printf("LR:      %08lx\n", regs->regs[30]);
+       }
        for (i = 0; i < 29; i += 2)
                printf("x%-2d: %016lx x%-2d: %016lx\n",
                       i, regs->regs[i], i+1, regs->regs[i+1]);
@@ -41,6 +50,7 @@ void show_regs(struct pt_regs *regs)
  */
 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);
        panic("Resetting CPU ...\n");
@@ -51,6 +61,7 @@ void do_bad_sync(struct pt_regs *pt_regs, unsigned int esr)
  */
 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);
        panic("Resetting CPU ...\n");
@@ -61,6 +72,7 @@ void do_bad_irq(struct pt_regs *pt_regs, unsigned int esr)
  */
 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);
        panic("Resetting CPU ...\n");
@@ -71,6 +83,7 @@ void do_bad_fiq(struct pt_regs *pt_regs, unsigned int esr)
  */
 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);
        panic("Resetting CPU ...\n");
@@ -81,6 +94,7 @@ void do_bad_error(struct pt_regs *pt_regs, unsigned int esr)
  */
 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);
        panic("Resetting CPU ...\n");
@@ -91,6 +105,7 @@ void do_sync(struct pt_regs *pt_regs, unsigned int esr)
  */
 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);
        panic("Resetting CPU ...\n");
@@ -101,6 +116,7 @@ void do_irq(struct pt_regs *pt_regs, unsigned int esr)
  */
 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);
        panic("Resetting CPU ...\n");
@@ -114,6 +130,7 @@ void do_fiq(struct pt_regs *pt_regs, unsigned int esr)
  */
 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);
        panic("Resetting CPU ...\n");