[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

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