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