|
|
1.1 root 1:
2: /* init.s */
3:
4:
5: /* This file is a diagnostic version of locore.s. */
6: /* It contains the following: */
7: /* *system data area = scb, dump buffer, interrupt stack, */
8: /* *system page table,user page tables,pcbs,iomap, & io buffers. */
9: /* */
10: /* *system code = interrupt vectors, initialization of system data,*/
11: /* *memory size calculation,initialization of SPT, zeroing of */
12: /* *unused memory, & loading of SBR & SLR. */
13: /* * */
14: /* *at the end of this code, you are ready to go to virtual mode. */
15: /* * --- GOOD LUCK! */
16:
17:
18: #include "conf.h"
19: /* privileged registers addresses */
20: #include "prvreg.h"
21:
22: /* program status long word definition */
23: #include "psl.h"
24:
25: /* page table entry definition */
26: #include "pte.h"
27:
28: /* process control block offsets */
29: #include "pcboffset.h"
30:
31: /* fundamental constants for globl use */
32: #include "const.h"
33:
34: /* system control block offsets*/
35: #include "scboffset.h"
36: /* SPT offsets */
37: #include "sptoffset.h"
38:
39: /* trap numbers*/
40: #include "trap.h"
41:
42:
43: #define V_TRAP 0
44: #define V_SYSCALL 4
45:
46: .set HIGH,0x1f /*mask for disabling all interrupts */
47: .set MCKVEC,4 /*scb offset for machinecheck vector */
48: .set NISP,2 /*no. of interrupt stack pages */
49: .set DONE,255 /*user process done code */
50:
51: .text
52:
53: #include "pstorage.s" /* PROCESSOR STORAGE AREA */
54:
55: .globl _Entry
56: _Entry:
57: jmp start
58: .space (1024-6)
59:
60:
61:
62: /* globl dump buffer to be used for communication */
63: /* between tests & interrupt handlers, & other misc. */
64: /* purposes. */
65:
66: /*physical page 3 */
67:
68: .set NLWU,32 /*no. of longwords already used */
69: /*this must be changed when you define */
70: /*additional variables below before */
71: /*_dbuf */
72: .globl _restart
73: _restart:
74: .space 4 /*contains restart address for restarting*/
75: /*after power is restored (loaded by */
76: /*power fail interrupt handler & used by*/
77: /*CPU 2 */
78: /* ****************** */
79: .globl _cyconf /* address : 0xc04 */
80: _cyconf: /* Cypher configuration pointer : 0xc06 */
81: .space 4
82: .space 4
83: /* ****************** */
84:
85: .globl _lastadd
86: _lastadd:
87: .space 4 /*address of the last long word */
88:
89: .globl _unused
90: _unused:
91: .space 4 /*first unused page in system space */
92:
93: .globl _ctlblk
94: _ctlblk:
95: .long 0 /* pointer to SCB */
96:
97: .globl _savvec0 /*save vectors area */
98: _savvec0:
99: .space 4
100:
101: .globl _savvec1 /*save vectors area */
102: _savvec1:
103: .space 4
104:
105: .globl _savvec2 /*save vectors area */
106: _savvec2:
107: .space 4
108:
109: .globl _savvec3 /*save vectors area */
110: _savvec3:
111: .space 4
112:
113: .globl _savvec4 /*save vectors area */
114: _savvec4:
115: .space 4
116:
117: .globl _savvec5 /*save vectors area */
118: _savvec5:
119: .space 4
120: .globl _savvec6 /*save vectors area */
121: _savvec6:
122: .space 4
123: .globl _savvec7 /*save vectors area */
124: _savvec7:
125: .space 4
126:
127: .globl _savvec8 /*save vectors area */
128: _savvec8:
129: .space 4
130:
131: testno: .long 0
132:
133: .globl _dbuf /*dump buffer left out of 1K */
134: .globl _r_no
135: _r_no:
136: .long 0
137: .globl _pt_base
138: _pt_base:
139: .long 0
140: .globl _saved_psl
141: _saved_psl:
142: .long 0
143: .globl _saved_sp
144: _saved_sp:
145: .long 0
146: .globl _saved_fp
147: _saved_fp:
148: .long 0
149: .globl _p_ptr
150: _p_ptr:
151: .long 0
152: .globl _ret_adr
153: _ret_adr:
154: .long 0
155: .globl _exp_par0
156: _exp_par0:
157: .long 0
158: .globl _exp_par1
159: _exp_par1:
160: .long 0
161: .globl _exp_par2
162: _exp_par2:
163: .long 0
164: .globl _exp_par3
165: _exp_par3:
166: .long 0
167: .globl _act_par0
168: _act_par0:
169: .long 0
170: .globl _act_par1
171: _act_par1:
172: .long 0
173:
174: .globl _IOpage
175: _IOpage:
176: .long 0 /* Pointer 64K I/O pages */
177: #
178: #
179: #
180: .globl _proc_no
181: _proc_no:
182: .long 0
183:
184: .globl _clk_cnt
185: _clk_cnt:
186: .long 0
187: _dbuf:
188: .space NBPG - (NLWU *4)
189: edbuf:
190:
191:
192: .globl _intstack /* Interrupt stack */
193: _intstack: /* Physical pages 4 & 5 */
194: .space NISP*NBPG
195: eintstack:
196:
197:
198: .set SYSPTSIZE,512 /* No. of entries in SPT */
199:
200: /*
201: System Page Table -- physical page 6 & 7
202: */
203: .align 2
204: .globl _Sysmap
205: _Sysmap:
206: .space SYSPTSIZE*4 /* 512 max pages allowed for system */
207: eSysmap:
208: .globl _Syssize
209: .set _Syssize,(eSysmap-_Sysmap)/4 /* should be SYSPTSIZE */
210:
211: .globl _iomap /* Physical page 8 */
212: _iomap: .space 1024 /* IOMAP - unused */
213: .globl _eiomap
214: _eiomap:
215:
216: .globl _pcb0 /* Physical page 9 */
217: _pcb0: .space 128 /*process control block 0 */
218: .globl _pcb1
219: _pcb1: .space 128 /*process control block 1 */
220: .globl _pcb2
221: _pcb2: .space 128 /*process control block 2 */
222: .globl _pcb3
223: _pcb3: .space 128 /*process control block 3 */
224: .globl _pcb4
225: _pcb4: .space 128 /*process control block 4 */
226: .globl _pcb5
227: _pcb5: .space 128 /*process control block 5 */
228: .globl _pcb6
229: _pcb6: .space 128 /*process control block 6 */
230: .globl _pcb7
231: _pcb7: .space 128 /*process control block 7 */
232:
233: /*
234: *user #0 page tables -- P0PT, P1PT, P2PT
235: *physical memory -- page10, 11, & 12 respectively
236: */
237: .align 2
238: .globl _u0p0pt
239: _u0p0pt:
240: .space 1024 /*255 max pages for user #0 text */
241: .globl _u0p1pt
242: _u0p1pt:
243: .space 1024 /*255 max pages for user #0 data */
244: .globl _u0p2pt
245: _u0p2pt:
246: .space 1020 /*255 max pages for user #0 stack */
247: eu0p2pt:
248: .space 4
249:
250: /*
251: *user #1 page tables -- P0PT, P1PT, P2PT
252: *physical memory -- page13 ,14, & 15 respectively
253: */
254: .align 2
255: .globl _u1p0pt
256: _u1p0pt:
257: .space 1024 /*255 max pages for user #1 text */
258: .globl _u1p1pt
259: _u1p1pt:
260: .space 1024 /*255 max pages for user #1 data */
261: .globl _u1p2pt
262: _u1p2pt:
263: .space 1020 /*255 max pages for user #1 stack */
264: eu1p2pt:
265: .space 4
266:
267:
268: /*
269: *user #2 page tables -- P0PT, P1PT, P2PT
270: *physical memory -- page 16, 17 , & 18 respectively
271: */
272: .align 2
273: .globl _u2p0pt
274: _u2p0pt:
275: .space 1024 /*255 max pages for user #2 text */
276: .globl _u2p1pt
277: _u2p1pt:
278: .space 1024 /*255 max pages for user #2 data */
279: .globl _u2p2pt
280: _u2p2pt:
281: .space 1020 /*255 max pages for user #2 stack */
282: eu2p2pt:
283: .space 4
284:
285:
286: /*
287: *user #3 page tables -- P0PT, P1PT, P2PT
288: *physical memory -- page 19, 20 , & 21 respectively
289: */
290: .align 2
291: .globl _u3p0pt
292: _u3p0pt:
293: .space 1024 /*255 max pages for user #3 text */
294: .globl _u3p1pt
295: _u3p1pt:
296: .space 1024 /*255 max pages for user #3 data */
297: .globl _u3p2pt
298: _u3p2pt:
299: .space 1020 /*255 max pages for user #3 stack */
300: eu3p2pt:
301: .space 4
302:
303: /*
304: *user #4 thru 6 page tables
305: *physical memory -- pages 22 thru 30
306: */
307: .globl _u4p0pt
308: _u4p0pt:
309: .space (9*NBPG) - 4
310: eu6p2pt:
311: .space 4
312:
313: /*
314: *user #7 page tables -- P0PT, P1PT, P2PT
315: *physical memory -- page 31, 32 , & 33 respectively
316: */
317: .align 2
318: .globl _u7p0pt
319: _u7p0pt:
320: .space 1024 /*255 max pages for user #7 text */
321: .globl _u7p1pt
322: _u7p1pt:
323: .space 1024 /*255 max pages for user #7 data */
324: .globl _u7p2pt
325: _u7p2pt:
326: .space 1020 /*255 max pages for user #7 stack */
327: eu7p2pt:
328: .space 4
329:
330: .globl _Ksp0 /* Page used for Kernel stack of user0 */
331: _Ksp0: .space 1020
332: _Eksp0: .long 0
333:
334: .globl _Ksp1 /* Page used for Kernel stack of user1 */
335: _Ksp1: .space 1020
336: _Eksp1: .long 0
337:
338: .globl _Ksp2 /* Page used for Kernel stack of user2 */
339: _Ksp2: .space 1020
340: _Eksp2: .long 0
341:
342: .globl _Ksp3 /* Page used for Kernel stack of user3 */
343: _Ksp3: .space 1020
344: _Eksp3: .long 0
345:
346: .globl _Ksp4 /* Page used for Kernel stack of user4 */
347: _Ksp4: .space 1020
348: _Eksp4: .long 0
349:
350: .globl _Ksp5 /* Page used for Kernel stack of user5 */
351: _Ksp5: .space 1020
352: _Eksp5: .long 0
353:
354: .globl _Ksp6 /* Page used for Kernel stack of user6 */
355: _Ksp6: .space 1020
356: _Eksp6: .long 0
357: #
358: # I/O buffers
359: #
360: .globl _iob0
361: _iob0: .space 1024
362: .globl _iob1
363: _iob1: .space 1024
364: .globl _iob2
365: _iob2: .space 1024
366: .globl _iob3
367: _iob3: .space 1024
368: .globl _iob4
369: _iob4: .space 1024
370: .globl _iob5
371: _iob5: .space 1024
372:
373: esysdata:
374:
375: #include "scblock.s" /* SYSTEM CONTROL BLOCK */
376:
377:
378:
379:
380:
381:
382: #include "evthandlers.s" /*event handlers */
383:
384: #define ACBL(_n1,_n2,_n3,_n4) \
385: addl2 _n2,_n3;\
386: cmpl _n3,_n1;\
387: bleq _n4;
388:
389:
390:
391: /*
392: *INITIALIZATION CODE
393: *
394: * MME off; mode = k; IPL = 31; IS = 1
395: *
396: */
397:
398: .globl start
399: start:
400: mtpr $0,$MME /* Disable MME */
401: movl r0,tst_mask
402: movab _scb,r0
403: andl2 $0x3ffffc00,r0
404: mtpr r0,$SCBB /* Set SCBB */
405: mtpr $0x1f,$IPL /* Set IPL to HIGH */
406:
407: movpsl r1
408: andl2 $0x001f0000,r1 /* Mask out flags */
409: cmpl r1,$0x001f0000 /* modes = K & IPL = 31? */
410: beql 1f
411: 2: movl $1,r0
412: movl $0x041f0000,r2
413: halt /* PSL not initialized as expected */
414: 1:
415: movl $_intstack+NISP*NBPG,r0
416: andl2 $0x3fffffff,r0 /* Mask out bit 30,31 */
417: mtpr r0,$ISP /* init. ISP */
418: movl r0,sp /* in case we get exception */
419: movab (sp),fp /* Initialize FP */
420: #
421: # Clear system data area all the way upto system code
422: # this includes dump buffer,interrupt stack,spt,iomap,pcbs,user
423: # page tables, & io buffer area.
424: #
425: 3:
426: movab esysdata,r7
427: movab _restart,r6
428: 1: clrl (r6)
429: ACBL(r7,$4,r6,1b)
430: #
431: # Initialize System Page Table
432: #
433: 5:
434: clrl r2
435: movab _Ksp6,r1 /* R1 = Last address in Kernel stack area */
436: andl2 $0x3fffffff,r1 /* Mask out bit 30,31 */
437: shar $PGSHIFT,r1,r1 /* Get page no. of last page of Kstacks */
438: 1:
439: movl r2,r11 /* Donot want to use orl3 */
440: orl2 $PG_V|PG_KW,r11
441: orl2 r11,_Sysmap[r2]
442: aobleq r1,r2,1b
443:
444: movab esysdata,r1 /* R1 = Last address in system data area */
445: andl2 $0x3fffffff,r1 /* Mask out bit 30,31 */
446: shar $PGSHIFT,r1,r1 /* Get page no. of last system data addr */
447: 1:
448: movl r2,r11 /* Donot want to use orl3 */
449: orl2 $PG_V|PG_KW|PG_NC,r11 /* Set I/O buffers non cachable */
450: orl2 r11,_Sysmap[r2]
451: aoblss r1,r2,1b
452: #
453: # Map system text area 1 to 1, Kernel read/write.
454: # For this to work, the label _etext must exist at the end
455: # of system code; Add in 4 more pages for data area used in C
456: #
457: movab _end + (NBPG-1),r1 /* Map text+data 1 to 1; Kernel R/W */
458: andl3 $0x3ffffc00,r1,_IOpage
459: addl2 $64*(1024),r1
460: andl2 $0x3fffffff,r1
461: shar $PGSHIFT,r1,r1
462: 1:
463: movl r2,r11
464: orl2 $PG_V|PG_KW|PG_NC,r11 /* Kernel Read/Write, non_cachable */
465: orl2 r11,_Sysmap[r2]
466: aoblss r1,r2,1b
467: #
468: # Map from here (1st unused page) to page 512 :
469: # * invalid,no access, & virtual = physical
470: #
471: movl r2,_unused /* Save first unused physical page no */
472: movl $LSP+1,r1
473: 1: movl r2,_Sysmap[r2]
474: aoblss r1,r2,1b
475:
476: sysrdy:
477: movab _Sysmap,r0
478: mtpr r0,$SBR /* Set SYSTEM BASE REG */
479: mtpr $_Syssize,$SLR
480: orl2 $0xc0000000,r0
481: mtpr r0,$P0BR /* Set P0BR */
482: mtpr $_Syssize,$P0LR
483:
484: movl $CLOCK,r0
485: movab _Xclock,_scb[r0] /* Set clock handler */
486:
487: movl $BUSER,r0
488: movab _Buser,_scb[r0] /* Set bus error handler */
489:
490: clrl _bturn
491: clrl _bell
492: clrl _btime
493: mtpr $1,$IPL /* Allow clock interrupt */
494: _bmore:
495: cmpl _btime,$0x5
496: jeql 1f
497: jmp _bmore
498: 1: incl _bell /* No more bell */
499:
500: .globl _ready
501: _ready:
502: clrl _proc_no
503: mtpr $1,$PACC
504: mtpr $1,$PADC
505: mtpr $1,$TBIA
506: mtpr $1,$CCK /* Set Code Cache Key = 1 */
507: mtpr $1,$DCK /* Set Data Cache Key = 1 */
508: mtpr $1,$MME /* Enable MME */
509: jmp *$1f
510: 1:
511: movab _pcb0,r0
512: movab _Eksp0,(r0) /* Set PCB0_KSP */
513: mfpr $P0BR,PCB_P0BR(r0) /* Set PCB0_P0BR */
514: mfpr $P0LR,PCB_P0LR(r0) /* Set PCB0_P0LR */
515: mtpr r0,$PCBB /* Init PCBB to PCB_0 */
516: ldpctx /* Just to switch to Kernel stack */
517: mtpr $1,$IPL /* Drop IPL to 0 */
518: movl (sp)+,r12 /* Pop unnecessary PC,PSL */
519: movl (sp)+,r11
520:
521: incl _IOinit /* Set flag, so bus err won't print */
522: clrl _Berr
523: #
524: # The following tests are included : Tape, Udc, Vioc, Vddc.
525: # Bit 0-3 correspond to Tape, Udc, Vioc, Vddc test. To disable
526: # a particular test just set the corresponding bit to 1 before
527: # start. For example, if only Vddc test to be run, set R0=7.
528: # To run all, set R0 = 0.
529: #
530: 1:
531: clrl _IOinit /* Clear flag, so bus err will print */
532: callf $4,_xylog
533:
534: 2:
535: movl $0xcafebabe,r0
536: halt
537: #
538: # Real time clock Handler
539: #
540: .align 2
541: .globl _Xclock
542: _Xclock:
543: tstl _bell /* If set then just return */
544: jneq 2f
545: incl _bturn
546: cmpl _bturn,$0x20
547: jneq 2f
548: pushl $7
549: callf $8,_writec /* Ring bell */
550: incl _btime
551: clrl _bturn
552: 2: rei
553:
554: #
555: # Bus error handler
556: #
557: .align 2
558: .globl _Buser
559: _Buser:
560: movab (sp),-(sp) /* Push pointer to error parameter */
561: callf $8,_buserror
562: incl _Berr
563: movl (sp)+,r0
564: movl (sp)+,r0
565: rei
566:
567:
568: .align 2
569: tst_mask:
570: .long 0
571: _bell: .long 0
572: _bturn: .long 0
573: _btime: .long 0
574: .globl _Multi
575: _Multi: .long 0
576: .globl _Berr
577: _Berr: .long 0
578: .globl _IOinit
579: _IOinit: .long 0
580: .globl _tape_ON
581: _tape_ON:
582: .long 1
583: .globl _vioc_ON
584: _vioc_ON:
585: .long 1
586: .globl _vddc_ON
587: _vddc_ON:
588: .long 1
589:
590: .align 1
591: tmsg: .ascii "\nTape controller not found !\12\0"
592: vmsg: .ascii "\nVIOC controller not found !\12\0"
593: vdmsg: .ascii "\nVDDC controller not found !\12\0"
594: mmsg: .ascii "\nNot enough controllers for multiple interrupts test !\12\0"
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.