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