source: mainline/kernel/arch/ia64/src/interrupt.c@ c8ea4a8b

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since c8ea4a8b was 11675207, checked in by jermar <jermar@…>, 17 years ago

Move everything to kernel/.

  • Property mode set to 100644
File size: 7.1 KB
Line 
1/*
2 * Copyright (C) 2005 Jakub Jermar
3 * Copyright (C) 2005 Jakub Vana
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 *
10 * - Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * - Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 * - The name of the author may not be used to endorse or promote products
16 * derived from this software without specific prior written permission.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
19 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
20 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
21 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
22 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
23 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 */
29
30/** @addtogroup ia64interrupt
31 * @{
32 */
33/** @file
34 */
35
36#include <arch/interrupt.h>
37#include <panic.h>
38#include <print.h>
39#include <console/console.h>
40#include <arch/types.h>
41#include <arch/asm.h>
42#include <arch/barrier.h>
43#include <arch/register.h>
44#include <arch/drivers/it.h>
45#include <arch.h>
46#include <symtab.h>
47#include <debug.h>
48#include <syscall/syscall.h>
49#include <print.h>
50#include <proc/scheduler.h>
51#include <ipc/sysipc.h>
52#include <ipc/irq.h>
53#include <ipc/ipc.h>
54#include <interrupt.h>
55
56
57#define VECTORS_64_BUNDLE 20
58#define VECTORS_16_BUNDLE 48
59#define VECTORS_16_BUNDLE_START 0x5000
60#define VECTOR_MAX 0x7f00
61
62#define BUNDLE_SIZE 16
63
64
65char *vector_names_64_bundle[VECTORS_64_BUNDLE] = {
66 "VHPT Translation vector",
67 "Instruction TLB vector",
68 "Data TLB vector",
69 "Alternate Instruction TLB vector",
70 "Alternate Data TLB vector",
71 "Data Nested TLB vector",
72 "Instruction Key Miss vector",
73 "Data Key Miss vector",
74 "Dirty-Bit vector",
75 "Instruction Access-Bit vector",
76 "Data Access-Bit vector"
77 "Break Instruction vector",
78 "External Interrupt vector"
79 "Reserved",
80 "Reserved",
81 "Reserved",
82 "Reserved",
83 "Reserved",
84 "Reserved",
85 "Reserved"
86};
87
88char *vector_names_16_bundle[VECTORS_16_BUNDLE] = {
89 "Page Not Present vector",
90 "Key Permission vector",
91 "Instruction Access rights vector",
92 "Data Access Rights vector",
93 "General Exception vector",
94 "Disabled FP-Register vector",
95 "NaT Consumption vector",
96 "Speculation vector",
97 "Reserved",
98 "Debug vector",
99 "Unaligned Reference vector",
100 "Unsupported Data Reference vector",
101 "Floating-point Fault vector",
102 "Floating-point Trap vector",
103 "Lower-Privilege Transfer Trap vector",
104 "Taken Branch Trap vector",
105 "Single STep Trap vector",
106 "Reserved",
107 "Reserved",
108 "Reserved",
109 "Reserved",
110 "Reserved",
111 "Reserved",
112 "Reserved",
113 "Reserved",
114 "IA-32 Exception vector",
115 "IA-32 Intercept vector",
116 "IA-32 Interrupt vector",
117 "Reserved",
118 "Reserved",
119 "Reserved"
120};
121
122static char *vector_to_string(uint16_t vector);
123static void dump_interrupted_context(istate_t *istate);
124
125char *vector_to_string(uint16_t vector)
126{
127 ASSERT(vector <= VECTOR_MAX);
128
129 if (vector >= VECTORS_16_BUNDLE_START)
130 return vector_names_16_bundle[(vector-VECTORS_16_BUNDLE_START)/(16*BUNDLE_SIZE)];
131 else
132 return vector_names_64_bundle[vector/(64*BUNDLE_SIZE)];
133}
134
135void dump_interrupted_context(istate_t *istate)
136{
137 char *ifa, *iipa, *iip;
138
139 ifa = get_symtab_entry(istate->cr_ifa);
140 iipa = get_symtab_entry(istate->cr_iipa);
141 iip = get_symtab_entry(istate->cr_iip);
142
143 putchar('\n');
144 printf("Interrupted context dump:\n");
145 printf("ar.bsp=%p\tar.bspstore=%p\n", istate->ar_bsp, istate->ar_bspstore);
146 printf("ar.rnat=%#018llx\tar.rsc=%#018llx\n", istate->ar_rnat, istate->ar_rsc);
147 printf("ar.ifs=%#018llx\tar.pfs=%#018llx\n", istate->ar_ifs, istate->ar_pfs);
148 printf("cr.isr=%#018llx\tcr.ipsr=%#018llx\t\n", istate->cr_isr.value, istate->cr_ipsr);
149
150 printf("cr.iip=%#018llx, #%d\t(%s)\n", istate->cr_iip, istate->cr_isr.ei, iip);
151 printf("cr.iipa=%#018llx\t(%s)\n", istate->cr_iipa, iipa);
152 printf("cr.ifa=%#018llx\t(%s)\n", istate->cr_ifa, ifa);
153}
154
155void general_exception(uint64_t vector, istate_t *istate)
156{
157 char *desc = "";
158
159 switch (istate->cr_isr.ge_code) {
160 case GE_ILLEGALOP:
161 desc = "Illegal Operation fault";
162 break;
163 case GE_PRIVOP:
164 desc = "Privileged Operation fault";
165 break;
166 case GE_PRIVREG:
167 desc = "Privileged Register fault";
168 break;
169 case GE_RESREGFLD:
170 desc = "Reserved Register/Field fault";
171 break;
172 case GE_DISBLDISTRAN:
173 desc = "Disabled Instruction Set Transition fault";
174 break;
175 case GE_ILLEGALDEP:
176 desc = "Illegal Dependency fault";
177 break;
178 default:
179 desc = "unknown";
180 break;
181 }
182
183 fault_if_from_uspace(istate, "General Exception (%s)", desc);
184
185 dump_interrupted_context(istate);
186 panic("General Exception (%s)\n", desc);
187}
188
189void fpu_enable(void);
190
191void disabled_fp_register(uint64_t vector, istate_t *istate)
192{
193#ifdef CONFIG_FPU_LAZY
194 scheduler_fpu_lazy_request();
195#else
196 fault_if_from_uspace(istate, "Interruption: %#hx (%s)", (uint16_t) vector, vector_to_string(vector));
197 dump_interrupted_context(istate);
198 panic("Interruption: %#hx (%s)\n", (uint16_t) vector, vector_to_string(vector));
199#endif
200}
201
202
203void nop_handler(uint64_t vector, istate_t *istate)
204{
205}
206
207
208
209/** Handle syscall. */
210int break_instruction(uint64_t vector, istate_t *istate)
211{
212 /*
213 * Move to next instruction after BREAK.
214 */
215 if (istate->cr_ipsr.ri == 2) {
216 istate->cr_ipsr.ri = 0;
217 istate->cr_iip += 16;
218 } else {
219 istate->cr_ipsr.ri++;
220 }
221
222 if (istate->in4 < SYSCALL_END)
223 return syscall_table[istate->in4](istate->in0, istate->in1, istate->in2, istate->in3);
224 else
225 panic("Undefined syscall %d", istate->in4);
226
227 return -1;
228}
229
230void universal_handler(uint64_t vector, istate_t *istate)
231{
232 fault_if_from_uspace(istate,"Interruption: %#hx (%s)\n",(uint16_t) vector, vector_to_string(vector));
233 dump_interrupted_context(istate);
234 panic("Interruption: %#hx (%s)\n", (uint16_t) vector, vector_to_string(vector));
235}
236
237void external_interrupt(uint64_t vector, istate_t *istate)
238{
239 cr_ivr_t ivr;
240
241 ivr.value = ivr_read();
242 srlz_d();
243
244 switch(ivr.vector) {
245 case INTERRUPT_TIMER:
246 it_interrupt();
247 break;
248 case INTERRUPT_SPURIOUS:
249 printf("cpu%d: spurious interrupt\n", CPU->id);
250 break;
251 default:
252 panic("\nUnhandled External Interrupt Vector %d\n", ivr.vector);
253 break;
254 }
255}
256
257void virtual_interrupt(uint64_t irq,void *param)
258{
259 switch(irq) {
260 case IRQ_KBD:
261 if(kbd_uspace) ipc_irq_send_notif(irq);
262 break;
263 default:
264 panic("\nUnhandled Virtual Interrupt request %d\n", irq);
265 break;
266 }
267}
268
269/* Reregister irq to be IPC-ready */
270void irq_ipc_bind_arch(unative_t irq)
271{
272 if(irq==IRQ_KBD) {
273 kbd_uspace=1;
274 return;
275 }
276 return;
277 panic("not implemented\n");
278 /* TODO */
279}
280
281/** @}
282 */
283
Note: See TracBrowser for help on using the repository browser.