|
|
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 /* Save user options */
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: # Probe to see what devices are online
522: */
523: incl _IOinit /* Set flag, so bus err won't print */
524: clrl _Berr
525: callf $4,_tape /* Probe Tape master */
526: cmpl $0,_Berr /* Get a bus error ? */
527: jneq 2f
528: cmpl $1,r0
529: jeql 1f
530: 2:
531: orl2 $1,tst_mask /* Disable Tape test */
532: pushab tmsg
533: callf $8,_writes
534: clrl _tape_ON
535: 1:
536: # clrl _Berr
537: # callf $4,_vioc /* Probe VIOC */
538: # cmpl $0,_Berr
539: # jneq 2f
540: # cmpl $1,r0
541: # jeql 1f
542: 2:
543: orl2 $2,tst_mask /* Disable VIOC test */
544: # pushab vmsg
545: # callf $8,_writes
546: # clrl _vioc_ON
547: 1:
548: clrl _Berr
549: callf $4,_vddc /* Probe VDDC */
550: cmpl $0,_Berr
551: jneq 2f
552: cmpl $1,r0
553: jeql 1f
554: 2:
555: orl2 $4,tst_mask
556: pushab vdmsg
557: callf $8,_writes
558: clrl _vddc_ON
559:
560: #
561: # The following tests are included : Tape, Vioc, Vddc.
562: # Bit 0-2 correspond to Tape, Vioc, Vddc test. To disable
563: # a particular test just set the corresponding bit to 1 before
564: # start. For example, if only Vddc test to be run, set R0=4.
565: # To run all, set R0 = 0.
566: #
567: 1:
568: clrl _IOinit /* Clear flag, so bus err will print */
569:
570: clrl _Multi
571: andl3 $0x1,tst_mask,r0
572: jneq 1f
573: callf $4,_tm_ex /* Test Tape master */
574: 1:
575: # andl3 $0x2,tst_mask,r0
576: # jneq 1f
577: # callf $4,_v_ex /* Test VIOC */
578: 1:
579: andl3 $0x4,tst_mask,r0
580: jneq 1f
581: callf $4,_vddc_ex /* Test VDDC */
582:
583: 1:
584: orl3 _tape_ON,_vddc_ON,r0
585: cmpl $1,r0
586: jeql 1f
587: pushab mmsg
588: callf $4,_writes
589: brw 2f
590: 1:
591: callf $4,_multi
592: 2:
593: pushab emsg
594: callf $4,_writes
595: movl $0xcafebabe,r0
596: halt
597: #
598: # Real time clock Handler
599: #
600: .align 2
601: .globl _Xclock
602: _Xclock:
603: tstl _bell /* If set then just return */
604: jneq 2f
605: incl _bturn
606: cmpl _bturn,$0x20
607: jneq 2f
608: pushl $7
609: callf $8,_writec /* Ring bell */
610: incl _btime
611: clrl _bturn
612: 2: rei
613:
614: #
615: # Bus error handler
616: #
617: .align 2
618: .globl _Buser
619: _Buser:
620: movab (sp),-(sp) /* Push pointer to error parameter */
621: callf $8,_buserror
622: incl _Berr
623: movl (sp)+,r0
624: movl (sp)+,r0
625: rei
626:
627:
628: .align 2
629: tst_mask:
630: .long 0
631: _bell: .long 0
632: _bturn: .long 0
633: _btime: .long 0
634: .globl _Multi
635: _Multi: .long 0
636: .globl _Berr
637: _Berr: .long 0
638: .globl _IOinit
639: _IOinit: .long 0
640: .globl _tape_ON
641: _tape_ON:
642: .long 1
643: .globl _vioc_ON
644: _vioc_ON:
645: .long 1
646: .globl _vddc_ON
647: _vddc_ON:
648: .long 1
649: .globl _xy_ON
650: _xy_ON:
651: .long 1
652:
653: .align 1
654: tmsg: .ascii "\nTape controller not found !\12\0"
655: vmsg: .ascii "\nVIOC controller not found !\12\0"
656: vdmsg: .ascii "\nVDDC controller not found !\12\0"
657: mmsg: .ascii "\nNot enough controllers for multiple interrupts test !\12\0"
658: emsg: .ascii "\nDone ...\12\0"
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.