xref: /rk3399_rockchip-uboot/arch/arm/lib/interrupts_64.c (revision d554a7b28ef6e524d1edf0db3236b5ae0d6a0d48)
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