Annotation of researchv10dc/sys/boot/naut/bda.s, revision 1.1.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.