|
|
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.