blob: addd26e4e62974ea10c4d74e4f11e2fadc5291b3 [file] [log] [blame]
wdenk2262cfe2002-11-18 00:14:45 +00001/*
Graeme Russdbf71152011-04-13 19:43:26 +10002 * (C) Copyright 2008-2011
3 * Graeme Russ, <graeme.russ@gmail.com>
Graeme Russ564a9982009-11-24 20:04:18 +11004 *
wdenk2262cfe2002-11-18 00:14:45 +00005 * (C) Copyright 2002
Albert ARIBAUDfa82f872011-08-04 18:45:45 +02006 * Daniel Engström, Omicron Ceti AB, <daniel@omicron.se>
wdenk2262cfe2002-11-18 00:14:45 +00007 *
Graeme Russ433ff2b2010-04-24 00:05:38 +10008 * Portions of this file are derived from the Linux kernel source
9 * Copyright (C) 1991, 1992 Linus Torvalds
10 *
Wolfgang Denk1a459662013-07-08 09:37:19 +020011 * SPDX-License-Identifier: GPL-2.0+
wdenk2262cfe2002-11-18 00:14:45 +000012 */
13
14#include <common.h>
Stefan Reinauer095593c2012-12-02 04:49:50 +000015#include <asm/cache.h>
16#include <asm/control_regs.h>
Graeme Russ9933d602008-12-07 10:29:01 +110017#include <asm/interrupt.h>
Graeme Russca56a4c2011-02-12 15:11:28 +110018#include <asm/io.h>
Graeme Russ0c24c9c2011-02-12 15:11:32 +110019#include <asm/processor-flags.h>
Graeme Russ717979f2011-11-08 02:33:13 +000020#include <linux/compiler.h>
Vadim Bendebury7c710342012-12-03 13:59:20 +000021#include <asm/msr.h>
Simon Glass8aba36d2015-07-31 09:31:32 -060022#include <asm/processor.h>
Vadim Bendebury7c710342012-12-03 13:59:20 +000023#include <asm/u-boot-x86.h>
Bin Meng1dae2e02014-11-20 16:11:16 +080024#include <asm/i8259.h>
wdenk2262cfe2002-11-18 00:14:45 +000025
Simon Glass7282d832013-04-17 16:13:33 +000026DECLARE_GLOBAL_DATA_PTR;
27
Graeme Russ564a9982009-11-24 20:04:18 +110028#define DECLARE_INTERRUPT(x) \
29 ".globl irq_"#x"\n" \
Graeme Russ0fc1b492009-11-24 20:04:19 +110030 ".hidden irq_"#x"\n" \
31 ".type irq_"#x", @function\n" \
Graeme Russ564a9982009-11-24 20:04:18 +110032 "irq_"#x":\n" \
Graeme Russ564a9982009-11-24 20:04:18 +110033 "pushl $"#x"\n" \
34 "jmp irq_common_entry\n"
wdenk2262cfe2002-11-18 00:14:45 +000035
Bin Meng3ccd49c2015-07-10 10:51:23 +080036static char *exceptions[] = {
37 "Divide Error",
38 "Debug",
39 "NMI Interrupt",
40 "Breakpoint",
41 "Overflow",
42 "BOUND Range Exceeded",
43 "Invalid Opcode (Undefined Opcode)",
44 "Device Not Avaiable (No Math Coprocessor)",
45 "Double Fault",
46 "Coprocessor Segment Overrun",
47 "Invalid TSS",
48 "Segment Not Present",
49 "Stack Segment Fault",
Simon Glass8aba36d2015-07-31 09:31:32 -060050 "General Protection",
Bin Meng3ccd49c2015-07-10 10:51:23 +080051 "Page Fault",
52 "Reserved",
53 "x87 FPU Floating-Point Error",
54 "Alignment Check",
55 "Machine Check",
56 "SIMD Floating-Point Exception",
57 "Virtualization Exception",
58 "Reserved",
59 "Reserved",
60 "Reserved",
61 "Reserved",
62 "Reserved",
63 "Reserved",
64 "Reserved",
65 "Reserved",
66 "Reserved",
67 "Reserved",
68 "Reserved"
69};
70
Simon Glasse1ffd812014-11-06 13:20:08 -070071static void dump_regs(struct irq_regs *regs)
Graeme Russ433ff2b2010-04-24 00:05:38 +100072{
Bin Meng013cf482015-07-10 10:38:32 +080073 unsigned long cs, eip, eflags;
Graeme Russ433ff2b2010-04-24 00:05:38 +100074 unsigned long cr0 = 0L, cr2 = 0L, cr3 = 0L, cr4 = 0L;
75 unsigned long d0, d1, d2, d3, d6, d7;
Graeme Russca56a4c2011-02-12 15:11:28 +110076 unsigned long sp;
Graeme Russ433ff2b2010-04-24 00:05:38 +100077
Bin Meng013cf482015-07-10 10:38:32 +080078 /*
79 * Some exceptions cause an error code to be saved on the current stack
80 * after the EIP value. We should extract CS/EIP/EFLAGS from different
81 * position on the stack based on the exception number.
82 */
83 switch (regs->irq_id) {
84 case EXC_DF:
85 case EXC_TS:
86 case EXC_NP:
87 case EXC_SS:
88 case EXC_GP:
89 case EXC_PF:
90 case EXC_AC:
91 cs = regs->context.ctx2.xcs;
92 eip = regs->context.ctx2.eip;
93 eflags = regs->context.ctx2.eflags;
94 /* We should fix up the ESP due to error code */
95 regs->esp += 4;
96 break;
97 default:
98 cs = regs->context.ctx1.xcs;
99 eip = regs->context.ctx1.eip;
100 eflags = regs->context.ctx1.eflags;
101 break;
102 }
103
Graeme Russ433ff2b2010-04-24 00:05:38 +1000104 printf("EIP: %04x:[<%08lx>] EFLAGS: %08lx\n",
Bin Meng013cf482015-07-10 10:38:32 +0800105 (u16)cs, eip, eflags);
Simon Glass73995152015-08-10 22:02:54 -0600106 if (gd->flags & GD_FLG_RELOC)
107 printf("Original EIP :[<%08lx>]\n", eip - gd->reloc_off);
Graeme Russ433ff2b2010-04-24 00:05:38 +1000108
109 printf("EAX: %08lx EBX: %08lx ECX: %08lx EDX: %08lx\n",
110 regs->eax, regs->ebx, regs->ecx, regs->edx);
111 printf("ESI: %08lx EDI: %08lx EBP: %08lx ESP: %08lx\n",
112 regs->esi, regs->edi, regs->ebp, regs->esp);
113 printf(" DS: %04x ES: %04x FS: %04x GS: %04x SS: %04x\n",
Graeme Russ717979f2011-11-08 02:33:13 +0000114 (u16)regs->xds, (u16)regs->xes, (u16)regs->xfs,
115 (u16)regs->xgs, (u16)regs->xss);
Graeme Russ433ff2b2010-04-24 00:05:38 +1000116
117 cr0 = read_cr0();
118 cr2 = read_cr2();
119 cr3 = read_cr3();
120 cr4 = read_cr4();
121
122 printf("CR0: %08lx CR2: %08lx CR3: %08lx CR4: %08lx\n",
123 cr0, cr2, cr3, cr4);
124
125 d0 = get_debugreg(0);
126 d1 = get_debugreg(1);
127 d2 = get_debugreg(2);
128 d3 = get_debugreg(3);
129
130 printf("DR0: %08lx DR1: %08lx DR2: %08lx DR3: %08lx\n",
131 d0, d1, d2, d3);
132
133 d6 = get_debugreg(6);
134 d7 = get_debugreg(7);
135 printf("DR6: %08lx DR7: %08lx\n",
136 d6, d7);
Graeme Russca56a4c2011-02-12 15:11:28 +1100137
138 printf("Stack:\n");
139 sp = regs->esp;
140
141 sp += 64;
142
143 while (sp > (regs->esp - 16)) {
144 if (sp == regs->esp)
145 printf("--->");
146 else
147 printf(" ");
148 printf("0x%8.8lx : 0x%8.8lx\n", sp, (ulong)readl(sp));
149 sp -= 4;
150 }
Graeme Russ433ff2b2010-04-24 00:05:38 +1000151}
152
Bin Meng3ccd49c2015-07-10 10:51:23 +0800153static void do_exception(struct irq_regs *regs)
154{
155 printf("%s\n", exceptions[regs->irq_id]);
156 dump_regs(regs);
157 hang();
158}
159
wdenk2262cfe2002-11-18 00:14:45 +0000160struct idt_entry {
161 u16 base_low;
162 u16 selector;
163 u8 res;
164 u8 access;
165 u16 base_high;
Graeme Russ717979f2011-11-08 02:33:13 +0000166} __packed;
wdenk2262cfe2002-11-18 00:14:45 +0000167
Graeme Russ564a9982009-11-24 20:04:18 +1100168struct desc_ptr {
169 unsigned short size;
170 unsigned long address;
Graeme Russ717979f2011-11-08 02:33:13 +0000171} __packed;
wdenk2262cfe2002-11-18 00:14:45 +0000172
Graeme Russ58c7a672011-12-19 14:26:18 +1100173struct idt_entry idt[256] __aligned(16);
wdenk2262cfe2002-11-18 00:14:45 +0000174
Graeme Russ564a9982009-11-24 20:04:18 +1100175struct desc_ptr idt_ptr;
wdenk2262cfe2002-11-18 00:14:45 +0000176
Graeme Russ564a9982009-11-24 20:04:18 +1100177static inline void load_idt(const struct desc_ptr *dtr)
178{
Graeme Russ717979f2011-11-08 02:33:13 +0000179 asm volatile("cs lidt %0" : : "m" (*dtr));
Graeme Russ564a9982009-11-24 20:04:18 +1100180}
wdenk2262cfe2002-11-18 00:14:45 +0000181
Graeme Russabf0cd32009-02-24 21:13:40 +1100182void set_vector(u8 intnum, void *routine)
wdenk2262cfe2002-11-18 00:14:45 +0000183{
Graeme Russ1c409bc2009-11-24 20:04:21 +1100184 idt[intnum].base_high = (u16)((u32)(routine) >> 16);
185 idt[intnum].base_low = (u16)((u32)(routine) & 0xffff);
wdenk2262cfe2002-11-18 00:14:45 +0000186}
187
Graeme Russ717979f2011-11-08 02:33:13 +0000188/*
189 * Ideally these would be defined static to avoid a checkpatch warning, but
190 * the compiler cannot see them in the inline asm and complains that they
191 * aren't defined
192 */
Graeme Russ564a9982009-11-24 20:04:18 +1100193void irq_0(void);
194void irq_1(void);
wdenk2262cfe2002-11-18 00:14:45 +0000195
Graeme Russabf0cd32009-02-24 21:13:40 +1100196int cpu_init_interrupts(void)
wdenk2262cfe2002-11-18 00:14:45 +0000197{
198 int i;
wdenk8bde7f72003-06-27 21:31:46 +0000199
Graeme Russ564a9982009-11-24 20:04:18 +1100200 int irq_entry_size = irq_1 - irq_0;
201 void *irq_entry = (void *)irq_0;
202
wdenk2262cfe2002-11-18 00:14:45 +0000203 /* Setup the IDT */
Graeme Russ717979f2011-11-08 02:33:13 +0000204 for (i = 0; i < 256; i++) {
wdenk2262cfe2002-11-18 00:14:45 +0000205 idt[i].access = 0x8e;
wdenk8bde7f72003-06-27 21:31:46 +0000206 idt[i].res = 0;
Simon Glass8aba36d2015-07-31 09:31:32 -0600207 idt[i].selector = X86_GDT_ENTRY_32BIT_CS * X86_GDT_ENTRY_SIZE;
Graeme Russ564a9982009-11-24 20:04:18 +1100208 set_vector(i, irq_entry);
209 irq_entry += irq_entry_size;
wdenk8bde7f72003-06-27 21:31:46 +0000210 }
211
Simon Glass8aba36d2015-07-31 09:31:32 -0600212 idt_ptr.size = 256 * 8 - 1;
Graeme Russ564a9982009-11-24 20:04:18 +1100213 idt_ptr.address = (unsigned long) idt;
Graeme Russ564a9982009-11-24 20:04:18 +1100214
215 load_idt(&idt_ptr);
wdenk8bde7f72003-06-27 21:31:46 +0000216
wdenk2262cfe2002-11-18 00:14:45 +0000217 return 0;
218}
219
Simon Glass6f41e0e7b2015-04-28 20:25:16 -0600220void *x86_get_idt(void)
221{
222 return &idt_ptr;
223}
224
Graeme Russ564a9982009-11-24 20:04:18 +1100225void __do_irq(int irq)
226{
227 printf("Unhandled IRQ : %d\n", irq);
228}
229void do_irq(int irq) __attribute__((weak, alias("__do_irq")));
230
wdenk2262cfe2002-11-18 00:14:45 +0000231void enable_interrupts(void)
232{
233 asm("sti\n");
234}
235
236int disable_interrupts(void)
237{
238 long flags;
wdenk8bde7f72003-06-27 21:31:46 +0000239
wdenk2262cfe2002-11-18 00:14:45 +0000240 asm volatile ("pushfl ; popl %0 ; cli\n" : "=g" (flags) : );
wdenk8bde7f72003-06-27 21:31:46 +0000241
Graeme Russ717979f2011-11-08 02:33:13 +0000242 return flags & X86_EFLAGS_IF;
wdenk2262cfe2002-11-18 00:14:45 +0000243}
Graeme Russ564a9982009-11-24 20:04:18 +1100244
Bin Meng1dae2e02014-11-20 16:11:16 +0800245int interrupt_init(void)
246{
Ben Stoltz3dcdd172015-08-04 12:33:46 -0600247 /*
248 * When running as an EFI application we are not in control of
249 * interrupts and should leave them alone.
250 */
251#ifndef CONFIG_EFI_APP
Bin Meng1dae2e02014-11-20 16:11:16 +0800252 /* Just in case... */
253 disable_interrupts();
254
255#ifdef CONFIG_SYS_PCAT_INTERRUPTS
256 /* Initialize the master/slave i8259 pic */
257 i8259_init();
258#endif
259
260 /* Initialize core interrupt and exception functionality of CPU */
261 cpu_init_interrupts();
262
Simon Glasse49ccea2015-08-04 12:34:00 -0600263 /*
264 * It is now safe to enable interrupts.
265 *
266 * TODO(sjg@chromium.org): But we don't handle these correctly when
267 * booted from EFI.
268 */
269 if (ll_boot_init())
270 enable_interrupts();
Ben Stoltz3dcdd172015-08-04 12:33:46 -0600271#endif
Bin Meng1dae2e02014-11-20 16:11:16 +0800272
273 return 0;
274}
275
Graeme Russ564a9982009-11-24 20:04:18 +1100276/* IRQ Low-Level Service Routine */
Graeme Russ7228efa2010-10-07 20:03:23 +1100277void irq_llsr(struct irq_regs *regs)
Graeme Russ564a9982009-11-24 20:04:18 +1100278{
279 /*
280 * For detailed description of each exception, refer to:
Albert ARIBAUDfa82f872011-08-04 18:45:45 +0200281 * Intel® 64 and IA-32 Architectures Software Developer's Manual
Graeme Russ564a9982009-11-24 20:04:18 +1100282 * Volume 1: Basic Architecture
283 * Order Number: 253665-029US, November 2008
284 * Table 6-1. Exceptions and Interrupts
285 */
Bin Meng3ccd49c2015-07-10 10:51:23 +0800286 if (regs->irq_id < 32) {
287 /* Architecture defined exception */
288 do_exception(regs);
289 } else {
Graeme Russ564a9982009-11-24 20:04:18 +1100290 /* Hardware or User IRQ */
Graeme Russ7228efa2010-10-07 20:03:23 +1100291 do_irq(regs->irq_id);
Graeme Russ564a9982009-11-24 20:04:18 +1100292 }
293}
294
295/*
296 * OK - This looks really horrible, but it serves a purpose - It helps create
297 * fully relocatable code.
298 * - The call to irq_llsr will be a relative jump
299 * - The IRQ entries will be guaranteed to be in order
Graeme Russ433ff2b2010-04-24 00:05:38 +1000300 * Interrupt entries are now very small (a push and a jump) but they are
301 * now slower (all registers pushed on stack which provides complete
302 * crash dumps in the low level handlers
Graeme Russ7228efa2010-10-07 20:03:23 +1100303 *
304 * Interrupt Entry Point:
305 * - Interrupt has caused eflags, CS and EIP to be pushed
306 * - Interrupt Vector Handler has pushed orig_eax
307 * - pt_regs.esp needs to be adjusted by 40 bytes:
308 * 12 bytes pushed by CPU (EFLAGSF, CS, EIP)
309 * 4 bytes pushed by vector handler (irq_id)
310 * 24 bytes pushed before SP (SS, GS, FS, ES, DS, EAX)
311 * NOTE: Only longs are pushed on/popped off the stack!
Graeme Russ564a9982009-11-24 20:04:18 +1100312 */
313asm(".globl irq_common_entry\n" \
Graeme Russ0fc1b492009-11-24 20:04:19 +1100314 ".hidden irq_common_entry\n" \
315 ".type irq_common_entry, @function\n" \
Graeme Russ564a9982009-11-24 20:04:18 +1100316 "irq_common_entry:\n" \
Graeme Russ433ff2b2010-04-24 00:05:38 +1000317 "cld\n" \
Graeme Russ7228efa2010-10-07 20:03:23 +1100318 "pushl %ss\n" \
Graeme Russ433ff2b2010-04-24 00:05:38 +1000319 "pushl %gs\n" \
320 "pushl %fs\n" \
321 "pushl %es\n" \
322 "pushl %ds\n" \
323 "pushl %eax\n" \
Graeme Russ7228efa2010-10-07 20:03:23 +1100324 "movl %esp, %eax\n" \
325 "addl $40, %eax\n" \
326 "pushl %eax\n" \
Graeme Russ433ff2b2010-04-24 00:05:38 +1000327 "pushl %ebp\n" \
328 "pushl %edi\n" \
329 "pushl %esi\n" \
330 "pushl %edx\n" \
331 "pushl %ecx\n" \
332 "pushl %ebx\n" \
333 "mov %esp, %eax\n" \
Graeme Russ564a9982009-11-24 20:04:18 +1100334 "call irq_llsr\n" \
Graeme Russ433ff2b2010-04-24 00:05:38 +1000335 "popl %ebx\n" \
336 "popl %ecx\n" \
337 "popl %edx\n" \
338 "popl %esi\n" \
339 "popl %edi\n" \
340 "popl %ebp\n" \
341 "popl %eax\n" \
Graeme Russ7228efa2010-10-07 20:03:23 +1100342 "popl %eax\n" \
Graeme Russ433ff2b2010-04-24 00:05:38 +1000343 "popl %ds\n" \
344 "popl %es\n" \
345 "popl %fs\n" \
346 "popl %gs\n" \
Graeme Russ7228efa2010-10-07 20:03:23 +1100347 "popl %ss\n" \
Graeme Russ433ff2b2010-04-24 00:05:38 +1000348 "add $4, %esp\n" \
Graeme Russ564a9982009-11-24 20:04:18 +1100349 "iret\n" \
350 DECLARE_INTERRUPT(0) \
351 DECLARE_INTERRUPT(1) \
352 DECLARE_INTERRUPT(2) \
353 DECLARE_INTERRUPT(3) \
354 DECLARE_INTERRUPT(4) \
355 DECLARE_INTERRUPT(5) \
356 DECLARE_INTERRUPT(6) \
357 DECLARE_INTERRUPT(7) \
358 DECLARE_INTERRUPT(8) \
359 DECLARE_INTERRUPT(9) \
360 DECLARE_INTERRUPT(10) \
361 DECLARE_INTERRUPT(11) \
362 DECLARE_INTERRUPT(12) \
363 DECLARE_INTERRUPT(13) \
364 DECLARE_INTERRUPT(14) \
365 DECLARE_INTERRUPT(15) \
366 DECLARE_INTERRUPT(16) \
367 DECLARE_INTERRUPT(17) \
368 DECLARE_INTERRUPT(18) \
369 DECLARE_INTERRUPT(19) \
370 DECLARE_INTERRUPT(20) \
371 DECLARE_INTERRUPT(21) \
372 DECLARE_INTERRUPT(22) \
373 DECLARE_INTERRUPT(23) \
374 DECLARE_INTERRUPT(24) \
375 DECLARE_INTERRUPT(25) \
376 DECLARE_INTERRUPT(26) \
377 DECLARE_INTERRUPT(27) \
378 DECLARE_INTERRUPT(28) \
379 DECLARE_INTERRUPT(29) \
380 DECLARE_INTERRUPT(30) \
381 DECLARE_INTERRUPT(31) \
382 DECLARE_INTERRUPT(32) \
383 DECLARE_INTERRUPT(33) \
384 DECLARE_INTERRUPT(34) \
385 DECLARE_INTERRUPT(35) \
386 DECLARE_INTERRUPT(36) \
387 DECLARE_INTERRUPT(37) \
388 DECLARE_INTERRUPT(38) \
389 DECLARE_INTERRUPT(39) \
390 DECLARE_INTERRUPT(40) \
391 DECLARE_INTERRUPT(41) \
392 DECLARE_INTERRUPT(42) \
393 DECLARE_INTERRUPT(43) \
394 DECLARE_INTERRUPT(44) \
395 DECLARE_INTERRUPT(45) \
396 DECLARE_INTERRUPT(46) \
397 DECLARE_INTERRUPT(47) \
398 DECLARE_INTERRUPT(48) \
399 DECLARE_INTERRUPT(49) \
400 DECLARE_INTERRUPT(50) \
401 DECLARE_INTERRUPT(51) \
402 DECLARE_INTERRUPT(52) \
403 DECLARE_INTERRUPT(53) \
404 DECLARE_INTERRUPT(54) \
405 DECLARE_INTERRUPT(55) \
406 DECLARE_INTERRUPT(56) \
407 DECLARE_INTERRUPT(57) \
408 DECLARE_INTERRUPT(58) \
409 DECLARE_INTERRUPT(59) \
410 DECLARE_INTERRUPT(60) \
411 DECLARE_INTERRUPT(61) \
412 DECLARE_INTERRUPT(62) \
413 DECLARE_INTERRUPT(63) \
414 DECLARE_INTERRUPT(64) \
415 DECLARE_INTERRUPT(65) \
416 DECLARE_INTERRUPT(66) \
417 DECLARE_INTERRUPT(67) \
418 DECLARE_INTERRUPT(68) \
419 DECLARE_INTERRUPT(69) \
420 DECLARE_INTERRUPT(70) \
421 DECLARE_INTERRUPT(71) \
422 DECLARE_INTERRUPT(72) \
423 DECLARE_INTERRUPT(73) \
424 DECLARE_INTERRUPT(74) \
425 DECLARE_INTERRUPT(75) \
426 DECLARE_INTERRUPT(76) \
427 DECLARE_INTERRUPT(77) \
428 DECLARE_INTERRUPT(78) \
429 DECLARE_INTERRUPT(79) \
430 DECLARE_INTERRUPT(80) \
431 DECLARE_INTERRUPT(81) \
432 DECLARE_INTERRUPT(82) \
433 DECLARE_INTERRUPT(83) \
434 DECLARE_INTERRUPT(84) \
435 DECLARE_INTERRUPT(85) \
436 DECLARE_INTERRUPT(86) \
437 DECLARE_INTERRUPT(87) \
438 DECLARE_INTERRUPT(88) \
439 DECLARE_INTERRUPT(89) \
440 DECLARE_INTERRUPT(90) \
441 DECLARE_INTERRUPT(91) \
442 DECLARE_INTERRUPT(92) \
443 DECLARE_INTERRUPT(93) \
444 DECLARE_INTERRUPT(94) \
445 DECLARE_INTERRUPT(95) \
446 DECLARE_INTERRUPT(97) \
447 DECLARE_INTERRUPT(96) \
448 DECLARE_INTERRUPT(98) \
449 DECLARE_INTERRUPT(99) \
450 DECLARE_INTERRUPT(100) \
451 DECLARE_INTERRUPT(101) \
452 DECLARE_INTERRUPT(102) \
453 DECLARE_INTERRUPT(103) \
454 DECLARE_INTERRUPT(104) \
455 DECLARE_INTERRUPT(105) \
456 DECLARE_INTERRUPT(106) \
457 DECLARE_INTERRUPT(107) \
458 DECLARE_INTERRUPT(108) \
459 DECLARE_INTERRUPT(109) \
460 DECLARE_INTERRUPT(110) \
461 DECLARE_INTERRUPT(111) \
462 DECLARE_INTERRUPT(112) \
463 DECLARE_INTERRUPT(113) \
464 DECLARE_INTERRUPT(114) \
465 DECLARE_INTERRUPT(115) \
466 DECLARE_INTERRUPT(116) \
467 DECLARE_INTERRUPT(117) \
468 DECLARE_INTERRUPT(118) \
469 DECLARE_INTERRUPT(119) \
470 DECLARE_INTERRUPT(120) \
471 DECLARE_INTERRUPT(121) \
472 DECLARE_INTERRUPT(122) \
473 DECLARE_INTERRUPT(123) \
474 DECLARE_INTERRUPT(124) \
475 DECLARE_INTERRUPT(125) \
476 DECLARE_INTERRUPT(126) \
477 DECLARE_INTERRUPT(127) \
478 DECLARE_INTERRUPT(128) \
479 DECLARE_INTERRUPT(129) \
480 DECLARE_INTERRUPT(130) \
481 DECLARE_INTERRUPT(131) \
482 DECLARE_INTERRUPT(132) \
483 DECLARE_INTERRUPT(133) \
484 DECLARE_INTERRUPT(134) \
485 DECLARE_INTERRUPT(135) \
486 DECLARE_INTERRUPT(136) \
487 DECLARE_INTERRUPT(137) \
488 DECLARE_INTERRUPT(138) \
489 DECLARE_INTERRUPT(139) \
490 DECLARE_INTERRUPT(140) \
491 DECLARE_INTERRUPT(141) \
492 DECLARE_INTERRUPT(142) \
493 DECLARE_INTERRUPT(143) \
494 DECLARE_INTERRUPT(144) \
495 DECLARE_INTERRUPT(145) \
496 DECLARE_INTERRUPT(146) \
497 DECLARE_INTERRUPT(147) \
498 DECLARE_INTERRUPT(148) \
499 DECLARE_INTERRUPT(149) \
500 DECLARE_INTERRUPT(150) \
501 DECLARE_INTERRUPT(151) \
502 DECLARE_INTERRUPT(152) \
503 DECLARE_INTERRUPT(153) \
504 DECLARE_INTERRUPT(154) \
505 DECLARE_INTERRUPT(155) \
506 DECLARE_INTERRUPT(156) \
507 DECLARE_INTERRUPT(157) \
508 DECLARE_INTERRUPT(158) \
509 DECLARE_INTERRUPT(159) \
510 DECLARE_INTERRUPT(160) \
511 DECLARE_INTERRUPT(161) \
512 DECLARE_INTERRUPT(162) \
513 DECLARE_INTERRUPT(163) \
514 DECLARE_INTERRUPT(164) \
515 DECLARE_INTERRUPT(165) \
516 DECLARE_INTERRUPT(166) \
517 DECLARE_INTERRUPT(167) \
518 DECLARE_INTERRUPT(168) \
519 DECLARE_INTERRUPT(169) \
520 DECLARE_INTERRUPT(170) \
521 DECLARE_INTERRUPT(171) \
522 DECLARE_INTERRUPT(172) \
523 DECLARE_INTERRUPT(173) \
524 DECLARE_INTERRUPT(174) \
525 DECLARE_INTERRUPT(175) \
526 DECLARE_INTERRUPT(176) \
527 DECLARE_INTERRUPT(177) \
528 DECLARE_INTERRUPT(178) \
529 DECLARE_INTERRUPT(179) \
530 DECLARE_INTERRUPT(180) \
531 DECLARE_INTERRUPT(181) \
532 DECLARE_INTERRUPT(182) \
533 DECLARE_INTERRUPT(183) \
534 DECLARE_INTERRUPT(184) \
535 DECLARE_INTERRUPT(185) \
536 DECLARE_INTERRUPT(186) \
537 DECLARE_INTERRUPT(187) \
538 DECLARE_INTERRUPT(188) \
539 DECLARE_INTERRUPT(189) \
540 DECLARE_INTERRUPT(190) \
541 DECLARE_INTERRUPT(191) \
542 DECLARE_INTERRUPT(192) \
543 DECLARE_INTERRUPT(193) \
544 DECLARE_INTERRUPT(194) \
545 DECLARE_INTERRUPT(195) \
546 DECLARE_INTERRUPT(196) \
547 DECLARE_INTERRUPT(197) \
548 DECLARE_INTERRUPT(198) \
549 DECLARE_INTERRUPT(199) \
550 DECLARE_INTERRUPT(200) \
551 DECLARE_INTERRUPT(201) \
552 DECLARE_INTERRUPT(202) \
553 DECLARE_INTERRUPT(203) \
554 DECLARE_INTERRUPT(204) \
555 DECLARE_INTERRUPT(205) \
556 DECLARE_INTERRUPT(206) \
557 DECLARE_INTERRUPT(207) \
558 DECLARE_INTERRUPT(208) \
559 DECLARE_INTERRUPT(209) \
560 DECLARE_INTERRUPT(210) \
561 DECLARE_INTERRUPT(211) \
562 DECLARE_INTERRUPT(212) \
563 DECLARE_INTERRUPT(213) \
564 DECLARE_INTERRUPT(214) \
565 DECLARE_INTERRUPT(215) \
566 DECLARE_INTERRUPT(216) \
567 DECLARE_INTERRUPT(217) \
568 DECLARE_INTERRUPT(218) \
569 DECLARE_INTERRUPT(219) \
570 DECLARE_INTERRUPT(220) \
571 DECLARE_INTERRUPT(221) \
572 DECLARE_INTERRUPT(222) \
573 DECLARE_INTERRUPT(223) \
574 DECLARE_INTERRUPT(224) \
575 DECLARE_INTERRUPT(225) \
576 DECLARE_INTERRUPT(226) \
577 DECLARE_INTERRUPT(227) \
578 DECLARE_INTERRUPT(228) \
579 DECLARE_INTERRUPT(229) \
580 DECLARE_INTERRUPT(230) \
581 DECLARE_INTERRUPT(231) \
582 DECLARE_INTERRUPT(232) \
583 DECLARE_INTERRUPT(233) \
584 DECLARE_INTERRUPT(234) \
585 DECLARE_INTERRUPT(235) \
586 DECLARE_INTERRUPT(236) \
587 DECLARE_INTERRUPT(237) \
588 DECLARE_INTERRUPT(238) \
589 DECLARE_INTERRUPT(239) \
590 DECLARE_INTERRUPT(240) \
591 DECLARE_INTERRUPT(241) \
592 DECLARE_INTERRUPT(242) \
593 DECLARE_INTERRUPT(243) \
594 DECLARE_INTERRUPT(244) \
595 DECLARE_INTERRUPT(245) \
596 DECLARE_INTERRUPT(246) \
597 DECLARE_INTERRUPT(247) \
598 DECLARE_INTERRUPT(248) \
599 DECLARE_INTERRUPT(249) \
600 DECLARE_INTERRUPT(250) \
601 DECLARE_INTERRUPT(251) \
602 DECLARE_INTERRUPT(252) \
603 DECLARE_INTERRUPT(253) \
604 DECLARE_INTERRUPT(254) \
605 DECLARE_INTERRUPT(255));