date and time created 90/04/24 12:59:26 by william
authorWilliam Nesheim <william@ucbvax.Berkeley.EDU>
Wed, 25 Apr 1990 03:59:26 +0000 (19:59 -0800)
committerWilliam Nesheim <william@ucbvax.Berkeley.EDU>
Wed, 25 Apr 1990 03:59:26 +0000 (19:59 -0800)
SCCS-vsn: sys/i386/isa/icu.s 5.1

usr/src/sys/i386/isa/icu.s [new file with mode: 0644]

diff --git a/usr/src/sys/i386/isa/icu.s b/usr/src/sys/i386/isa/icu.s
new file mode 100644 (file)
index 0000000..ab81a5e
--- /dev/null
@@ -0,0 +1,371 @@
+/*-
+ * Copyright (c) 1990 The Regents of the University of California.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * William Jolitz.
+ *
+ * %sccs.include.386.c%
+ *
+ *     @(#)icu.s       5.1 (Berkeley) %G%
+ */
+
+/*
+ * AT/386
+ * Vector interrupt control section
+ * W. Jolitz   8/89
+ */
+
+       .data
+       .globl  _imen
+       .globl  _cpl
+_cpl:  .long   15                      # current priority level (all off)
+_imen: .long   0xffff                  # interrupt mask enable (all off)
+       .text
+
+       .globl  _iml0                   # masks off all interrupts
+       .globl  _splhigh
+       .globl  _splclock
+       .globl  _spl6
+_iml0:
+_spl6:
+_splhigh:
+_splclock:
+       cli                             # disable interrupts
+       movw    $0xffff,%ax             # set new priority level
+       movw    %ax,%dx
+       orw     _imen,%ax               # mask off those not enabled yet
+       movw    %ax,%cx
+       NOP
+       outb    %al,$0x21               /* update icu's */
+       NOP
+       movb    %ah,%al
+       NOP
+       outb    %al,$0xA1
+       NOP
+       movzwl  _cpl,%eax               # return old priority
+       movw    %dx,_cpl                # set new priority level
+#      sti                             # enable interrupts
+       ret
+
+       .globl  _iml1                   # mask off all but irq0
+       .globl  _spltty                 # block clists
+_iml1:
+_spltty:
+       cli                             # disable interrupts
+       movw    $0xfffe,%ax             # set new priority level
+       movw    %ax,%dx
+       orw     _imen,%ax               # mask off those not enabled yet
+       movw    %ax,%cx
+       NOP
+       outb    %al,$0x21               /* update icu's */
+       NOP
+       movb    %ah,%al
+       NOP
+       outb    %al,$0xA1
+       NOP
+       movzwl  _cpl,%eax               # return old priority
+       movw    %dx,_cpl                # set new priority level
+#      sti                             # enable interrupts
+       ret
+
+       .globl  _iml8                   # mask off all but irq0-1
+_iml8:
+       cli                             # disable interrupts
+       movw    $0xfffc,%ax             # set new priority level
+       movw    %ax,%dx
+       orw     _imen,%ax               # mask off those not enabled yet
+       movw    %ax,%cx
+       NOP
+       outb    %al,$0x21               /* update icu's */
+       NOP
+       movb    %ah,%al
+       NOP
+       outb    %al,$0xA1
+       NOP
+       movzwl  _cpl,%eax               # return old priority
+       movw    %dx,_cpl                # set new priority level
+#      sti                             # enable interrupts
+       ret
+
+       .globl  _iml9                   # mask off all but irq0-1,8
+       .globl  _iml2                   # alias for PC hardware level 2
+       .globl  _splimp
+       .globl  _splnet
+_iml9:
+_iml2:
+_splimp:
+_splnet:
+       cli                             # disable interrupts
+       movw    $0xfef8,%ax             # set new priority level
+       movw    %ax,%dx
+       orw     _imen,%ax               # mask off those not enabled yet
+       movw    %ax,%cx
+       NOP
+       outb    %al,$0x21               /* update icu's */
+       NOP
+       movb    %ah,%al
+       NOP
+       outb    %al,$0xA1
+       NOP
+       movzwl  _cpl,%eax               # return old priority
+       movw    %dx,_cpl                # set new priority level
+#      sti                             # enable interrupts
+       ret
+
+       .globl  _iml10                  # mask off all but irq0-1,8-9
+_iml10:
+       cli                             # disable interrupts
+       movw    $0xfcf8,%ax             # set new priority level
+       movw    %ax,%dx
+       orw     _imen,%ax               # mask off those not enabled yet
+       movw    %ax,%cx
+       NOP
+       outb    %al,$0x21               /* update icu's */
+       NOP
+       movb    %ah,%al
+       NOP
+       outb    %al,$0xA1
+       NOP
+       movzwl  _cpl,%eax               # return old priority
+       movw    %dx,_cpl                # set new priority level
+       sti                             # enable interrupts
+       ret
+
+       .globl  _iml11                  # mask off all but irq0-1,8-10
+_iml11:
+       cli                             # disable interrupts
+       movw    $0xf8f8,%ax             # set new priority level
+       movw    %ax,%dx
+       orw     _imen,%ax               # mask off those not enabled yet
+       movw    %ax,%cx
+       NOP
+       outb    %al,$0x21               /* update icu's */
+       NOP
+       movb    %ah,%al
+       NOP
+       outb    %al,$0xA1
+       NOP
+       movzwl  _cpl,%eax               # return old priority
+       movw    %dx,_cpl                # set new priority level
+       sti                             # enable interrupts
+       ret
+
+       .globl  _iml12                  # mask off all but irq0-1,8-11
+_iml12:
+       cli                             # disable interrupts
+       movw    $0xf0f8,%ax             # set new priority level
+       movw    %ax,%dx
+       orw     _imen,%ax               # mask off those not enabled yet
+       movw    %ax,%cx
+       NOP
+       outb    %al,$0x21               /* update icu's */
+       NOP
+       movb    %ah,%al
+       NOP
+       outb    %al,$0xA1
+       NOP
+       movzwl  _cpl,%eax               # return old priority
+       movw    %dx,_cpl                # set new priority level
+       sti                             # enable interrupts
+       ret
+
+       .globl  _iml13                  # mask off all but irq0-1,8-12
+_iml13:
+       cli                             # disable interrupts
+       movw    $0xe0f8,%ax             # set new priority level
+       movw    %ax,%dx
+       orw     _imen,%ax               # mask off those not enabled yet
+       movw    %ax,%cx
+       NOP
+       outb    %al,$0x21               /* update icu's */
+       NOP
+       movb    %ah,%al
+       NOP
+       outb    %al,$0xA1
+       NOP
+       movzwl  _cpl,%eax               # return old priority
+       movw    %dx,_cpl                # set new priority level
+       sti                             # enable interrupts
+       ret
+
+       .globl  _iml14                  # mask off all but irq0-1,8-13
+       .globl  _splbio 
+_iml14:
+_splbio:
+       cli                             # disable interrupts
+       movw    $0xc0f8,%ax             # set new priority level
+       movw    %ax,%dx
+       orw     _imen,%ax               # mask off those not enabled yet
+       movw    %ax,%cx
+       NOP
+       outb    %al,$0x21               /* update icu's */
+       NOP
+       movb    %ah,%al
+       NOP
+       outb    %al,$0xA1
+       NOP
+       movzwl  _cpl,%eax               # return old priority
+       movw    %dx,_cpl                # set new priority level
+#      sti                             # enable interrupts
+       ret
+
+       .globl  _iml15                  # mask off all but irq0-1,8-14
+_iml15:
+       cli                             # disable interrupts
+       movw    $0x80f8,%ax             # set new priority level
+       movw    %ax,%dx
+       orw     _imen,%ax               # mask off those not enabled yet
+       movw    %ax,%cx
+       NOP
+       outb    %al,$0x21               /* update icu's */
+       NOP
+       movb    %ah,%al
+       NOP
+       outb    %al,$0xA1
+       NOP
+       movzwl  _cpl,%eax               # return old priority
+       movw    %dx,_cpl                # set new priority level
+       sti                             # enable interrupts
+       ret
+
+       .globl  _iml3                   # mask off all but irq0-1,8-15
+_iml3:
+       cli                             # disable interrupts
+       movw    $0x00f8,%ax             # set new priority level
+       movw    %ax,%dx
+       orw     _imen,%ax               # mask off those not enabled yet
+       movw    %ax,%cx
+       NOP
+       outb    %al,$0x21               /* update icu's */
+       NOP
+       movb    %ah,%al
+       NOP
+       outb    %al,$0xA1
+       NOP
+       movzwl  _cpl,%eax               # return old priority
+       movw    %dx,_cpl                # set new priority level
+       sti                             # enable interrupts
+       ret
+
+       .globl  _iml4                   # mask off all but irq0-1,8-15,3
+_iml4:
+       cli                             # disable interrupts
+       movw    $0x00f0,%ax             # set new priority level
+       movw    %ax,%dx
+       orw     _imen,%ax               # mask off those not enabled yet
+       movw    %ax,%cx
+       NOP
+       outb    %al,$0x21               /* update icu's */
+       NOP
+       movb    %ah,%al
+       NOP
+       outb    %al,$0xA1
+       NOP
+       movzwl  _cpl,%eax               # return old priority
+       movw    %dx,_cpl                # set new priority level
+       sti                             # enable interrupts
+       ret
+
+       .globl  _iml5                   # mask off all but irq0-1,8-15,3-4
+_iml5:
+       cli                             # disable interrupts
+       movw    $0x00e0,%ax             # set new priority level
+       movw    %ax,%dx
+       orw     _imen,%ax               # mask off those not enabled yet
+       movw    %ax,%cx
+       NOP
+       outb    %al,$0x21               /* update icu's */
+       NOP
+       movb    %ah,%al
+       NOP
+       outb    %al,$0xA1
+       NOP
+       movzwl  _cpl,%eax               # return old priority
+       movw    %dx,_cpl                # set new priority level
+       sti                             # enable interrupts
+       ret
+
+       .globl  _iml6                   # mask off all but irq0-1,8-15,3-5
+_iml6:
+       cli                             # disable interrupts
+       movw    $0x00c0,%ax             # set new priority level
+       movw    %ax,%dx
+       orw     _imen,%ax               # mask off those not enabled yet
+       movw    %ax,%cx
+       NOP
+       outb    %al,$0x21               /* update icu's */
+       NOP
+       movb    %ah,%al
+       NOP
+       outb    %al,$0xA1
+       NOP
+       movzwl  _cpl,%eax               # return old priority
+       movw    %dx,_cpl                # set new priority level
+       sti                             # enable interrupts
+       ret
+
+       .globl  _iml7,_splsoftclock     # mask off all but irq0-1,8-15,3-7
+_iml7:
+_splsoftclock:
+       cli                             # disable interrupts
+       movw    $0x0080,%ax             # set new priority level
+       movw    %ax,%dx
+       orw     _imen,%ax               # mask off those not enabled yet
+       movw    %ax,%cx
+       NOP
+       outb    %al,$0x21               /* update icu's */
+       NOP
+       movb    %ah,%al
+       NOP
+       outb    %al,$0xA1
+       NOP
+       movzwl  _cpl,%eax               # return old priority
+       movw    %dx,_cpl                # set new priority level
+#      sti                             # enable interrupts
+       ret
+
+       .globl _imlnone                 # masks off no interrupts
+       .globl _splnone
+       .globl _spl0
+_imlnone:
+_splnone:
+_spl0:
+       cli                             # disable interrupts
+       movw    $0,%ax                  # set new priority level
+       movw    %ax,%dx
+       orw     _imen,%ax               # mask off those not enabled yet
+       movw    %ax,%cx
+       NOP
+       outb    %al,$0x21               /* update icu's */
+       NOP
+       movb    %ah,%al
+       NOP
+       outb    %al,$0xA1
+       NOP
+       movzwl  _cpl,%eax               # return old priority
+       movw    %dx,_cpl                # set new priority level
+       sti                             # enable interrupts
+       ret
+
+       .globl _splx
+_splx:
+       cli                             # disable interrupts
+       movw    4(%esp),%ax             # new priority level
+       movw    %ax,%dx
+       orw     _imen,%ax               # mask off those not enabled yet
+       movw    %ax,%cx
+       NOP
+       outb    %al,$0x21               /* update icu's */
+       NOP
+       movb    %ah,%al
+       NOP
+       outb    %al,$0xA1
+       NOP
+       movzwl  _cpl,%eax               # return old priority
+       movw    %dx,_cpl                # set new priority level
+       cmpw    $0,%dx          # XXX
+       jne     1f              # XXX
+       sti                             # enable interrupts
+1:
+       ret