|
|
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: .globl _dbuf /*dump buffer left out of 1K */
132: .globl _r_no
133: _r_no:
134: .long 0
135: .globl _pt_base
136: _pt_base:
137: .long 0
138: .globl _saved_psl
139: _saved_psl:
140: .long 0
141: .globl _saved_sp
142: _saved_sp:
143: .long 0
144: .globl _saved_fp
145: _saved_fp:
146: .long 0
147: .globl _p_ptr
148: _p_ptr:
149: .long 0
150: .globl _ret_adr
151: _ret_adr:
152: .long 0
153: .globl _exp_par0
154: _exp_par0:
155: .long 0
156: .globl _exp_par1
157: _exp_par1:
158: .long 0
159: .globl _exp_par2
160: _exp_par2:
161: .long 0
162: .globl _exp_par3
163: _exp_par3:
164: .long 0
165: .globl _act_par0
166: _act_par0:
167: .long 0
168: .globl _act_par1
169: _act_par1:
170: .long 0
171:
172: .globl _IOpage
173: _IOpage:
174: .long 0 /* Pointer 64K I/O pages */
175: #
176: #
177: #
178: .globl _proc_no
179: _proc_no:
180: .long 0
181:
182: .globl _clk_cnt
183: _clk_cnt:
184: .long 0
185: _dbuf:
186: .set NN, (_dbuf - _restart)
187: .space 1024 - NN
188: edbuf:
189:
190:
191: .globl _intstack /* Interrupt stack */
192: _intstack: /* Physical pages 4 & 5 */
193: .space NISP*NBPG
194: eintstack:
195:
196:
197: .set SYSPTSIZE,512 /* No. of entries in SPT */
198:
199: /*
200: System Page Table -- physical page 6 & 7
201: */
202: .align 2
203: .globl _Sysmap
204: _Sysmap:
205: .space SYSPTSIZE*4 /* 512 max pages allowed for system */
206: eSysmap:
207: .globl _Syssize
208: .set _Syssize,(eSysmap-_Sysmap)/4 /* should be SYSPTSIZE */
209:
210: .globl _iomap /* Physical page 8 */
211: _iomap: .space 1024 /* IOMAP - unused */
212: .globl _eiomap
213: _eiomap:
214:
215: .globl _pcb0 /* Physical page 9 */
216: _pcb0: .space 128 /*process control block 0 */
217: .globl _pcb1
218: _pcb1: .space 128 /*process control block 1 */
219: .globl _pcb2
220: _pcb2: .space 128 /*process control block 2 */
221: .globl _pcb3
222: _pcb3: .space 128 /*process control block 3 */
223: .globl _pcb4
224: _pcb4: .space 128 /*process control block 4 */
225: .globl _pcb5
226: _pcb5: .space 128 /*process control block 5 */
227: .globl _pcb6
228: _pcb6: .space 128 /*process control block 6 */
229: .globl _pcb7
230: _pcb7: .space 128 /*process control block 7 */
231:
232: /*
233: *user #0 page tables -- P0PT, P1PT, P2PT
234: *physical memory -- page10, 11, & 12 respectively
235: */
236: .align 2
237: .globl _u0p0pt
238: _u0p0pt:
239: .space 1024 /*255 max pages for user #0 text */
240: .globl _u0p1pt
241: _u0p1pt:
242: .space 1024 /*255 max pages for user #0 data */
243: .globl _u0p2pt
244: _u0p2pt:
245: .space 1020 /*255 max pages for user #0 stack */
246: eu0p2pt:
247: .space 4
248:
249: /*
250: *user #1 page tables -- P0PT, P1PT, P2PT
251: *physical memory -- page13 ,14, & 15 respectively
252: */
253: .align 2
254: .globl _u1p0pt
255: _u1p0pt:
256: .space 1024 /*255 max pages for user #1 text */
257: .globl _u1p1pt
258: _u1p1pt:
259: .space 1024 /*255 max pages for user #1 data */
260: .globl _u1p2pt
261: _u1p2pt:
262: .space 1020 /*255 max pages for user #1 stack */
263: eu1p2pt:
264: .space 4
265:
266:
267: /*
268: *user #2 page tables -- P0PT, P1PT, P2PT
269: *physical memory -- page 16, 17 , & 18 respectively
270: */
271: .align 2
272: .globl _u2p0pt
273: _u2p0pt:
274: .space 1024 /*255 max pages for user #2 text */
275: .globl _u2p1pt
276: _u2p1pt:
277: .space 1024 /*255 max pages for user #2 data */
278: .globl _u2p2pt
279: _u2p2pt:
280: .space 1020 /*255 max pages for user #2 stack */
281: eu2p2pt:
282: .space 4
283:
284:
285: /*
286: *user #3 page tables -- P0PT, P1PT, P2PT
287: *physical memory -- page 19, 20 , & 21 respectively
288: */
289: .align 2
290: .globl _u3p0pt
291: _u3p0pt:
292: .space 1024 /*255 max pages for user #3 text */
293: .globl _u3p1pt
294: _u3p1pt:
295: .space 1024 /*255 max pages for user #3 data */
296: .globl _u3p2pt
297: _u3p2pt:
298: .space 1020 /*255 max pages for user #3 stack */
299: eu3p2pt:
300: .space 4
301:
302: /*
303: *user #4 thru 6 page tables
304: *physical memory -- pages 22 thru 30
305: */
306: .globl _u4p0pt
307: _u4p0pt:
308: .space (9*NBPG) - 4
309: eu6p2pt:
310: .space 4
311:
312: /*
313: *user #7 page tables -- P0PT, P1PT, P2PT
314: *physical memory -- page 31, 32 , & 33 respectively
315: */
316: .align 2
317: .globl _u7p0pt
318: _u7p0pt:
319: .space 1024 /*255 max pages for user #7 text */
320: .globl _u7p1pt
321: _u7p1pt:
322: .space 1024 /*255 max pages for user #7 data */
323: .globl _u7p2pt
324: _u7p2pt:
325: .space 1020 /*255 max pages for user #7 stack */
326: eu7p2pt:
327: .space 4
328:
329: .globl _Ksp0 /* Page used for Kernel stack of user0 */
330: _Ksp0: .space 1020
331: _Eksp0: .long 0
332:
333: .globl _Ksp1 /* Page used for Kernel stack of user1 */
334: _Ksp1: .space 1020
335: _Eksp1: .long 0
336:
337: .globl _Ksp2 /* Page used for Kernel stack of user2 */
338: _Ksp2: .space 1020
339: _Eksp2: .long 0
340:
341: .globl _Ksp3 /* Page used for Kernel stack of user3 */
342: _Ksp3: .space 1020
343: _Eksp3: .long 0
344:
345: .globl _Ksp4 /* Page used for Kernel stack of user4 */
346: _Ksp4: .space 1020
347: _Eksp4: .long 0
348:
349: .globl _Ksp5 /* Page used for Kernel stack of user5 */
350: _Ksp5: .space 1020
351: _Eksp5: .long 0
352:
353: .globl _Ksp6 /* Page used for Kernel stack of user6 */
354: _Ksp6: .space 1020
355: _Eksp6: .long 0
356: #
357: # I/O buffers
358: #
359: .globl _iob0
360: _iob0: .space 1024
361: .globl _iob1
362: _iob1: .space 1024
363: .globl _iob2
364: _iob2: .space 1024
365: .globl _iob3
366: _iob3: .space 1024
367: .globl _iob4
368: _iob4: .space 1024
369: .globl _iob5
370: _iob5: .space 1024
371:
372: esysdata:
373:
374: #include "scblock.s" /* SYSTEM CONTROL BLOCK */
375:
376:
377:
378:
379:
380:
381: #include "evthandlers.s" /*event handlers */
382:
383: #define ACBL(_n1,_n2,_n3,_n4) \
384: addl2 _n2,_n3;\
385: cmpl _n3,_n1;\
386: bleq _n4;
387:
388:
389:
390: /*
391: *INITIALIZATION CODE
392: *
393: * MME off; mode = k; IPL = 31; IS = 1
394: *
395: */
396:
397: .globl start
398: start:
399: mtpr $0x1f,$IPL /* Set IPL to HIGH */
400: mtpr $0,$MME /* Disable MME */
401: movab _scb,r1
402: andl3 $0x000003ff, r1, r0
403: tstl r0 /* does scb addr starts at pg boundary? */
404: beql 1f
405: movl $0xffffffff,r0 /* scb address misaligned error */
406: halt /* halt immediately */
407: 1:
408: mtpr r1, $SCBB /* Set SCBB */
409:
410: movpsl r1
411: andl2 $0x001f0000,r1 /* Mask out flags */
412: cmpl r1,$0x001f0000 /* modes = K & IPL = 31? */
413: beql 1f
414: 2: movl $0xeeeeeeee,r0
415: movl $0x041f0000,r2
416: halt /* PSL not initialized as expected */
417: 1:
418: movl $_intstack+NISP*NBPG,r0
419: andl2 $0x3fffffff,r0 /* Mask out bit 30,31 */
420: mtpr r0,$ISP /* init. ISP */
421: movl r0,sp /* in case we get exception */
422: movab (sp),fp /* Initialize FP */
423: #
424: # Clear system data area all the way upto system code
425: # this includes dump buffer,interrupt stack,spt,iomap,pcbs,user
426: # page tables, & io buffer area.
427: #
428: 3:
429: movab esysdata,r7
430: movab _restart,r6
431: 1: clrl (r6)
432: ACBL(r7,$4,r6,1b)
433: #
434: # Initialize System Page Table
435: #
436: 5:
437: clrl r2
438: movab _Ksp6,r1 /* R1 = Last address in Kernel stack area */
439: andl2 $0x3fffffff,r1 /* Mask out bit 30,31 */
440: shar $PGSHIFT,r1,r1 /* Get page no. of last page of Kstacks */
441: 1:
442: movl r2,r11 /* Donot want to use orl3 */
443: orl2 $PG_V|PG_KW,r11
444: orl2 r11,_Sysmap[r2]
445: aobleq r1,r2,1b
446:
447: movab esysdata,r1 /* R1 = Last address in system data area */
448: andl2 $0x3fffffff,r1 /* Mask out bit 30,31 */
449: shar $PGSHIFT,r1,r1 /* Get page no. of last system data addr */
450: 1:
451: movl r2,r11 /* Donot want to use orl3 */
452: orl2 $PG_V|PG_KW|PG_NC,r11 /* Set I/O buffers non cachable */
453: orl2 r11,_Sysmap[r2]
454: aoblss r1,r2,1b
455: #
456: # Map system text area 1 to 1, Kernel read/write.
457: # For this to work, the label _etext must exist at the end
458: # of system code; Add in 4 more pages for data area used in C
459: #
460: movab _end + (NBPG-1),r1 /* Map text+data 1 to 1; Kernel R/W */
461: andl3 $0x3ffffc00,r1,_IOpage
462: addl2 $64*(1024),r1
463: andl2 $0x3fffffff,r1
464: shar $PGSHIFT,r1,r1
465: 1:
466: movl r2,r11
467: orl2 $PG_V|PG_KW|PG_NC,r11 /* Kernel Read/Write, non_cachable */
468: orl2 r11,_Sysmap[r2]
469: aoblss r1,r2,1b
470: #
471: # Map from here (1st unused page) to page 512 :
472: # * invalid,no access, & virtual = physical
473: #
474: movl r2,_unused /* Save first unused physical page no */
475: movl $LSP+1,r1
476: 1: movl r2,_Sysmap[r2]
477: aoblss r1,r2,1b
478:
479: sysrdy:
480: movab _Sysmap,r0
481: mtpr r0,$SBR /* Set SYSTEM BASE REG */
482: mtpr $_Syssize,$SLR
483: orl2 $0xc0000000,r0
484: mtpr r0,$P0BR /* Set P0BR */
485: mtpr $_Syssize,$P0LR
486:
487: movl $CLOCK,r0 /* clock handler entry */
488: movab _Xclock,_scb[r0] /* clk hndlr address */
489:
490: movl $BUSER,r0
491: movab _Buser,_scb[r0] /* Set bus error handler */
492:
493: clrl _bturn
494: clrl _bell
495: clrl _btime
496: mtpr $1,$IPL /* Allow clock interrupt */
497: #
498: # Probe for VEIUs
499: #
500: clrl _veius
501: callf $4,_chk_veiu_adr
502: movl r0,_veius
503:
504: .globl _ready
505: _ready:
506: clrl _proc_no
507: mtpr $1,$PACC
508: mtpr $1,$PADC
509: mtpr $1,$TBIA
510: mtpr $1,$CCK /* Set Code Cache Key = 1 */
511: mtpr $1,$DCK /* Set Data Cache Key = 1 */
512: mtpr $1,$MME /* Enable MME */
513: jmp *$1f
514: 1:
515: movab _pcb0,r0
516: movab _Eksp0,(r0) /* Set PCB0_KSP */
517: mfpr $P0BR,PCB_P0BR(r0) /* Set PCB0_P0BR */
518: mfpr $P0LR,PCB_P0LR(r0) /* Set PCB0_P0LR */
519: mtpr r0,$PCBB /* Init PCBB to PCB_0 */
520: ldpctx /* Just to switch to Kernel stack */
521: mtpr $1,$IPL /* Drop IPL to 1 */
522: movl (sp)+,r12 /* Pop unnecessary PC,PSL */
523: movl (sp)+,r11
524: #
525: 1: clrl _Multi
526: #
527: # VEIUs Test
528: #
529: tstl _veius /* Any VEIUs to test ? */
530: beql 1f
531: callf $4,_init_veiu_vec /* Set up interrupt handlers for VEIUs */
532: callf $4,_veiu /* VEIU test */
533: #
534: #
535: 1:
536: movl $0xcafebabe,r0
537: halt
538: #
539: # Real time clock Handler
540: #
541: .align 2
542: .globl _Xclock
543: _Xclock:
544: rei
545:
546: #
547: # Bus error handler
548: #
549: .align 2
550: .globl _Buser
551: _Buser:
552: movab (sp),-(sp) /* Push pointer to error parameter */
553: callf $8,_buserror
554: incl _Berr
555: movl (sp)+,r0
556: movl (sp)+,r0
557: movl $0xeeeeeeee, r0
558: rei
559:
560: #
561: # badaddr(addr, len)
562: # see if access addr with a len type instruction causes a machine check
563: # len is length of access (1=byte, 2=short, 4=long)
564: # r0 = 0 means good(exists); r0 =1 means does not exist.
565: #
566: .globl _badaddr
567: _badaddr:
568: .word 0x1c # Keep r4,r3,r2
569: mfpr $IPL,r1
570: mtpr $HIGH,$IPL
571: movl _scb+BEVEC,r2
572: movl 4(fp),r3
573: movl 8(fp),r4
574: movab 9f,_scb+BEVEC
575: bbc $0,r4,1f
576: tstb (r3)
577: 1: bbc $1,r4,1f
578: tstw (r3)
579: 1: bbc $2,r4,1f
580: tstl (r3)
581: 1: clrl r0 # made it w/o machine checks
582: 2: movl r2,_scb+BEVEC
583: mtpr r1,$IPL
584: ret
585:
586: .align 2
587: 9: # Here we catch buss error (if it comes)
588: andl3 4(sp),$0x7,r0 # check ERRCD
589: cmpl r0,$1 # check APE
590: jneq 1f
591: halt # Address parity error !!!
592: 1: cmpl r0,$5 # check VBE
593: jneq 1f
594: halt # Versabus error
595: 1:
596: movl $1,r0 # Anything else = bad address
597: movab 8(sp),sp # discard buss error trash
598: movab 2b,(sp) # new program counter on stack.
599: rei
600: #
601: #
602: #
603: .align 2
604: _bell: .long 0
605: _bturn: .long 0
606: _btime: .long 0
607: .globl _Multi
608: _Multi: .long 0
609: .globl _Berr
610: _Berr: .long 0
611: .globl _IOinit
612: _IOinit: .long 0
613: .globl _tape_ON
614: _tape_ON:
615: .long 1
616: .globl _vioc_ON
617: _vioc_ON:
618: .long 1
619: .globl _vddc_ON
620: _vddc_ON:
621: .long 1
622: .globl _viocs
623: _viocs:
624: .long 0
625: .globl _veius
626: _veius:
627: .long 0
628:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.