improvements to decrease interrupt latency
authorDon Ahn <donahn@ucbvax.Berkeley.EDU>
Sun, 24 Jun 1990 09:49:44 +0000 (01:49 -0800)
committerDon Ahn <donahn@ucbvax.Berkeley.EDU>
Sun, 24 Jun 1990 09:49:44 +0000 (01:49 -0800)
SCCS-vsn: sys/i386/isa/icu.s 5.2

usr/src/sys/i386/isa/icu.s

index ab81a5e..b8d2db4 100644 (file)
@@ -7,7 +7,7 @@
  *
  * %sccs.include.386.c%
  *
  *
  * %sccs.include.386.c%
  *
- *     @(#)icu.s       5.1 (Berkeley) %G%
+ *     @(#)icu.s       5.2 (Berkeley) %G%
  */
 
 /*
  */
 
 /*
        .data
        .globl  _imen
        .globl  _cpl
        .data
        .globl  _imen
        .globl  _cpl
-_cpl:  .long   15                      # current priority level (all off)
+_cpl:  .long   0xffff                  # current priority level (all off)
 _imen: .long   0xffff                  # interrupt mask enable (all off)
 _imen: .long   0xffff                  # interrupt mask enable (all off)
+       .globl  _ttymask
+_ttymask:      .long   IRQ1+IRQ3+IRQ4
+       .globl  _biomask
+_biomask:      .long   IRQ14+IRQ6
        .text
 
        .globl  _iml0                   # masks off all interrupts
        .text
 
        .globl  _iml0                   # masks off all interrupts
@@ -34,7 +38,7 @@ _splclock:
        cli                             # disable interrupts
        movw    $0xffff,%ax             # set new priority level
        movw    %ax,%dx
        cli                             # disable interrupts
        movw    $0xffff,%ax             # set new priority level
        movw    %ax,%dx
-       orw     _imen,%ax               # mask off those not enabled yet
+       # orw   _imen,%ax               # mask off those not enabled yet
        movw    %ax,%cx
        NOP
        outb    %al,$0x21               /* update icu's */
        movw    %ax,%cx
        NOP
        outb    %al,$0x21               /* update icu's */
@@ -45,7 +49,7 @@ _splclock:
        NOP
        movzwl  _cpl,%eax               # return old priority
        movw    %dx,_cpl                # set new priority level
        NOP
        movzwl  _cpl,%eax               # return old priority
        movw    %dx,_cpl                # set new priority level
-#      sti                             # enable interrupts
+       sti                             # enable interrupts
        ret
 
        .globl  _iml1                   # mask off all but irq0
        ret
 
        .globl  _iml1                   # mask off all but irq0
@@ -53,7 +57,9 @@ _splclock:
 _iml1:
 _spltty:
        cli                             # disable interrupts
 _iml1:
 _spltty:
        cli                             # disable interrupts
-       movw    $0xfffe,%ax             # set new priority level
+       # movw  $0xfffe,%ax             # set new priority level
+       movw    _cpl,%ax
+       orw     _ttymask,%ax
        movw    %ax,%dx
        orw     _imen,%ax               # mask off those not enabled yet
        movw    %ax,%cx
        movw    %ax,%dx
        orw     _imen,%ax               # mask off those not enabled yet
        movw    %ax,%cx
@@ -66,7 +72,7 @@ _spltty:
        NOP
        movzwl  _cpl,%eax               # return old priority
        movw    %dx,_cpl                # set new priority level
        NOP
        movzwl  _cpl,%eax               # return old priority
        movw    %dx,_cpl                # set new priority level
-#      sti                             # enable interrupts
+       sti                             # enable interrupts
        ret
 
        .globl  _iml8                   # mask off all but irq0-1
        ret
 
        .globl  _iml8                   # mask off all but irq0-1
@@ -85,7 +91,7 @@ _iml8:
        NOP
        movzwl  _cpl,%eax               # return old priority
        movw    %dx,_cpl                # set new priority level
        NOP
        movzwl  _cpl,%eax               # return old priority
        movw    %dx,_cpl                # set new priority level
-#      sti                             # enable interrupts
+       sti                             # enable interrupts
        ret
 
        .globl  _iml9                   # mask off all but irq0-1,8
        ret
 
        .globl  _iml9                   # mask off all but irq0-1,8
@@ -97,7 +103,8 @@ _iml2:
 _splimp:
 _splnet:
        cli                             # disable interrupts
 _splimp:
 _splnet:
        cli                             # disable interrupts
-       movw    $0xfef8,%ax             # set new priority level
+       # movw  $0xfef8,%ax             # set new priority level
+       movw    $0xffff,%ax             # set new priority level
        movw    %ax,%dx
        orw     _imen,%ax               # mask off those not enabled yet
        movw    %ax,%cx
        movw    %ax,%dx
        orw     _imen,%ax               # mask off those not enabled yet
        movw    %ax,%cx
@@ -110,7 +117,7 @@ _splnet:
        NOP
        movzwl  _cpl,%eax               # return old priority
        movw    %dx,_cpl                # set new priority level
        NOP
        movzwl  _cpl,%eax               # return old priority
        movw    %dx,_cpl                # set new priority level
-#      sti                             # enable interrupts
+       sti                             # enable interrupts
        ret
 
        .globl  _iml10                  # mask off all but irq0-1,8-9
        ret
 
        .globl  _iml10                  # mask off all but irq0-1,8-9
@@ -194,7 +201,10 @@ _iml13:
 _iml14:
 _splbio:
        cli                             # disable interrupts
 _iml14:
 _splbio:
        cli                             # disable interrupts
-       movw    $0xc0f8,%ax             # set new priority level
+       movw    _cpl,%ax
+       orw     _biomask,%ax
+       # movw  $0xffff,%ax             # set new priority level XXX
+       # movw  $0xc0f8,%ax             # set new priority level
        movw    %ax,%dx
        orw     _imen,%ax               # mask off those not enabled yet
        movw    %ax,%cx
        movw    %ax,%dx
        orw     _imen,%ax               # mask off those not enabled yet
        movw    %ax,%cx
@@ -207,7 +217,7 @@ _splbio:
        NOP
        movzwl  _cpl,%eax               # return old priority
        movw    %dx,_cpl                # set new priority level
        NOP
        movzwl  _cpl,%eax               # return old priority
        movw    %dx,_cpl                # set new priority level
-#      sti                             # enable interrupts
+       sti                             # enable interrupts
        ret
 
        .globl  _iml15                  # mask off all but irq0-1,8-14
        ret
 
        .globl  _iml15                  # mask off all but irq0-1,8-14
@@ -322,7 +332,7 @@ _splsoftclock:
        NOP
        movzwl  _cpl,%eax               # return old priority
        movw    %dx,_cpl                # set new priority level
        NOP
        movzwl  _cpl,%eax               # return old priority
        movw    %dx,_cpl                # set new priority level
-#      sti                             # enable interrupts
+       sti                             # enable interrupts
        ret
 
        .globl _imlnone                 # masks off no interrupts
        ret
 
        .globl _imlnone                 # masks off no interrupts
@@ -364,8 +374,5 @@ _splx:
        NOP
        movzwl  _cpl,%eax               # return old priority
        movw    %dx,_cpl                # set new priority level
        NOP
        movzwl  _cpl,%eax               # return old priority
        movw    %dx,_cpl                # set new priority level
-       cmpw    $0,%dx          # XXX
-       jne     1f              # XXX
        sti                             # enable interrupts
        sti                             # enable interrupts
-1:
        ret
        ret