|
|
1.1 root 1:
2: /* privileged registers constants (addresses) */
3:
4:
5:
6: .set SBR,0 /*system base register */
7: .set SLR,1 /*system length reg */
8: .set P0BR,2 /*p0 base reg */
9: .set P0LR,3 /*p0 length reg */
10: .set P1BR,4 /*p1 base reg */
11: .set P1LR,5 /*p1 length reg */
12: .set P2BR,6 /*p2 base reg */
13: .set P2LR,7 /*p2 length reg */
14: .set IPL,8 /*int priority level reg */
15: .set MME,9 /*memory mgmt enable reg */
16: .set TBIA,10 /*trans buf invalidate all */
17: /*entries */
18: .set TBIS,11 /*trans buf invalidate single */
19: /*entry */
20: .set DCK,12 /*data cache key */
21: .set CCK,13 /*code cache key */
22: .set PCBB,14 /*process control block base */
23: .set ISP,15 /*interrupt stack pointer */
24: .set SIRR,16 /*software int request reg */
25: .set SISR,17 /*software int summary reg */
26: .set SCBB,18 /*system control block base reg */
27: .set KSP,19 /*kernel stack pointer reg */
28: .set USP,20 /*user stack pointer */
29: .set DCB,21 /*CPU2 DCB */
30: .set PACC,23 /*purge (invalidate) all pages */
31: /*of process in code cache */
32: .set P1DC,24 /*purge one page of data cache */
33: .set PADC,25 /*purge all the pages of */
34: /*process in data cache */
35: .set HISR,26 /* Hardware interrupt summary reg */
36: .set DCR,27 /* Diagnostic control register */
37: .set PDCS,28 /* Purge 1 data cache slot */
38:
39: #
40: #TAHOE program status longword
41: #
42:
43: .set PSL_C,0x00000001 /* carry bit */
44: .set PSL_V,0x00000002 /* overflow bit */
45: .set PSL_Z,0x00000004 /* zero bit */
46: .set Z,0x00000004
47: .set PSL_N,0x00000008 /* negative bit */
48: .set PSL_T,0x00000010 /* trace enable bit */
49: .set PSL_I,0x00000020 /* integer overflow enable bit */
50: .set PSL_EN_OVFL,0x20 /* integer overflow enable bit */
51: .set PSL_EN_UNDFL,0x40 /* floating underflow enable */
52: .set PSL_DBL,0x80 /* dbl precision Accumulator bit */
53: .set PSL_IPL,0x001f0000 /* interrupt priority level */
54: .set PSL_MOD,0x01000000 /* mode = 1 means user */
55: .set PSL_IS,0x04000000 /* interrupt stack */
56: .set PSL_TP,0x40000000 /* trace pending */
57:
58: #
59: # TAHOE page table entry
60: #/
61: .set PG_V,0x8000000
62: .set PG_PROT,0x78000000
63: .set PG_M,0x04000000
64: .set PG_USED,0x02000000
65: .set PG_NC,0x01000000
66: .set PG_PFNUM,0x003fffff
67:
68: .set PG_NOACC,0
69: .set PG_KR,0x40000000
70: .set PG_KW,0x60000000
71: .set PG_URKR,0x50000000
72: .set PG_URKW,0x70000000
73: .set PG_UW,0x78000000
74:
75: #* PCB offsets & diagnostic extension to pcb */
76: #* PCB is at pcb0 */
77:
78:
79: .set PCB_SIZE, 24
80: .set PCB_KSP, 0
81: .set PCB_USP, 4
82: .set PCB_R0, 8
83: .set PCB_R1, 12
84: .set PCB_R2, 16
85: .set PCB_R3, 20
86: .set PCB_R4, 24
87: .set PCB_R5, 28
88: .set PCB_R6, 32
89: .set PCB_R7, 36
90: .set PCB_R8, 40
91: .set PCB_R9, 44
92: .set PCB_R10, 48
93: .set PCB_R11, 52
94: .set PCB_R12, 56
95: .set PCB_R13, 60
96: .set PCB_PC, 64
97: .set PCB_PSL, 68
98: .set PCB_P0BR, 72
99: .set PCB_P0LR, 76
100: .set PCB_P1BR, 80
101: .set PCB_P1LR, 84
102: .set PCB_P2BR, 88
103: .set PCB_P2LR, 92
104: .set PCB_ACCM, 96
105: .set PCB_ACCL, 100
106: #*
107: # Diagnostic pcb extension
108: #/
109: .set PCB_STAT, 104 /*process status,statistics,id,etc*/
110:
111:
112:
113: #* fundamental constants */
114:
115: #*
116: # fundamental constants of the implementation--
117: # cannot be changed easily.
118: #/
119:
120: .set NBPG,1024
121: .set PGOFSET,(NBPG-1) /* byte offset into page */
122: .set PGSHIFT,10 /* LOG2(NBPG) */
123: .set HIGH,0x1f
124:
125:
126: #* SCB offsets */
127: #* SCB is at scb */
128:
129: .set PFVEC,1*4 /*power fail */
130: .set PRVEC,2*4 /*power restore */
131: .set CLOCKVEC,7*4 /*hard clock vector */
132: .set CRVEC,0xa*4 /*console receive */
133: .set CXVEC,44 /*console transmit */
134: .set SIVEC1,0x1e*4 /*software int vec #1 */
135: /*for 2,3,..15, sub 4,8,.. 56 */
136: /*from SIVEC1 */
137: .set BEVEC,0x20*4 /*bus error */
138: .set SYSVEC,0x2b*4 /*system call (kcall) */
139: .set PINSTVEC,0x2c*4 /*privileged instruction fault */
140: .set PRIVSVEC,0x2c*4 /*privileged instruction fault */
141: .set ROVEC,0x2d*4 /*reserved operand fault */
142: .set RAVEC,0x2e*4 /*reserved addressing fault */
143: .set PROTVEC,0x2f*4 /*access control violation */
144: .set TRANS,0x30 /*translation fault vector */
145: .set TRANSVEC,0x30*4 /*translation fault vector */
146: .set KSPVEC,0x31*4 /*kernel stack not valid vector */
147: .set TRACEVEC,0x32*4 /*trace vector */
148: .set BPTVEC,0x33*4 /*break point fault */
149: .set ARITHVEC,0x34*4 /*arithmetic trap */
150: .set ALIGNVEC,0x35*4 /*alignment vector */
151: .set FPMVEC,0x37*4 /*fpp emulation vector */
152: .set IO14VEC,256 /*io vector, ipl #14 */
153: .set IO15VEC,320 /*io vector, ipl #15 */
154: .set IO16VEC,384 /*io vector, ipl #16 */
155: .set IO17VEC,448 /*io vector, ipl #17 */
156:
157: #* SPT (system page table) offsets */
158: #* SPT is at Sysmap */
159:
160: .set SCBPTE,8 /*system control block pte offset*/
161: .set BUFPTE,12 /*buffer pte offset */
162: .set ISPTE,16 /*interrupt stack page 0 */
163: .set IS1PTE,20 /*interrupt stack page 1 */
164: .set SPTPTE,20 /*system page table page 1 */
165: .set SPT1PTE,20 /*system page table page 2 */
166: .set IOMAPPTE,24 /*io map */
167: .set PCBPTE,28 /*process control blocks pte */
168: .set U0P0PTE,32 /*U0 p0pt pte */
169: .set U0P1PTE,36 /*U0 p1pt pte */
170: .set U0P2PTE,40 /*U0 p2pt pte */
171: .set U1P0PTE,44
172: .set U1P1PTE,48
173: .set U1P2PTE,52
174: .set U2P0PTE,56
175: .set U2P1PTE,60
176: .set U2P2PTE,64
177: .set U3P0PTE,68
178: .set U3P1PTE,72
179: .set U3P2PTE,76
180: .set U4P0PTE,80
181: .set U4P1PTE,84
182: .set U4P2PTE,88
183: .set U5P0PTE,92
184: .set U5P1PTE,96
185: .set U5P2PTE,100
186: .set U6P0PTE,104
187: .set U6P1PTE,108
188: .set U6P2PTE,112
189: .set U7P0PTE,116 /*U7 p0pt pte */
190: .set U7P1PTE,120 /*U7 p1pt pte */
191: .set U7P2PTE,124 /*U7 p2pt pte */
192: .set IOB0PTE,128 /*io buffer 0 pte */
193: .set IOB1PTE,132
194: .set IOB2PTE,136
195: .set IOB3PTE,140
196: .set IOB4PTE,144
197: .set IOB5PTE,148
198: .set IOB6PTE,152
199: .set IOB7PTE,156 /*io buffer 7 pte */
200:
201:
202: #* trap.h 4.6 81/03/03 */
203:
204: #*
205: #* Trap type values
206: #/
207:
208: .set RESADFLT,0 /* reserved addressing fault */
209: .set PRIVINFLT,1 /* privileged instruction fault */
210: .set RESOPFLT,2 /* reserved operand fault */
211: .set BPTFLT,3 /* bpt instruction fault */
212: .set ALIGNFLT,4 /* alignment fault */
213: .set SYSCALL,5 /* kcall instruction (syscall trap) */
214: .set ARITHTRAP,6 /* arithmetic trap */
215: .set PROTFLT,7 /* protection fault */
216: .set TRCTRAP,8 /* trace trap */
217: .set TRANSFLT,9 /* translation not valid fault */
218: .set DONE,255
219:
220: #
221: # Event codes
222: #
223: .set RTCLOCK_CODE,7 /* real time clock event */
224: .set RESOP_CODE,0x2d /* reserved operand fault */
225: .set RESAD_CODE,0x2e /* reserved address fault */
226: .set ARITH_CODE,0x34 /* arithmetic fault */
227: .set FPM_CODE,0x37 /* fpp emulation trap */
228: .set INTEGER_OVERFLOW,1 /* code for arith. fault */
229:
230: #
231: # Arithmetic Event types
232: #
233: .set INT_OVFL_CODE,1 /* integer overflow */
234: .set INT_0_DIV_CODE,2 /* integer divide by 0 */
235: .set FLT_0_DIV_CODE,3 /* floating divide by 0 */
236: .set FLT_OVFL_CODE,4 /* floating overflow */
237: .set FLT_UNDFL_CODE,5 /* floating underflow */
238:
239: #
240: # Floating Point Instruction Op-Codes
241: #
242: .set LDF_OP_CODE,0x06 /* sgl load acc. instr */
243: .set LDD_OP_CODE,0x07 /* dbl load acc. instr */
244: .set LNF_OP_CODE,0x16 /* sgl load-neg acc. instr */
245: .set LND_OP_CODE,0x17 /* dbl load-neg acc. instr */
246: .set STF_OP_CODE,0x26 /* sgl store acc. instr */
247: .set STD_OP_CODE,0x27 /* dbl store acc. instr */
248: .set CMPF_OP_CODE,0x36 /* sgl compare instr */
249: .set CMPD_OP_CODE,0x37 /* dbl compare instr */
250: .set CMPF2_OP_CODE,0x46 /* sgl compare 2 instr */
251: .set CMPD2_OP_CODE,0x47 /* dbl compare 2 instr */
252: .set TSTF_OP_CODE,0x56 /* sgl test acc. instr */
253: .set TSTD_OP_CODE,0x57 /* dbl test acc. instr */
254: .set PUSHD_OP_CODE,0x67 /* dbl push acc. instr */
255: .set CVLF_OP_CODE,0x76 /* convert int to sgl instr */
256: .set CVLD_OP_CODE,0x77 /* convert int to dbl instr */
257: .set CVFL_OP_CODE,0x86 /* convert sgl to int instr */
258: .set CVDL_OP_CODE,0x87 /* convert dbl to int instr */
259: .set LDFD_OP_CODE,0x97 /* load sgl to dbl instr */
260: .set CVDF_OP_CODE,0xa6 /* convert dbl to sgl instr */
261: .set NEGF_OP_CODE,0xb6 /* negate sgl acc. instr */
262: .set NEGD_OP_CODE,0xb7 /* negate dbl acc. instr */
263: .set ADDF_OP_CODE,0xc6 /* sgl add instr */
264: .set ADDD_OP_CODE,0xc7 /* dbl add instr */
265: .set SUBF_OP_CODE,0xd6 /* sgl subtract instr */
266: .set SUBD_OP_CODE,0xd7 /* dbl subtract instr */
267: .set MULF_OP_CODE,0xe6 /* sgl multiply instr */
268: .set MULD_OP_CODE,0xe7 /* dbl multiply instr */
269: .set DIVF_OP_CODE,0xf6 /* sgl divide instr */
270: .set DIVD_OP_CODE,0xf7 /* dbl divide instr */
271: .set SINF_OP_CODE,0x05 /* sgl sine instr */
272: .set COSF_OP_CODE,0x15 /* sgl cosine instr */
273: .set ATANF_OP_CODE,0x25 /* sgl arc-tangent instr */
274: .set LOGF_OP_CODE,0x35 /* sgl natural log instr */
275: .set SQRTF_OP_CODE,0x45 /* sgl square root instr */
276: .set EXPF_OP_CODE,0x55 /* sgl "e to the x" instr */
277: .set MULL2_OP_CODE,0x4c /* integer multiply - 2 ops */
278: .set MULL3_OP_CODE,0x5c /* integer multiply - 3 ops */
279:
280:
281: #
282: # Addressing test constants - These must agree with "fpp_defs.h"
283: #
284: .set ADR_ABSOLUTE,1 /* absolute address */
285: .set ADR_LITERAL,2 /* literal -short immediate byte */
286: .set ADR_IM_B,3 /* immediate byte */
287: .set ADR_IM_W,4 /* immediate word */
288: .set ADR_IM_L,5 /* immediate long-word */
289: .set ADR_B_DSP,6 /* byte displ relative */
290: .set ADR_W_DSP,7 /* word displ relative */
291: .set ADR_L_DSP,8 /* long-word displ relative */
292: .set ADR_B_DSP_DEF,9 /* byte displ relative deferred */
293: .set ADR_W_DSP_DEF,10 /* word displ relative deferred */
294: .set ADR_L_DSP_DEF,11 /* L-word displ relative deferred */
295: .set ADR_REG,12 /* direct register */
296: .set ADR_REG_DEF,13 /* register deferred */
297: .set ADR_FP_DEF,14 /* FP deferred */
298: .set ADR_SP_DEF,15 /* SP deferred */
299: .set ADR_PUSH,16 /* auto-decrement SP */
300: .set ADR_POP,17 /* auto-increment SP */
301: .set ADR_POP_DEF,18 /* auto-increment SP deferred */
302: .set ADR_REG_B,19 /* register + byte displ */
303: .set ADR_REG_W,20 /* register + word displ */
304: .set ADR_REG_L,21 /* register + long-word displ */
305: .set ADR_REG_B_DEF,22 /* register + byte displ deferred */
306: .set ADR_REG_W_DEF,23 /* register + word displ deferred */
307: .set ADR_REG_L_DEF,24 /* register + L-word displ deferred */
308: .set ADR_I_FP_DEF,25 /* indexed (frame pointer deferred) */
309: .set ADR_I_L,26 /* indexed (longword displacement) */
310:
311:
312: #*************************************************************************
313: #
314: # Stuff for the Demand Paging , Events, & Addressing Tests
315: #
316: #************************************************************************/
317: .set SGL,1 /* sgl precision data */
318: .set DBL,2 /* dbl precision data */
319: .set ENABLE_EVENTS,0x60 /* enable ovfl & undfl events */
320: .set NONE,0 /* no operand flag */
321: .set LOAD,1 /* read-the-operand flag */
322: .set STORE,2 /* store-the-operand flag */
323:
324: .set NO_EVT_HLT,1 /* halt code: did not Get event */
325: .set EVT_MSK_HLT,2 /* halt code: got masked event */
326: .set BAD_PSL_HLT,3 /* halt code: wrong PSL value */
327: .set PUSH_CNT_HLT,4 /* halt code: wrong # ops on stk */
328: .set PUSH_PSL_HLT,5 /* halt code: bad PSL on stack */
329: .set PUSH_PC_HLT,6 /* halt code: bad PC on stack */
330: .set BAD_REG_HLT,7 /* halt code: bad final register */
331: .set BAD_ACC_HLT,8 /* halt code: bad final Acc. */
332:
333: #
334: # set DMP_PG_0 to the 1st empty page
335: #
336: .set DMP_PG_0,0x36000
337: .set DMP_PG_1,DMP_PG_0+0x400
338: .set DMP_PG_2,DMP_PG_1+0x400
339: .set DMP_PG_3,DMP_PG_2+0x400
340: .set DMP_PG_4,DMP_PG_3+0x400
341: .set DMP_PG_5,DMP_PG_4+0x400
342: .set DMP_PG_6,DMP_PG_5+0x400
343: .set DMP_PG_7,DMP_PG_6+0x400
344: .set DMP_PG_8,DMP_PG_7+0x400
345: .set DMP_PG_9,DMP_PG_8+0x400
346: .set DMP_PG_10,DMP_PG_9+0x400
347: .set DMP_PG_11,DMP_PG_10+0x400
348: .set DMP_PG_12,DMP_PG_11+0x400
349: .set DMP_PG_13,DMP_PG_12+0x400
350:
351: #
352: # test code space for the address / demand page tests
353: #
354: .set START_OF_CODE,DMP_PG_1-20 /* 1st addr of test-code space */
355: .set CODE_BUF_SIZE,40 /* # bytes in test-code space */
356: .set END_OF_CODE,START_OF_CODE+CODE_BUF_SIZE
357:
358: #
359: # data locations used by the event and demand page tests
360: #
361: .set _dmp_byte_op_1,DMP_PG_1+0x30 /* 'byte offset' data */
362: .set _dmp_byte_op_2,DMP_PG_1+0x50 /* 'byte offset' data */
363: .set _dmp_byte_op_3,DMP_PG_1+0x70 /* 'byte offset' data */
364: .set _dmp_op_1,DMP_PG_3-4 /* 1st data word */
365: .set _dmp_op_1_ptr,DMP_PG_4+0x30 /* ptr to 1st data wd */
366: .set _dmp_op_2_ptr,DMP_PG_5+0x30 /* ptr to 2nd data wd */
367: .set _dmp_op_2,DMP_PG_7-4 /* 2nd data word */
368: .set _dmp_op_3,DMP_PG_8 /* 3rd data word */
369: .set _dmp_op_3_ptr,DMP_PG_9+0x30 /* ptr to 3rd data wd */
370: .set _dmp_op_4,DMP_PG_10 /* 4th data (for pipes) */
371: .set _dmp_op_5,DMP_PG_11 /* 5th data (for pipes) */
372: .set _sp_minus,DMP_PG_13-4 /* SP for POPs */
373: .set _sp_page,DMP_PG_13 /* SP page boundary */
374: .set _sp_plus,DMP_PG_13+4 /* SP for PUSHs */
375:
376:
377: /************************************************************************/
378: /* Revision History */
379: /* ---------- */
380: /* Rev 1.0 1 Aug 85 */
381: /* */
382: /* Initial release of the diagnostic */
383: /* */
384: /************************************************************************/
385:
386: # INIT.X for the Demand Pageing Tests
387: #
388: # This file is a diagnostic version of locore.s.
389: # It contains the following:
390: # *system data area = scb, dump buffer, interrupt stack,
391: # *system page table,user page tables,pcbs,iomap, & io buffers.
392: #
393: # *system code = interrupt vectors, initialization of system data,
394: # *memory size calculation,initialization of SPT, zeroing of
395: # *unused memory, & loading of SBR & SLR.
396: # *
397: # *at the end of this code, you are ready to go to virtual mode.
398: # * --- GOOD LUCK!
399: #
400: ##########################################################################
401: #
402: # 6-Mar-85 : changed to user mode execution
403: # 11-Mar-85 : moved mode changeing from here to RUN_CODE
404: # 17-Jul-85 : added "mtpr" test for fpp/no-fpp wcs
405: ##########################################################################
406:
407:
408: /* privileged registers addresses */
409: #include "prvreg.h"
410:
411: /* program status long word definition */
412: #include "psl.h"
413:
414: /* page table entry definition */
415: #include "pte.h"
416:
417: /* process control block offsets */
418: #include "pcboffset.h"
419:
420: /* fundamental constants for globl use */
421: #include "const.h"
422:
423: /* system control block offsets*/
424: #include "scboffset.h"
425: /* SPT offsets */
426: #include "sptoffset.h"
427:
428: /* trap numbers*/
429: #include "trap.h"
430:
431:
432: #define V_TRAP 0
433: #define V_SYSCALL 4
434:
435: .set HIGH,0x1f /*mask for disabling all interrupts */
436: .set MCKVEC,4 /*scb offset for machinecheck vector */
437: .set NISP,2 /*no. of interrupt stack pages */
438: .set DONE,255 /*user process done code */
439: .set TTRAP,0x32
440: .set PRIVS,0x2c
441:
442: .text
443:
444: /* PROCESSOR STORAGE AREA */
445: #include "pstorage.s"
446:
447: .globl _Entry
448: _Entry:
449: jmp start
450: .space (1024-6)
451:
452: /* globl dump buffer to be used for communication */
453: /* between tests & interrupt handlers, & other misc. */
454: /* purposes. */
455:
456: /* Physical page 3 : Used for global variables */
457:
458: .set NLWU,35 /*no. of longwords already used */
459: /*this must be changed when you define */
460: /*additional variables below before */
461: /*_dbuf */
462: .globl _Codek
463: _Codek: .long 0 /* Code cache key */
464:
465: .globl _restart
466: _restart:
467: .space 4 /*contains restart address for restarting*/
468: /*after power is restored (loaded by */
469: /*power fail interrupt handler & used by*/
470: /*CPU 2 */
471: .globl _maxmem
472: _maxmem:
473: .space 4 /*memory size in no of bytes */
474:
475: .globl _maxpages
476: _maxpages:
477: .space 4 /*memory size in no. of physical pages */
478:
479: .globl _lastadd
480: _lastadd:
481: .space 4 /*address of the last long word */
482:
483: .globl _unused
484: _unused:
485: .space 4 /*first unused page in system space */
486:
487: .globl _ctlblk
488: _ctlblk:
489: .long 0 /* pointer to SCB */
490:
491: .globl _savvec0 /*save vectors area */
492: _savvec0:
493: .space 4
494:
495: .globl _savvec1 /*save vectors area */
496: _savvec1:
497: .space 4
498:
499: .globl _savvec2 /*save vectors area */
500: _savvec2:
501: .space 4
502:
503: .globl _savvec3 /*save vectors area */
504: _savvec3:
505: .space 4
506:
507: .globl _savvec4 /*save vectors area */
508: _savvec4:
509: .space 4
510:
511: .globl _savvec5 /*save vectors area */
512: _savvec5:
513: .space 4
514: .globl _savvec6 /*save vectors area */
515: _savvec6:
516: .space 4
517: .globl _savvec7 /*save vectors area */
518: _savvec7:
519: .space 4
520:
521: .globl _savvec8 /*save vectors area */
522: _savvec8:
523: .space 4
524:
525: .globl _r_no
526: _r_no:
527: .long 0
528: .globl _pt_base
529: _pt_base:
530: .long 0
531: .globl _saved_psl
532: _saved_psl:
533: .long 0
534: .globl _saved_sp
535: _saved_sp:
536: .long 0
537: .globl _saved_fp
538: _saved_fp:
539: .long 0
540: .globl _ret_adr
541: _ret_adr:
542: .long 0
543: .globl _exp_par0
544: _exp_par0:
545: .long 0
546: .globl _exp_par1
547: _exp_par1:
548: .long 0
549: .globl _f_vaddr
550: _f_vaddr:
551: .long 0 /* VA that caused fault */
552:
553: .globl _f_ptr
554: _f_ptr:
555: .long 0 /* Pointer to fault parameters */
556: .globl _df_cnt
557: _df_cnt:
558: .long 0 /* Count of data fault */
559:
560: .globl _if_cnt
561: _if_cnt:
562: .long 0 /* Count of Instruction fault */
563:
564: .globl _newepc
565: _newepc:
566: .long 0
567:
568: .globl _errcnt
569: _errcnt:
570: .long 0
571:
572: .globl _clk_cnt
573: _clk_cnt:
574: .long 0
575:
576: .globl _ttcnt
577: _ttcnt:
578: .long 0 /* Count of Trap exception */
579: .globl _trcnt
580: _trcnt:
581: .long 0 /* Count of Translation fault */
582:
583: .globl _Ufpte
584: _Ufpte: .long 0
585: .globl _Ulpte
586: _Ulpte: .long 0
587:
588: .globl _dbuf /*dump buffer left out of 1K */
589: _dbuf:
590: .space NBPG - (NLWU *4)
591: edbuf:
592:
593:
594: .globl _intstack /* Interrupt stack */
595: _intstack: /* Physical pages 4 & 5 */
596: .space NISP*NBPG
597: eintstack:
598:
599:
600: .set SYSPTSIZE,512 /* No. of entries in SPT */
601:
602: /*
603: System Page Table -- physical page 6 & 7
604: */
605: .align 2
606: .globl _Sysmap
607: _Sysmap:
608: .space SYSPTSIZE*4 /* 512 max pages allowed for system */
609: eSysmap:
610: .globl _Syssize
611: .set _Syssize,(eSysmap-_Sysmap)/4 /* should be SYSPTSIZE */
612:
613: .globl _iomap /* Physical page 8 */
614: _iomap: .space 1024 /* IOMAP - unused */
615: .globl _eiomap
616: _eiomap:
617:
618: .globl _pcb0 /* Physical page 9 */
619: _pcb0: .space 128 /*process control block 0 */
620: .globl _pcb1
621: _pcb1: .space 128 /*process control block 1 */
622: .globl _pcb2
623: _pcb2: .space 128 /*process control block 2 */
624: .globl _pcb3
625: _pcb3: .space 128 /*process control block 3 */
626: .globl _pcb4
627: _pcb4: .space 128 /*process control block 4 */
628: .globl _pcb5
629: _pcb5: .space 128 /*process control block 5 */
630: .globl _pcb6
631: _pcb6: .space 128 /*process control block 6 */
632: .globl _pcb7
633: _pcb7: .space 128 /*process control block 7 */
634:
635: /*
636: *user #0 page tables -- P0PT, P1PT, P2PT
637: *physical memory -- page10, 11, & 12 respectively
638: */
639: .align 2
640: .globl _u0p0pt
641: _u0p0pt:
642: .space 1024 /*255 max pages for user #0 text */
643: .globl _u0p1pt
644: _u0p1pt:
645: .space 1024 /*255 max pages for user #0 data */
646: .globl _u0p2pt
647: _u0p2pt:
648: .space 1020 /*255 max pages for user #0 stack */
649: eu0p2pt:
650: .space 4
651:
652: /*
653: *user #1 page tables -- P0PT, P1PT, P2PT
654: *physical memory -- page13 ,14, & 15 respectively
655: */
656: .align 2
657: .globl _u1p0pt
658: _u1p0pt:
659: .space 1024 /*255 max pages for user #1 text */
660: .globl _u1p1pt
661: _u1p1pt:
662: .space 1024 /*255 max pages for user #1 data */
663: .globl _u1p2pt
664: _u1p2pt:
665: .space 1020 /*255 max pages for user #1 stack */
666: eu1p2pt:
667: .space 4
668:
669:
670: /*
671: *user #2 page tables -- P0PT, P1PT, P2PT
672: *physical memory -- page 16, 17 , & 18 respectively
673: */
674: .align 2
675: .globl _u2p0pt
676: _u2p0pt:
677: .space 1024 /*255 max pages for user #2 text */
678: .globl _u2p1pt
679: _u2p1pt:
680: .space 1024 /*255 max pages for user #2 data */
681: .globl _u2p2pt
682: _u2p2pt:
683: .space 1020 /*255 max pages for user #2 stack */
684: eu2p2pt:
685: .space 4
686:
687:
688: /*
689: *user #3 page tables -- P0PT, P1PT, P2PT
690: *physical memory -- page 19, 20 , & 21 respectively
691: */
692: .align 2
693: .globl _u3p0pt
694: _u3p0pt:
695: .space 1024 /*255 max pages for user #3 text */
696: .globl _u3p1pt
697: _u3p1pt:
698: .space 1024 /*255 max pages for user #3 data */
699: .globl _u3p2pt
700: _u3p2pt:
701: .space 1020 /*255 max pages for user #3 stack */
702: eu3p2pt:
703: .space 4
704:
705: /*
706: *user #4 thru 6 page tables
707: *physical memory -- pages 22 thru 30
708: */
709: .globl _u4p0pt
710: _u4p0pt:
711: .space (9*NBPG) - 4
712: eu6p2pt:
713: .space 4
714:
715: /*
716: Area used for Kernel stack
717: physical memory -- page 31, 32 , 33
718: */
719:
720: .align 2
721: .globl _Kstack /* Kernel stack */
722: _Kstack: /* Physical pages 31,32,33 */
723: .space 3*NBPG
724: .globl ekstack
725: ekstack:
726:
727:
728: .globl _iob0 /*io buffer 0 */
729: _iob0: .space 1024
730: .globl _iob1 /*io buffer 1 */
731: _iob1: .space 1024
732: .globl _iob2 /*io buffer 2 */
733: _iob2: .space 1024
734: .globl _iob3 /*io buffer 3 */
735: _iob3: .space 1024
736: .globl _iob4 /*io buffer 4 */
737: _iob4: .space 1024
738: .globl _iob5 /*io buffer 5 */
739: _iob5: .space 1024
740: .globl _iob6 /*io buffer 6 */
741: _iob6: .space 1024
742: esysdata:
743:
744: /* SYSTEM CONTROL BLOCK */
745: #include "scblock.s"
746:
747:
748:
749: #include "evthandlers.s"
750:
751: #define ACBL(_n1,_n2,_n3,_n4) addl2 _n2,_n3; cmpl _n3,_n1; bleq _n4;
752:
753:
754:
755: # *INITIALIZATION CODE
756: # *
757: # * MME off; mode = k; IPL = 31; IS = 1
758: # *
759:
760:
761: .globl start
762: start:
763: mtpr $0,$MME /* Disable MME */
764: movl r0,_run_list
765: movl r1,_OPTIONS
766: clrl _nonstop /* clear the continuous run flag */
767: movl r2,_count /* save the test count */
768: bneq 1f /* is count = 0 ? */
769: movl $1,_count /* yes -set cycle count = 1 */
770: 1: bgeq 1f /* is count < 0 ? */
771: movl $1,_nonstop /* yes -set NONSTOP flag */
772: 1:
773: clrl _no_fpp_wcs /* clear the NO-FPP WCS flag */
774: mtpr $0x400,$DCR /* check for FPP WCS loaded */
775: tstl r1 /* r1 = 0 if NO-FPP WCS loaded */
776: bneq 1f
777: movl $1,_no_fpp_wcs /* set the NO-FPP WCS flag */
778: 1:
779: movab _scb,r0
780: andl2 $0x3ffffc00,r0
781: mtpr r0,$SCBB /* Set SCBB */
782: mtpr $0x1f,$IPL /* Set IPL to HIGH */
783:
784: andl3 $4,r11,_ss1 /* messages sense switch */
785:
786: #
787: # clear the option flags
788: #
789: clrl _halt_flg /* clear the halt on error flag */
790: clrl _loop_on_err /* clear the loop on error flag */
791: movl $1,_prt_error /* set the print error messages flag */
792: movl $1,_prt_hdrs /* set the print header messages flag */
793: movl $1,_en_data_cache /* set the enable data cache flag */
794: movl $1,_user_mode /* set the Run In User Mode flag */
795: clrl _exp_event /* clear the fpp event expected flag */
796: clrl _event_return /* clear the fpp event return flag */
797: clrl _unexp_event_ret /*clear the unexpected event return addr */
798:
799: #
800: # set the option flags as needed
801: #
802: bitl $1,_OPTIONS /* bit(0) = HALT ON ERROR */
803: beql 1f
804: movl $1,_halt_flg /* set the HALT ON ERROR flag */
805: 1:
806: bitl $2,_OPTIONS /* bit(1) = LOOP ON ERROR */
807: beql 1f
808: movl $1,_loop_on_err /* set the LOOP ON ERROR flag */
809: 1:
810: bitl $4,_OPTIONS /* bit(2) = PRINT ERROR MESSAGES */
811: beql 1f
812: clrl _prt_error /* clear the PRINT ERROR MESSAGES flag */
813: 1:
814: bitl $8,_OPTIONS /* bit(3) = PRINT HEADER MESSAGES */
815: beql 1f
816: clrl _prt_hdrs /* clear the PRINT HEADER MESSAGES flag */
817: 1:
818: bitl $16,_OPTIONS /* bit(4) = ENABLE DATA CACHE flag */
819: beql 1f
820: clrl _en_data_cache /* clear the ENABLE DATA CACHE flag */
821: 1:
822: bitl $32,_OPTIONS /* bit(5) = DON'T RUN IN USER MODE flag */
823: beql 1f
824: clrl _user_mode /* reset the RUN IN USER MODE flag */
825: 1:
826: movpsl r1
827: andl2 $0xffffff00,r1 /* Mask out flags */
828: cmpl r1,$0x041f0000 /*IS on,modes =k & IPL = 31? */
829: beql 1f
830: 2: movl $1,r0
831: movl $0x041f0000,r2
832: halt /* PSL not initialized as expected */
833: 1:
834: movl $_intstack+NISP*NBPG,r0
835: andl2 $0x3fffffff,r0 /* Mask out bit 30,31 */
836: mtpr r0,$ISP /* init. ISP */
837: movl r0,sp /* in case we get exception */
838: movab (sp),fp /* Initialize FP */
839: #
840: # Clear system data area all the way upto system code
841: # this includes dump buffer,interrupt stack,spt,iomap,pcbs,user
842: # page tables, & io buffer area.
843: #
844: 3:
845: movab esysdata,r7
846: movab _restart,r6
847: 1: clrl (r6)
848: ACBL(r7,$4,r6,1b)
849: #
850: # Initialize System Page Table
851: #
852: 5:
853: clrl r2
854: movab esysdata,r1 /* R1 = Last address in system data area */
855: andl2 $0x3fffffff,r1 /* Mask out bit 30,31 */
856: shar $PGSHIFT,r1,r1 /* Get page no. of last system data addr */
857: /* Map systm data area 1 to 1,kernel writable */
858: 1:
859: orl3 $PG_V|PG_KW,r2,_Sysmap[r2]
860: aoblss r1,r2,1b
861:
862: #
863: # Map system text area 1 to 1, Kernel read/write.
864: # For this to work, the label _etext must exist at the end
865: # of system code; Add in 4 more pages for data area used in C
866: #
867: movab _Esys,r1 /* Map System text 1 to 1; Kernel R/W */
868: andl2 $0x3fffffff,r1
869: shar $PGSHIFT,r1,r1
870: 1:
871: orl3 $PG_V|PG_KW,r2,_Sysmap[r2]
872: aobleq r1,r2,1b
873: #
874: # Map from here to last page used by user :
875: # invalid, User access, & virtual = physical
876: #
877: movl r2,_unused /* Save first unused physical page no */
878: movl r2,_Ufpte /* First PTE of User */
879: movl $0x80000,r1 /* Allow this much memory for User */
880: shar $PGSHIFT,r1,r1
881: movl r1,_Ulpte /* Last PTE of User */
882:
883: 1:
884: orl3 $PG_V|PG_UW,r2,_Sysmap[r2] /* Valid / User Read/Write */
885: aoblss r1,r2,1b
886:
887: #
888: # Initialize SBR, SLR
889: #
890: sysrdy:
891: mtpr $_Sysmap,$SBR /* Set SYSTEM BASE REG */
892: mtpr $_Syssize,$SLR
893: mtpr $64,$DCR /* Enable fault */
894:
895: # GO TO VIRTUAL MODE
896: # Double map the kernel into user addresses :
897: # This will enable system to go to virtual mode the 1st time !!
898: #
899:
900: orl3 $0xc0000000,$_Sysmap,r0
901: mtpr r0,$P0BR /* Double map P0BR to SBR */
902: mtpr $_Syssize,$P0LR
903: mtpr $1,$PADC /* Purge all data cache */
904: mtpr $1,$TBIA /* Purge all Trans. buffer */
905:
906: mfpr $SCBB,r0
907: movab _Trans,TRANSVEC(r0) /* Set new trans. fault handler */
908: movab _Prvis,PRIVSVEC(r0) /* Set new priv. ins. fault handler */
909: moval _FPM_handler,FPMVEC(r0) /* Set now fpm trap handler */
910: mtpr $_pcb0,$0xe /* Init. PCBB to PCB_0 */
911:
912: movab _pcb0,r0
913: movab ekstack,PCB_KSP(r0) /* Init. PCB_KSP */
914: movab eustack,PCB_USP(r0) /* Init. PCB_USP */
915: mfpr $P0BR,PCB_P0BR(r0) /* " PCB_P0BR */
916: mfpr $P0LR,PCB_P0LR(r0) /* " PCB_P0LR */
917: movl $0x001f000,PCB_PSL(r0) /* Set PCB_PSL : Kernel Mode */
918: ldpctx /* load the process context */
919:
920: mtpr $1,$PACC /* purge the code cache */
921: movl $1,_Codek
922: mtpr _Codek,$CCK /* Set code cache key */
923:
924: callf $4,_monitor /* go execute the test */
925:
926:
927: #include "fault_handlers.s" /* put spectial handlers here */
928:
929:
930: # /****************************************************************************
931: # * STACK AREA
932: # ****************************************************************************/
933:
934: .globl _Esys /* end of systems only code */
935: _Esys:
936: .space NBPG
937:
938: .globl _Ustack /* basic stack space */
939: _Ustack:
940: .space (2*NBPG)-4 /* 2 pages */
941: .globl eustack
942: eustack:
943: .long 0 /* initial user stack ptr */
944:
945: .globl U_area
946: U_area:
947:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.