]>
Commit | Line | Data |
---|---|---|
74f4304e WD |
1 | /* |
2 | * (C) Copyright 2003 | |
3 | * Texas Instruments <www.ti.com> | |
4 | * | |
5 | * (C) Copyright 2002 | |
6 | * Sysgo Real-Time Solutions, GmbH <www.elinos.com> | |
7 | * Marius Groeger <mgroeger@sysgo.de> | |
8 | * | |
9 | * (C) Copyright 2002 | |
10 | * Sysgo Real-Time Solutions, GmbH <www.elinos.com> | |
11 | * Alex Zuepke <azu@sysgo.de> | |
12 | * | |
13 | * (C) Copyright 2002-2004 | |
792a09eb | 14 | * Gary Jennejohn, DENX Software Engineering, <garyj@denx.de> |
74f4304e WD |
15 | * |
16 | * (C) Copyright 2004 | |
17 | * Philippe Robin, ARM Ltd. <philippe.robin@arm.com> | |
18 | * | |
3765b3e7 | 19 | * SPDX-License-Identifier: GPL-2.0+ |
74f4304e WD |
20 | */ |
21 | ||
22 | #include <common.h> | |
23 | #include <asm/proc-armv/ptrace.h> | |
49c4bc3a | 24 | #include <asm/u-boot-arm.h> |
cc4a4748 | 25 | #include <efi_loader.h> |
74f4304e | 26 | |
c358d9c3 JCPV |
27 | DECLARE_GLOBAL_DATA_PTR; |
28 | ||
f1d2b313 HS |
29 | int interrupt_init (void) |
30 | { | |
31 | /* | |
32 | * setup up stacks if necessary | |
33 | */ | |
34 | IRQ_STACK_START_IN = gd->irq_sp + 8; | |
35 | ||
36 | return 0; | |
37 | } | |
f1d2b313 | 38 | |
74f4304e WD |
39 | void enable_interrupts (void) |
40 | { | |
41 | return; | |
42 | } | |
43 | int disable_interrupts (void) | |
44 | { | |
45 | return 0; | |
46 | } | |
74f4304e WD |
47 | |
48 | void bad_mode (void) | |
49 | { | |
50 | panic ("Resetting CPU ...\n"); | |
51 | reset_cpu (0); | |
52 | } | |
53 | ||
54 | void show_regs (struct pt_regs *regs) | |
55 | { | |
80402f34 HS |
56 | unsigned long __maybe_unused flags; |
57 | const char __maybe_unused *processor_modes[] = { | |
74f4304e WD |
58 | "USER_26", "FIQ_26", "IRQ_26", "SVC_26", |
59 | "UK4_26", "UK5_26", "UK6_26", "UK7_26", | |
60 | "UK8_26", "UK9_26", "UK10_26", "UK11_26", | |
61 | "UK12_26", "UK13_26", "UK14_26", "UK15_26", | |
62 | "USER_32", "FIQ_32", "IRQ_32", "SVC_32", | |
63 | "UK4_32", "UK5_32", "UK6_32", "ABT_32", | |
b726d22d | 64 | "UK8_32", "UK9_32", "HYP_32", "UND_32", |
74f4304e WD |
65 | "UK12_32", "UK13_32", "UK14_32", "SYS_32", |
66 | }; | |
67 | ||
68 | flags = condition_codes (regs); | |
69 | ||
23d184d2 SG |
70 | printf("pc : [<%08lx>] lr : [<%08lx>]\n", |
71 | instruction_pointer(regs), regs->ARM_lr); | |
72 | if (gd->flags & GD_FLG_RELOC) { | |
73 | printf("reloc pc : [<%08lx>] lr : [<%08lx>]\n", | |
74 | instruction_pointer(regs) - gd->reloc_off, | |
75 | regs->ARM_lr - gd->reloc_off); | |
76 | } | |
77 | printf("sp : %08lx ip : %08lx fp : %08lx\n", | |
78 | regs->ARM_sp, regs->ARM_ip, regs->ARM_fp); | |
6d0943a6 | 79 | printf ("r10: %08lx r9 : %08lx r8 : %08lx\n", |
74f4304e | 80 | regs->ARM_r10, regs->ARM_r9, regs->ARM_r8); |
6d0943a6 | 81 | printf ("r7 : %08lx r6 : %08lx r5 : %08lx r4 : %08lx\n", |
74f4304e | 82 | regs->ARM_r7, regs->ARM_r6, regs->ARM_r5, regs->ARM_r4); |
6d0943a6 | 83 | printf ("r3 : %08lx r2 : %08lx r1 : %08lx r0 : %08lx\n", |
74f4304e WD |
84 | regs->ARM_r3, regs->ARM_r2, regs->ARM_r1, regs->ARM_r0); |
85 | printf ("Flags: %c%c%c%c", | |
86 | flags & CC_N_BIT ? 'N' : 'n', | |
87 | flags & CC_Z_BIT ? 'Z' : 'z', | |
88 | flags & CC_C_BIT ? 'C' : 'c', flags & CC_V_BIT ? 'V' : 'v'); | |
89 | printf (" IRQs %s FIQs %s Mode %s%s\n", | |
90 | interrupts_enabled (regs) ? "on" : "off", | |
91 | fast_interrupts_enabled (regs) ? "on" : "off", | |
92 | processor_modes[processor_mode (regs)], | |
93 | thumb_mode (regs) ? " (T)" : ""); | |
94 | } | |
95 | ||
c8882361 LW |
96 | /* fixup PC to point to the instruction leading to the exception */ |
97 | static inline void fixup_pc(struct pt_regs *regs, int offset) | |
98 | { | |
99 | uint32_t pc = instruction_pointer(regs) + offset; | |
100 | regs->ARM_pc = pc | (regs->ARM_pc & PCMASK); | |
101 | } | |
102 | ||
74f4304e WD |
103 | void do_undefined_instruction (struct pt_regs *pt_regs) |
104 | { | |
cc4a4748 | 105 | efi_restore_gd(); |
74f4304e | 106 | printf ("undefined instruction\n"); |
c8882361 | 107 | fixup_pc(pt_regs, -4); |
74f4304e WD |
108 | show_regs (pt_regs); |
109 | bad_mode (); | |
110 | } | |
111 | ||
112 | void do_software_interrupt (struct pt_regs *pt_regs) | |
113 | { | |
cc4a4748 | 114 | efi_restore_gd(); |
74f4304e | 115 | printf ("software interrupt\n"); |
c8882361 | 116 | fixup_pc(pt_regs, -4); |
74f4304e WD |
117 | show_regs (pt_regs); |
118 | bad_mode (); | |
119 | } | |
120 | ||
121 | void do_prefetch_abort (struct pt_regs *pt_regs) | |
122 | { | |
cc4a4748 | 123 | efi_restore_gd(); |
74f4304e | 124 | printf ("prefetch abort\n"); |
c8882361 | 125 | fixup_pc(pt_regs, -8); |
74f4304e WD |
126 | show_regs (pt_regs); |
127 | bad_mode (); | |
128 | } | |
129 | ||
130 | void do_data_abort (struct pt_regs *pt_regs) | |
131 | { | |
cc4a4748 | 132 | efi_restore_gd(); |
1551df35 | 133 | printf ("data abort\n"); |
c8882361 | 134 | fixup_pc(pt_regs, -8); |
74f4304e WD |
135 | show_regs (pt_regs); |
136 | bad_mode (); | |
137 | } | |
138 | ||
139 | void do_not_used (struct pt_regs *pt_regs) | |
140 | { | |
cc4a4748 | 141 | efi_restore_gd(); |
74f4304e | 142 | printf ("not used\n"); |
c8882361 | 143 | fixup_pc(pt_regs, -8); |
74f4304e WD |
144 | show_regs (pt_regs); |
145 | bad_mode (); | |
146 | } | |
147 | ||
148 | void do_fiq (struct pt_regs *pt_regs) | |
149 | { | |
cc4a4748 | 150 | efi_restore_gd(); |
74f4304e | 151 | printf ("fast interrupt request\n"); |
c8882361 | 152 | fixup_pc(pt_regs, -8); |
74f4304e WD |
153 | show_regs (pt_regs); |
154 | bad_mode (); | |
155 | } | |
156 | ||
157 | void do_irq (struct pt_regs *pt_regs) | |
158 | { | |
cc4a4748 | 159 | efi_restore_gd(); |
74f4304e | 160 | printf ("interrupt request\n"); |
c8882361 | 161 | fixup_pc(pt_regs, -8); |
74f4304e WD |
162 | show_regs (pt_regs); |
163 | bad_mode (); | |
164 | } |