home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Source Code 1993 July / THE_SOURCE_CODE_CD_ROM.iso / bsd_srcs / sys / i386 / isa / icu.s < prev    next >
Encoding:
Text File  |  1991-05-21  |  12.8 KB  |  595 lines

  1. /*-
  2.  * Copyright (c) 1989, 1990 William F. Jolitz.
  3.  * Copyright (c) 1990 The Regents of the University of California.
  4.  * All rights reserved.
  5.  *
  6.  * This code is derived from software contributed to Berkeley by
  7.  * William Jolitz.
  8.  *
  9.  * Redistribution and use in source and binary forms, with or without
  10.  * modification, are permitted provided that the following conditions
  11.  * are met:
  12.  * 1. Redistributions of source code must retain the above copyright
  13.  *    notice, this list of conditions and the following disclaimer.
  14.  * 2. Redistributions in binary form must reproduce the above copyright
  15.  *    notice, this list of conditions and the following disclaimer in the
  16.  *    documentation and/or other materials provided with the distribution.
  17.  * 3. All advertising materials mentioning features or use of this software
  18.  *    must display the following acknowledgement:
  19.  *    This product includes software developed by the University of
  20.  *    California, Berkeley and its contributors.
  21.  * 4. Neither the name of the University nor the names of its contributors
  22.  *    may be used to endorse or promote products derived from this software
  23.  *    without specific prior written permission.
  24.  *
  25.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  26.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  27.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  28.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  29.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  30.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  31.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  32.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  33.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  34.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  35.  * SUCH DAMAGE.
  36.  *
  37.  *    @(#)icu.s    7.2 (Berkeley) 5/21/91
  38.  */
  39.  
  40. /*
  41.  * AT/386
  42.  * Vector interrupt control section
  43.  */
  44.  
  45.     .data
  46.     .globl    _imen
  47.     .globl    _cpl
  48. _cpl:    .long    0xffff            # current priority level (all off)
  49. _imen:    .long    0xffff            # interrupt mask enable (all off)
  50.     .globl    _highmask
  51. _highmask:    .long    0xffff
  52.     .globl    _ttymask
  53. _ttymask:    .long    0
  54.     .globl    _biomask
  55. _biomask:    .long    0
  56.     .globl    _netmask
  57. _netmask:    .long    0
  58.     .globl    _isa_intr
  59. _isa_intr:    .space    16*4
  60.  
  61.     .text
  62. /*
  63.  * Handle return from interrupt after device handler finishes
  64.  */
  65. doreti:
  66.     cli
  67.     popl    %ebx            # remove intr number
  68.     popl    %eax            # get previous priority
  69.     # now interrupt frame is a trap frame!
  70.     movw    %ax,%cx
  71.     movw    %ax,_cpl
  72.     orw    _imen,%ax
  73.     NOP
  74.     outb    %al,$ IO_ICU1+1        # re-enable intr?
  75.     NOP
  76.     movb    %ah,%al
  77.     NOP
  78.     outb    %al,$ IO_ICU2+1
  79.     NOP
  80.     inb    $0x84,%al
  81.  
  82.     andw    $0xffff,%cx    
  83.     cmpw    $0,%cx            # returning to zero?
  84.     je    1f
  85.  
  86.     pop    %es            # nope, going to non-zero level
  87.     pop    %ds
  88.     popa
  89.     addl    $8,%esp
  90.     iret
  91.  
  92. 1:    cmpl    $0,_netisr        # check for softint s/traps
  93.     jne    1f
  94.  
  95.     pop    %es            # none, going back to base pri
  96.     pop    %ds
  97.     popa
  98.     addl    $8,%esp
  99.     iret
  100.     
  101. #include "../net/netisr.h"
  102.  
  103. 1:
  104.  
  105. #define DONET(s, c)    ; \
  106.     .globl    c ;  \
  107.     movl    $ s ,%eax ;     \
  108.     btrl    %eax,_netisr ;  \
  109.     jnb    1f ; \
  110.     call    c ; \
  111. 1:
  112.  
  113.     call    _splnet
  114.     pushl    %eax
  115.  
  116.     DONET(NETISR_RAW,_rawintr)
  117. #ifdef INET
  118.     DONET(NETISR_IP,_ipintr)
  119. #endif
  120. #ifdef IMP
  121.     DONET(NETISR_IMP,_impintr)
  122. #endif
  123. #ifdef NS
  124.     DONET(NETISR_NS,_nsintr)
  125. #endif
  126.  
  127.     popl    %eax
  128.     movw    %ax,_cpl
  129.     orw    _imen,%ax
  130.     NOP
  131.     outb    %al,$ IO_ICU1+1        # re-enable intr?
  132.     NOP
  133.     movb    %ah,%al
  134.     NOP
  135.     outb    %al,$ IO_ICU2+1
  136.     NOP
  137.     inb    $0x84,%al
  138.  
  139.     # btrl    $ NETISR_SCLK,_netisr
  140.     movl    $ NETISR_SCLK,%eax    # stupid assembler, as usual
  141.     btrl    %eax,_netisr
  142.     jnb    1f
  143.     # back to an interrupt frame for a moment
  144.     call    _splsoftclock
  145.     pushl    %eax
  146.     pushl    $0xff    # dummy intr
  147.     call    _softclock
  148.     popl    %eax
  149.     call    _splx
  150.     popl    %eax
  151.  
  152.     jmp    2f
  153.  
  154.     /* 1:    btrl    $NETISR_AST,_netisr*/
  155. 1:
  156.     cmpw    $0x1f,13*4(%esp)    # to user?
  157.     jne    2f            # nope, leave
  158.     movl    $ NETISR_AST,%eax    # stupid assembler, as usual
  159.     btrl    %eax,_netisr
  160.     jnb    2f
  161.     call    _trap
  162.  
  163. 2:    pop    %es
  164.     pop    %ds
  165.     popal
  166.     addl    $8,%esp
  167.     iret
  168.  
  169. /*
  170.  * Interrupt priority mechanism
  171.  *
  172.  * Two flavors    -- imlXX masks relative to ISA noemenclature (for PC compat sw)
  173.  *        -- splXX masks with group mechanism for BSD purposes
  174.  */
  175.  
  176.     .globl    _splhigh
  177.     .globl    _splclock
  178. _splhigh:
  179. _splclock:
  180.     cli                # disable interrupts
  181.     movw    $0xffff,%ax        # set new priority level
  182.     movw    %ax,%dx
  183.     # orw    _imen,%ax        # mask off those not enabled yet
  184.     movw    %ax,%cx
  185.     NOP
  186.     outb    %al,$ IO_ICU1+1        /* update icu's */
  187.     NOP
  188.     movb    %ah,%al
  189.     NOP
  190.     outb    %al,$ IO_ICU2+1
  191.     NOP
  192.     inb    $0x84,%al
  193.     movzwl    _cpl,%eax        # return old priority
  194.     movw    %dx,_cpl        # set new priority level
  195.     sti                # enable interrupts
  196.     ret
  197.  
  198.     .globl    _spltty            # block clists
  199. _spltty:
  200.     cli                # disable interrupts
  201.     movw    _cpl,%ax
  202.     orw    _ttymask,%ax
  203.     movw    %ax,%dx
  204.     orw    _imen,%ax        # mask off those not enabled yet
  205.     movw    %ax,%cx
  206.     NOP
  207.     outb    %al,$ IO_ICU1+1        /* update icu's */
  208.     NOP
  209.     movb    %ah,%al
  210.     NOP
  211.     outb    %al,$ IO_ICU2+1
  212.     NOP
  213.     inb    $0x84,%al
  214.     movzwl    _cpl,%eax        # return old priority
  215.     movw    %dx,_cpl        # set new priority level
  216.     sti                # enable interrupts
  217.     ret
  218.  
  219.     .globl    _splimp
  220.     .globl    _splnet
  221. _splimp:
  222. _splnet:
  223.     cli                # disable interrupts
  224.     movw    _cpl,%ax
  225.     orw    _netmask,%ax
  226.     movw    %ax,%dx
  227.     orw    _imen,%ax        # mask off those not enabled yet
  228.     movw    %ax,%cx
  229.     NOP
  230.     outb    %al,$ IO_ICU1+1        /* update icu's */
  231.     NOP
  232.     movb    %ah,%al
  233.     NOP
  234.     outb    %al,$ IO_ICU2+1
  235.     NOP
  236.     inb    $0x84,%al
  237.     movzwl    _cpl,%eax        # return old priority
  238.     movw    %dx,_cpl        # set new priority level
  239.     sti                # enable interrupts
  240.     ret
  241.  
  242.     .globl    _splbio    
  243. _splbio:
  244.     cli                # disable interrupts
  245.     movw    _cpl,%ax
  246.     orw    _biomask,%ax
  247.     movw    %ax,%dx
  248.     orw    _imen,%ax        # mask off those not enabled yet
  249.     movw    %ax,%cx
  250.     NOP
  251.     outb    %al,$ IO_ICU1+1        /* update icu's */
  252.     NOP
  253.     movb    %ah,%al
  254.     NOP
  255.     outb    %al,$ IO_ICU2+1
  256.     NOP
  257.     inb    $0x84,%al
  258.     movzwl    _cpl,%eax        # return old priority
  259.     movw    %dx,_cpl        # set new priority level
  260.     sti                # enable interrupts
  261.     ret
  262.  
  263.     .globl    _splsoftclock
  264. _splsoftclock:
  265.     cli                # disable interrupts
  266.     movw    _cpl,%ax
  267.     orw    $0x8000,%ax        # set new priority level
  268.     movw    %ax,%dx
  269.     orw    _imen,%ax        # mask off those not enabled yet
  270.     movw    %ax,%cx
  271.     NOP
  272.     outb    %al,$ IO_ICU1+1        /* update icu's */
  273.     NOP
  274.     movb    %ah,%al
  275.     NOP
  276.     outb    %al,$ IO_ICU2+1
  277.     NOP
  278.     inb    $0x84,%al
  279.     movzwl    _cpl,%eax        # return old priority
  280.     movw    %dx,_cpl        # set new priority level
  281.     sti                # enable interrupts
  282.     ret
  283.  
  284.     .globl _splnone
  285.     .globl _spl0
  286. _splnone:
  287. _spl0:
  288.     cli                # disable interrupts
  289.     pushl    _cpl            # save old priority
  290.     movw    _cpl,%ax
  291.     orw    _netmask,%ax        # mask off those network devices
  292.     movw    %ax,_cpl        # set new priority level
  293.     orw    _imen,%ax        # mask off those not enabled yet
  294.     NOP
  295.     outb    %al,$ IO_ICU1+1        /* update icu's */
  296.     NOP
  297.     movb    %ah,%al
  298.     NOP
  299.     outb    %al,$ IO_ICU2+1
  300.     NOP
  301.     inb    $0x84,%al
  302.     sti                # enable interrupts
  303.  
  304.     DONET(NETISR_RAW,_rawintr)
  305. #ifdef INET
  306.     DONET(NETISR_IP,_ipintr)
  307. #endif
  308.     cli                # disable interrupts
  309.     popl    _cpl            # save old priority
  310.     movw    $0,%ax            # set new priority level
  311.     movw    %ax,%dx
  312.     orw    _imen,%ax        # mask off those not enabled yet
  313.     movw    %ax,%cx
  314.     NOP
  315.     outb    %al,$ IO_ICU1+1        /* update icu's */
  316.     NOP
  317.     movb    %ah,%al
  318.     NOP
  319.     outb    %al,$ IO_ICU2+1
  320.     NOP
  321.     inb    $0x84,%al
  322.     movzwl    _cpl,%eax        # return old priority
  323.     movw    %dx,_cpl        # set new priority level
  324.     sti                # enable interrupts
  325.     ret
  326.  
  327.     .globl _splx
  328. _splx:
  329.     cli                # disable interrupts
  330.     movw    4(%esp),%ax        # new priority level
  331.     movw    %ax,%dx
  332.     cmpw    $0,%dx
  333.     je    _spl0            # going to "zero level" is special
  334.  
  335.     orw    _imen,%ax        # mask off those not enabled yet
  336.     movw    %ax,%cx
  337.     NOP
  338.     outb    %al,$ IO_ICU1+1        /* update icu's */
  339.     NOP
  340.     movb    %ah,%al
  341.     NOP
  342.     outb    %al,$ IO_ICU2+1
  343.     NOP
  344.     inb    $0x84,%al
  345.     movzwl    _cpl,%eax        # return old priority
  346.     movw    %dx,_cpl        # set new priority level
  347.     sti                # enable interrupts
  348.     ret
  349.  
  350. #ifdef notyet
  351.     .globl    _iml8            # mask off all but irq0-1
  352. _iml8:
  353.     cli                # disable interrupts
  354.     movw    $0xfffc,%ax        # set new priority level
  355.     movw    %ax,%dx
  356.     orw    _imen,%ax        # mask off those not enabled yet
  357.     movw    %ax,%cx
  358.     NOP
  359.     outb    %al,$ IO_ICU1+1        /* update icu's */
  360.     NOP
  361.     movb    %ah,%al
  362.     NOP
  363.     outb    %al,$ IO_ICU2+1
  364.     NOP
  365.     movzwl    _cpl,%eax        # return old priority
  366.     movw    %dx,_cpl        # set new priority level
  367.     sti                # enable interrupts
  368.     ret
  369.  
  370.     .globl    _iml10            # mask off all but irq0-1,8-9
  371. _iml10:
  372.     cli                # disable interrupts
  373.     movw    $0xfcf8,%ax        # set new priority level
  374.     movw    %ax,%dx
  375.     orw    _imen,%ax        # mask off those not enabled yet
  376.     movw    %ax,%cx
  377.     NOP
  378.     outb    %al,$ IO_ICU1+1        /* update icu's */
  379.     NOP
  380.     movb    %ah,%al
  381.     NOP
  382.     outb    %al,$ IO_ICU2+1
  383.     NOP
  384.     movzwl    _cpl,%eax        # return old priority
  385.     movw    %dx,_cpl        # set new priority level
  386.     sti                # enable interrupts
  387.     ret
  388.  
  389.     .globl    _iml11            # mask off all but irq0-1,8-10
  390. _iml11:
  391.     cli                # disable interrupts
  392.     movw    $0xf8f8,%ax        # set new priority level
  393.     movw    %ax,%dx
  394.     orw    _imen,%ax        # mask off those not enabled yet
  395.     movw    %ax,%cx
  396.     NOP
  397.     outb    %al,$ IO_ICU1+1        /* update icu's */
  398.     NOP
  399.     movb    %ah,%al
  400.     NOP
  401.     outb    %al,$ IO_ICU2+1
  402.     NOP
  403.     movzwl    _cpl,%eax        # return old priority
  404.     movw    %dx,_cpl        # set new priority level
  405.     sti                # enable interrupts
  406.     ret
  407.  
  408.     .globl    _iml12            # mask off all but irq0-1,8-11
  409. _iml12:
  410.     cli                # disable interrupts
  411.     movw    $0xf0f8,%ax        # set new priority level
  412.     movw    %ax,%dx
  413.     orw    _imen,%ax        # mask off those not enabled yet
  414.     movw    %ax,%cx
  415.     NOP
  416.     outb    %al,$ IO_ICU1+1        /* update icu's */
  417.     NOP
  418.     movb    %ah,%al
  419.     NOP
  420.     outb    %al,$ IO_ICU2+1
  421.     NOP
  422.     movzwl    _cpl,%eax        # return old priority
  423.     movw    %dx,_cpl        # set new priority level
  424.     sti                # enable interrupts
  425.     ret
  426.  
  427.     .globl    _iml13            # mask off all but irq0-1,8-12
  428. _iml13:
  429.     cli                # disable interrupts
  430.     movw    $0xe0f8,%ax        # set new priority level
  431.     movw    %ax,%dx
  432.     orw    _imen,%ax        # mask off those not enabled yet
  433.     movw    %ax,%cx
  434.     NOP
  435.     outb    %al,$ IO_ICU1+1        /* update icu's */
  436.     NOP
  437.     movb    %ah,%al
  438.     NOP
  439.     outb    %al,$ IO_ICU2+1
  440.     NOP
  441.     movzwl    _cpl,%eax        # return old priority
  442.     movw    %dx,_cpl        # set new priority level
  443.     sti                # enable interrupts
  444.     ret
  445.  
  446.     .globl    _iml15            # mask off all but irq0-1,8-14
  447. _iml15:
  448.     cli                # disable interrupts
  449.     movw    $0x80f8,%ax        # set new priority level
  450.     movw    %ax,%dx
  451.     orw    _imen,%ax        # mask off those not enabled yet
  452.     movw    %ax,%cx
  453.     NOP
  454.     outb    %al,$ IO_ICU1+1        /* update icu's */
  455.     NOP
  456.     movb    %ah,%al
  457.     NOP
  458.     outb    %al,$ IO_ICU2+1
  459.     NOP
  460.     movzwl    _cpl,%eax        # return old priority
  461.     movw    %dx,_cpl        # set new priority level
  462.     sti                # enable interrupts
  463.     ret
  464.  
  465.     .globl    _iml3            # mask off all but irq0-1,8-15
  466. _iml3:
  467.     cli                # disable interrupts
  468.     movw    $0x00f8,%ax        # set new priority level
  469.     movw    %ax,%dx
  470.     orw    _imen,%ax        # mask off those not enabled yet
  471.     movw    %ax,%cx
  472.     NOP
  473.     outb    %al,$ IO_ICU1+1        /* update icu's */
  474.     NOP
  475.     movb    %ah,%al
  476.     NOP
  477.     outb    %al,$ IO_ICU2+1
  478.     NOP
  479.     movzwl    _cpl,%eax        # return old priority
  480.     movw    %dx,_cpl        # set new priority level
  481.     sti                # enable interrupts
  482.     ret
  483.  
  484.     .globl    _iml4            # mask off all but irq0-1,8-15,3
  485. _iml4:
  486.     cli                # disable interrupts
  487.     movw    $0x00f0,%ax        # set new priority level
  488.     movw    %ax,%dx
  489.     orw    _imen,%ax        # mask off those not enabled yet
  490.     movw    %ax,%cx
  491.     NOP
  492.     outb    %al,$ IO_ICU1+1        /* update icu's */
  493.     NOP
  494.     movb    %ah,%al
  495.     NOP
  496.     outb    %al,$ IO_ICU2+1
  497.     NOP
  498.     movzwl    _cpl,%eax        # return old priority
  499.     movw    %dx,_cpl        # set new priority level
  500.     sti                # enable interrupts
  501.     ret
  502.  
  503.     .globl    _iml5            # mask off all but irq0-1,8-15,3-4
  504. _iml5:
  505.     cli                # disable interrupts
  506.     movw    $0x00e0,%ax        # set new priority level
  507.     movw    %ax,%dx
  508.     orw    _imen,%ax        # mask off those not enabled yet
  509.     movw    %ax,%cx
  510.     NOP
  511.     outb    %al,$ IO_ICU1+1        /* update icu's */
  512.     NOP
  513.     movb    %ah,%al
  514.     NOP
  515.     outb    %al,$ IO_ICU2+1
  516.     NOP
  517.     movzwl    _cpl,%eax        # return old priority
  518.     movw    %dx,_cpl        # set new priority level
  519.     sti                # enable interrupts
  520.     ret
  521.  
  522.     .globl    _iml6            # mask off all but irq0-1,8-15,3-5
  523. _iml6:
  524.     cli                # disable interrupts
  525.     movw    $0x00c0,%ax        # set new priority level
  526.     movw    %ax,%dx
  527.     orw    _imen,%ax        # mask off those not enabled yet
  528.     movw    %ax,%cx
  529.     NOP
  530.     outb    %al,$ IO_ICU1+1        /* update icu's */
  531.     NOP
  532.     movb    %ah,%al
  533.     NOP
  534.     outb    %al,$ IO_ICU2+1
  535.     NOP
  536.     movzwl    _cpl,%eax        # return old priority
  537.     movw    %dx,_cpl        # set new priority level
  538.     sti                # enable interrupts
  539.     ret
  540.  
  541. #endif    notyet
  542.  
  543.     /* hardware interrupt catcher (IDT 32 - 47) */
  544.     .globl    _isa_strayintr
  545.  
  546. IDTVEC(intr0)
  547.     INTR(0, _highmask, 0) ; call    _isa_strayintr ; INTREXIT1
  548.  
  549. IDTVEC(intr1)
  550.     INTR(1, _highmask, 1) ; call    _isa_strayintr ; INTREXIT1
  551.  
  552. IDTVEC(intr2)
  553.     INTR(2, _highmask, 2) ; call    _isa_strayintr ; INTREXIT1
  554.  
  555. IDTVEC(intr3)
  556.     INTR(3, _highmask, 3) ; call    _isa_strayintr ; INTREXIT1
  557.  
  558. IDTVEC(intr4)
  559.     INTR(4, _highmask, 4) ; call    _isa_strayintr ; INTREXIT1
  560.  
  561. IDTVEC(intr5)
  562.     INTR(5, _highmask, 5) ; call    _isa_strayintr ; INTREXIT1
  563.  
  564. IDTVEC(intr6)
  565.     INTR(6, _highmask, 6) ; call    _isa_strayintr ; INTREXIT1
  566.  
  567. IDTVEC(intr7)
  568.     INTR(7, _highmask, 7) ; call    _isa_strayintr ; INTREXIT1
  569.  
  570.  
  571. IDTVEC(intr8)
  572.     INTR(8, _highmask, 8) ; call    _isa_strayintr ; INTREXIT2
  573.  
  574. IDTVEC(intr9)
  575.     INTR(9, _highmask, 9) ; call    _isa_strayintr ; INTREXIT2
  576.  
  577. IDTVEC(intr10)
  578.     INTR(10, _highmask, 10) ; call    _isa_strayintr ; INTREXIT2
  579.  
  580. IDTVEC(intr11)
  581.     INTR(11, _highmask, 11) ; call    _isa_strayintr ; INTREXIT2
  582.  
  583. IDTVEC(intr12)
  584.     INTR(12, _highmask, 12) ; call    _isa_strayintr ; INTREXIT2
  585.  
  586. IDTVEC(intr13)
  587.     INTR(13, _highmask, 13) ; call    _isa_strayintr ; INTREXIT2
  588.  
  589. IDTVEC(intr14)
  590.     INTR(14, _highmask, 14) ; call    _isa_strayintr ; INTREXIT2
  591.  
  592. IDTVEC(intr15)
  593.     INTR(15, _highmask, 15) ; call    _isa_strayintr ; INTREXIT2
  594.  
  595.