Annotation of researchv10dc/sys/boot/naut/bda.s, revision 1.1

1.1     ! root        1: #
        !             2: # fake boot ROM for nautilus, KDB50
        !             3: #
        !             4: # read block 0 of some specified drive into memory,
        !             5: # and branch there, with registers set to point to
        !             6: # a device driver that can read other blocks.
        !             7: # register conventions a la the comet boot ROMs
        !             8: # we expect to be loaded at address 0xfa00,
        !             9: # and that we have 1024 bytes to squander there
        !            10: # (like the four comet ROMs)
        !            11: #
        !            12: 
        !            13: #
        !            14: # nautilus-specific defs
        !            15: #
        !            16:        .set    NMICSR,0x20080000       # nmi csrs -- device 0
        !            17:        .set    NMIto2,30               # 0x40000000; add to get device 1
        !            18:        .set    LOOP,0x10000            # csr0 loopback mode
        !            19: 
        !            20: #
        !            21: # VAXBI defs
        !            22: #
        !            23:        .set    FIRSTBI,0x20000000      # BI 0 node 0
        !            24:        .set    NSIZE,0x2000            # size of a BI node
        !            25:        .set    BISIZE,0x2000000        # size of all the registers in a BI
        !            26: 
        !            27: #
        !            28: # VAXBI and/or KDB50 defs
        !            29: #
        !            30:        .set    BITYPE,0
        !            31:        .set    DB88,0x106              # device type for DB88
        !            32:        .set    BICSR,0x4
        !            33:        .set    SST,0x400               # node reset
        !            34:        .set    BROKE,0x1000            # i'm broken
        !            35:        .set    BISADR,0x20
        !            36:        .set    BIEADR,0x24
        !            37:        .set    IP,0xf2                 # word -- ip reg
        !            38:        .set    SAR,0xf4                # word -- read version of sa reg
        !            39:        .set    SAW,0xf6                # word -- write version of sa
        !            40: 
        !            41:        .set    STEP0,10                # STEP1 == bit 11
        !            42: 
        !            43:        .set    BPOWN,31                # bit 31 == port owns descriptor
        !            44:        .set    RTOC,4
        !            45: 
        !            46: #
        !            47: # mscp defs
        !            48: # packet offsets have 4 added to account for UQSSP header (mostly length)
        !            49: #
        !            50: 
        !            51:        .set    m_crf,4                 # command ref number
        !            52:        .set    m_unit,8                # disk unit number
        !            53:        .set    m_opcd,12               # opcode
        !            54:        .set    m_sts,14                # status (word)
        !            55:        .set    RPKSIZE,16              # as much as we want on rcv
        !            56:        .set    m_bcnt,16               # byte count
        !            57:        .set    SOSIZE,20               # as much as we send for ONLINE
        !            58:        .set    m_buff,20               # buffer address
        !            59:        .set    m_lbn,32                # block number
        !            60:        .set    SRSIZE,36               # as much as we send to read
        !            61:        .set    SOSIZE,36               # as much as we send for ONLINE
        !            62: 
        !            63:        .set    OPONL,011               # unit online
        !            64:        .set    OPRD,041                # read block
        !            65: 
        !            66: #
        !            67: # boot ROM conventions
        !            68: #
        !            69:        .set    WMEM,0x200              # sp == some working memory + WMEM
        !            70:                                        # usually working memory == 0
        !            71:        .set    BSIZE,512               # size of a block
        !            72: 
        !            73: 
        !            74: ourstack:
        !            75:        .byte   'U,'D                   # ROM id (though we're not in a ROM)
        !            76: #
        !            77: # here to start off, at 0xfa02
        !            78: # registers:
        !            79: #      r1      bi node number; 0xf == node, 0xf0 == which BI
        !            80: #      r2      uninteresting to us; we put register addr there
        !            81: #      r3      unit number
        !            82: #      r5      boot flags; ignored but preserved
        !            83: #      sp      working memory + WMEM
        !            84: #
        !            85: # registers to save: r0 r1 r3 r5 r10 r11 ap sp
        !            86: # init the appropriate NBIA/NBIB
        !            87: # assume the NBIA is already OK
        !            88: #
        !            89:        movl    sp,savesp
        !            90:        movab   ourstack,sp
        !            91:        movl    $NMICSR,r2
        !            92:        extzv   $4,$2,r1,r6     # get BI number
        !            93:        bbc     $1,r6,0f
        !            94:         bbss   $NMIto2,r2,0f   # second NBIA
        !            95: 0:     bisl2   $LOOP,(r2)      # set loopback mode
        !            96:        mull3   r6,$BISIZE,r7   # first node in this BI
        !            97:        addl2   $FIRSTBI,r7
        !            98:        movl    BITYPE(r7),r8
        !            99:        movw    $DB88,r8
        !           100:        movl    r8,BITYPE(r7)   # set device type in DB88
        !           101:        clrl    BISADR(r7)      # start address
        !           102:        movl    $0x20000000,BIEADR(r7)  # end address: all possible mem
        !           103:        bisl2   $BROKE,BICSR(r7)        # set BROKE to clear it
        !           104:        bicl2   $LOOP,(r2)      # and turn off loopback mode
        !           105: 
        !           106: #
        !           107: # init the KDB50
        !           108: #
        !           109: 
        !           110:        extzv   $0,$4,r1,r2     # pick out node number
        !           111:        mull2   $NSIZE,r2
        !           112:        addl2   r7,r2           # address of KDB50 regs
        !           113:        bisw2   $SST,BICSR(r2)  # reset: kick into startup
        !           114: 0:     movw    SAR(r2),r7
        !           115:        blss    oops
        !           116:        bbc     $STEP0+1,r7,0b  # wait for step1
        !           117:        movw    $0x8000,SAW(r2) # no vector, ring size (2^0,2^0)
        !           118: 0:     movw    SAR(r2),r7
        !           119:        blss    oops
        !           120:        bbc     $STEP0+2,r7,0b  # wait for step2
        !           121:        movab   rsp,r6          # ring address
        !           122:        movw    r6,SAW(r2)
        !           123: 0:     movw    SAR(r2),r7
        !           124:        blss    oops
        !           125:        bbc     $STEP0+3,r7,0b  # wait for step3
        !           126:        ashl    $-16,r6,r6
        !           127:        movw    r6,SAW(r2)
        !           128: 0:     movw    SAR(r2),r7
        !           129:        blss    oops
        !           130:        bbc     $STEP0+4,r7,0b  # wait for step4
        !           131:        movw    $1,SAW(r2)      # GO
        !           132: 
        !           133: #
        !           134: # read block 0 into bottom of memory
        !           135: #
        !           136: 
        !           137:        pushl   r0              # rblk eats it
        !           138:        movab   rblk,r6         # set up device driver address
        !           139:        subl3   $WMEM,savesp,-(sp)      # physical addr
        !           140: # trick: we know driver doesn't use r5, so we needn't preserve boot flags
        !           141:        clrl    r8              # block 0
        !           142:        jsb     (r6)
        !           143:        blbc    r0,oops
        !           144:        tstl    (sp)+
        !           145:        movl    (sp)+,r0
        !           146: #
        !           147: # start boot block
        !           148: # registers now:
        !           149: #      r0      device type (unchanged)
        !           150: #      r1      BI node number (unchanged)
        !           151: #      r2      device register addr
        !           152: #      r3      device unit number (unchanged)
        !           153: #      r5      boot flags (unchanged)
        !           154: #      r6      address of our device driver
        !           155: #      sp      `working memory + 0x200' (unchanged)
        !           156: #
        !           157:        movl    savesp,sp
        !           158:        jmp     0xc-WMEM(sp)
        !           159: 
        !           160: #
        !           161: # here when something is broken
        !           162: #
        !           163: oops:  halt
        !           164: 
        !           165: #
        !           166: # device driver; called above and by boot block and friends
        !           167: #
        !           168: #      r2      device registers
        !           169: #      r3      device unit number
        !           170: #      r5      buffer address, relative to `working memory' (ignored)
        !           171: #      4(sp)   physical buffer address; we use that
        !           172: #      r8      block number
        !           173: #
        !           174: # do not destroy r1-r6 r10 r11 ap
        !           175: # on return, low bit of r0 set if we read it, clear if we failed
        !           176: #
        !           177: # always bring disk online, even if already is
        !           178: #
        !           179: 
        !           180: rblk:
        !           181:        movq    r10,-(sp)
        !           182:        clrl    r0                      # assume failure
        !           183:        movab   cp,r10
        !           184:        movab   rp,r11
        !           185:        movab   rsp,r9
        !           186:        movl    r3,m_unit(r10)          # make ONLINE packet
        !           187:        movzbl  $OPONL,m_opcd(r10)
        !           188:        movzbl  $SOSIZE,(r10)
        !           189:        clrl    m_bcnt(r10)             # ugh
        !           190:        clrl    m_buff(r10)             # ugh
        !           191:        clrl    m_lbn(r10)              # ugh
        !           192:        bsbb    sendrcv
        !           193:        bneq    rfail
        !           194:        movzbl  $OPRD,m_opcd(r10)       # now make READ packet
        !           195:        movl    4+8(sp),m_buff(r10)     # unmapped address
        !           196:        movzwl  $BSIZE,m_bcnt(r10)
        !           197:        movl    r8,m_lbn(r10)
        !           198:        movzbl  $SRSIZE,(r10)
        !           199:        bsbb    sendrcv
        !           200:        bneq    rfail
        !           201:        incl    r0                      # success
        !           202: rfail: movq    (sp)+,r10
        !           203:        rsb
        !           204: 
        !           205: sendrcv:
        !           206:        movzbl  $RPKSIZE,(r11)
        !           207:        movab   m_crf(r10),RTOC(r9)
        !           208:        movab   m_crf(r11),(r9)
        !           209:        bbss    $BPOWN,(r9),0f          # make response buffer available
        !           210: 0:     bbss    $BPOWN,RTOC(r9),0f      # send the ONLINE packet
        !           211: 0:     movw    IP(r2),r7               # kick to make it go
        !           212: 0:     bbs     $BPOWN,(r9),0b          # wait for answer
        !           213:        tstb    m_sts(r11)              # tstb: ignore `already online' flag
        !           214:        rsb
        !           215: 
        !           216: #
        !           217: # KDB50 communication area
        !           218: #
        !           219:        .align  2
        !           220: savesp:        .space  4               # working mem + WMEM
        !           221:        .space  8               # crap at the top
        !           222: rsp:   .space  4               # response descriptor
        !           223:        .space  4               # command descriptor
        !           224: 
        !           225: #
        !           226: # a pair of packets
        !           227: # +4 for length
        !           228: #
        !           229: 
        !           230: cp:    .space  SRSIZE+4        # command packet
        !           231: rp:    .space  RPKSIZE+4       # response packet

unix.superglobalmegacorp.com

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