|
|
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 PSL,22 /* program status longword */
25: .set SIRR,16 /*software int request reg */
26: .set SISR,17 /*software int summary reg */
27: .set SCBB,18 /*system control block base reg */
28: .set KSP,19 /*kernel stack pointer reg */
29: .set USP,20 /*user stack pointer */
30: .set P1CC,21 /*purge (invalidate) one page */
31: /*of code cache */
32: .set PACC,23 /*purge (invalidate) all pages */
33: /*of process in code cache */
34: .set P1DC,24 /*purge one page of data cache */
35: .set PADC,25 /*purge all the pages of */
36: /*process in data cache */
37: .set HISR,26 /* Hardware interrupt summary reg */
38:
39:
40:
41: .set PSL_C,0x00000001 /* carry bit */
42: .set PSL_V,0x00000002 /* overflow bit */
43: .set PSL_Z,0x00000004 /* zero bit */
44: .set Z,0x00000004
45: .set PSL_N,0x00000008 /* negative bit */
46: .set PSL_T,0x00000010 /* trace enable bit */
47: .set PSL_I,0x00000020 /* integer overflow enable bit */
48: .set PSL_IPL,0x001f0000 /* interrupt priority level */
49: .set PSL_MOD,0x01000000 /* mode = 1 means user*/
50: .set PSL_IS,0x04000000 /* interrupt stack */
51: .set PSL_TP,0x40000000 /* trace pending */
52:
53: .set PG_V,0x80000000
54: .set PG_PROT,0x78000000
55: .set PG_M,0x04000000
56: .set PG_USED,0x02000000
57: .set PG_NC,0x01000000
58: .set PG_PFNUM,0x003fffff
59:
60: .set PG_NOACC,0
61: .set PG_KR,0x40000000
62: .set PG_KW,0x60000000
63: .set PG_URKR,0x50000000
64: .set PG_URKW,0x70000000
65: .set PG_UW,0x78000000
66:
67: /* PCB offsets & diagnostic extension to pcb */
68:
69:
70: .set PCB_KSP, 0
71: .set PCB_USP, 4
72: .set PCB_R0, 8
73: .set PCB_R1, 12
74: .set PCB_R2, 16
75: .set PCB_R3, 20
76: .set PCB_R4, 24
77: .set PCB_R5, 28
78: .set PCB_R6, 32
79: .set PCB_R7, 36
80: .set PCB_R8, 40
81: .set PCB_R9, 44
82: .set PCB_R10, 48
83: .set PCB_R11, 52
84: .set PCB_R12, 56
85: .set PCB_R13, 60
86: .set PCB_PC, 64
87: .set PCB_PSL, 68
88: .set PCB_P0BR, 72
89: .set PCB_P0LR, 76
90: .set PCB_P1BR, 80
91: .set PCB_P1LR, 84
92: .set PCB_P2BR, 88
93: .set PCB_P2LR, 92
94: .set PCB_STAT, 96 /*process status,statistics,id,etc*/
95:
96:
97:
98: /* fundamental constants */
99:
100:
101: .set NBPG,1024
102: .set PGOFSET,(NBPG-1) /* byte offset into page */
103: .set PGSHIFT,10 /* LOG2(NBPG) */
104: .set HIGH,0x1f
105: .set PAGE,1024
106:
107:
108: /* SCB offsets */
109:
110: .set PFVEC,4 /*power fail */
111: .set CLOCKVEC,28 /*hard clock vector */
112: .set CRVEC,40 /*console receive */
113: .set CXVEC,44 /*console transmit */
114: .set SIVEC1,120 /*software int vec #1 */
115: /*for 2,3,..15, sub 4,8,.. 56 */
116: /*from SIVEC1 */
117: .set BEVEC,128 /*bus error */
118: .set SYSVEC,172 /*system call (kcall) */
119: .set PINSTVEC,176 /*privileged instruction fault */
120: .set ROVEC,180 /*reserved operand fault */
121: .set RAVEC,184 /*reserved addressing fault */
122: .set PROTVEC,188 /*access control violation */
123: .set TRANSVEC,192 /*translation fault vector */
124: .set KSPVEC,196 /*kernel stack not valid vector */
125: .set TRACEVEC,200 /*trace vector */
126: .set BPTVEC,204 /*break point fault */
127: .set ARITHVEC,208 /*arithmetic trap */
128: .set ALIGNVEC,212 /*alignment vector */
129: .set IO14VEC,256 /*io vector, ipl #14 */
130: .set IO15VEC,320 /*io vector, ipl #15 */
131: .set IO16VEC,384 /*io vector, ipl #16 */
132: .set IO17VEC,448 /*io vector, ipl #17 */
133:
134: /* SPT (system page table) offsets */
135:
136: .set SCBPTE,8 /*system control block pte offset*/
137: .set BUFPTE,12 /*buffer pte offset */
138: .set ISPTE,16 /*interrupt stack page 0 */
139: .set IS1PTE,20 /*interrupt stack page 1 */
140: .set SPTPTE,20 /*system page table page 1 */
141: .set SPT1PTE,20 /*system page table page 2 */
142: .set IOMAPPTE,24 /*io map */
143: .set PCBPTE,28 /*process control blocks pte */
144: .set U0P0PTE,32 /*U0 p0pt pte */
145: .set U0P1PTE,36 /*U0 p1pt pte */
146: .set U0P2PTE,40 /*U0 p2pt pte */
147: .set U1P0PTE,44
148: .set U1P1PTE,48
149: .set U1P2PTE,52
150: .set U2P0PTE,56
151: .set U2P1PTE,60
152: .set U2P2PTE,64
153: .set U3P0PTE,68
154: .set U3P1PTE,72
155: .set U3P2PTE,76
156: .set U4P0PTE,80
157: .set U4P1PTE,84
158: .set U4P2PTE,88
159: .set U5P0PTE,92
160: .set U5P1PTE,96
161: .set U5P2PTE,100
162: .set U6P0PTE,104
163: .set U6P1PTE,108
164: .set U6P2PTE,112
165: .set U7P0PTE,116 /*U7 p0pt pte */
166: .set U7P1PTE,120 /*U7 p1pt pte */
167: .set U7P2PTE,124 /*U7 p2pt pte */
168: .set IOB0PTE,128 /*io buffer 0 pte */
169: .set IOB1PTE,132
170: .set IOB2PTE,136
171: .set IOB3PTE,140
172: .set IOB4PTE,144
173: .set IOB5PTE,148
174: .set IOB6PTE,152
175: .set IOB7PTE,156 /*io buffer 7 pte */
176:
177:
178: /* trap.h 4.6 81/03/03 */
179:
180:
181: .set RESADFLT,0 /* reserved addressing fault */
182: .set PRIVINFLT,1 /* privileged instruction fault */
183: .set RESOPFLT,2 /* reserved operand fault */
184: .set BPTFLT,3 /* bpt instruction fault */
185: .set ALIGNFLT,4 /* alignment fault */
186: .set SYSCALL,5 /* kcall instruction (syscall trap) */
187: .set ARITHTRAP,6 /* arithmetic trap */
188: .set PROTFLT,7 /* protection fault */
189: .set TRCTRAP,8 /* trace trap */
190: .set TRANSFLT,9 /* translation not valid fault */
191: .set DONE,255
192: .set CPMDCB,21
193: .set ISTK,0x10000
194: .globl _rtclk
195: .set SYSP,0x20000
196: .set SSP,0x30000
197: .set CPCONS,0x01
198: .set CPWRITE,0x01
199: .set CPREAD,0x02
200: .set INTMR,0x04
201: .set BFSZ,0x02
202: .set CNT,0xfffffff
203: .set CLKCNT,0x05020
204:
205:
206: /* Console interval timer test */
207:
208:
209: _rtclk: movl $0x00,r1
210: movab bitbl,r0
211: lvec: movl r0,_scb[r1]
212: movl r1,bitbl[r1]
213: addl2 $4,r0
214: addl2 $1,r1
215: cmpl $0xff,r1
216: jneq lvec
217: movl $60,msgcnt /* load message count of sixty */
218: movl $0,tikcnt /* clear tick counter */
219: mtpr $0,$PSL /* setup for user stack */
220: mtpr $_scb,$SCBB /* initialize SCBB */
221: mtpr $ISTK,$ISP /* initialize interrupt stack pointer */
222: movl $ISTK,sp /* initialize s ystem stack pointer */
223: movab bdint,_scb + CLOCKVEC /* trap for unexpected interrupt */
224: mtpr $0x18,$IPL /* lower the ipl allow random interrupts */
225: movb $INTMR,CPDCB /* set up cpdcb to program interval timer */
226: movb $CPWRITE,CPDCB + 1
227: movw $CLKCNT,CPDCB + 2
228: movl $CNT,r2 /* load count value for timeout */
229: movl $CPDCB,r10 /* load address of device control block */
230: andl2 $0xffffff,r10 /* mask off garbage */
231: movab gdint,_scb + CLOCKVEC /* address of good interrupt handler */
232: movab txvec,_scb + CXVEC /* handle transmit interrupts */
233: mtpr r10,$CPMDCB /* send xmit interrupt to cp */
234: mtpr $0x17,$IPL /* lower the ipl allow clock interrupts */
235: loop: cmpl $30,tikcnt /* check its time to transmit mesg */
236: jgtr loop2 /* not ready continue */
237: mtpr $0x18,$IPL /* do not allow ticks during transmit */
238: cmpl $60,msgcnt
239: jneq nfirst /* skip if not the first message */
240: pushab nl /* start on a new line */
241: callf $8,_writes /* call print function */
242: nfirst: andl3 $1,msgcnt,r0 /* check for tick or tock */
243: jneq ptock /* generate tock */
244: pushab tick
245: jmp pmesg
246: ptock: pushab tock
247: pmesg: callf $8,_writes /* call print function */
248: movl $0,tikcnt /* clear tick counter */
249: movl $CNT,r2 /* reload rescue timer */
250: decl msgcnt /* decrement message counter */
251: jeql gdhlt
252: cmpl $0x32,msgcnt /* check half done */
253: jgtr lower /* if yes drop IPL to 0x13 */
254: mtpr $0x17,$IPL /* lower IPL allow another tick */
255: jmp loop2 /* continue */
256: lower: mtpr $0x13,$IPL /* lower IPL to 0x13 */
257: loop2: decl r2 /* decrement count register */
258: jneq loop /* not zero then loop */
259: movl $0x02,r0 /* error - expected interrupt did not occur */
260: halt
261:
262: bdint: movl $0x01,r0 /* error - unexpected interrupt occurred */
263: halt
264: txvec: rei
265: gdint: mtpr $CPDCB,$PDCS /* check done bit */
266: movw CPDCB,r1 /* check done bit */
267: andl2 $0x08000,r1 /* mask off don't care bits */
268: jneq gd1 /* not zero jmp */
269: movl $0x03,r0 /* error code done bit not set */
270: halt
271: gd1: mfpr $IPL,r1 /* read current ipl */
272: movl $0x18,r2 /* expected value */
273: cmpl r1,r2
274: jeql gd2
275: movl $0x04,r0 /* error code wrong ipl */
276: halt
277: gd2: movpsl r1 /* get current psl */
278: andl2 $0x0fffff00,r1 /* mask off don't cares */
279: movl $0x04180000,r2 /* expected value */
280: cmpl r1,r2
281: jeql gd3 /* if correct jump */
282: movl $0x05,r0 /* error code wrong psl */
283: halt
284: gd3: movab (sp),r1 /* current stack pointer address */
285: movl $ISTK - 8,r2
286: cmpl r1,r2
287: jeql gd4
288: movl $0x06,r0 /* error code wrong stack address */
289: halt
290: gd4: incl tikcnt /* increment tick counter */
291: rei /* return from interrupt */
292: gdhlt: pushab boom
293: callf $8,_writes /* call print function */
294: movl $0xcafebabe,r0 /* good halt - CAFEBABE ! */
295: halt
296:
297: .data
298:
299: _scb:
300: .space 1024
301:
302: bitbl:
303: .space 1024
304:
305:
306: .align 2
307:
308: CPDCB:
309:
310: .space 20
311:
312: .align 2
313:
314:
315: tikcnt:
316: .space 4
317:
318: msgcnt:
319: .space 4
320:
321: nl: .ascii "\n\0"
322: tick: .ascii "Tick \0"
323: tock: .ascii "Tock \0"
324: boom: .ascii "Boom!\n\0"
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.