blob: a32a4b68684764423fd480a03d7705d3aa2f955f [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>
8#include <linux/compiler.h>
Alexander Graf58177862016-03-04 01:10:06 +01009#include <efi_loader.h>
David Feng85fd5f12013-12-14 11:47:35 +080010
Peng Fanc3c9b332017-11-28 10:08:08 +080011DECLARE_GLOBAL_DATA_PTR;
David Feng85fd5f12013-12-14 11:47:35 +080012
13int interrupt_init(void)
14{
15 return 0;
16}
17
18void enable_interrupts(void)
19{
20 return;
21}
22
23int disable_interrupts(void)
24{
25 return 0;
26}
27
Heinrich Schuchardtb7c0c382019-04-04 22:06:25 +020028static void show_efi_loaded_images(struct pt_regs *regs)
29{
30 efi_print_image_infos((void *)regs->elr);
31}
32
Heinrich Schuchardt11efc1a2019-09-12 19:09:26 +020033static void dump_instr(struct pt_regs *regs)
34{
35 u32 *addr = (u32 *)(regs->elr & ~3UL);
36 int i;
37
38 printf("Code: ");
39 for (i = -4; i < 1; i++)
40 printf(i == 0 ? "(%08x) " : "%08x ", addr[i]);
41 printf("\n");
42}
43
David Feng85fd5f12013-12-14 11:47:35 +080044void show_regs(struct pt_regs *regs)
45{
46 int i;
47
Karl Beldanb33ccd12018-02-20 23:30:08 +000048 if (gd->flags & GD_FLG_RELOC)
49 printf("elr: %016lx lr : %016lx (reloc)\n",
50 regs->elr - gd->reloc_off,
51 regs->regs[30] - gd->reloc_off);
52 printf("elr: %016lx lr : %016lx\n", regs->elr, regs->regs[30]);
53
David Feng85fd5f12013-12-14 11:47:35 +080054 for (i = 0; i < 29; i += 2)
55 printf("x%-2d: %016lx x%-2d: %016lx\n",
56 i, regs->regs[i], i+1, regs->regs[i+1]);
57 printf("\n");
Heinrich Schuchardt11efc1a2019-09-12 19:09:26 +020058 dump_instr(regs);
David Feng85fd5f12013-12-14 11:47:35 +080059}
60
61/*
62 * do_bad_sync handles the impossible case in the Synchronous Abort vector.
63 */
64void do_bad_sync(struct pt_regs *pt_regs, unsigned int esr)
65{
Alexander Graf58177862016-03-04 01:10:06 +010066 efi_restore_gd();
David Feng85fd5f12013-12-14 11:47:35 +080067 printf("Bad mode in \"Synchronous Abort\" handler, esr 0x%08x\n", esr);
68 show_regs(pt_regs);
Heinrich Schuchardtb7c0c382019-04-04 22:06:25 +020069 show_efi_loaded_images(pt_regs);
David Feng85fd5f12013-12-14 11:47:35 +080070 panic("Resetting CPU ...\n");
71}
72
73/*
74 * do_bad_irq handles the impossible case in the Irq vector.
75 */
76void do_bad_irq(struct pt_regs *pt_regs, unsigned int esr)
77{
Alexander Graf58177862016-03-04 01:10:06 +010078 efi_restore_gd();
David Feng85fd5f12013-12-14 11:47:35 +080079 printf("Bad mode in \"Irq\" handler, esr 0x%08x\n", esr);
80 show_regs(pt_regs);
Heinrich Schuchardtb7c0c382019-04-04 22:06:25 +020081 show_efi_loaded_images(pt_regs);
David Feng85fd5f12013-12-14 11:47:35 +080082 panic("Resetting CPU ...\n");
83}
84
85/*
86 * do_bad_fiq handles the impossible case in the Fiq vector.
87 */
88void do_bad_fiq(struct pt_regs *pt_regs, unsigned int esr)
89{
Alexander Graf58177862016-03-04 01:10:06 +010090 efi_restore_gd();
David Feng85fd5f12013-12-14 11:47:35 +080091 printf("Bad mode in \"Fiq\" handler, esr 0x%08x\n", esr);
92 show_regs(pt_regs);
Heinrich Schuchardtb7c0c382019-04-04 22:06:25 +020093 show_efi_loaded_images(pt_regs);
David Feng85fd5f12013-12-14 11:47:35 +080094 panic("Resetting CPU ...\n");
95}
96
97/*
98 * do_bad_error handles the impossible case in the Error vector.
99 */
100void do_bad_error(struct pt_regs *pt_regs, unsigned int esr)
101{
Alexander Graf58177862016-03-04 01:10:06 +0100102 efi_restore_gd();
David Feng85fd5f12013-12-14 11:47:35 +0800103 printf("Bad mode in \"Error\" handler, esr 0x%08x\n", esr);
104 show_regs(pt_regs);
Heinrich Schuchardtb7c0c382019-04-04 22:06:25 +0200105 show_efi_loaded_images(pt_regs);
David Feng85fd5f12013-12-14 11:47:35 +0800106 panic("Resetting CPU ...\n");
107}
108
109/*
110 * do_sync handles the Synchronous Abort exception.
111 */
112void do_sync(struct pt_regs *pt_regs, unsigned int esr)
113{
Alexander Graf58177862016-03-04 01:10:06 +0100114 efi_restore_gd();
David Feng85fd5f12013-12-14 11:47:35 +0800115 printf("\"Synchronous Abort\" handler, esr 0x%08x\n", esr);
116 show_regs(pt_regs);
Heinrich Schuchardtb7c0c382019-04-04 22:06:25 +0200117 show_efi_loaded_images(pt_regs);
David Feng85fd5f12013-12-14 11:47:35 +0800118 panic("Resetting CPU ...\n");
119}
120
121/*
122 * do_irq handles the Irq exception.
123 */
124void do_irq(struct pt_regs *pt_regs, unsigned int esr)
125{
Alexander Graf58177862016-03-04 01:10:06 +0100126 efi_restore_gd();
David Feng85fd5f12013-12-14 11:47:35 +0800127 printf("\"Irq\" handler, esr 0x%08x\n", esr);
128 show_regs(pt_regs);
Heinrich Schuchardtb7c0c382019-04-04 22:06:25 +0200129 show_efi_loaded_images(pt_regs);
David Feng85fd5f12013-12-14 11:47:35 +0800130 panic("Resetting CPU ...\n");
131}
132
133/*
134 * do_fiq handles the Fiq exception.
135 */
136void do_fiq(struct pt_regs *pt_regs, unsigned int esr)
137{
Alexander Graf58177862016-03-04 01:10:06 +0100138 efi_restore_gd();
David Feng85fd5f12013-12-14 11:47:35 +0800139 printf("\"Fiq\" handler, esr 0x%08x\n", esr);
140 show_regs(pt_regs);
Heinrich Schuchardtb7c0c382019-04-04 22:06:25 +0200141 show_efi_loaded_images(pt_regs);
David Feng85fd5f12013-12-14 11:47:35 +0800142 panic("Resetting CPU ...\n");
143}
144
145/*
146 * do_error handles the Error exception.
147 * Errors are more likely to be processor specific,
148 * it is defined with weak attribute and can be redefined
149 * in processor specific code.
150 */
151void __weak do_error(struct pt_regs *pt_regs, unsigned int esr)
152{
Alexander Graf58177862016-03-04 01:10:06 +0100153 efi_restore_gd();
David Feng85fd5f12013-12-14 11:47:35 +0800154 printf("\"Error\" handler, esr 0x%08x\n", esr);
155 show_regs(pt_regs);
Heinrich Schuchardtb7c0c382019-04-04 22:06:25 +0200156 show_efi_loaded_images(pt_regs);
David Feng85fd5f12013-12-14 11:47:35 +0800157 panic("Resetting CPU ...\n");
158}