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

Annotation of sys/arch/i386/isa/icu.s, Revision 1.1

1.1     ! nbrk        1: /*     $OpenBSD: icu.s,v 1.25 2007/05/25 21:27:15 krw Exp $    */
        !             2: /*     $NetBSD: icu.s,v 1.45 1996/01/07 03:59:34 mycroft Exp $ */
        !             3:
        !             4: /*-
        !             5:  * Copyright (c) 1993, 1994, 1995 Charles M. Hannum.  All rights reserved.
        !             6:  *
        !             7:  * Redistribution and use in source and binary forms, with or without
        !             8:  * modification, are permitted provided that the following conditions
        !             9:  * are met:
        !            10:  * 1. Redistributions of source code must retain the above copyright
        !            11:  *    notice, this list of conditions and the following disclaimer.
        !            12:  * 2. Redistributions in binary form must reproduce the above copyright
        !            13:  *    notice, this list of conditions and the following disclaimer in the
        !            14:  *    documentation and/or other materials provided with the distribution.
        !            15:  * 3. All advertising materials mentioning features or use of this software
        !            16:  *    must display the following acknowledgement:
        !            17:  *     This product includes software developed by Charles M. Hannum.
        !            18:  * 4. The name of the author may not be used to endorse or promote products
        !            19:  *    derived from this software without specific prior written permission.
        !            20:  *
        !            21:  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
        !            22:  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
        !            23:  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
        !            24:  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
        !            25:  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
        !            26:  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
        !            27:  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
        !            28:  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
        !            29:  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
        !            30:  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
        !            31:  */
        !            32:
        !            33: #include <net/netisr.h>
        !            34:
        !            35:        .data
        !            36:        .globl  _C_LABEL(imen),_C_LABEL(ipending),_C_LABEL(netisr)
        !            37: _C_LABEL(imen):
        !            38:        .long   0xffff          # interrupt mask enable (all off)
        !            39: _C_LABEL(ipending):
        !            40:        .long   0               # interrupts pending
        !            41: _C_LABEL(netisr):
        !            42:        .long   0               # scheduling bits for network
        !            43:
        !            44:        .text
        !            45: /*
        !            46:  * Process pending interrupts.
        !            47:  *
        !            48:  * Important registers:
        !            49:  *   ebx - cpl
        !            50:  *   esi - address to resume loop at
        !            51:  *   edi - scratch for Xsoftnet
        !            52:  */
        !            53: IDTVEC(spllower)
        !            54:        pushl   %ebx
        !            55:        pushl   %esi
        !            56:        pushl   %edi
        !            57:        movl    CPL,%ebx                # save priority
        !            58:        movl    $1f,%esi                # address to resume loop at
        !            59: 1:     movl    %ebx,%eax               # get cpl
        !            60:        shrl    $4,%eax                 # find its mask.
        !            61:        movl    _C_LABEL(iunmask)(,%eax,4),%eax
        !            62:        cli
        !            63:        andl    _C_LABEL(ipending),%eax         # any non-masked bits left?
        !            64:        jz      2f
        !            65:        sti
        !            66:        bsfl    %eax,%eax
        !            67:        btrl    %eax,_C_LABEL(ipending)
        !            68:        jnc     1b
        !            69:        jmp     *_C_LABEL(Xrecurse)(,%eax,4)
        !            70: 2:     movl    %ebx,CPL
        !            71:        sti
        !            72:        popl    %edi
        !            73:        popl    %esi
        !            74:        popl    %ebx
        !            75:        ret
        !            76:
        !            77: /*
        !            78:  * Handle return from interrupt after device handler finishes.
        !            79:  *
        !            80:  * Important registers:
        !            81:  *   ebx - cpl to restore
        !            82:  *   esi - address to resume loop at
        !            83:  *   edi - scratch for Xsoftnet
        !            84:  */
        !            85: IDTVEC(doreti)
        !            86:        popl    %ebx                    # get previous priority
        !            87:        movl    $1f,%esi                # address to resume loop at
        !            88: 1:     movl    %ebx,%eax
        !            89:        shrl    $4,%eax
        !            90:        movl    _C_LABEL(iunmask)(,%eax,4),%eax
        !            91:        cli
        !            92:        andl    _C_LABEL(ipending),%eax
        !            93:        jz      2f
        !            94:        sti
        !            95:        bsfl    %eax,%eax               # slow, but not worth optimizing
        !            96:        btrl    %eax,_C_LABEL(ipending)
        !            97:        jnc     1b                      # some intr cleared the in-memory bit
        !            98:        cli
        !            99:        jmp     *_C_LABEL(Xresume)(,%eax,4)
        !           100: 2:     /* Check for ASTs on exit to user mode. */
        !           101:        CHECK_ASTPENDING(%ecx)
        !           102:        movl    %ebx,CPL
        !           103:        je      3f
        !           104:        testb   $SEL_RPL,TF_CS(%esp)
        !           105: #ifdef VM86
        !           106:        jnz     4f
        !           107:        testl   $PSL_VM,TF_EFLAGS(%esp)
        !           108: #endif
        !           109:        jz      3f
        !           110: 4:     CLEAR_ASTPENDING(%ecx)
        !           111:        sti
        !           112:        movl    $T_ASTFLT,TF_TRAPNO(%esp)       /* XXX undo later. */
        !           113:        /* Pushed T_ASTFLT into tf_trapno on entry. */
        !           114:        call    _C_LABEL(trap)
        !           115:        cli
        !           116:        jmp     2b
        !           117: 3:     INTRFASTEXIT
        !           118:
        !           119:
        !           120: /*
        !           121:  * Soft interrupt handlers
        !           122:  */
        !           123:
        !           124: #include "pccom.h"
        !           125:
        !           126: IDTVEC(softast)
        !           127:        movl    $IPL_SOFTAST,%eax
        !           128:        movl    %eax,CPL
        !           129:        sti
        !           130:        jmp     *%esi
        !           131:
        !           132: IDTVEC(softtty)
        !           133: #if NPCCOM > 0
        !           134:        movl    $IPL_SOFTTTY,%eax
        !           135:        movl    %eax,CPL
        !           136:        sti
        !           137: #ifdef MULTIPROCESSOR
        !           138:        call    _C_LABEL(i386_softintlock)
        !           139: #endif
        !           140:        call    _C_LABEL(comsoft)
        !           141: #ifdef MULTIPROCESSOR
        !           142:        call    _C_LABEL(i386_softintunlock)
        !           143: #endif
        !           144: #endif
        !           145:        jmp     *%esi
        !           146:
        !           147: #define DONETISR(s, c) \
        !           148:        .globl  _C_LABEL(c)     ;\
        !           149:        testl   $(1 << s),%edi  ;\
        !           150:        jz      1f              ;\
        !           151:        call    _C_LABEL(c)     ;\
        !           152: 1:
        !           153:
        !           154: IDTVEC(softnet)
        !           155:        movl    $IPL_SOFTNET,%eax
        !           156:        movl    %eax,CPL
        !           157:        sti
        !           158: #ifdef MULTIPROCESSOR
        !           159:        call    _C_LABEL(i386_softintlock)
        !           160: #endif
        !           161:        xorl    %edi,%edi
        !           162:        xchgl   _C_LABEL(netisr),%edi
        !           163: #include <net/netisr_dispatch.h>
        !           164: #ifdef MULTIPROCESSOR
        !           165:        call    _C_LABEL(i386_softintunlock)
        !           166: #endif
        !           167:        jmp     *%esi
        !           168: #undef DONETISR
        !           169:
        !           170: IDTVEC(softclock)
        !           171:        movl    $IPL_SOFTCLOCK,%eax
        !           172:        movl    %eax,CPL
        !           173:        sti
        !           174: #ifdef MULTIPROCESSOR
        !           175:        call    _C_LABEL(i386_softintlock)
        !           176: #endif
        !           177:        call    _C_LABEL(softclock)
        !           178: #ifdef MULTIPROCESSOR
        !           179:        call    _C_LABEL(i386_softintunlock)
        !           180: #endif
        !           181:        jmp     *%esi
        !           182:

CVSweb