Annotation of sys/arch/amd64/amd64/vector.S, Revision 1.1
1.1 ! nbrk 1: /* $OpenBSD: vector.S,v 1.10 2007/06/01 21:01:51 art Exp $ */
! 2: /* $NetBSD: vector.S,v 1.5 2004/06/28 09:13:11 fvdl Exp $ */
! 3:
! 4: /*
! 5: * Copyright (c) 2001 Wasabi Systems, Inc.
! 6: * All rights reserved.
! 7: *
! 8: * Written by Frank van der Linden for Wasabi Systems, Inc.
! 9: *
! 10: * Redistribution and use in source and binary forms, with or without
! 11: * modification, are permitted provided that the following conditions
! 12: * are met:
! 13: * 1. Redistributions of source code must retain the above copyright
! 14: * notice, this list of conditions and the following disclaimer.
! 15: * 2. Redistributions in binary form must reproduce the above copyright
! 16: * notice, this list of conditions and the following disclaimer in the
! 17: * documentation and/or other materials provided with the distribution.
! 18: * 3. All advertising materials mentioning features or use of this software
! 19: * must display the following acknowledgement:
! 20: * This product includes software developed for the NetBSD Project by
! 21: * Wasabi Systems, Inc.
! 22: * 4. The name of Wasabi Systems, Inc. may not be used to endorse
! 23: * or promote products derived from this software without specific prior
! 24: * written permission.
! 25: *
! 26: * THIS SOFTWARE IS PROVIDED BY WASABI SYSTEMS, INC. ``AS IS'' AND
! 27: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
! 28: * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
! 29: * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL WASABI SYSTEMS, INC
! 30: * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
! 31: * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
! 32: * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
! 33: * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
! 34: * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
! 35: * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
! 36: * POSSIBILITY OF SUCH DAMAGE.
! 37: */
! 38:
! 39: /*-
! 40: * Copyright (c) 1998 The NetBSD Foundation, Inc.
! 41: * All rights reserved.
! 42: *
! 43: * This code is derived from software contributed to The NetBSD Foundation
! 44: * by Charles M. Hannum.
! 45: *
! 46: * Redistribution and use in source and binary forms, with or without
! 47: * modification, are permitted provided that the following conditions
! 48: * are met:
! 49: * 1. Redistributions of source code must retain the above copyright
! 50: * notice, this list of conditions and the following disclaimer.
! 51: * 2. Redistributions in binary form must reproduce the above copyright
! 52: * notice, this list of conditions and the following disclaimer in the
! 53: * documentation and/or other materials provided with the distribution.
! 54: * 3. All advertising materials mentioning features or use of this software
! 55: * must display the following acknowledgement:
! 56: * This product includes software developed by the NetBSD
! 57: * Foundation, Inc. and its contributors.
! 58: * 4. Neither the name of The NetBSD Foundation nor the names of its
! 59: * contributors may be used to endorse or promote products derived
! 60: * from this software without specific prior written permission.
! 61: *
! 62: * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
! 63: * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
! 64: * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
! 65: * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
! 66: * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
! 67: * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
! 68: * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
! 69: * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
! 70: * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
! 71: * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
! 72: * POSSIBILITY OF SUCH DAMAGE.
! 73: */
! 74:
! 75: #define ALIGN_TEXT .align 16,0x90
! 76:
! 77: #include <machine/param.h>
! 78: #include <machine/i8259.h>
! 79: #include <machine/i82093reg.h>
! 80: #include <machine/i82489reg.h>
! 81: #include <machine/asm.h>
! 82: #include <machine/frameasm.h>
! 83: #include <machine/segments.h>
! 84: #include <machine/trap.h>
! 85: #include <machine/intr.h>
! 86: #include <machine/psl.h>
! 87:
! 88: #include <net/netisr.h>
! 89:
! 90: #include "ioapic.h"
! 91: #include "lapic.h"
! 92: #include "assym.h"
! 93:
! 94: /*****************************************************************************/
! 95:
! 96: /*
! 97: * Trap and fault vector routines
! 98: *
! 99: * On exit from the kernel to user mode, we always need to check for ASTs. In
! 100: * addition, we need to do this atomically; otherwise an interrupt may occur
! 101: * which causes an AST, but it won't get processed until the next kernel entry
! 102: * (possibly the next clock tick). Thus, we disable interrupt before checking,
! 103: * and only enable them again on the final `iret' or before calling the AST
! 104: * handler.
! 105: */
! 106:
! 107: /*****************************************************************************/
! 108:
! 109: #define TRAP(a) pushq $(a) ; jmp _C_LABEL(alltraps)
! 110: #define ZTRAP(a) pushq $0 ; TRAP(a)
! 111:
! 112: #define BPTTRAP(a) ZTRAP(a)
! 113:
! 114: .text
! 115: IDTVEC(trap00)
! 116: ZTRAP(T_DIVIDE)
! 117: IDTVEC(trap01)
! 118: BPTTRAP(T_TRCTRAP)
! 119: IDTVEC(trap02)
! 120: ZTRAP(T_NMI)
! 121: IDTVEC(trap03)
! 122: BPTTRAP(T_BPTFLT)
! 123: IDTVEC(trap04)
! 124: ZTRAP(T_OFLOW)
! 125: IDTVEC(trap05)
! 126: ZTRAP(T_BOUND)
! 127: IDTVEC(trap06)
! 128: ZTRAP(T_PRIVINFLT)
! 129: IDTVEC(trap07)
! 130: pushq $0 # dummy error code
! 131: pushq $T_DNA
! 132: INTRENTRY
! 133: sti
! 134: movq CPUVAR(SELF),%rdi
! 135: call _C_LABEL(fpudna)
! 136: INTRFASTEXIT
! 137: IDTVEC(trap08)
! 138: ZTRAP(T_DOUBLEFLT)
! 139: IDTVEC(trap09)
! 140: ZTRAP(T_FPOPFLT)
! 141: IDTVEC(trap0a)
! 142: TRAP(T_TSSFLT)
! 143: IDTVEC(trap0b)
! 144: TRAP(T_SEGNPFLT)
! 145: IDTVEC(trap0c)
! 146: TRAP(T_STKFLT)
! 147: IDTVEC(trap0d)
! 148: TRAP(T_PROTFLT)
! 149: IDTVEC(trap0e)
! 150: TRAP(T_PAGEFLT)
! 151: IDTVEC(intrspurious)
! 152: IDTVEC(trap0f)
! 153: iretq
! 154: IDTVEC(trap10)
! 155: ZTRAP(T_ARITHTRAP)
! 156: IDTVEC(trap11)
! 157: ZTRAP(T_ALIGNFLT)
! 158: IDTVEC(trap12)
! 159: ZTRAP(T_MCA)
! 160: IDTVEC(trap13)
! 161: ZTRAP(T_XMM)
! 162: IDTVEC(trap14)
! 163: IDTVEC(trap15)
! 164: IDTVEC(trap16)
! 165: IDTVEC(trap17)
! 166: IDTVEC(trap18)
! 167: IDTVEC(trap19)
! 168: IDTVEC(trap1a)
! 169: IDTVEC(trap1b)
! 170: IDTVEC(trap1c)
! 171: IDTVEC(trap1d)
! 172: IDTVEC(trap1e)
! 173: IDTVEC(trap1f)
! 174: /* 20 - 31 reserved for future exp */
! 175: ZTRAP(T_RESERVED)
! 176:
! 177: IDTVEC(exceptions)
! 178: .quad _C_LABEL(Xtrap00), _C_LABEL(Xtrap01)
! 179: .quad _C_LABEL(Xtrap02), _C_LABEL(Xtrap03)
! 180: .quad _C_LABEL(Xtrap04), _C_LABEL(Xtrap05)
! 181: .quad _C_LABEL(Xtrap06), _C_LABEL(Xtrap07)
! 182: .quad _C_LABEL(Xtrap08), _C_LABEL(Xtrap09)
! 183: .quad _C_LABEL(Xtrap0a), _C_LABEL(Xtrap0b)
! 184: .quad _C_LABEL(Xtrap0c), _C_LABEL(Xtrap0d)
! 185: .quad _C_LABEL(Xtrap0e), _C_LABEL(Xtrap0f)
! 186: .quad _C_LABEL(Xtrap10), _C_LABEL(Xtrap11)
! 187: .quad _C_LABEL(Xtrap12), _C_LABEL(Xtrap13)
! 188: .quad _C_LABEL(Xtrap14), _C_LABEL(Xtrap15)
! 189: .quad _C_LABEL(Xtrap16), _C_LABEL(Xtrap17)
! 190: .quad _C_LABEL(Xtrap18), _C_LABEL(Xtrap19)
! 191: .quad _C_LABEL(Xtrap1a), _C_LABEL(Xtrap1b)
! 192: .quad _C_LABEL(Xtrap1c), _C_LABEL(Xtrap1d)
! 193: .quad _C_LABEL(Xtrap1e), _C_LABEL(Xtrap1f)
! 194:
! 195: /*
! 196: * If an error is detected during trap, syscall, or interrupt exit, trap() will
! 197: * change %eip to point to one of these labels. We clean up the stack, if
! 198: * necessary, and resume as if we were handling a general protection fault.
! 199: * This will cause the process to get a SIGBUS.
! 200: *
! 201: * XXXfvdl currently unused, as pop %ds and pop %es are illegal in long
! 202: * mode. However, if the x86-64 port is going to support USER_LDT, we
! 203: * may need something like this after all.
! 204: */
! 205: NENTRY(resume_iret)
! 206: ZTRAP(T_PROTFLT)
! 207: #if 0
! 208: NENTRY(resume_pop_ds)
! 209: movl $GSEL(GDATA_SEL, SEL_KPL),%eax
! 210: movl %eax,%es
! 211: NENTRY(resume_pop_es)
! 212: movl $T_PROTFLT,TF_TRAPNO(%rsp)
! 213: jmp calltrap
! 214: #endif
! 215:
! 216: /*
! 217: * All traps go through here. Call the generic trap handler, and
! 218: * check for ASTs afterwards.
! 219: */
! 220: NENTRY(alltraps)
! 221: INTRENTRY
! 222: sti
! 223: calltrap:
! 224: #ifdef DIAGNOSTIC
! 225: movl CPUVAR(ILEVEL),%ebx
! 226: #endif /* DIAGNOSTIC */
! 227: movq %rsp, %rdi
! 228: call _C_LABEL(trap)
! 229: 2: /* Check for ASTs on exit to user mode. */
! 230: cli
! 231: CHECK_ASTPENDING(%r11)
! 232: je 1f
! 233: testb $SEL_RPL,TF_CS(%rsp)
! 234: jz 1f
! 235: 5: CLEAR_ASTPENDING(%r11)
! 236: sti
! 237: movl $T_ASTFLT,TF_TRAPNO(%rsp)
! 238: movq %rsp, %rdi
! 239: call _C_LABEL(trap)
! 240: jmp 2b
! 241: #ifndef DIAGNOSTIC
! 242: 1: INTRFASTEXIT
! 243: #else /* DIAGNOSTIC */
! 244: 1: cmpl CPUVAR(ILEVEL),%ebx
! 245: jne 3f
! 246: INTRFASTEXIT
! 247: 3: sti
! 248: movabsq $4f,%rdi
! 249: movl CPUVAR(ILEVEL),%esi
! 250: movl %ebx,%edx
! 251: xorq %rax,%rax
! 252: call _C_LABEL(printf)
! 253: #ifdef DDB
! 254: int $3
! 255: #endif /* DDB */
! 256: movl %ebx,CPUVAR(ILEVEL)
! 257: jmp 2b
! 258: 4: .asciz "WARNING: SPL NOT LOWERED ON TRAP EXIT %x %x\n"
! 259: #endif /* DIAGNOSTIC */
! 260:
! 261:
! 262: #define __HAVE_GENERIC_SOFT_INTERRUPTS /* XXX */
! 263:
! 264:
! 265: /*
! 266: * Macros for interrupt entry, call to handler, and exit.
! 267: *
! 268: * XXX
! 269: * The interrupt frame is set up to look like a trap frame. This may be a
! 270: * waste. The only handler which needs a frame is the clock handler, and it
! 271: * only needs a few bits. Xdoreti() needs a trap frame for handling ASTs, but
! 272: * it could easily convert the frame on demand.
! 273: *
! 274: * The direct costs of setting up a trap frame are two pushq's (error code and
! 275: * trap number), an addl to get rid of these, and pushing and popping the
! 276: * callee-saved registers %esi, %edi, %ebx, and %ebp twice.
! 277: *
! 278: * If the interrupt frame is made more flexible, INTR can push %eax first and
! 279: * decide the ipending case with less overhead, e.g., by avoiding loading the
! 280: * segment registers.
! 281: *
! 282: */
! 283:
! 284: #define MY_COUNT _C_LABEL(uvmexp)
! 285:
! 286: /* XXX See comment in locore.s */
! 287: #ifdef __ELF__
! 288: #define XINTR(name,num) Xintr_/**/name/**/num
! 289: #else
! 290: #define XINTR(name,num) _Xintr_/**/name/**/num
! 291: #endif
! 292:
! 293: #if NLAPIC > 0
! 294: #ifdef MULTIPROCESSOR
! 295: IDTVEC(recurse_lapic_ipi)
! 296: INTR_RECURSE_HWFRAME
! 297: pushq $0
! 298: pushq $T_ASTFLT
! 299: INTRENTRY
! 300: jmp 1f
! 301: IDTVEC(intr_lapic_ipi)
! 302: pushq $0
! 303: pushq $T_ASTFLT
! 304: INTRENTRY
! 305: movl $0,_C_LABEL(local_apic)+LAPIC_EOI
! 306: movl CPUVAR(ILEVEL),%ebx
! 307: cmpl $IPL_IPI,%ebx
! 308: jae 2f
! 309: IDTVEC(resume_lapic_ipi)
! 310: 1:
! 311: incl CPUVAR(IDEPTH)
! 312: movl $IPL_IPI,CPUVAR(ILEVEL)
! 313: sti
! 314: pushq %rbx
! 315: call _C_LABEL(x86_ipi_handler)
! 316: jmp _C_LABEL(Xdoreti)
! 317: 2:
! 318: orl $(1 << LIR_IPI),CPUVAR(IPENDING)
! 319: sti
! 320: INTRFASTEXIT
! 321:
! 322: IDTVEC(ipi_invltlb)
! 323: pushq %rax
! 324:
! 325: ioapic_asm_ack()
! 326:
! 327: movq %cr3, %rax
! 328: movq %rax, %cr3
! 329:
! 330: lock
! 331: decq tlb_shoot_wait
! 332:
! 333: popq %rax
! 334: iretq
! 335:
! 336: IDTVEC(ipi_invlpg)
! 337: pushq %rax
! 338:
! 339: ioapic_asm_ack()
! 340:
! 341: movq tlb_shoot_addr1, %rax
! 342: invlpg (%rax)
! 343:
! 344: lock
! 345: decq tlb_shoot_wait
! 346:
! 347: popq %rax
! 348: iretq
! 349:
! 350: IDTVEC(ipi_invlrange)
! 351: pushq %rax
! 352: pushq %rdx
! 353:
! 354: ioapic_asm_ack()
! 355:
! 356: movq tlb_shoot_addr1, %rax
! 357: movq tlb_shoot_addr2, %rdx
! 358: 1: invlpg (%rax)
! 359: addq $PAGE_SIZE, %rax
! 360: cmpq %rdx, %rax
! 361: jb 1b
! 362:
! 363: lock
! 364: decq tlb_shoot_wait
! 365:
! 366: popq %rdx
! 367: popq %rax
! 368: iretq
! 369:
! 370: #endif /* MULTIPROCESSOR */
! 371:
! 372: /*
! 373: * Interrupt from the local APIC timer.
! 374: */
! 375: IDTVEC(recurse_lapic_ltimer)
! 376: INTR_RECURSE_HWFRAME
! 377: pushq $0
! 378: pushq $T_ASTFLT
! 379: INTRENTRY
! 380: jmp 1f
! 381: IDTVEC(intr_lapic_ltimer)
! 382: pushq $0
! 383: pushq $T_ASTFLT
! 384: INTRENTRY
! 385: movl $0,_C_LABEL(local_apic)+LAPIC_EOI
! 386: movl CPUVAR(ILEVEL),%ebx
! 387: cmpl $IPL_CLOCK,%ebx
! 388: jae 2f
! 389: IDTVEC(resume_lapic_ltimer)
! 390: 1:
! 391: incl CPUVAR(IDEPTH)
! 392: movl $IPL_CLOCK,CPUVAR(ILEVEL)
! 393: sti
! 394: pushq %rbx
! 395: xorq %rdi,%rdi
! 396: call _C_LABEL(lapic_clockintr)
! 397: jmp _C_LABEL(Xdoreti)
! 398: 2:
! 399: orl $(1 << LIR_TIMER),CPUVAR(IPENDING)
! 400: sti
! 401: INTRFASTEXIT
! 402: #endif /* NLAPIC > 0 */
! 403:
! 404: #ifdef MULTIPROCESSOR
! 405: #define LOCK_KERNEL movq %rsp, %rdi; call _C_LABEL(x86_intlock)
! 406: #define UNLOCK_KERNEL movq %rsp, %rdi; call _C_LABEL(x86_intunlock)
! 407: #else
! 408: #define LOCK_KERNEL
! 409: #define UNLOCK_KERNEL
! 410: #endif
! 411:
! 412: #define voidop(num)
! 413:
! 414:
! 415: /*
! 416: * This macro defines the generic stub code. Its arguments modify it
! 417: * for specific PICs.
! 418: */
! 419:
! 420: #define INTRSTUB(name, num, early_ack, late_ack, mask, unmask, level_mask) \
! 421: IDTVEC(recurse_/**/name/**/num) ;\
! 422: INTR_RECURSE_HWFRAME ;\
! 423: subq $8,%rsp ;\
! 424: pushq $T_ASTFLT /* trap # for doing ASTs */ ;\
! 425: INTRENTRY ;\
! 426: IDTVEC(resume_/**/name/**/num) \
! 427: movq $IREENT_MAGIC,TF_ERR(%rsp) ;\
! 428: movl %ebx,%r13d ;\
! 429: movq CPUVAR(ISOURCES) + (num) * 8, %r14 ;\
! 430: movl IS_MAXLEVEL(%r14),%ebx ;\
! 431: jmp 1f ;\
! 432: IDTVEC(intr_/**/name/**/num) ;\
! 433: pushq $0 /* dummy error code */ ;\
! 434: pushq $T_ASTFLT /* trap # for doing ASTs */ ;\
! 435: INTRENTRY ;\
! 436: movq CPUVAR(ISOURCES) + (num) * 8, %r14 ;\
! 437: mask(num) /* mask it in hardware */ ;\
! 438: early_ack(num) /* and allow other intrs */ ;\
! 439: testq %r14,%r14 ;\
! 440: jz 9f /* stray */ ;\
! 441: movl IS_MAXLEVEL(%r14),%ebx ;\
! 442: movl CPUVAR(ILEVEL),%r13d ;\
! 443: cmpl %ebx,%r13d ;\
! 444: jae 10f /* currently masked; hold it */ ;\
! 445: incl MY_COUNT+V_INTR /* statistical info */ ;\
! 446: 1: \
! 447: pushq %r13 ;\
! 448: movl %ebx,CPUVAR(ILEVEL) ;\
! 449: sti ;\
! 450: incl CPUVAR(IDEPTH) ;\
! 451: movq IS_HANDLERS(%r14),%rbx ;\
! 452: LOCK_KERNEL ;\
! 453: 6: \
! 454: movl IH_LEVEL(%rbx),%r12d ;\
! 455: cmpl %r13d,%r12d ;\
! 456: jle 7f ;\
! 457: movq IH_ARG(%rbx),%rdi ;\
! 458: testq %rdi, %rdi ;\
! 459: jnz 8f ;\
! 460: movq %rsp, %rdi ;\
! 461: 8: movl %r12d,CPUVAR(ILEVEL) ;\
! 462: call *IH_FUN(%rbx) /* call it */ ;\
! 463: orq %rax,%rax /* should it be counted? */ ;\
! 464: jz 4f ;\
! 465: incq IH_COUNT(%rbx) ;\
! 466: 4: movq IH_NEXT(%rbx),%rbx /* next handler in chain */ ;\
! 467: testq %rbx,%rbx ;\
! 468: jnz 6b ;\
! 469: 5: \
! 470: UNLOCK_KERNEL ;\
! 471: cli ;\
! 472: unmask(num) /* unmask it in hardware */ ;\
! 473: late_ack(num) ;\
! 474: sti ;\
! 475: jmp _C_LABEL(Xdoreti) /* lower spl and do ASTs */ ;\
! 476: 7: \
! 477: UNLOCK_KERNEL ;\
! 478: cli ;\
! 479: orl $(1 << num),CPUVAR(IPENDING) ;\
! 480: level_mask(num) ;\
! 481: late_ack(num) ;\
! 482: sti ;\
! 483: jmp _C_LABEL(Xdoreti) /* lower spl and do ASTs */ ;\
! 484: 10: \
! 485: cli ;\
! 486: orl $(1 << num),CPUVAR(IPENDING) ;\
! 487: level_mask(num) ;\
! 488: late_ack(num) ;\
! 489: sti ;\
! 490: INTRFASTEXIT ;\
! 491: 9: \
! 492: unmask(num) ;\
! 493: late_ack(num) ;\
! 494: sti ;\
! 495: INTRFASTEXIT
! 496:
! 497: #define ICUADDR IO_ICU1
! 498:
! 499: INTRSTUB(legacy,0,i8259_asm_ack1,voidop,i8259_asm_mask,i8259_asm_unmask,
! 500: voidop)
! 501: INTRSTUB(legacy,1,i8259_asm_ack1,voidop,i8259_asm_mask,i8259_asm_unmask,
! 502: voidop)
! 503: INTRSTUB(legacy,2,i8259_asm_ack1,voidop,i8259_asm_mask,i8259_asm_unmask,
! 504: voidop)
! 505: INTRSTUB(legacy,3,i8259_asm_ack1,voidop,i8259_asm_mask,i8259_asm_unmask,
! 506: voidop)
! 507: INTRSTUB(legacy,4,i8259_asm_ack1,voidop,i8259_asm_mask,i8259_asm_unmask,
! 508: voidop)
! 509: INTRSTUB(legacy,5,i8259_asm_ack1,voidop,i8259_asm_mask,i8259_asm_unmask,
! 510: voidop)
! 511: INTRSTUB(legacy,6,i8259_asm_ack1,voidop,i8259_asm_mask,i8259_asm_unmask,
! 512: voidop)
! 513: INTRSTUB(legacy,7,i8259_asm_ack1,voidop,i8259_asm_mask,i8259_asm_unmask,
! 514: voidop)
! 515: #undef ICUADDR
! 516: #define ICUADDR IO_ICU2
! 517:
! 518: INTRSTUB(legacy,8,i8259_asm_ack2,voidop,i8259_asm_mask,i8259_asm_unmask,
! 519: voidop)
! 520: INTRSTUB(legacy,9,i8259_asm_ack2,voidop,i8259_asm_mask,i8259_asm_unmask,
! 521: voidop)
! 522: INTRSTUB(legacy,10,i8259_asm_ack2,voidop,i8259_asm_mask,i8259_asm_unmask,
! 523: voidop)
! 524: INTRSTUB(legacy,11,i8259_asm_ack2,voidop,i8259_asm_mask,i8259_asm_unmask,
! 525: voidop)
! 526: INTRSTUB(legacy,12,i8259_asm_ack2,voidop,i8259_asm_mask,i8259_asm_unmask,
! 527: voidop)
! 528: INTRSTUB(legacy,13,i8259_asm_ack2,voidop,i8259_asm_mask,i8259_asm_unmask,
! 529: voidop)
! 530: INTRSTUB(legacy,14,i8259_asm_ack2,voidop,i8259_asm_mask,i8259_asm_unmask,
! 531: voidop)
! 532: INTRSTUB(legacy,15,i8259_asm_ack2,voidop,i8259_asm_mask,i8259_asm_unmask,
! 533: voidop)
! 534:
! 535: #if NIOAPIC > 0
! 536:
! 537: INTRSTUB(ioapic_edge,0,voidop,ioapic_asm_ack,voidop,voidop,voidop)
! 538: INTRSTUB(ioapic_edge,1,voidop,ioapic_asm_ack,voidop,voidop,voidop)
! 539: INTRSTUB(ioapic_edge,2,voidop,ioapic_asm_ack,voidop,voidop,voidop)
! 540: INTRSTUB(ioapic_edge,3,voidop,ioapic_asm_ack,voidop,voidop,voidop)
! 541: INTRSTUB(ioapic_edge,4,voidop,ioapic_asm_ack,voidop,voidop,voidop)
! 542: INTRSTUB(ioapic_edge,5,voidop,ioapic_asm_ack,voidop,voidop,voidop)
! 543: INTRSTUB(ioapic_edge,6,voidop,ioapic_asm_ack,voidop,voidop,voidop)
! 544: INTRSTUB(ioapic_edge,7,voidop,ioapic_asm_ack,voidop,voidop,voidop)
! 545: INTRSTUB(ioapic_edge,8,voidop,ioapic_asm_ack,voidop,voidop,voidop)
! 546: INTRSTUB(ioapic_edge,9,voidop,ioapic_asm_ack,voidop,voidop,voidop)
! 547: INTRSTUB(ioapic_edge,10,voidop,ioapic_asm_ack,voidop,voidop,voidop)
! 548: INTRSTUB(ioapic_edge,11,voidop,ioapic_asm_ack,voidop,voidop,voidop)
! 549: INTRSTUB(ioapic_edge,12,voidop,ioapic_asm_ack,voidop,voidop,voidop)
! 550: INTRSTUB(ioapic_edge,13,voidop,ioapic_asm_ack,voidop,voidop,voidop)
! 551: INTRSTUB(ioapic_edge,14,voidop,ioapic_asm_ack,voidop,voidop,voidop)
! 552: INTRSTUB(ioapic_edge,15,voidop,ioapic_asm_ack,voidop,voidop,voidop)
! 553: INTRSTUB(ioapic_edge,16,voidop,ioapic_asm_ack,voidop,voidop,voidop)
! 554: INTRSTUB(ioapic_edge,17,voidop,ioapic_asm_ack,voidop,voidop,voidop)
! 555: INTRSTUB(ioapic_edge,18,voidop,ioapic_asm_ack,voidop,voidop,voidop)
! 556: INTRSTUB(ioapic_edge,19,voidop,ioapic_asm_ack,voidop,voidop,voidop)
! 557: INTRSTUB(ioapic_edge,20,voidop,ioapic_asm_ack,voidop,voidop,voidop)
! 558: INTRSTUB(ioapic_edge,21,voidop,ioapic_asm_ack,voidop,voidop,voidop)
! 559: INTRSTUB(ioapic_edge,22,voidop,ioapic_asm_ack,voidop,voidop,voidop)
! 560: INTRSTUB(ioapic_edge,23,voidop,ioapic_asm_ack,voidop,voidop,voidop)
! 561: INTRSTUB(ioapic_edge,24,voidop,ioapic_asm_ack,voidop,voidop,voidop)
! 562: INTRSTUB(ioapic_edge,25,voidop,ioapic_asm_ack,voidop,voidop,voidop)
! 563: INTRSTUB(ioapic_edge,26,voidop,ioapic_asm_ack,voidop,voidop,voidop)
! 564: INTRSTUB(ioapic_edge,27,voidop,ioapic_asm_ack,voidop,voidop,voidop)
! 565: INTRSTUB(ioapic_edge,28,voidop,ioapic_asm_ack,voidop,voidop,voidop)
! 566: INTRSTUB(ioapic_edge,29,voidop,ioapic_asm_ack,voidop,voidop,voidop)
! 567: INTRSTUB(ioapic_edge,30,voidop,ioapic_asm_ack,voidop,voidop,voidop)
! 568: INTRSTUB(ioapic_edge,31,voidop,ioapic_asm_ack,voidop,voidop,voidop)
! 569:
! 570: INTRSTUB(ioapic_level,0,voidop,ioapic_asm_ack,voidop,ioapic_unmask,ioapic_mask)
! 571: INTRSTUB(ioapic_level,1,voidop,ioapic_asm_ack,voidop,ioapic_unmask,ioapic_mask)
! 572: INTRSTUB(ioapic_level,2,voidop,ioapic_asm_ack,voidop,ioapic_unmask,ioapic_mask)
! 573: INTRSTUB(ioapic_level,3,voidop,ioapic_asm_ack,voidop,ioapic_unmask,ioapic_mask)
! 574: INTRSTUB(ioapic_level,4,voidop,ioapic_asm_ack,voidop,ioapic_unmask,ioapic_mask)
! 575: INTRSTUB(ioapic_level,5,voidop,ioapic_asm_ack,voidop,ioapic_unmask,ioapic_mask)
! 576: INTRSTUB(ioapic_level,6,voidop,ioapic_asm_ack,voidop,ioapic_unmask,ioapic_mask)
! 577: INTRSTUB(ioapic_level,7,voidop,ioapic_asm_ack,voidop,ioapic_unmask,ioapic_mask)
! 578: INTRSTUB(ioapic_level,8,voidop,ioapic_asm_ack,voidop,ioapic_unmask,ioapic_mask)
! 579: INTRSTUB(ioapic_level,9,voidop,ioapic_asm_ack,voidop,ioapic_unmask,ioapic_mask)
! 580: INTRSTUB(ioapic_level,10,voidop,ioapic_asm_ack,voidop,ioapic_unmask,ioapic_mask)
! 581: INTRSTUB(ioapic_level,11,voidop,ioapic_asm_ack,voidop,ioapic_unmask,ioapic_mask)
! 582: INTRSTUB(ioapic_level,12,voidop,ioapic_asm_ack,voidop,ioapic_unmask,ioapic_mask)
! 583: INTRSTUB(ioapic_level,13,voidop,ioapic_asm_ack,voidop,ioapic_unmask,ioapic_mask)
! 584: INTRSTUB(ioapic_level,14,voidop,ioapic_asm_ack,voidop,ioapic_unmask,ioapic_mask)
! 585: INTRSTUB(ioapic_level,15,voidop,ioapic_asm_ack,voidop,ioapic_unmask,ioapic_mask)
! 586: INTRSTUB(ioapic_level,16,voidop,ioapic_asm_ack,voidop,ioapic_unmask,ioapic_mask)
! 587: INTRSTUB(ioapic_level,17,voidop,ioapic_asm_ack,voidop,ioapic_unmask,ioapic_mask)
! 588: INTRSTUB(ioapic_level,18,voidop,ioapic_asm_ack,voidop,ioapic_unmask,ioapic_mask)
! 589: INTRSTUB(ioapic_level,19,voidop,ioapic_asm_ack,voidop,ioapic_unmask,ioapic_mask)
! 590: INTRSTUB(ioapic_level,20,voidop,ioapic_asm_ack,voidop,ioapic_unmask,ioapic_mask)
! 591: INTRSTUB(ioapic_level,21,voidop,ioapic_asm_ack,voidop,ioapic_unmask,ioapic_mask)
! 592: INTRSTUB(ioapic_level,22,voidop,ioapic_asm_ack,voidop,ioapic_unmask,ioapic_mask)
! 593: INTRSTUB(ioapic_level,23,voidop,ioapic_asm_ack,voidop,ioapic_unmask,ioapic_mask)
! 594: INTRSTUB(ioapic_level,24,voidop,ioapic_asm_ack,voidop,ioapic_unmask,ioapic_mask)
! 595: INTRSTUB(ioapic_level,25,voidop,ioapic_asm_ack,voidop,ioapic_unmask,ioapic_mask)
! 596: INTRSTUB(ioapic_level,26,voidop,ioapic_asm_ack,voidop,ioapic_unmask,ioapic_mask)
! 597: INTRSTUB(ioapic_level,27,voidop,ioapic_asm_ack,voidop,ioapic_unmask,ioapic_mask)
! 598: INTRSTUB(ioapic_level,28,voidop,ioapic_asm_ack,voidop,ioapic_unmask,ioapic_mask)
! 599: INTRSTUB(ioapic_level,29,voidop,ioapic_asm_ack,voidop,ioapic_unmask,ioapic_mask)
! 600: INTRSTUB(ioapic_level,30,voidop,ioapic_asm_ack,voidop,ioapic_unmask,ioapic_mask)
! 601: INTRSTUB(ioapic_level,31,voidop,ioapic_asm_ack,voidop,ioapic_unmask,ioapic_mask)
! 602:
! 603: #endif
! 604:
! 605: .globl _C_LABEL(i8259_stubs)
! 606: _C_LABEL(i8259_stubs):
! 607: .quad _C_LABEL(Xintr_legacy0), _C_LABEL(Xrecurse_legacy0)
! 608: .quad _C_LABEL(Xresume_legacy0)
! 609: .quad _C_LABEL(Xintr_legacy1), _C_LABEL(Xrecurse_legacy1)
! 610: .quad _C_LABEL(Xresume_legacy1)
! 611: .quad _C_LABEL(Xintr_legacy2), _C_LABEL(Xrecurse_legacy2)
! 612: .quad _C_LABEL(Xresume_legacy2)
! 613: .quad _C_LABEL(Xintr_legacy3), _C_LABEL(Xrecurse_legacy3)
! 614: .quad _C_LABEL(Xresume_legacy3)
! 615: .quad _C_LABEL(Xintr_legacy4), _C_LABEL(Xrecurse_legacy4)
! 616: .quad _C_LABEL(Xresume_legacy4)
! 617: .quad _C_LABEL(Xintr_legacy5), _C_LABEL(Xrecurse_legacy5)
! 618: .quad _C_LABEL(Xresume_legacy5)
! 619: .quad _C_LABEL(Xintr_legacy6), _C_LABEL(Xrecurse_legacy6)
! 620: .quad _C_LABEL(Xresume_legacy6)
! 621: .quad _C_LABEL(Xintr_legacy7), _C_LABEL(Xrecurse_legacy7)
! 622: .quad _C_LABEL(Xresume_legacy7)
! 623: .quad _C_LABEL(Xintr_legacy8), _C_LABEL(Xrecurse_legacy8)
! 624: .quad _C_LABEL(Xresume_legacy8)
! 625: .quad _C_LABEL(Xintr_legacy9), _C_LABEL(Xrecurse_legacy9)
! 626: .quad _C_LABEL(Xresume_legacy9)
! 627: .quad _C_LABEL(Xintr_legacy10), _C_LABEL(Xrecurse_legacy10)
! 628: .quad _C_LABEL(Xresume_legacy10)
! 629: .quad _C_LABEL(Xintr_legacy11), _C_LABEL(Xrecurse_legacy11)
! 630: .quad _C_LABEL(Xresume_legacy11)
! 631: .quad _C_LABEL(Xintr_legacy12), _C_LABEL(Xrecurse_legacy12)
! 632: .quad _C_LABEL(Xresume_legacy12)
! 633: .quad _C_LABEL(Xintr_legacy13), _C_LABEL(Xrecurse_legacy13)
! 634: .quad _C_LABEL(Xresume_legacy13)
! 635: .quad _C_LABEL(Xintr_legacy14), _C_LABEL(Xrecurse_legacy14)
! 636: .quad _C_LABEL(Xresume_legacy14)
! 637: .quad _C_LABEL(Xintr_legacy15), _C_LABEL(Xrecurse_legacy15)
! 638: .quad _C_LABEL(Xresume_legacy15)
! 639:
! 640: #if NIOAPIC > 0
! 641: .globl _C_LABEL(ioapic_edge_stubs)
! 642: _C_LABEL(ioapic_edge_stubs):
! 643: .quad _C_LABEL(Xintr_ioapic_edge0), _C_LABEL(Xrecurse_ioapic_edge0)
! 644: .quad _C_LABEL(Xresume_ioapic_edge0)
! 645: .quad _C_LABEL(Xintr_ioapic_edge1), _C_LABEL(Xrecurse_ioapic_edge1)
! 646: .quad _C_LABEL(Xresume_ioapic_edge1)
! 647: .quad _C_LABEL(Xintr_ioapic_edge2), _C_LABEL(Xrecurse_ioapic_edge2)
! 648: .quad _C_LABEL(Xresume_ioapic_edge2)
! 649: .quad _C_LABEL(Xintr_ioapic_edge3), _C_LABEL(Xrecurse_ioapic_edge3)
! 650: .quad _C_LABEL(Xresume_ioapic_edge3)
! 651: .quad _C_LABEL(Xintr_ioapic_edge4), _C_LABEL(Xrecurse_ioapic_edge4)
! 652: .quad _C_LABEL(Xresume_ioapic_edge4)
! 653: .quad _C_LABEL(Xintr_ioapic_edge5), _C_LABEL(Xrecurse_ioapic_edge5)
! 654: .quad _C_LABEL(Xresume_ioapic_edge5)
! 655: .quad _C_LABEL(Xintr_ioapic_edge6), _C_LABEL(Xrecurse_ioapic_edge6)
! 656: .quad _C_LABEL(Xresume_ioapic_edge6)
! 657: .quad _C_LABEL(Xintr_ioapic_edge7), _C_LABEL(Xrecurse_ioapic_edge7)
! 658: .quad _C_LABEL(Xresume_ioapic_edge7)
! 659: .quad _C_LABEL(Xintr_ioapic_edge8), _C_LABEL(Xrecurse_ioapic_edge8)
! 660: .quad _C_LABEL(Xresume_ioapic_edge8)
! 661: .quad _C_LABEL(Xintr_ioapic_edge9), _C_LABEL(Xrecurse_ioapic_edge9)
! 662: .quad _C_LABEL(Xresume_ioapic_edge9)
! 663: .quad _C_LABEL(Xintr_ioapic_edge10), _C_LABEL(Xrecurse_ioapic_edge10)
! 664: .quad _C_LABEL(Xresume_ioapic_edge10)
! 665: .quad _C_LABEL(Xintr_ioapic_edge11), _C_LABEL(Xrecurse_ioapic_edge11)
! 666: .quad _C_LABEL(Xresume_ioapic_edge11)
! 667: .quad _C_LABEL(Xintr_ioapic_edge12), _C_LABEL(Xrecurse_ioapic_edge12)
! 668: .quad _C_LABEL(Xresume_ioapic_edge12)
! 669: .quad _C_LABEL(Xintr_ioapic_edge13), _C_LABEL(Xrecurse_ioapic_edge13)
! 670: .quad _C_LABEL(Xresume_ioapic_edge13)
! 671: .quad _C_LABEL(Xintr_ioapic_edge14), _C_LABEL(Xrecurse_ioapic_edge14)
! 672: .quad _C_LABEL(Xresume_ioapic_edge14)
! 673: .quad _C_LABEL(Xintr_ioapic_edge15), _C_LABEL(Xrecurse_ioapic_edge15)
! 674: .quad _C_LABEL(Xresume_ioapic_edge15)
! 675: .quad _C_LABEL(Xintr_ioapic_edge16), _C_LABEL(Xrecurse_ioapic_edge16)
! 676: .quad _C_LABEL(Xresume_ioapic_edge16)
! 677: .quad _C_LABEL(Xintr_ioapic_edge17), _C_LABEL(Xrecurse_ioapic_edge17)
! 678: .quad _C_LABEL(Xresume_ioapic_edge17)
! 679: .quad _C_LABEL(Xintr_ioapic_edge18), _C_LABEL(Xrecurse_ioapic_edge18)
! 680: .quad _C_LABEL(Xresume_ioapic_edge18)
! 681: .quad _C_LABEL(Xintr_ioapic_edge19), _C_LABEL(Xrecurse_ioapic_edge19)
! 682: .quad _C_LABEL(Xresume_ioapic_edge19)
! 683: .quad _C_LABEL(Xintr_ioapic_edge20), _C_LABEL(Xrecurse_ioapic_edge20)
! 684: .quad _C_LABEL(Xresume_ioapic_edge20)
! 685: .quad _C_LABEL(Xintr_ioapic_edge21), _C_LABEL(Xrecurse_ioapic_edge21)
! 686: .quad _C_LABEL(Xresume_ioapic_edge21)
! 687: .quad _C_LABEL(Xintr_ioapic_edge22), _C_LABEL(Xrecurse_ioapic_edge22)
! 688: .quad _C_LABEL(Xresume_ioapic_edge22)
! 689: .quad _C_LABEL(Xintr_ioapic_edge23), _C_LABEL(Xrecurse_ioapic_edge23)
! 690: .quad _C_LABEL(Xresume_ioapic_edge23)
! 691: .quad _C_LABEL(Xintr_ioapic_edge24), _C_LABEL(Xrecurse_ioapic_edge24)
! 692: .quad _C_LABEL(Xresume_ioapic_edge24)
! 693: .quad _C_LABEL(Xintr_ioapic_edge25), _C_LABEL(Xrecurse_ioapic_edge25)
! 694: .quad _C_LABEL(Xresume_ioapic_edge25)
! 695: .quad _C_LABEL(Xintr_ioapic_edge26), _C_LABEL(Xrecurse_ioapic_edge26)
! 696: .quad _C_LABEL(Xresume_ioapic_edge26)
! 697: .quad _C_LABEL(Xintr_ioapic_edge27), _C_LABEL(Xrecurse_ioapic_edge27)
! 698: .quad _C_LABEL(Xresume_ioapic_edge27)
! 699: .quad _C_LABEL(Xintr_ioapic_edge28), _C_LABEL(Xrecurse_ioapic_edge28)
! 700: .quad _C_LABEL(Xresume_ioapic_edge28)
! 701: .quad _C_LABEL(Xintr_ioapic_edge29), _C_LABEL(Xrecurse_ioapic_edge29)
! 702: .quad _C_LABEL(Xresume_ioapic_edge29)
! 703: .quad _C_LABEL(Xintr_ioapic_edge30), _C_LABEL(Xrecurse_ioapic_edge30)
! 704: .quad _C_LABEL(Xresume_ioapic_edge30)
! 705: .quad _C_LABEL(Xintr_ioapic_edge31), _C_LABEL(Xrecurse_ioapic_edge31)
! 706: .quad _C_LABEL(Xresume_ioapic_edge31)
! 707:
! 708: .globl _C_LABEL(ioapic_level_stubs)
! 709: _C_LABEL(ioapic_level_stubs):
! 710: .quad _C_LABEL(Xintr_ioapic_level0), _C_LABEL(Xrecurse_ioapic_level0)
! 711: .quad _C_LABEL(Xresume_ioapic_level0)
! 712: .quad _C_LABEL(Xintr_ioapic_level1), _C_LABEL(Xrecurse_ioapic_level1)
! 713: .quad _C_LABEL(Xresume_ioapic_level1)
! 714: .quad _C_LABEL(Xintr_ioapic_level2), _C_LABEL(Xrecurse_ioapic_level2)
! 715: .quad _C_LABEL(Xresume_ioapic_level2)
! 716: .quad _C_LABEL(Xintr_ioapic_level3), _C_LABEL(Xrecurse_ioapic_level3)
! 717: .quad _C_LABEL(Xresume_ioapic_level3)
! 718: .quad _C_LABEL(Xintr_ioapic_level4), _C_LABEL(Xrecurse_ioapic_level4)
! 719: .quad _C_LABEL(Xresume_ioapic_level4)
! 720: .quad _C_LABEL(Xintr_ioapic_level5), _C_LABEL(Xrecurse_ioapic_level5)
! 721: .quad _C_LABEL(Xresume_ioapic_level5)
! 722: .quad _C_LABEL(Xintr_ioapic_level6), _C_LABEL(Xrecurse_ioapic_level6)
! 723: .quad _C_LABEL(Xresume_ioapic_level6)
! 724: .quad _C_LABEL(Xintr_ioapic_level7), _C_LABEL(Xrecurse_ioapic_level7)
! 725: .quad _C_LABEL(Xresume_ioapic_level7)
! 726: .quad _C_LABEL(Xintr_ioapic_level8), _C_LABEL(Xrecurse_ioapic_level8)
! 727: .quad _C_LABEL(Xresume_ioapic_level8)
! 728: .quad _C_LABEL(Xintr_ioapic_level9), _C_LABEL(Xrecurse_ioapic_level9)
! 729: .quad _C_LABEL(Xresume_ioapic_level9)
! 730: .quad _C_LABEL(Xintr_ioapic_level10), _C_LABEL(Xrecurse_ioapic_level10)
! 731: .quad _C_LABEL(Xresume_ioapic_level10)
! 732: .quad _C_LABEL(Xintr_ioapic_level11), _C_LABEL(Xrecurse_ioapic_level11)
! 733: .quad _C_LABEL(Xresume_ioapic_level11)
! 734: .quad _C_LABEL(Xintr_ioapic_level12), _C_LABEL(Xrecurse_ioapic_level12)
! 735: .quad _C_LABEL(Xresume_ioapic_level12)
! 736: .quad _C_LABEL(Xintr_ioapic_level13), _C_LABEL(Xrecurse_ioapic_level13)
! 737: .quad _C_LABEL(Xresume_ioapic_level13)
! 738: .quad _C_LABEL(Xintr_ioapic_level14), _C_LABEL(Xrecurse_ioapic_level14)
! 739: .quad _C_LABEL(Xresume_ioapic_level14)
! 740: .quad _C_LABEL(Xintr_ioapic_level15), _C_LABEL(Xrecurse_ioapic_level15)
! 741: .quad _C_LABEL(Xresume_ioapic_level15)
! 742: .quad _C_LABEL(Xintr_ioapic_level16), _C_LABEL(Xrecurse_ioapic_level16)
! 743: .quad _C_LABEL(Xresume_ioapic_level16)
! 744: .quad _C_LABEL(Xintr_ioapic_level17), _C_LABEL(Xrecurse_ioapic_level17)
! 745: .quad _C_LABEL(Xresume_ioapic_level17)
! 746: .quad _C_LABEL(Xintr_ioapic_level18), _C_LABEL(Xrecurse_ioapic_level18)
! 747: .quad _C_LABEL(Xresume_ioapic_level18)
! 748: .quad _C_LABEL(Xintr_ioapic_level19), _C_LABEL(Xrecurse_ioapic_level19)
! 749: .quad _C_LABEL(Xresume_ioapic_level19)
! 750: .quad _C_LABEL(Xintr_ioapic_level20), _C_LABEL(Xrecurse_ioapic_level20)
! 751: .quad _C_LABEL(Xresume_ioapic_level20)
! 752: .quad _C_LABEL(Xintr_ioapic_level21), _C_LABEL(Xrecurse_ioapic_level21)
! 753: .quad _C_LABEL(Xresume_ioapic_level21)
! 754: .quad _C_LABEL(Xintr_ioapic_level22), _C_LABEL(Xrecurse_ioapic_level22)
! 755: .quad _C_LABEL(Xresume_ioapic_level22)
! 756: .quad _C_LABEL(Xintr_ioapic_level23), _C_LABEL(Xrecurse_ioapic_level23)
! 757: .quad _C_LABEL(Xresume_ioapic_level23)
! 758: .quad _C_LABEL(Xintr_ioapic_level24), _C_LABEL(Xrecurse_ioapic_level24)
! 759: .quad _C_LABEL(Xresume_ioapic_level24)
! 760: .quad _C_LABEL(Xintr_ioapic_level25), _C_LABEL(Xrecurse_ioapic_level25)
! 761: .quad _C_LABEL(Xresume_ioapic_level25)
! 762: .quad _C_LABEL(Xintr_ioapic_level26), _C_LABEL(Xrecurse_ioapic_level26)
! 763: .quad _C_LABEL(Xresume_ioapic_level26)
! 764: .quad _C_LABEL(Xintr_ioapic_level27), _C_LABEL(Xrecurse_ioapic_level27)
! 765: .quad _C_LABEL(Xresume_ioapic_level27)
! 766: .quad _C_LABEL(Xintr_ioapic_level28), _C_LABEL(Xrecurse_ioapic_level28)
! 767: .quad _C_LABEL(Xresume_ioapic_level28)
! 768: .quad _C_LABEL(Xintr_ioapic_level29), _C_LABEL(Xrecurse_ioapic_level29)
! 769: .quad _C_LABEL(Xresume_ioapic_level29)
! 770: .quad _C_LABEL(Xintr_ioapic_level30), _C_LABEL(Xrecurse_ioapic_level30)
! 771: .quad _C_LABEL(Xresume_ioapic_level30)
! 772: .quad _C_LABEL(Xintr_ioapic_level31), _C_LABEL(Xrecurse_ioapic_level31)
! 773: .quad _C_LABEL(Xresume_ioapic_level31)
! 774: #endif
! 775:
! 776: .data
! 777:
! 778: /*
! 779: * Soft interrupt handlers
! 780: */
! 781: .globl _C_LABEL(netisr)
! 782: _C_LABEL(netisr):
! 783: .word 0
! 784:
! 785: IDTVEC(softserial)
! 786: movl $IPL_SOFTSERIAL, CPUVAR(ILEVEL)
! 787: sti
! 788: incl CPUVAR(IDEPTH)
! 789: #ifdef MULTIPROCESSOR
! 790: call _C_LABEL(x86_softintlock)
! 791: #endif
! 792: movq CPUVAR(ISOURCES) + SIR_SERIAL * 8, %r12
! 793: movl $X86_SOFTINTR_SOFTSERIAL,%edi
! 794: call _C_LABEL(softintr_dispatch)
! 795: #ifdef MULTIPROCESSOR
! 796: call _C_LABEL(x86_softintunlock)
! 797: #endif
! 798: decl CPUVAR(IDEPTH)
! 799: jmp *%r13
! 800:
! 801: IDTVEC(softnet)
! 802: movl $IPL_SOFTNET, CPUVAR(ILEVEL)
! 803: sti
! 804: incl CPUVAR(IDEPTH)
! 805: #ifdef MULTIPROCESSOR
! 806: call _C_LABEL(x86_softintlock)
! 807: #endif
! 808: movq CPUVAR(ISOURCES) + SIR_NET * 8, %r12
! 809:
! 810: xorq %r12,%r12
! 811: xchgl _C_LABEL(netisr),%r12d
! 812:
! 813: /* XXX Do the legacy netisrs here for now. */
! 814: #define DONETISR(s, c) \
! 815: .globl _C_LABEL(c) ;\
! 816: testl $(1 << s),%r12d ;\
! 817: jz 1f ;\
! 818: call _C_LABEL(c) ;\
! 819: 1:
! 820: #include <net/netisr_dispatch.h>
! 821:
! 822: movl $X86_SOFTINTR_SOFTNET,%edi
! 823: call _C_LABEL(softintr_dispatch)
! 824: #ifdef MULTIPROCESSOR
! 825: call _C_LABEL(x86_softintunlock)
! 826: #endif
! 827: decl CPUVAR(IDEPTH)
! 828: jmp *%r13
! 829:
! 830: IDTVEC(softclock)
! 831: movl $IPL_SOFTCLOCK, CPUVAR(ILEVEL)
! 832: sti
! 833: incl CPUVAR(IDEPTH)
! 834: #ifdef MULTIPROCESSOR
! 835: call _C_LABEL(x86_softintlock)
! 836: #endif
! 837: movq CPUVAR(ISOURCES) + SIR_CLOCK * 8, %r12
! 838:
! 839: movl $X86_SOFTINTR_SOFTCLOCK,%edi
! 840: call _C_LABEL(softintr_dispatch)
! 841: #ifdef MULTIPROCESSOR
! 842: call _C_LABEL(x86_softintunlock)
! 843: #endif
! 844: decl CPUVAR(IDEPTH)
! 845: jmp *%r13
CVSweb