[BACK]Return to apicvec.s CVS log [TXT][DIR] Up to [local] / sys / arch / i386 / i386

Annotation of sys/arch/i386/i386/apicvec.s, Revision 1.1

1.1     ! nbrk        1: /* $OpenBSD: apicvec.s,v 1.10 2007/05/25 15:55:26 art Exp $ */
        !             2: /* $NetBSD: apicvec.s,v 1.1.2.2 2000/02/21 21:54:01 sommerfeld Exp $ */
        !             3:
        !             4: /*-
        !             5:  * Copyright (c) 2000 The NetBSD Foundation, Inc.
        !             6:  * All rights reserved.
        !             7:  *
        !             8:  * This code is derived from software contributed to The NetBSD Foundation
        !             9:  * by RedBack Networks Inc.
        !            10:  *
        !            11:  * Author: Bill Sommerfeld
        !            12:  *
        !            13:  * Redistribution and use in source and binary forms, with or without
        !            14:  * modification, are permitted provided that the following conditions
        !            15:  * are met:
        !            16:  * 1. Redistributions of source code must retain the above copyright
        !            17:  *    notice, this list of conditions and the following disclaimer.
        !            18:  * 2. Redistributions in binary form must reproduce the above copyright
        !            19:  *    notice, this list of conditions and the following disclaimer in the
        !            20:  *    documentation and/or other materials provided with the distribution.
        !            21:  * 3. All advertising materials mentioning features or use of this software
        !            22:  *    must display the following acknowledgement:
        !            23:  *        This product includes software developed by the NetBSD
        !            24:  *        Foundation, Inc. and its contributors.
        !            25:  * 4. Neither the name of The NetBSD Foundation nor the names of its
        !            26:  *    contributors may be used to endorse or promote products derived
        !            27:  *    from this software without specific prior written permission.
        !            28:  *
        !            29:  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
        !            30:  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
        !            31:  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
        !            32:  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
        !            33:  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
        !            34:  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
        !            35:  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
        !            36:  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
        !            37:  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
        !            38:  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
        !            39:  * POSSIBILITY OF SUCH DAMAGE.
        !            40:  */
        !            41:
        !            42: #include <machine/i82093reg.h>
        !            43: #include <machine/i82489reg.h>
        !            44:
        !            45: #ifdef __ELF__
        !            46: #define XINTR(vec) Xintr/**/vec
        !            47: #else
        !            48: #define XINTR(vec) _Xintr/**/vec
        !            49: #endif
        !            50:
        !            51:        .globl  _C_LABEL(apic_stray)
        !            52:
        !            53: #ifdef MULTIPROCESSOR
        !            54:        .globl  XINTR(ipi)
        !            55: XINTR(ipi):
        !            56:        pushl   $0
        !            57:        pushl   $T_ASTFLT
        !            58:        INTRENTRY
        !            59:        MAKE_FRAME
        !            60:        pushl   CPL
        !            61:        movl    _C_LABEL(lapic_ppr),%eax
        !            62:        movl    %eax,CPL
        !            63:        ioapic_asm_ack()
        !            64:        sti                     /* safe to take interrupts.. */
        !            65:        call    _C_LABEL(i386_ipi_handler)
        !            66:        cli
        !            67:        popl    CPL
        !            68:        INTRFASTEXIT
        !            69:
        !            70:        .globl XINTR(ipi_ast)
        !            71: XINTR(ipi_ast):
        !            72:        pushl   %eax
        !            73:        pushl   %ds
        !            74:        movl    $GSEL(GDATA_SEL, SEL_KPL), %eax
        !            75:        movl    %eax, %ds
        !            76:
        !            77:        ioapic_asm_ack()
        !            78:
        !            79:        movl    $IPL_SOFTAST, %eax
        !            80:        orl     $(1 << SIR_AST), _C_LABEL(ipending)
        !            81:
        !            82:        orl     $(LAPIC_DLMODE_FIXED|LAPIC_LVL_ASSERT|LAPIC_DEST_SELF), %eax
        !            83:        movl    %eax, _C_LABEL(local_apic) + LAPIC_ICRLO
        !            84:
        !            85:        movl    _C_LABEL(local_apic) + LAPIC_ID, %eax
        !            86:        popl    %ds
        !            87:        popl    %eax
        !            88:        iret
        !            89:
        !            90:        .globl  XINTR(ipi_invltlb)
        !            91:        .p2align 4,0x90
        !            92: XINTR(ipi_invltlb):
        !            93:        pushl   %eax
        !            94:        pushl   %ds
        !            95:        movl    $GSEL(GDATA_SEL, SEL_KPL), %eax
        !            96:        movl    %eax, %ds
        !            97:
        !            98:        ioapic_asm_ack()
        !            99:
        !           100:        movl    %cr3, %eax
        !           101:        movl    %eax, %cr3
        !           102:
        !           103:        lock
        !           104:        decl    tlb_shoot_wait
        !           105:
        !           106:        popl    %ds
        !           107:        popl    %eax
        !           108:        iret
        !           109:
        !           110:        .globl  XINTR(ipi_invlpg)
        !           111:        .p2align 4,0x90
        !           112: XINTR(ipi_invlpg):
        !           113:        pushl   %eax
        !           114:        pushl   %ds
        !           115:        movl    $GSEL(GDATA_SEL, SEL_KPL), %eax
        !           116:        movl    %eax, %ds
        !           117:
        !           118:        ioapic_asm_ack()
        !           119:
        !           120:        movl    tlb_shoot_addr1, %eax
        !           121:        invlpg  (%eax)
        !           122:
        !           123:        lock
        !           124:        decl    tlb_shoot_wait
        !           125:
        !           126:        popl    %ds
        !           127:        popl    %eax
        !           128:        iret
        !           129:
        !           130:        .globl  XINTR(ipi_invlrange)
        !           131:        .p2align 4,0x90
        !           132: XINTR(ipi_invlrange):
        !           133:        pushl   %eax
        !           134:        pushl   %edx
        !           135:        pushl   %ds
        !           136:        movl    $GSEL(GDATA_SEL, SEL_KPL), %eax
        !           137:        movl    %eax, %ds
        !           138:
        !           139:        ioapic_asm_ack()
        !           140:
        !           141:        movl    tlb_shoot_addr1, %eax
        !           142:        movl    tlb_shoot_addr2, %edx
        !           143: 1:     invlpg  (%eax)
        !           144:        addl    $PAGE_SIZE, %eax
        !           145:        cmpl    %edx, %eax
        !           146:        jb      1b
        !           147:
        !           148:        lock
        !           149:        decl    tlb_shoot_wait
        !           150:
        !           151:        popl    %ds
        !           152:        popl    %edx
        !           153:        popl    %eax
        !           154:        iret
        !           155:
        !           156: #endif
        !           157:
        !           158:        /*
        !           159:         * Interrupt from the local APIC timer.
        !           160:         */
        !           161:        .globl  XINTR(ltimer)
        !           162: XINTR(ltimer):
        !           163:        pushl   $0
        !           164:        pushl   $T_ASTFLT
        !           165:        INTRENTRY
        !           166:        MAKE_FRAME
        !           167:        pushl   CPL
        !           168:        movl    _C_LABEL(lapic_ppr),%eax
        !           169:        movl    %eax,CPL
        !           170:        ioapic_asm_ack()
        !           171:        sti
        !           172: #ifdef MULTIPROCESSOR
        !           173:        call    _C_LABEL(i386_softintlock)
        !           174: #endif
        !           175:        movl    %esp,%eax
        !           176:        pushl   %eax
        !           177:        call    _C_LABEL(lapic_clockintr)
        !           178:        addl    $4,%esp
        !           179: #ifdef MULTIPROCESSOR
        !           180:        call    _C_LABEL(i386_softintunlock)
        !           181: #endif
        !           182:        jmp     _C_LABEL(Xdoreti)
        !           183:
        !           184:        .globl  XINTR(softclock), XINTR(softnet), XINTR(softtty), XINTR(softast)
        !           185: XINTR(softclock):
        !           186:        pushl   $0
        !           187:        pushl   $T_ASTFLT
        !           188:        INTRENTRY
        !           189:        MAKE_FRAME
        !           190:        pushl   CPL
        !           191:        movl    $IPL_SOFTCLOCK,CPL
        !           192:        andl    $~(1<<SIR_CLOCK),_C_LABEL(ipending)
        !           193:        ioapic_asm_ack()
        !           194:        sti
        !           195: #ifdef MULTIPROCESSOR
        !           196:        call    _C_LABEL(i386_softintlock)
        !           197: #endif
        !           198:        call    _C_LABEL(softclock)
        !           199: #ifdef MULTIPROCESSOR
        !           200:        call    _C_LABEL(i386_softintunlock)
        !           201: #endif
        !           202:        jmp     _C_LABEL(Xdoreti)
        !           203:
        !           204: #define DONETISR(s, c) \
        !           205:        .globl  _C_LABEL(c)     ;\
        !           206:        testl   $(1 << s),%edi  ;\
        !           207:        jz      1f              ;\
        !           208:        call    _C_LABEL(c)     ;\
        !           209: 1:
        !           210:
        !           211: XINTR(softnet):
        !           212:        pushl   $0
        !           213:        pushl   $T_ASTFLT
        !           214:        INTRENTRY
        !           215:        MAKE_FRAME
        !           216:        pushl   CPL
        !           217:        movl    $IPL_SOFTNET,CPL
        !           218:        andl    $~(1<<SIR_NET),_C_LABEL(ipending)
        !           219:        ioapic_asm_ack()
        !           220:        sti
        !           221: #ifdef MULTIPROCESSOR
        !           222:        call    _C_LABEL(i386_softintlock)
        !           223: #endif
        !           224:        xorl    %edi,%edi
        !           225:        xchgl   _C_LABEL(netisr),%edi
        !           226: #include <net/netisr_dispatch.h>
        !           227: #ifdef MULTIPROCESSOR
        !           228:        call    _C_LABEL(i386_softintunlock)
        !           229: #endif
        !           230:        jmp     _C_LABEL(Xdoreti)
        !           231: #undef DONETISR
        !           232:
        !           233: XINTR(softtty):
        !           234:        pushl   $0
        !           235:        pushl   $T_ASTFLT
        !           236:        INTRENTRY
        !           237:        MAKE_FRAME
        !           238:        pushl   CPL
        !           239:        movl    $IPL_SOFTTTY,CPL
        !           240:        andl    $~(1<<SIR_TTY),_C_LABEL(ipending)
        !           241:        ioapic_asm_ack()
        !           242:        sti
        !           243: #ifdef MULTIPROCESSOR
        !           244:        call    _C_LABEL(i386_softintlock)
        !           245: #endif
        !           246:        call    _C_LABEL(comsoft)
        !           247: #ifdef MULTIPROCESSOR
        !           248:        call    _C_LABEL(i386_softintunlock)
        !           249: #endif
        !           250:        jmp     _C_LABEL(Xdoreti)
        !           251:
        !           252: XINTR(softast):
        !           253:        pushl   $0
        !           254:        pushl   $T_ASTFLT
        !           255:        INTRENTRY
        !           256:        MAKE_FRAME
        !           257:        pushl   CPL
        !           258:        movl    $IPL_SOFTAST,CPL
        !           259:        andl    $~(1<<SIR_AST),_C_LABEL(ipending)
        !           260:        ioapic_asm_ack()
        !           261:        sti
        !           262:        jmp     _C_LABEL(Xdoreti)
        !           263:
        !           264: #if NIOAPIC > 0
        !           265:
        !           266: #define voidop(num)
        !           267:
        !           268:        /*
        !           269:         * I/O APIC interrupt.
        !           270:         * We sort out which one is which based on the value of
        !           271:         * the processor priority register.
        !           272:         *
        !           273:         * XXX use cmove when appropriate.
        !           274:         */
        !           275:
        !           276: #define APICINTR(name, num, early_ack, late_ack, mask, unmask, level_mask) \
        !           277: _C_LABEL(Xintr_/**/name/**/num):                                       \
        !           278:        pushl   $0                                                      ;\
        !           279:        pushl   $T_ASTFLT                                               ;\
        !           280:        INTRENTRY                                                       ;\
        !           281:        MAKE_FRAME                                                      ;\
        !           282:        pushl   CPL                                                     ;\
        !           283:        movl    _C_LABEL(lapic_ppr),%eax                                ;\
        !           284:        orl     $num,%eax                                               ;\
        !           285:        movl    _C_LABEL(apic_maxlevel)(,%eax,4),%ebx                   ;\
        !           286:        movl    %ebx,CPL                                                ;\
        !           287:        mask(num)                       /* mask it in hardware */       ;\
        !           288:        early_ack(num)                  /* and allow other intrs */     ;\
        !           289:        incl    MY_COUNT+V_INTR         /* statistical info */          ;\
        !           290:        sti                                                             ;\
        !           291:        incl    _C_LABEL(apic_intrcount)(,%eax,4)                       ;\
        !           292:        movl    _C_LABEL(apic_intrhand)(,%eax,4),%ebx /* chain head */  ;\
        !           293:        testl   %ebx,%ebx                                               ;\
        !           294:        jz      _C_LABEL(Xstray_/**/name/**/num)                        ;\
        !           295:        APIC_STRAY_INIT                 /* nobody claimed it yet */     ;\
        !           296: 7:                                                                      \
        !           297:        LOCK_KERNEL(IF_PPL(%esp))                                       ;\
        !           298:        movl    IH_ARG(%ebx),%eax       /* get handler arg */           ;\
        !           299:        testl   %eax,%eax                                               ;\
        !           300:        jnz     6f                                                      ;\
        !           301:        movl    %esp,%eax               /* 0 means frame pointer */     ;\
        !           302: 6:                                                                      \
        !           303:        pushl   %eax                                                    ;\
        !           304:        call    *IH_FUN(%ebx)           /* call it */                   ;\
        !           305:        addl    $4,%esp                 /* toss the arg */              ;\
        !           306:        APIC_STRAY_INTEGRATE            /* maybe he claimed it */       ;\
        !           307:        orl     %eax,%eax               /* should it be counted? */     ;\
        !           308:        jz      4f                                                      ;\
        !           309:        addl    $1,IH_COUNT(%ebx)       /* count the intrs */           ;\
        !           310:        adcl    $0,IH_COUNT+4(%ebx)                                     ;\
        !           311: 4:                                                                      \
        !           312:        UNLOCK_KERNEL(IF_PPL(%esp))                                     ;\
        !           313:        movl    IH_NEXT(%ebx),%ebx      /* next handler in chain */     ;\
        !           314:        testl   %ebx,%ebx                                               ;\
        !           315:        jnz     7b                                                      ;\
        !           316:        APIC_STRAY_TEST(name,num)       /* see if it's a stray */       ;\
        !           317: 8:                                                                      \
        !           318:        unmask(num)                     /* unmask it in hardware */     ;\
        !           319:        late_ack(num)                                                   ;\
        !           320:        jmp     _C_LABEL(Xdoreti)                                       ;\
        !           321: _C_LABEL(Xstray_/**/name/**/num):                                       \
        !           322:        pushl   $num                                                    ;\
        !           323:        call    _C_LABEL(apic_stray)                                    ;\
        !           324:        addl    $4,%esp                                                 ;\
        !           325:        jmp     8b                                                      ;\
        !           326:
        !           327: #if defined(DEBUG)
        !           328: #define APIC_STRAY_INIT \
        !           329:        xorl    %esi,%esi
        !           330: #define        APIC_STRAY_INTEGRATE \
        !           331:        orl     %eax,%esi
        !           332: #define APIC_STRAY_TEST(name,num) \
        !           333:        testl   %esi,%esi                                               ;\
        !           334:        jz      _C_LABEL(Xstray_/**/name/**/num)
        !           335: #else /* !DEBUG */
        !           336: #define APIC_STRAY_INIT
        !           337: #define APIC_STRAY_INTEGRATE
        !           338: #define APIC_STRAY_TEST(name,num)
        !           339: #endif /* DEBUG */
        !           340:
        !           341: APICINTR(ioapic,0, voidop, ioapic_asm_ack, voidop, voidop, voidop)
        !           342: APICINTR(ioapic,1, voidop, ioapic_asm_ack, voidop, voidop, voidop)
        !           343: APICINTR(ioapic,2, voidop, ioapic_asm_ack, voidop, voidop, voidop)
        !           344: APICINTR(ioapic,3, voidop, ioapic_asm_ack, voidop, voidop, voidop)
        !           345: APICINTR(ioapic,4, voidop, ioapic_asm_ack, voidop, voidop, voidop)
        !           346: APICINTR(ioapic,5, voidop, ioapic_asm_ack, voidop, voidop, voidop)
        !           347: APICINTR(ioapic,6, voidop, ioapic_asm_ack, voidop, voidop, voidop)
        !           348: APICINTR(ioapic,7, voidop, ioapic_asm_ack, voidop, voidop, voidop)
        !           349: APICINTR(ioapic,8, voidop, ioapic_asm_ack, voidop, voidop, voidop)
        !           350: APICINTR(ioapic,9, voidop, ioapic_asm_ack, voidop, voidop, voidop)
        !           351: APICINTR(ioapic,10, voidop, ioapic_asm_ack, voidop, voidop, voidop)
        !           352: APICINTR(ioapic,11, voidop, ioapic_asm_ack, voidop, voidop, voidop)
        !           353: APICINTR(ioapic,12, voidop, ioapic_asm_ack, voidop, voidop, voidop)
        !           354: APICINTR(ioapic,13, voidop, ioapic_asm_ack, voidop, voidop, voidop)
        !           355: APICINTR(ioapic,14, voidop, ioapic_asm_ack, voidop, voidop, voidop)
        !           356: APICINTR(ioapic,15, voidop, ioapic_asm_ack, voidop, voidop, voidop)
        !           357:
        !           358:        .globl  _C_LABEL(Xintr_ioapic0),_C_LABEL(Xintr_ioapic1)
        !           359:        .globl  _C_LABEL(Xintr_ioapic2),_C_LABEL(Xintr_ioapic3)
        !           360:        .globl  _C_LABEL(Xintr_ioapic4),_C_LABEL(Xintr_ioapic5)
        !           361:        .globl  _C_LABEL(Xintr_ioapic6),_C_LABEL(Xintr_ioapic7)
        !           362:        .globl  _C_LABEL(Xintr_ioapic8),_C_LABEL(Xintr_ioapic9)
        !           363:        .globl  _C_LABEL(Xintr_ioapic10),_C_LABEL(Xintr_ioapic11)
        !           364:        .globl  _C_LABEL(Xintr_ioapic12),_C_LABEL(Xintr_ioapic13)
        !           365:        .globl  _C_LABEL(Xintr_ioapic14),_C_LABEL(Xintr_ioapic15)
        !           366:        .globl _C_LABEL(apichandler)
        !           367:
        !           368: _C_LABEL(apichandler):
        !           369:        .long   _C_LABEL(Xintr_ioapic0),_C_LABEL(Xintr_ioapic1)
        !           370:        .long   _C_LABEL(Xintr_ioapic2),_C_LABEL(Xintr_ioapic3)
        !           371:        .long   _C_LABEL(Xintr_ioapic4),_C_LABEL(Xintr_ioapic5)
        !           372:        .long   _C_LABEL(Xintr_ioapic6),_C_LABEL(Xintr_ioapic7)
        !           373:        .long   _C_LABEL(Xintr_ioapic8),_C_LABEL(Xintr_ioapic9)
        !           374:        .long   _C_LABEL(Xintr_ioapic10),_C_LABEL(Xintr_ioapic11)
        !           375:        .long   _C_LABEL(Xintr_ioapic12),_C_LABEL(Xintr_ioapic13)
        !           376:        .long   _C_LABEL(Xintr_ioapic14),_C_LABEL(Xintr_ioapic15)
        !           377:
        !           378: #endif
        !           379:

CVSweb