Annotation of researchv9/sys/sundev/zs_asm.s, revision 1.1

1.1     ! root        1:        .data
        !             2:        .asciz  "@(#)zs_asm.s 1.1 86/02/03 Copyr 1985 Sun Micro"
        !             3:        .even
        !             4:        .text
        !             5: /*
        !             6:  *     Copyright (c) 1985 by Sun Microsystems, Inc.
        !             7:  */
        !             8: #include "assym.s"
        !             9: #include "../machine/asm_linkage.h"
        !            10: #include "../machine/mmu.h"
        !            11: #include "../sundev/zsreg.h"
        !            12: 
        !            13: /*
        !            14:  * We come here for auto-vectored interrupts
        !            15:  * (All Sun-2s and the Sun-3 Model 25)
        !            16:  * We assume that the most recently interrupting
        !            17:  * chip is interrupting again and read the vector out of the
        !            18:  * chip and branch to the right routine. The "special receive"
        !            19:  * interrupt routine gets control if the assumption was wrong
        !            20:  * and performs the longer task of figuring out who is really interrupting
        !            21:  * and why.
        !            22:  */
        !            23:        .globl  zslevel6, _zscurr
        !            24: zslevel6:
        !            25:        movl    a1,sp@-                 | save a1
        !            26:        movl    a0,sp@-                 | save a0
        !            27:        movl    _zscurr,a0              | get most active channel desc
        !            28:        movl    a0@(ZS_ADDR),a1         | get hardware channel addr
        !            29:        movb    #2,a1@                  | read from reg 2 in channel B
        !            30: /* we need at least 1.6 usec recovery time between here ... */
        !            31:        movl    d1,sp@-                 | recovery time - save d1, d0
        !            32:        movl    d0,sp@-                 | recovery time - save d1, d0
        !            33: #ifdef sun3
        !            34:         nop; nop; nop; nop; nop; nop    | additional recovery time
        !            35: #endif sun3
        !            36: /* ... and here */
        !            37:        movb    a1@,d0
        !            38:        btst    #3,d0                   | channel A?
        !            39:        beq     1f                      | no, skip
        !            40:        subw    #ZSSIZE,a0              | point to channel A
        !            41: 1:     andw    #6,d0                   | get vector bits
        !            42:        addw    d0,d0                   | get multiple of 4
        !            43:        pea     a0@                     | push argument
        !            44:        movl    a0@(0,d0:w),a0          | get routine address
        !            45:        jsr     a0@                     | call routine
        !            46:        movl    sp@+,a0                 | pop argument
        !            47:        movl    a0@(ZS_ADDR),a1         | get hardware channel addr
        !            48:        movb    #ZSWR0_CLR_INTR,a1@     | reset interrupt
        !            49:        moveml  sp@+,#0x0303            | restore all saved regs
        !            50:        addql   #1,_cnt+V_INTR          | increment io interrupt count
        !            51:        rte                             | and return!
        !            52: 
        !            53: #ifdef sun3
        !            54: /*
        !            55:  * Vector stubs for SCCs
        !            56:  * Each SCC requires 8 vectors - 4 for each channel, channel B before channel A
        !            57:  */
        !            58:        .globl  _zscom
        !            59: #define        ZSSTUB(chip,chan,src)                           \
        !            60: zsv/**/chip/**/chan/**/src:                            \
        !            61: zs/**/chip/**/chan/**/src = ZSSIZE*(chip*2+chan);      \
        !            62: zv/**/chip/**/chan/**/src = ZSSIZE*(chip*2+chan)+(4*src); \
        !            63:        moveml  #0xC0C0,sp@-;                           \
        !            64:        pea     _zscom+zs/**/chip/**/chan/**/src;       \
        !            65:        movl    _zscom+zv/**/chip/**/chan/**/src,a0;    \
        !            66:        jsr     a0@;                                    \
        !            67:        addql   #4,sp;                                  \
        !            68:        movl    _zscom+zs/**/chip/**/chan/**/src+ZS_ADDR,a1; \
        !            69:        movb    #ZSWR0_CLR_INTR,a1@;                    \
        !            70:        moveml  sp@+,#0x0303;                           \
        !            71:        rte;                                            \
        !            72:        .data;                                          \
        !            73:        .long   zsv/**/chip/**/chan/**/src;             \
        !            74:        .text
        !            75: 
        !            76: .data
        !            77:        .globl  _zsvectab
        !            78: _zsvectab:
        !            79: .text
        !            80: #include "zs.h"
        !            81: #if NZS > 0
        !            82:        ZSSTUB(0,1,0); ZSSTUB(0,1,1); ZSSTUB(0,1,2); ZSSTUB(0,1,3);
        !            83:        ZSSTUB(0,0,0); ZSSTUB(0,0,1); ZSSTUB(0,0,2); ZSSTUB(0,0,3);
        !            84: #endif
        !            85: #if NZS > 1
        !            86:        ZSSTUB(1,1,0); ZSSTUB(1,1,1); ZSSTUB(1,1,2); ZSSTUB(1,1,3);
        !            87:        ZSSTUB(1,0,0); ZSSTUB(1,0,1); ZSSTUB(1,0,2); ZSSTUB(1,0,3);
        !            88: #endif
        !            89: #if NZS > 2
        !            90:        ZSSTUB(2,1,0); ZSSTUB(2,1,1); ZSSTUB(2,1,2); ZSSTUB(2,1,3);
        !            91:        ZSSTUB(2,0,0); ZSSTUB(2,0,1); ZSSTUB(2,0,2); ZSSTUB(2,0,3);
        !            92: #endif
        !            93: #if NZS > 3
        !            94: ERROR - too many ZSs
        !            95: #endif
        !            96: #endif sun3
        !            97: 
        !            98: #ifdef sun3
        !            99: #include "../sun3/interreg.h"
        !           100: /*
        !           101:  * Turn on a zs soft interrupt - Sun-3
        !           102:  */
        !           103:        ENTRY(setzssoft)
        !           104:        bset    #IR_SOFT_INT3_BIT,INTERREG
        !           105:        rts
        !           106: 
        !           107: /*
        !           108:  * Test and clear a zs soft interrupt - Sun-3
        !           109:  */
        !           110:        ENTRY(clrzssoft)
        !           111:        movl    #0,d0
        !           112:        bclr    #IR_SOFT_INT3_BIT,INTERREG
        !           113:        jeq     1f
        !           114:        movl    #1,d0
        !           115: 1:     rts
        !           116: #endif sun3
        !           117: 
        !           118: #ifdef sun2
        !           119: #include "../sun2/enable.h"
        !           120: ZSSOFTMASK = ENA_SOFT_INT_3
        !           121: /*
        !           122:  * Turn on a zs soft interrupt - Sun-2
        !           123:  */
        !           124:        ENTRY(setzssoft)
        !           125:        movc    dfc,a1
        !           126:        movl    #FC_MAP,d0              | set to address FC_MAP space
        !           127:        movc    d0,dfc
        !           128: 1:
        !           129:        movl    #ZSSOFTMASK,d0
        !           130:        orw     d0,enablereg            | enable the interrupt
        !           131:        movw    enablereg,d0            | get it in a reg
        !           132:        movsw   d0,ENABLEREG            | put enable register back
        !           133:        cmpw    enablereg,d0            | see if someone higher changed it
        !           134:        bne     1b                      | if so, try again
        !           135:        movc    a1,dfc                  | restore dfc
        !           136:        rts
        !           137: 
        !           138: /*
        !           139:  * Test and clear a zs soft interrupt - Sun-2
        !           140:  */
        !           141:        ENTRY(clrzssoft)
        !           142:        movw    enablereg,d0
        !           143:        andl    #ZSSOFTMASK,d0          | clear d0 if no intr
        !           144:        beq     2f
        !           145:        movc    dfc,a1
        !           146:        movl    #FC_MAP,d0              | set to address FC_MAP space
        !           147:        movc    d0,dfc
        !           148: 1:
        !           149:        movl    #~ZSSOFTMASK,d0
        !           150:        andw    d0,enablereg            | enable the interrupt
        !           151:        movw    enablereg,d0            | get it in a reg
        !           152:        movsw   d0,ENABLEREG            | put enable register back
        !           153:        cmpw    enablereg,d0            | see if someone higher changed it
        !           154:        bne     1b                      | if so, try again
        !           155:        movc    a1,dfc                  | restore dfc
        !           156:        movl    #1,d0                   | return true
        !           157: 2:
        !           158:        rts
        !           159: #endif sun2
        !           160: 
        !           161: /*
        !           162:  * Read a control register in the chip
        !           163:  */
        !           164:        ENTRY(zszread)
        !           165:        movl    sp@(4),a1               | chip address
        !           166:        movb    sp@(0xb),a1@            | write register number
        !           167: #ifdef sun3
        !           168:        moveq   #20,d0                  | DELAY(2)
        !           169:        movl    _cpudelay,d1
        !           170:        asrl    d1,d0
        !           171: 1:     subql   #1,d0
        !           172:        bgts    1b
        !           173: #else
        !           174: /* need 1.6 usec recovery here */
        !           175:        clrl    d0
        !           176:        nop; nop; nop
        !           177: /* that was actually 1.8  */
        !           178: #endif sun3
        !           179:        movb    a1@,d0                  | get returned register
        !           180:        rts
        !           181: 
        !           182: /*
        !           183:  * Write a control register in the chip
        !           184:  */
        !           185:        ENTRY(zszwrite)
        !           186:        movl    sp@(4),a1               | chip address
        !           187:        movb    sp@(0xb),a1@            | write register number
        !           188: #ifdef sun3
        !           189:        moveq   #20,d0                  | DELAY(2)
        !           190:        movl    _cpudelay,d1
        !           191:        asrl    d1,d0
        !           192: 1:     subql   #1,d0
        !           193:        bgts    1b
        !           194: #else
        !           195: /* 1.6 usec recovery plus slop for buffered video writes */
        !           196:        nop; nop; nop; nop; nop
        !           197: #endif sun3
        !           198:        movb    sp@(0xf),a1@            | write data
        !           199:        rts

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.