• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  * (C) Copyright 2013
4  * David Feng <fenghua@phytium.com.cn>
5  */
6 
7 #include <common.h>
8 #include <irq_func.h>
9 #include <linux/compiler.h>
10 #include <efi_loader.h>
11 
12 DECLARE_GLOBAL_DATA_PTR;
13 
interrupt_init(void)14 int interrupt_init(void)
15 {
16 	return 0;
17 }
18 
enable_interrupts(void)19 void enable_interrupts(void)
20 {
21 	return;
22 }
23 
disable_interrupts(void)24 int disable_interrupts(void)
25 {
26 	return 0;
27 }
28 
show_efi_loaded_images(struct pt_regs * regs)29 static void show_efi_loaded_images(struct pt_regs *regs)
30 {
31 	efi_print_image_infos((void *)regs->elr);
32 }
33 
dump_instr(struct pt_regs * regs)34 static void dump_instr(struct pt_regs *regs)
35 {
36 	u32 *addr = (u32 *)(regs->elr & ~3UL);
37 	int i;
38 
39 	printf("Code: ");
40 	for (i = -4; i < 1; i++)
41 		printf(i == 0 ? "(%08x) " : "%08x ", addr[i]);
42 	printf("\n");
43 }
44 
show_regs(struct pt_regs * regs)45 void show_regs(struct pt_regs *regs)
46 {
47 	int i;
48 
49 	if (gd->flags & GD_FLG_RELOC)
50 		printf("elr: %016lx lr : %016lx (reloc)\n",
51 		       regs->elr - gd->reloc_off,
52 		       regs->regs[30] - gd->reloc_off);
53 	printf("elr: %016lx lr : %016lx\n", regs->elr, regs->regs[30]);
54 
55 	for (i = 0; i < 29; i += 2)
56 		printf("x%-2d: %016lx x%-2d: %016lx\n",
57 		       i, regs->regs[i], i+1, regs->regs[i+1]);
58 	printf("\n");
59 	dump_instr(regs);
60 }
61 
62 /*
63  * do_bad_sync handles the impossible case in the Synchronous Abort vector.
64  */
do_bad_sync(struct pt_regs * pt_regs,unsigned int esr)65 void do_bad_sync(struct pt_regs *pt_regs, unsigned int esr)
66 {
67 	efi_restore_gd();
68 	printf("Bad mode in \"Synchronous Abort\" handler, esr 0x%08x\n", esr);
69 	show_regs(pt_regs);
70 	show_efi_loaded_images(pt_regs);
71 	panic("Resetting CPU ...\n");
72 }
73 
74 /*
75  * do_bad_irq handles the impossible case in the Irq vector.
76  */
do_bad_irq(struct pt_regs * pt_regs,unsigned int esr)77 void do_bad_irq(struct pt_regs *pt_regs, unsigned int esr)
78 {
79 	efi_restore_gd();
80 	printf("Bad mode in \"Irq\" handler, esr 0x%08x\n", esr);
81 	show_regs(pt_regs);
82 	show_efi_loaded_images(pt_regs);
83 	panic("Resetting CPU ...\n");
84 }
85 
86 /*
87  * do_bad_fiq handles the impossible case in the Fiq vector.
88  */
do_bad_fiq(struct pt_regs * pt_regs,unsigned int esr)89 void do_bad_fiq(struct pt_regs *pt_regs, unsigned int esr)
90 {
91 	efi_restore_gd();
92 	printf("Bad mode in \"Fiq\" handler, esr 0x%08x\n", esr);
93 	show_regs(pt_regs);
94 	show_efi_loaded_images(pt_regs);
95 	panic("Resetting CPU ...\n");
96 }
97 
98 /*
99  * do_bad_error handles the impossible case in the Error vector.
100  */
do_bad_error(struct pt_regs * pt_regs,unsigned int esr)101 void do_bad_error(struct pt_regs *pt_regs, unsigned int esr)
102 {
103 	efi_restore_gd();
104 	printf("Bad mode in \"Error\" handler, esr 0x%08x\n", esr);
105 	show_regs(pt_regs);
106 	show_efi_loaded_images(pt_regs);
107 	panic("Resetting CPU ...\n");
108 }
109 
110 /*
111  * do_sync handles the Synchronous Abort exception.
112  */
do_sync(struct pt_regs * pt_regs,unsigned int esr)113 void do_sync(struct pt_regs *pt_regs, unsigned int esr)
114 {
115 	efi_restore_gd();
116 	printf("\"Synchronous Abort\" handler, esr 0x%08x\n", esr);
117 	show_regs(pt_regs);
118 	show_efi_loaded_images(pt_regs);
119 	panic("Resetting CPU ...\n");
120 }
121 
122 /*
123  * do_irq handles the Irq exception.
124  */
do_irq(struct pt_regs * pt_regs,unsigned int esr)125 void do_irq(struct pt_regs *pt_regs, unsigned int esr)
126 {
127 	efi_restore_gd();
128 	printf("\"Irq\" handler, esr 0x%08x\n", esr);
129 	show_regs(pt_regs);
130 	show_efi_loaded_images(pt_regs);
131 	panic("Resetting CPU ...\n");
132 }
133 
134 /*
135  * do_fiq handles the Fiq exception.
136  */
do_fiq(struct pt_regs * pt_regs,unsigned int esr)137 void do_fiq(struct pt_regs *pt_regs, unsigned int esr)
138 {
139 	efi_restore_gd();
140 	printf("\"Fiq\" handler, esr 0x%08x\n", esr);
141 	show_regs(pt_regs);
142 	show_efi_loaded_images(pt_regs);
143 	panic("Resetting CPU ...\n");
144 }
145 
146 /*
147  * do_error handles the Error exception.
148  * Errors are more likely to be processor specific,
149  * it is defined with weak attribute and can be redefined
150  * in processor specific code.
151  */
do_error(struct pt_regs * pt_regs,unsigned int esr)152 void __weak do_error(struct pt_regs *pt_regs, unsigned int esr)
153 {
154 	efi_restore_gd();
155 	printf("\"Error\" handler, esr 0x%08x\n", esr);
156 	show_regs(pt_regs);
157 	show_efi_loaded_images(pt_regs);
158 	panic("Resetting CPU ...\n");
159 }
160