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