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