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