blob: dffdf57aa2029127e2e856f141e035f793ccc69b [file] [log] [blame]
Tom Rini10e47792018-05-06 17:58:06 -04001// SPDX-License-Identifier: GPL-2.0+
David Feng85fd5f12013-12-14 11:47:35 +08002/*
3 * (C) Copyright 2013
4 * David Feng <fenghua@phytium.com.cn>
David Feng85fd5f12013-12-14 11:47:35 +08005 */
6
7#include <common.h>
Simon Glass9b61c7c2019-11-14 12:57:41 -07008#include <irq_func.h>
David Feng85fd5f12013-12-14 11:47:35 +08009#include <linux/compiler.h>
Alexander Graf58177862016-03-04 01:10:06 +010010#include <efi_loader.h>
David Feng85fd5f12013-12-14 11:47:35 +080011
Peng Fanc3c9b332017-11-28 10:08:08 +080012DECLARE_GLOBAL_DATA_PTR;
David Feng85fd5f12013-12-14 11:47:35 +080013
14int interrupt_init(void)
15{
16 return 0;
17}
18
19void enable_interrupts(void)
20{
21 return;
22}
23
24int disable_interrupts(void)
25{
26 return 0;
27}
28
Heinrich Schuchardtb7c0c382019-04-04 22:06:25 +020029static void show_efi_loaded_images(struct pt_regs *regs)
30{
31 efi_print_image_infos((void *)regs->elr);
32}
33
Heinrich Schuchardt11efc1a2019-09-12 19:09:26 +020034static 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
David Feng85fd5f12013-12-14 11:47:35 +080045void show_regs(struct pt_regs *regs)
46{
47 int i;
48
Karl Beldanb33ccd12018-02-20 23:30:08 +000049 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
David Feng85fd5f12013-12-14 11:47:35 +080055 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");
Heinrich Schuchardt11efc1a2019-09-12 19:09:26 +020059 dump_instr(regs);
David Feng85fd5f12013-12-14 11:47:35 +080060}
61
62/*
63 * do_bad_sync handles the impossible case in the Synchronous Abort vector.
64 */
65void do_bad_sync(struct pt_regs *pt_regs, unsigned int esr)
66{
Alexander Graf58177862016-03-04 01:10:06 +010067 efi_restore_gd();
David Feng85fd5f12013-12-14 11:47:35 +080068 printf("Bad mode in \"Synchronous Abort\" handler, esr 0x%08x\n", esr);
69 show_regs(pt_regs);
Heinrich Schuchardtb7c0c382019-04-04 22:06:25 +020070 show_efi_loaded_images(pt_regs);
David Feng85fd5f12013-12-14 11:47:35 +080071 panic("Resetting CPU ...\n");
72}
73
74/*
75 * do_bad_irq handles the impossible case in the Irq vector.
76 */
77void do_bad_irq(struct pt_regs *pt_regs, unsigned int esr)
78{
Alexander Graf58177862016-03-04 01:10:06 +010079 efi_restore_gd();
David Feng85fd5f12013-12-14 11:47:35 +080080 printf("Bad mode in \"Irq\" handler, esr 0x%08x\n", esr);
81 show_regs(pt_regs);
Heinrich Schuchardtb7c0c382019-04-04 22:06:25 +020082 show_efi_loaded_images(pt_regs);
David Feng85fd5f12013-12-14 11:47:35 +080083 panic("Resetting CPU ...\n");
84}
85
86/*
87 * do_bad_fiq handles the impossible case in the Fiq vector.
88 */
89void do_bad_fiq(struct pt_regs *pt_regs, unsigned int esr)
90{
Alexander Graf58177862016-03-04 01:10:06 +010091 efi_restore_gd();
David Feng85fd5f12013-12-14 11:47:35 +080092 printf("Bad mode in \"Fiq\" handler, esr 0x%08x\n", esr);
93 show_regs(pt_regs);
Heinrich Schuchardtb7c0c382019-04-04 22:06:25 +020094 show_efi_loaded_images(pt_regs);
David Feng85fd5f12013-12-14 11:47:35 +080095 panic("Resetting CPU ...\n");
96}
97
98/*
99 * do_bad_error handles the impossible case in the Error vector.
100 */
101void do_bad_error(struct pt_regs *pt_regs, unsigned int esr)
102{
Alexander Graf58177862016-03-04 01:10:06 +0100103 efi_restore_gd();
David Feng85fd5f12013-12-14 11:47:35 +0800104 printf("Bad mode in \"Error\" handler, esr 0x%08x\n", esr);
105 show_regs(pt_regs);
Heinrich Schuchardtb7c0c382019-04-04 22:06:25 +0200106 show_efi_loaded_images(pt_regs);
David Feng85fd5f12013-12-14 11:47:35 +0800107 panic("Resetting CPU ...\n");
108}
109
110/*
111 * do_sync handles the Synchronous Abort exception.
112 */
113void do_sync(struct pt_regs *pt_regs, unsigned int esr)
114{
Alexander Graf58177862016-03-04 01:10:06 +0100115 efi_restore_gd();
David Feng85fd5f12013-12-14 11:47:35 +0800116 printf("\"Synchronous Abort\" handler, esr 0x%08x\n", esr);
117 show_regs(pt_regs);
Heinrich Schuchardtb7c0c382019-04-04 22:06:25 +0200118 show_efi_loaded_images(pt_regs);
David Feng85fd5f12013-12-14 11:47:35 +0800119 panic("Resetting CPU ...\n");
120}
121
122/*
123 * do_irq handles the Irq exception.
124 */
125void do_irq(struct pt_regs *pt_regs, unsigned int esr)
126{
Alexander Graf58177862016-03-04 01:10:06 +0100127 efi_restore_gd();
David Feng85fd5f12013-12-14 11:47:35 +0800128 printf("\"Irq\" handler, esr 0x%08x\n", esr);
129 show_regs(pt_regs);
Heinrich Schuchardtb7c0c382019-04-04 22:06:25 +0200130 show_efi_loaded_images(pt_regs);
David Feng85fd5f12013-12-14 11:47:35 +0800131 panic("Resetting CPU ...\n");
132}
133
134/*
135 * do_fiq handles the Fiq exception.
136 */
137void do_fiq(struct pt_regs *pt_regs, unsigned int esr)
138{
Alexander Graf58177862016-03-04 01:10:06 +0100139 efi_restore_gd();
David Feng85fd5f12013-12-14 11:47:35 +0800140 printf("\"Fiq\" handler, esr 0x%08x\n", esr);
141 show_regs(pt_regs);
Heinrich Schuchardtb7c0c382019-04-04 22:06:25 +0200142 show_efi_loaded_images(pt_regs);
David Feng85fd5f12013-12-14 11:47:35 +0800143 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 */
152void __weak do_error(struct pt_regs *pt_regs, unsigned int esr)
153{
Alexander Graf58177862016-03-04 01:10:06 +0100154 efi_restore_gd();
David Feng85fd5f12013-12-14 11:47:35 +0800155 printf("\"Error\" handler, esr 0x%08x\n", esr);
156 show_regs(pt_regs);
Heinrich Schuchardtb7c0c382019-04-04 22:06:25 +0200157 show_efi_loaded_images(pt_regs);
David Feng85fd5f12013-12-14 11:47:35 +0800158 panic("Resetting CPU ...\n");
159}