10ae76531SDavid Feng /* 20ae76531SDavid Feng * (C) Copyright 2013 30ae76531SDavid Feng * David Feng <fenghua@phytium.com.cn> 40ae76531SDavid Feng * 50ae76531SDavid Feng * SPDX-License-Identifier: GPL-2.0+ 60ae76531SDavid Feng */ 70ae76531SDavid Feng 80ae76531SDavid Feng #include <common.h> 90ae76531SDavid Feng #include <linux/compiler.h> 1064982915SAlexander Graf #include <efi_loader.h> 1158d85a14SJoseph Chen #include <iomem.h> 12*d554a7b2SJoseph Chen #include <stacktrace.h> 130ae76531SDavid Feng 145e076729SPeng Fan DECLARE_GLOBAL_DATA_PTR; 15f4fc5f8dSKever Yang #if defined(CONFIG_SPL_BUILD) || !defined(CONFIG_IRQ) 165e076729SPeng Fan 170ae76531SDavid Feng int interrupt_init(void) 180ae76531SDavid Feng { 190ae76531SDavid Feng return 0; 200ae76531SDavid Feng } 210ae76531SDavid Feng 220ae76531SDavid Feng void enable_interrupts(void) 230ae76531SDavid Feng { 240ae76531SDavid Feng return; 250ae76531SDavid Feng } 260ae76531SDavid Feng 270ae76531SDavid Feng int disable_interrupts(void) 280ae76531SDavid Feng { 290ae76531SDavid Feng return 0; 300ae76531SDavid Feng } 31fa40f8a0SJoseph Chen #endif 320ae76531SDavid Feng 33faa7eb0fSJoseph Chen #if (!defined(CONFIG_SPL_BUILD) && !defined(CONFIG_TPL_BUILD)) 34faa7eb0fSJoseph Chen #define REG_BITS(val, shift, mask) (((val) >> (shift)) & (mask)) 35faa7eb0fSJoseph Chen 36faa7eb0fSJoseph Chen void show_regs(struct pt_regs *regs) 37faa7eb0fSJoseph Chen { 38faa7eb0fSJoseph Chen int i; 39faa7eb0fSJoseph Chen int el = current_el(); 40faa7eb0fSJoseph Chen const char *h_scr_name[] = { 41faa7eb0fSJoseph Chen [2] = "HCR_EL2", 42faa7eb0fSJoseph Chen [3] = "SCR_EL3", 43faa7eb0fSJoseph Chen }; 44faa7eb0fSJoseph Chen const char *esr_bits_ec[] = { 45faa7eb0fSJoseph Chen [0] = "EC[31:26] == 000000, Exception with an unknown reason", 46faa7eb0fSJoseph Chen [1] = "EC[31:26] == 000001, Exception from a WFI or WFE instruction", 47faa7eb0fSJoseph Chen [3] = "EC[31:26] == 000011, Exception from an MCR or MRC access", 48faa7eb0fSJoseph Chen [4] = "EC[31:26] == 000100, Exception from an MCRR or MRRC access", 49faa7eb0fSJoseph Chen [5] = "EC[31:26] == 000101, Exception from an MCR or MRC access", 50faa7eb0fSJoseph Chen [6] = "EC[31:26] == 000110, Exception from an LDC or STC access to CP14", 51faa7eb0fSJoseph Chen [7] = "EC[31:26] == 000111, Exception from an access to an Advanced SIMD or floating-point register, resulting from CPACR_EL1.FPEN or CPTR_ELx.TFP", 52faa7eb0fSJoseph Chen [8] = "EC[31:26] == 001000, Exception from an MCR or MRC access", 53faa7eb0fSJoseph Chen [12] = "EC[31:26] == 001100, Exception from an MCRR or MRRC access", 54faa7eb0fSJoseph Chen [14] = "EC[31:26] == 001110, Exception from an Illegal execution state, or a PC or SP alignment fault", 55faa7eb0fSJoseph Chen [10] = "EC[31:26] == 010001, Exception from HVC or SVC instruction execution", 56faa7eb0fSJoseph Chen [18] = "EC[31:26] == 010010, Exception from HVC or SVC instruction execution", 57faa7eb0fSJoseph Chen [19] = "EC[31:26] == 010011, Exception from SMC instruction execution in AArch32 state", 58faa7eb0fSJoseph Chen [21] = "EC[31:26] == 010101, Exception from HVC or SVC instruction execution", 59faa7eb0fSJoseph Chen [22] = "EC[31:26] == 010110, Exception from HVC or SVC instruction execution", 60faa7eb0fSJoseph Chen [23] = "EC[31:26] == 010111, Exception from SMC instruction execution in AArch64 state", 61faa7eb0fSJoseph Chen [24] = "EC[31:26] == 011000, Exception from MSR, MRS, or System instruction execution in AArch64 state", 62faa7eb0fSJoseph Chen [31] = "EC[31:26] == 011111, IMPLEMENTATION DEFINED exception to EL3", 63faa7eb0fSJoseph Chen [32] = "EC[31:26] == 100000, Exception from an Instruction abort", 64faa7eb0fSJoseph Chen [33] = "EC[31:26] == 100001, Exception from an Instruction abort", 65faa7eb0fSJoseph Chen [34] = "EC[31:26] == 100010, Exception from an Illegal execution state, or a PC or SP alignment fault", 66faa7eb0fSJoseph Chen [36] = "EC[31:26] == 100100, Exception from a Data abort, from lower exception level", 67faa7eb0fSJoseph Chen [37] = "EC[31:26] == 100101, Exception from a Data abort, from current exception level", 68faa7eb0fSJoseph Chen [38] = "EC[31:26] == 100110, Exception from an Illegal execution state, or a PC or SP alignment fault", 69faa7eb0fSJoseph Chen [40] = "EC[31:26] == 101000, Exception from a trapped Floating-point exception", 70faa7eb0fSJoseph Chen [44] = "EC[31:26] == 101100, Exception from a trapped Floating-point exception", 71faa7eb0fSJoseph Chen [47] = "EC[31:26] == 101111, SError interrupt", 72faa7eb0fSJoseph Chen [48] = "EC[31:26] == 110000, Exception from a Breakpoint or Vector Catch debug event", 73faa7eb0fSJoseph Chen [49] = "EC[31:26] == 110001, Exception from a Breakpoint or Vector Catch debug event", 74faa7eb0fSJoseph Chen [50] = "EC[31:26] == 110010, Exception from a Software Step debug event", 75faa7eb0fSJoseph Chen [51] = "EC[31:26] == 110011, Exception from a Software Step debug event", 76faa7eb0fSJoseph Chen [52] = "EC[31:26] == 110100, Exception from a Watchpoint debug event", 77faa7eb0fSJoseph Chen [53] = "EC[31:26] == 110101, Exception from a Watchpoint debug event", 78faa7eb0fSJoseph Chen [56] = "EC[31:26] == 111000, Exception from execution of a Software Breakpoint instructio", 79faa7eb0fSJoseph Chen }; 80faa7eb0fSJoseph Chen const char *esr_bits_il[] = { 81faa7eb0fSJoseph Chen "IL[25] == 0, 16-bit instruction trapped", 82faa7eb0fSJoseph Chen "IL[25] == 1, 32-bit instruction trapped", 83faa7eb0fSJoseph Chen }; 84faa7eb0fSJoseph Chen const char *daif_bits_f[] = { 85faa7eb0fSJoseph Chen "F[6] == 0, FIQ not masked", 86faa7eb0fSJoseph Chen "F[6] == 1, FIQ masked", 87faa7eb0fSJoseph Chen }; 88faa7eb0fSJoseph Chen const char *daif_bits_i[] = { 89faa7eb0fSJoseph Chen "I[7] == 0, IRQ not masked", 90faa7eb0fSJoseph Chen "I[7] == 1, IRQ masked", 91faa7eb0fSJoseph Chen }; 92faa7eb0fSJoseph Chen const char *daif_bits_a[] = { 93faa7eb0fSJoseph Chen "A[8] == 0, ABORT not masked", 94faa7eb0fSJoseph Chen "A[8] == 1, ABORT masked", 95faa7eb0fSJoseph Chen }; 96faa7eb0fSJoseph Chen const char *daif_bits_d[] = { 97faa7eb0fSJoseph Chen "D[9] == 0, DBG not masked", 98faa7eb0fSJoseph Chen "D[9] == 1, DBG masked", 99faa7eb0fSJoseph Chen }; 100faa7eb0fSJoseph Chen const char *spsr_bits_m_aarch32[] = { 101faa7eb0fSJoseph Chen [0] = "M[3:0] == 0000, User", 102faa7eb0fSJoseph Chen [1] = "M[3:0] == 0001, FIQ", 103faa7eb0fSJoseph Chen [2] = "M[3:0] == 0010, IRQ", 104faa7eb0fSJoseph Chen [3] = "M[3:0] == 0011, Supervisor", 105faa7eb0fSJoseph Chen [6] = "M[3:0] == 0110, Monitor", 106faa7eb0fSJoseph Chen [7] = "M[3:0] == 0111, Abort", 107faa7eb0fSJoseph Chen [10] = "M[3:0] == 1010, Hyp", 108faa7eb0fSJoseph Chen [11] = "M[3:0] == 1011, Undefined", 109faa7eb0fSJoseph Chen [15] = "M[3:0] == 1111, System", 110faa7eb0fSJoseph Chen }; 111faa7eb0fSJoseph Chen const char *spsr_bits_m_aarch64[] = { 112faa7eb0fSJoseph Chen [0] = "M[3:0] == 0000, EL0t", 113faa7eb0fSJoseph Chen [4] = "M[3:0] == 0100, EL1t", 114faa7eb0fSJoseph Chen [5] = "M[3:0] == 0101, EL1h", 115faa7eb0fSJoseph Chen [8] = "M[3:0] == 1000, EL2t", 116faa7eb0fSJoseph Chen [9] = "M[3:0] == 1001, EL2h", 117faa7eb0fSJoseph Chen [10] = "M[3:0] == 1100, EL3t", 118faa7eb0fSJoseph Chen [11] = "M[3:0] == 1101, EL3h", 119faa7eb0fSJoseph Chen }; 120faa7eb0fSJoseph Chen const char *spsr_bits_m[] = { 121faa7eb0fSJoseph Chen "M[4] == 0, Exception taken from AArch64", 122faa7eb0fSJoseph Chen "M[4] == 1, Exception taken from AArch32", 123faa7eb0fSJoseph Chen }; 124faa7eb0fSJoseph Chen const char *spsr_bits_f[] = { 125faa7eb0fSJoseph Chen "F[6] == 0, FIQ not masked", 126faa7eb0fSJoseph Chen "F[6] == 1, FIQ masked", 127faa7eb0fSJoseph Chen }; 128faa7eb0fSJoseph Chen const char *spsr_bits_i[] = { 129faa7eb0fSJoseph Chen "I[7] == 0, IRQ not masked", 130faa7eb0fSJoseph Chen "I[7] == 1, IRQ masked", 131faa7eb0fSJoseph Chen }; 132faa7eb0fSJoseph Chen const char *spsr_bits_a[] = { 133faa7eb0fSJoseph Chen "A[8] == 0, ABORT not masked", 134faa7eb0fSJoseph Chen "A[8] == 1, ABORT masked", 135faa7eb0fSJoseph Chen }; 136faa7eb0fSJoseph Chen const char *spsr_bits_d[] = { 137faa7eb0fSJoseph Chen "D[9] == 0, DBG not masked", 138faa7eb0fSJoseph Chen "D[9] == 1, DBG masked", 139faa7eb0fSJoseph Chen }; 140faa7eb0fSJoseph Chen const char *sctlr_bits_i[] = { 141faa7eb0fSJoseph Chen "I[12] == 0, Icache disabled", 142faa7eb0fSJoseph Chen "I[12] == 1, Icaches enabled", 143faa7eb0fSJoseph Chen }; 144faa7eb0fSJoseph Chen const char *sctlr_bits_c[] = { 145faa7eb0fSJoseph Chen "C[2] == 0, Dcache disabled", 146faa7eb0fSJoseph Chen "C[2] == 1, Dcache enabled", 147faa7eb0fSJoseph Chen }; 148faa7eb0fSJoseph Chen const char *sctlr_bits_m[] = { 149faa7eb0fSJoseph Chen "M[0] == 0, MMU disabled", 150faa7eb0fSJoseph Chen "M[0] == 1, MMU enabled", 151faa7eb0fSJoseph Chen }; 152faa7eb0fSJoseph Chen 153faa7eb0fSJoseph Chen printf("* Relocate offset = %016lx\n", gd->reloc_off); 154faa7eb0fSJoseph Chen 155faa7eb0fSJoseph Chen if (gd->flags & GD_FLG_RELOC) { 156faa7eb0fSJoseph Chen printf("* ELR(PC) = %016lx\n", regs->elr - gd->reloc_off); 157faa7eb0fSJoseph Chen printf("* LR = %016lx\n", regs->regs[30] - gd->reloc_off); 158faa7eb0fSJoseph Chen } else { 159faa7eb0fSJoseph Chen printf("* ELR(PC) = %016lx\n", regs->elr); 160faa7eb0fSJoseph Chen printf("* LR = %016lx\n", regs->regs[30]); 161faa7eb0fSJoseph Chen } 162faa7eb0fSJoseph Chen 163faa7eb0fSJoseph Chen printf("* SP = %016lx\n", regs->sp); 164faa7eb0fSJoseph Chen printf("\n"); 165faa7eb0fSJoseph Chen 166faa7eb0fSJoseph Chen /* 167faa7eb0fSJoseph Chen * System registers 168faa7eb0fSJoseph Chen */ 169faa7eb0fSJoseph Chen /* ESR_EL2 */ 170faa7eb0fSJoseph Chen printf("* ESR_EL%d = %016lx\n", el, regs->esr); 171faa7eb0fSJoseph Chen printf("\t%s\n", esr_bits_ec[REG_BITS(regs->esr, 26, 0x3f)]); 172faa7eb0fSJoseph Chen printf("\t%s\n", esr_bits_il[REG_BITS(regs->esr, 25, 0x01)]); 173faa7eb0fSJoseph Chen printf("\n"); 174faa7eb0fSJoseph Chen /* DAIF */ 175faa7eb0fSJoseph Chen printf("* DAIF = %016lx\n", regs->daif); 176faa7eb0fSJoseph Chen printf("\t%s\n", daif_bits_d[REG_BITS(regs->daif, 9, 0x1)]); 177faa7eb0fSJoseph Chen printf("\t%s\n", daif_bits_a[REG_BITS(regs->daif, 8, 0x1)]); 178faa7eb0fSJoseph Chen printf("\t%s\n", daif_bits_i[REG_BITS(regs->daif, 7, 0x1)]); 179faa7eb0fSJoseph Chen printf("\t%s\n", daif_bits_f[REG_BITS(regs->daif, 6, 0x1)]); 180faa7eb0fSJoseph Chen printf("\n"); 181faa7eb0fSJoseph Chen /* SPSR_ELx */ 182faa7eb0fSJoseph Chen printf("* SPSR_EL%d = %016lx\n", el, regs->spsr); 183faa7eb0fSJoseph Chen printf("\t%s\n", spsr_bits_d[REG_BITS(regs->spsr, 9, 0x1)]); 184faa7eb0fSJoseph Chen printf("\t%s\n", spsr_bits_a[REG_BITS(regs->spsr, 8, 0x1)]); 185faa7eb0fSJoseph Chen printf("\t%s\n", spsr_bits_i[REG_BITS(regs->spsr, 7, 0x1)]); 186faa7eb0fSJoseph Chen printf("\t%s\n", spsr_bits_f[REG_BITS(regs->spsr, 6, 0x1)]); 187faa7eb0fSJoseph Chen printf("\t%s\n", spsr_bits_m[REG_BITS(regs->spsr, 4, 0x1)]); 188faa7eb0fSJoseph Chen if (REG_BITS(regs->spsr, 4, 0x1)) 189faa7eb0fSJoseph Chen printf("\t%s\n", spsr_bits_m_aarch32[REG_BITS(regs->spsr, 0, 0xf)]); 190faa7eb0fSJoseph Chen else 191faa7eb0fSJoseph Chen printf("\t%s\n", spsr_bits_m_aarch64[REG_BITS(regs->spsr, 0, 0xf)]); 192faa7eb0fSJoseph Chen printf("\n"); 193faa7eb0fSJoseph Chen /* SCTLR_EL2 */ 194faa7eb0fSJoseph Chen printf("* SCTLR_EL%d = %016lx\n", el, regs->sctlr); 195faa7eb0fSJoseph Chen printf("\t%s\n", sctlr_bits_i[REG_BITS(regs->sctlr, 12, 0x1)]); 196faa7eb0fSJoseph Chen printf("\t%s\n", sctlr_bits_c[REG_BITS(regs->sctlr, 2, 0x1)]); 197faa7eb0fSJoseph Chen printf("\t%s\n", sctlr_bits_m[REG_BITS(regs->sctlr, 0, 0x1)]); 198faa7eb0fSJoseph Chen printf("\n"); 199faa7eb0fSJoseph Chen 200faa7eb0fSJoseph Chen /* Other */ 201faa7eb0fSJoseph Chen if (el >= 2) 202faa7eb0fSJoseph Chen printf("* %s = %016lx\n", h_scr_name[el], regs->hcr); 203faa7eb0fSJoseph Chen printf("* VBAR_EL%d = %016lx\n", el, regs->vbar); 204faa7eb0fSJoseph Chen printf("* TTBR0_EL%d = %016lx\n", el, regs->ttbr0); 205faa7eb0fSJoseph Chen printf("\n"); 206faa7eb0fSJoseph Chen 207faa7eb0fSJoseph Chen for (i = 0; i < 29; i += 2) 208faa7eb0fSJoseph Chen printf("x%-2d: %016lx x%-2d: %016lx\n", 209faa7eb0fSJoseph Chen i, regs->regs[i], i+1, regs->regs[i+1]); 21058d85a14SJoseph Chen 21158d85a14SJoseph Chen printf("\n"); 21258d85a14SJoseph Chen iomem_show("SP", regs->sp, 0x00, 0xfc); 21358d85a14SJoseph Chen 214faa7eb0fSJoseph Chen printf("\n"); 21524cd8f36SJoseph Chen 21624cd8f36SJoseph Chen #ifdef CONFIG_ROCKCHIP_CRASH_DUMP 21724cd8f36SJoseph Chen iomem_show_by_compatible("-cru", 0, 0x400); 21824cd8f36SJoseph Chen iomem_show_by_compatible("-pmucru", 0, 0x400); 21924cd8f36SJoseph Chen iomem_show_by_compatible("-grf", 0, 0x400); 22024cd8f36SJoseph Chen iomem_show_by_compatible("-pmugrf", 0, 0x400); 22124cd8f36SJoseph Chen /* tobe add here ... */ 22224cd8f36SJoseph Chen #endif 223*d554a7b2SJoseph Chen dump_core_stack(regs); 224faa7eb0fSJoseph Chen } 225faa7eb0fSJoseph Chen 226faa7eb0fSJoseph Chen #else 2270ae76531SDavid Feng void show_regs(struct pt_regs *regs) 2280ae76531SDavid Feng { 2290ae76531SDavid Feng int i; 2300ae76531SDavid Feng 2315e076729SPeng Fan if (gd->flags & GD_FLG_RELOC) { 2325e076729SPeng Fan printf("ELR: %lx\n", regs->elr - gd->reloc_off); 2335e076729SPeng Fan printf("LR: %lx\n", regs->regs[30] - gd->reloc_off); 2345e076729SPeng Fan } else { 2350ae76531SDavid Feng printf("ELR: %lx\n", regs->elr); 2360ae76531SDavid Feng printf("LR: %lx\n", regs->regs[30]); 2375e076729SPeng Fan } 2380ae76531SDavid Feng for (i = 0; i < 29; i += 2) 2390ae76531SDavid Feng printf("x%-2d: %016lx x%-2d: %016lx\n", 2400ae76531SDavid Feng i, regs->regs[i], i+1, regs->regs[i+1]); 2410ae76531SDavid Feng printf("\n"); 242*d554a7b2SJoseph Chen 243*d554a7b2SJoseph Chen dump_core_stack(regs); 2440ae76531SDavid Feng } 245faa7eb0fSJoseph Chen #endif 2460ae76531SDavid Feng 2470ae76531SDavid Feng /* 2480ae76531SDavid Feng * do_bad_sync handles the impossible case in the Synchronous Abort vector. 2490ae76531SDavid Feng */ 2500ae76531SDavid Feng void do_bad_sync(struct pt_regs *pt_regs, unsigned int esr) 2510ae76531SDavid Feng { 25264982915SAlexander Graf efi_restore_gd(); 2530ae76531SDavid Feng printf("Bad mode in \"Synchronous Abort\" handler, esr 0x%08x\n", esr); 2540ae76531SDavid Feng show_regs(pt_regs); 2550ae76531SDavid Feng panic("Resetting CPU ...\n"); 2560ae76531SDavid Feng } 2570ae76531SDavid Feng 2580ae76531SDavid Feng /* 2590ae76531SDavid Feng * do_bad_irq handles the impossible case in the Irq vector. 2600ae76531SDavid Feng */ 2610ae76531SDavid Feng void do_bad_irq(struct pt_regs *pt_regs, unsigned int esr) 2620ae76531SDavid Feng { 26364982915SAlexander Graf efi_restore_gd(); 2640ae76531SDavid Feng printf("Bad mode in \"Irq\" handler, esr 0x%08x\n", esr); 2650ae76531SDavid Feng show_regs(pt_regs); 2660ae76531SDavid Feng panic("Resetting CPU ...\n"); 2670ae76531SDavid Feng } 2680ae76531SDavid Feng 2690ae76531SDavid Feng /* 2700ae76531SDavid Feng * do_bad_fiq handles the impossible case in the Fiq vector. 2710ae76531SDavid Feng */ 2720ae76531SDavid Feng void do_bad_fiq(struct pt_regs *pt_regs, unsigned int esr) 2730ae76531SDavid Feng { 27464982915SAlexander Graf efi_restore_gd(); 2750ae76531SDavid Feng printf("Bad mode in \"Fiq\" handler, esr 0x%08x\n", esr); 2760ae76531SDavid Feng show_regs(pt_regs); 2770ae76531SDavid Feng panic("Resetting CPU ...\n"); 2780ae76531SDavid Feng } 2790ae76531SDavid Feng 2800ae76531SDavid Feng /* 2810ae76531SDavid Feng * do_bad_error handles the impossible case in the Error vector. 2820ae76531SDavid Feng */ 2830ae76531SDavid Feng void do_bad_error(struct pt_regs *pt_regs, unsigned int esr) 2840ae76531SDavid Feng { 28564982915SAlexander Graf efi_restore_gd(); 2860ae76531SDavid Feng printf("Bad mode in \"Error\" handler, esr 0x%08x\n", esr); 2870ae76531SDavid Feng show_regs(pt_regs); 2880ae76531SDavid Feng panic("Resetting CPU ...\n"); 2890ae76531SDavid Feng } 2900ae76531SDavid Feng 2910ae76531SDavid Feng /* 2920ae76531SDavid Feng * do_sync handles the Synchronous Abort exception. 2930ae76531SDavid Feng */ 2940ae76531SDavid Feng void do_sync(struct pt_regs *pt_regs, unsigned int esr) 2950ae76531SDavid Feng { 29664982915SAlexander Graf efi_restore_gd(); 2970ae76531SDavid Feng printf("\"Synchronous Abort\" handler, esr 0x%08x\n", esr); 2980ae76531SDavid Feng show_regs(pt_regs); 2990ae76531SDavid Feng panic("Resetting CPU ...\n"); 3000ae76531SDavid Feng } 3010ae76531SDavid Feng 302f4fc5f8dSKever Yang #if defined(CONFIG_SPL_BUILD) || !defined(CONFIG_IRQ) 3030ae76531SDavid Feng /* 3040ae76531SDavid Feng * do_irq handles the Irq exception. 3050ae76531SDavid Feng */ 3060ae76531SDavid Feng void do_irq(struct pt_regs *pt_regs, unsigned int esr) 3070ae76531SDavid Feng { 30864982915SAlexander Graf efi_restore_gd(); 3090ae76531SDavid Feng printf("\"Irq\" handler, esr 0x%08x\n", esr); 3100ae76531SDavid Feng show_regs(pt_regs); 3110ae76531SDavid Feng panic("Resetting CPU ...\n"); 3120ae76531SDavid Feng } 313fa40f8a0SJoseph Chen #endif 3140ae76531SDavid Feng 3150ae76531SDavid Feng /* 3160ae76531SDavid Feng * do_fiq handles the Fiq exception. 3170ae76531SDavid Feng */ 3180ae76531SDavid Feng void do_fiq(struct pt_regs *pt_regs, unsigned int esr) 3190ae76531SDavid Feng { 32064982915SAlexander Graf efi_restore_gd(); 3210ae76531SDavid Feng printf("\"Fiq\" handler, esr 0x%08x\n", esr); 3220ae76531SDavid Feng show_regs(pt_regs); 3230ae76531SDavid Feng panic("Resetting CPU ...\n"); 3240ae76531SDavid Feng } 3250ae76531SDavid Feng 3260ae76531SDavid Feng /* 3270ae76531SDavid Feng * do_error handles the Error exception. 3280ae76531SDavid Feng * Errors are more likely to be processor specific, 3290ae76531SDavid Feng * it is defined with weak attribute and can be redefined 3300ae76531SDavid Feng * in processor specific code. 3310ae76531SDavid Feng */ 3320ae76531SDavid Feng void __weak do_error(struct pt_regs *pt_regs, unsigned int esr) 3330ae76531SDavid Feng { 33464982915SAlexander Graf efi_restore_gd(); 3350ae76531SDavid Feng printf("\"Error\" handler, esr 0x%08x\n", esr); 3360ae76531SDavid Feng show_regs(pt_regs); 3370ae76531SDavid Feng panic("Resetting CPU ...\n"); 3380ae76531SDavid Feng } 339