|
|
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
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.