|
|
1.1 root 1: #ifdef LOCORE
2: #define P_LINK 0
3: #define P_RLINK 4
4: #define P_XLINK 108
5: #define P_ADDR 16
6: #define P_PRI 21
7: #define P_STAT 23
8: #define P_WCHAN 96
9: #define P_TSIZE 68
10: #define P_DSIZE 72
11: #define P_SSIZE 76
12: #define P_P0BR 104
13: #define P_SZPT 66
14: #define P_TEXTP 100
15: #define P_FLAG 44
16: #define SSLEEP 1
17: #define SRUN 3
18: #define UBA_BRRVR 48
19: #define UH_UBA 0
20: #define UH_VEC 8
21: #define UH_SIZE 64
22: #define RP_FLAG 12
23: #define X_CADDR 64
24: #define V_SWTCH 0
25: #define V_TRAP 4
26: #define V_SYSCALL 8
27: #define V_INTR 12
28: #define V_SOFT 16
29: #define V_PDMA 20
30: #define V_FAULTS 92
31: #define V_PGREC 52
32: #define V_FASTPGREC 112
33: #define UPAGES 10
34: #define CLSIZE 2
35: #define SYSPTSIZE 3584
36: #define USRPTSIZE 4096
37: #define MSGBUFPTECNT 8
38: #define NMBCLUSTERS 256
39: #define U_PROCP 128
40: #define U_RU 1640
41: #define RU_MINFLT 32
42: #else
43: asm(".set U_ARG,156");
44: asm(".set U_QSAVE,192");
45: #endif
46: /*
47: * Copyright (c) 1982, 1986 Regents of the University of California.
48: * All rights reserved. The Berkeley software License Agreement
49: * specifies the terms and conditions for redistribution.
50: *
51: * @(#)rpb.s 7.1 (Berkeley) 6/5/86
52: */
53:
54: /*
55: * This has to get loaded first (physical 0) as 780 memory restart rom
56: * only looks for rpb on a 64K page boundary (doc isn't wrong,
57: * it never says what size "page boundary" rpb has to be on).
58: */
59: .globl _rpb
60: _rpb:
61: .space 508
62: erpb:
63: .space 4
64: /*
65: * Copyright (c) 1982, 1986 Regents of the University of California.
66: * All rights reserved. The Berkeley software License Agreement
67: * specifies the terms and conditions for redistribution.
68: *
69: * @(#)scb.s 7.1 (Berkeley) 6/5/86
70: */
71:
72: #include "uba.h"
73:
74: /*
75: * System control block
76: */
77: .set INTSTK,1 # handle this interrupt on the interrupt stack
78: .set HALT,3 # halt if this interrupt occurs
79:
80: _scb: .globl _scb
81:
82: #define STRAY .long _Xstray+INTSTK
83: #define STRAY8 STRAY;STRAY;STRAY;STRAY;STRAY;STRAY;STRAY;STRAY
84: #define STRAY15 STRAY;STRAY;STRAY;STRAY;STRAY;STRAY;STRAY;STRAY8
85: #define KS(a) .long _X/**/a
86: #define IS(a) .long _X/**/a+INTSTK
87: #define STOP(a) .long _X/**/a+HALT
88:
89: /* 000 */ STRAY; IS(machcheck); IS(kspnotval); STOP(powfail);
90: /* 010 */ KS(privinflt); KS(xfcflt); KS(resopflt); KS(resadflt);
91: /* 020 */ KS(protflt); KS(transflt); KS(tracep); KS(bptflt);
92: /* 030 */ KS(compatflt); KS(arithtrap); STRAY; STRAY;
93: /* 040 */ KS(syscall); KS(chme); KS(chms); KS(chmu);
94: /* 050 */ STRAY; IS(cmrd); STRAY; STRAY;
95: /* 060 */ IS(wtime); STRAY; STRAY; STRAY;
96: /* 070 */ STRAY; STRAY; STRAY; STRAY;
97: /* 080 */ STRAY; STRAY; KS(astflt); STRAY;
98: /* 090 */ STRAY; STRAY; STRAY; STRAY;
99: /* 0a0 */ IS(softclock); STRAY; STRAY; STRAY;
100: /* 0b0 */ IS(netintr); STRAY; STRAY; STRAY;
101: /* 0c0 */ IS(hardclock); STRAY; KS(emulate); KS(emulateFPD);
102: /* 0d0 */ STRAY; STRAY; STRAY; STRAY;
103: /* 0e0 */ STRAY; STRAY; STRAY; STRAY;
104: /* 0f0 */ IS(consdin); IS(consdout); IS(cnrint); IS(cnxint);
105: /* 100 */ IS(nexzvec); STRAY15; /* ipl 0x14, nexus 0-15 */
106: /* 140 */ IS(nexzvec); STRAY15; /* ipl 0x15, nexus 0-15 */
107: /* 180 */ IS(nexzvec); STRAY15; /* ipl 0x16, nexus 0-15 */
108: /* 1c0 */ IS(nexzvec); STRAY15; /* ipl 0x17, nexus 0-15 */
109:
110: .globl _UNIvec
111: _UNIvec: .space 512 # 750 unibus intr vector
112: # 1st UBA jump table on 780's
113: #if NUBA > 1
114: .globl _UNI1vec
115: _UNI1vec: .space 512 # 750 second unibus intr vector
116: # 2nd UBA jump table on 780's
117: #endif
118: #define I_CLOCK 0
119: #define I_CNR 4
120: #define I_CNX 8
121: #define I_TUR 12
122: #define I_TUX 16
123: #define I_MBA0 20
124: #define I_MBA1 24
125: #define I_MBA2 28
126: #define I_MBA3 32
127: #define I_UBA0 36
128: #define I_UBA1 40
129: #define I_UBA2 44
130: #define I_UBA3 48
131: /*
132: * Copyright (c) 1980, 1986 Regents of the University of California.
133: * All rights reserved. The Berkeley software License Agreement
134: * specifies the terms and conditions for redistribution.
135: *
136: * @(#)locore.s 7.1 (Berkeley) 6/5/86
137: */
138:
139: #include "psl.h"
140: #include "pte.h"
141:
142: #include "errno.h"
143: #include "cmap.h"
144:
145: #include "mtpr.h"
146: #include "trap.h"
147: #include "cpu.h"
148: #include "nexus.h"
149: #include "cons.h"
150: #include "clock.h"
151: #include "ioa.h"
152: #include "ka630.h"
153: #include "../vaxuba/ubareg.h"
154:
155: #include "dz.h"
156: #include "uu.h"
157: #include "ps.h"
158: #include "mba.h"
159: #include "uba.h"
160:
161: .set HIGH,0x1f # mask for total disable
162: .set MCKVEC,4 # offset into scb of machine check vector
163: .set NBPG,512
164: .set PGSHIFT,9
165:
166: .set NISP,3 # number of interrupt stack pages
167:
168: /*
169: * User structure is UPAGES at top of user space.
170: */
171: .globl _u
172: .set _u,0x80000000 - UPAGES*NBPG
173:
174: .globl _intstack
175: _intstack:
176: .space NISP*NBPG
177: eintstack:
178:
179: /*
180: * Do a dump.
181: * Called by auto-restart.
182: * May be called manually.
183: */
184: .align 2
185: .globl _doadump
186: _doadump:
187: nop; nop # .word 0x0101
188: #define _rpbmap _Sysmap # rpb, scb, UNI*vec, istack*4
189: bicl2 $PG_PROT,_rpbmap
190: bisl2 $PG_KW,_rpbmap
191: mtpr $0,$TBIA
192: tstl _rpb+RP_FLAG # dump only once!
193: bneq 1f
194: incl _rpb+RP_FLAG
195: movl sp,erpb
196: movab erpb,sp
197: mfpr $PCBB,-(sp)
198: mfpr $MAPEN,-(sp)
199: mfpr $IPL,-(sp)
200: mtpr $0,$MAPEN
201: mtpr $HIGH,$IPL
202: pushr $0x3fff
203: calls $0,_dumpsys
204: 1:
205: pushl $TXDB_BOOT
206: calls $1,_tocons
207: halt
208:
209: /*
210: * Interrupt vector routines
211: */
212: .globl _waittime
213:
214: #define SCBVEC(name) .align 2; .globl _X/**/name; _X/**/name
215: #define PANIC(msg) clrl _waittime; pushab 1f; \
216: calls $1,_panic; 1: .asciz msg
217: #define PRINTF(n,msg) pushab 1f; calls $n+1,_printf; MSG(msg)
218: #define MSG(msg) .data; 1: .asciz msg; .text
219: #define PUSHR pushr $0x3f
220: #define POPR popr $0x3f
221:
222: .data
223: nofault: .long 0 # where to go on predicted machcheck
224: .text
225: SCBVEC(machcheck):
226: tstl nofault
227: bneq 1f
228: PUSHR; pushab 6*4(sp); calls $1,_machinecheck; POPR;
229: addl2 (sp)+,sp; rei
230: .align 2
231: 1:
232: casel _cpu,$1,$VAX_MAX
233: 0:
234: .word 8f-0b # 1 is 780
235: .word 5f-0b # 2 is 750
236: .word 5f-0b # 3 is 730
237: .word 7f-0b # 4 is 8600
238: .word 1f-0b # ???
239: .word 1f-0b # ???
240: .word 1f-0b # ???
241: .word 1f-0b # 8 is 630
242: 5:
243: #if defined(VAX750) || defined(VAX730)
244: mtpr $0xf,$MCESR
245: #endif
246: brb 1f
247: 7:
248: #if VAX8600
249: mtpr $0,$EHSR
250: #endif
251: brb 1f
252: 8:
253: #if VAX780
254: mtpr $0,$SBIFS
255: #endif
256: 1:
257: addl2 (sp)+,sp # discard mchchk trash
258: movl nofault,(sp)
259: rei
260: SCBVEC(kspnotval):
261: PUSHR; PANIC("KSP not valid");
262: SCBVEC(powfail):
263: halt
264: SCBVEC(chme): SCBVEC(chms): SCBVEC(chmu):
265: PUSHR; PANIC("CHM? in kernel");
266: SCBVEC(stray):
267: PUSHR; PRINTF(0, "stray scb interrupt\n"); POPR;
268: rei
269: SCBVEC(nexzvec):
270: PUSHR; mfpr $IPL,-(sp); PRINTF(1, "nexus stray intr ipl%x\n"); POPR; rei
271: SCBVEC(cmrd):
272: PUSHR; calls $0,_memerr; POPR; rei
273: SCBVEC(wtime):
274: PUSHR; pushl 6*4(sp); PRINTF(1,"write timeout %x\n"); POPR;
275: PANIC("wtimo");
276:
277: #if NMBA > 0
278: SCBVEC(mba3int):
279: PUSHR; incl _intrcnt+I_MBA3; pushl $3; brb 1f
280: SCBVEC(mba2int):
281: PUSHR; incl _intrcnt+I_MBA2; pushl $2; brb 1f
282: SCBVEC(mba1int):
283: PUSHR; incl _intrcnt+I_MBA1; pushl $1; brb 1f
284: SCBVEC(mba0int):
285: PUSHR; incl _intrcnt+I_MBA0; pushl $0
286: 1: calls $1,_mbintr
287: POPR
288: incl _cnt+V_INTR
289: rei
290: #endif
291:
292: #if defined(VAX780) || defined(VAX8600)
293: /*
294: * Registers for the uba handling code
295: */
296: #define rUBANUM r0
297: #define rUBAHD r1
298: #define rUVEC r3
299: #define rUBA r4
300: /* r2,r5 are scratch */
301:
302: #define I_UBA I_UBA0 /* base of UBA interrupt counters */
303:
304: #if NUBA > 4
305: SCBVEC(ua7int):
306: PUSHR; movl $7,rUBANUM; moval _uba_hd+(7*UH_SIZE),rUBAHD; brb 1f
307: SCBVEC(ua6int):
308: PUSHR; movl $6,rUBANUM; moval _uba_hd+(6*UH_SIZE),rUBAHD; brb 1f
309: SCBVEC(ua5int):
310: PUSHR; movl $5,rUBANUM; moval _uba_hd+(5*UH_SIZE),rUBAHD; brb 1f
311: SCBVEC(ua4int):
312: PUSHR; movl $4,rUBANUM; moval _uba_hd+(4*UH_SIZE),rUBAHD; brb 1f
313: #endif
314: SCBVEC(ua3int):
315: PUSHR; movl $3,rUBANUM; moval _uba_hd+(3*UH_SIZE),rUBAHD; brb 1f
316: SCBVEC(ua2int):
317: PUSHR; movl $2,rUBANUM; moval _uba_hd+(2*UH_SIZE),rUBAHD; brb 1f
318: SCBVEC(ua1int):
319: PUSHR; movl $1,rUBANUM; moval _uba_hd+(1*UH_SIZE),rUBAHD; brb 1f
320: SCBVEC(ua0int):
321: PUSHR; movl $0,rUBANUM; moval _uba_hd+(0*UH_SIZE),rUBAHD;
322: 1:
323: mfpr $IPL,r2 /* r2 = mfpr(IPL); */
324: movl UH_UBA(rUBAHD),rUBA /* uba = uhp->uh_uba; */
325: movl UBA_BRRVR-0x14*4(rUBA)[r2],rUVEC
326: /* uvec = uba->uba_brrvr[r2-0x14] */
327: ubanorm:
328: bleq ubaerror
329: addl2 UH_VEC(rUBAHD),rUVEC /* uvec += uh->uh_vec */
330: bicl3 $3,(rUVEC),r1
331: jmp 2(r1) /* 2 skips ``pushr $0x3f'' */
332: ubaerror:
333: PUSHR; calls $0,_ubaerror; POPR /* ubaerror r/w's r0-r5 */
334: tstl rUVEC; jneq ubanorm /* rUVEC contains result */
335: incl _intrcnt+I_UBA[rUBANUM]
336: incl _cnt+V_INTR
337: POPR
338: rei
339: #endif
340: SCBVEC(cnrint):
341: PUSHR; calls $0,_cnrint; POPR
342: incl _cnt+V_INTR
343: incl _intrcnt+I_CNR
344: rei
345: SCBVEC(cnxint):
346: PUSHR; calls $0,_cnxint; POPR
347: incl _cnt+V_INTR
348: incl _intrcnt+I_CNX
349: rei
350: SCBVEC(hardclock):
351: PUSHR
352: mtpr $ICCS_RUN|ICCS_IE|ICCS_INT|ICCS_ERR,$ICCS
353: #if NPS > 0
354: pushl 4+6*4(sp); pushl 4+6*4(sp);
355: calls $2,_psextsync
356: #endif
357: pushl 4+6*4(sp); pushl 4+6*4(sp);
358: calls $2,_hardclock # hardclock(pc,psl)
359: POPR;
360: incl _cnt+V_INTR
361: incl _intrcnt+I_CLOCK
362: rei
363: SCBVEC(softclock):
364: PUSHR
365: pushl 4+6*4(sp); pushl 4+6*4(sp);
366: calls $2,_softclock # softclock(pc,psl)
367: POPR;
368: incl _cnt+V_SOFT
369: rei
370:
371: #include "../net/netisr.h"
372: .globl _netisr
373: SCBVEC(netintr):
374: PUSHR
375: #include "imp.h"
376: #if NIMP > 0
377: bbcc $NETISR_IMP,_netisr,1f; calls $0,_impintr; 1:
378: #endif
379: #ifdef INET
380: bbcc $NETISR_IP,_netisr,1f; calls $0,_ipintr; 1:
381: #endif
382: #ifdef NS
383: bbcc $NETISR_NS,_netisr,1f; calls $0,_nsintr; 1:
384: #endif
385: bbcc $NETISR_RAW,_netisr,1f; calls $0,_rawintr; 1:
386: POPR
387: incl _cnt+V_SOFT
388: rei
389:
390: #if defined(VAX750) || defined(VAX730) || defined(VAX8600)
391: SCBVEC(consdin):
392: PUSHR;
393: incl _intrcnt+I_TUR
394: casel _cpu,$VAX_750,$VAX_8600
395: 0:
396: .word 5f-0b # 2 is VAX_750
397: .word 3f-0b # 3 is VAX_730
398: .word 6f-0b # 4 is VAX_8600
399: halt
400: 5:
401: #if defined(VAX750) && !defined(MRSP)
402: jsb tudma
403: #endif
404: 3:
405: #if defined(VAX750) || defined(VAX730)
406: calls $0,_turintr
407: brb 2f
408: #else
409: halt
410: #endif
411: 6:
412: #if VAX8600
413: calls $0, _crlintr
414: #else
415: halt
416: #endif
417: 2:
418: POPR;
419: incl _cnt+V_INTR;
420: rei
421: #else
422: SCBVEC(consdin):
423: halt
424: #endif
425:
426: #if defined(VAX750) || defined(VAX730)
427: SCBVEC(consdout):
428: PUSHR; calls $0,_tuxintr; POPR
429: incl _cnt+V_INTR
430: incl _intrcnt+I_TUX
431: rei
432: #else
433: SCBVEC(consdout):
434: halt
435: #endif
436:
437: #if NDZ > 0
438: /*
439: * DZ pseudo dma routine:
440: * r0 - controller number
441: */
442: .align 1
443: .globl dzdma
444: dzdma:
445: mull2 $8*20,r0
446: movab _dzpdma(r0),r3 # pdma structure base
447: # for this controller
448: dzploop:
449: movl r3,r0
450: movl (r0)+,r1 # device register address
451: movzbl 1(r1),r2 # get line number
452: bitb $0x80,r2 # TRDY on?
453: beql dzprei # no
454: bicb2 $0xf8,r2 # clear garbage bits
455: mull2 $20,r2
456: addl2 r2,r0 # point at line's pdma structure
457: movl (r0)+,r2 # p_mem
458: cmpl r2,(r0)+ # p_mem < p_end ?
459: bgequ dzpcall # no, go call dzxint
460: movb (r2)+,6(r1) # dztbuf = *p_mem++
461: movl r2,-8(r0)
462: brb dzploop # check for another line
463: dzprei:
464: POPR
465: incl _cnt+V_PDMA
466: rei
467:
468: dzpcall:
469: pushl r3
470: pushl (r0)+ # push tty address
471: calls $1,*(r0) # call interrupt rtn
472: movl (sp)+,r3
473: brb dzploop # check for another line
474: #endif
475:
476: #if NUU > 0 && defined(UUDMA)
477: /*
478: * Pseudo DMA routine for tu58 (on DL11)
479: * r0 - controller number
480: */
481: .align 1
482: .globl uudma
483: uudma:
484: movl _uudinfo[r0],r2
485: movl 16(r2),r2 # r2 = uuaddr
486: mull3 $48,r0,r3
487: movab _uu_softc(r3),r5 # r5 = uuc
488:
489: cvtwl 2(r2),r1 # c = uuaddr->rdb
490: bbc $15,r1,1f # if (c & UUDB_ERROR)
491: movl $13,16(r5) # uuc->tu_state = TUC_RCVERR;
492: rsb # let uurintr handle it
493: 1:
494: tstl 4(r5) # if (uuc->tu_rcnt) {
495: beql 1f
496: movb r1,*0(r5) # *uuc->tu_rbptr++ = r1
497: incl (r5)
498: decl 4(r5) # if (--uuc->tu_rcnt)
499: beql 2f # done
500: tstl (sp)+
501: POPR # registers saved in ubglue.s
502: rei # }
503: 2:
504: cmpl 16(r5),$8 # if (uuc->tu_state != TUS_GETH)
505: beql 2f # let uurintr handle it
506: 1:
507: rsb
508: 2:
509: mull2 $14,r0 # sizeof(uudata[ctlr]) = 14
510: movab _uudata(r0),r4 # data = &uudata[ctlr];
511: cmpb $1,(r4) # if (data->pk_flag != TUF_DATA)
512: bneq 1b
513: #ifdef notdef
514: /* this is for command packets */
515: beql 1f # r0 = uuc->tu_rbptr
516: movl (r5),r0
517: brb 2f
518: 1: # else
519: #endif
520: movl 24(r5),r0 # r0 = uuc->tu_addr
521: 2:
522: movzbl 1(r4),r3 # counter to r3 (data->pk_count)
523: movzwl (r4),r1 # first word of checksum (=header)
524: mfpr $IPL,-(sp) # s = spl5();
525: mtpr $0x15,$IPL # to keep disk interrupts out
526: clrw (r2) # disable receiver interrupts
527: 3: bbc $7,(r2),3b # while ((uuaddr->rcs & UUCS_READY)==0);
528: cvtwb 2(r2),(r0)+ # *buffer = uuaddr->rdb & 0xff
529: sobgtr r3,1f # continue with next byte ...
530: addw2 2(r2),r1 # unless this was the last (odd count)
531: brb 2f
532:
533: 1: bbc $7,(r2),1b # while ((uuaddr->rcs & UUCS_READY)==0);
534: cvtwb 2(r2),(r0)+ # *buffer = uuaddr->rdb & 0xff
535: addw2 -2(r0),r1 # add to checksum..
536: 2:
537: adwc $0,r1 # get the carry
538: sobgtr r3,3b # loop while r3 > 0
539: /*
540: * We're ready to get the checksum
541: */
542: 1: bbc $7,(r2),1b # while ((uuaddr->rcs & UUCS_READY)==0);
543: cvtwb 2(r2),12(r4) # get first (lower) byte
544: 1: bbc $7,(r2),1b
545: cvtwb 2(r2),13(r4) # ..and second
546: cmpw 12(r4),r1 # is checksum ok?
547: beql 1f
548: movl $14,16(r5) # uuc->tu_state = TUS_CHKERR
549: brb 2f # exit
550: 1:
551: movl $11,16(r5) # uuc->tu_state = TUS_GET (ok)
552: 2:
553: movw $0x40,(r2) # enable receiver interrupts
554: mtpr (sp)+,$IPL # splx(s);
555: rsb # continue processing in uurintr
556: #endif
557:
558: #if defined(VAX750) && !defined(MRSP)
559: /*
560: * Pseudo DMA routine for VAX-11/750 console tu58
561: * (without MRSP)
562: */
563: .align 1
564: .globl tudma
565: tudma:
566: movab _tu,r5 # r5 = tu
567: tstl 4(r5) # if (tu.tu_rcnt) {
568: beql 3f
569: mfpr $CSRD,r1 # get data from tu58
570: movb r1,*0(r5) # *tu.tu_rbptr++ = r1
571: incl (r5)
572: decl 4(r5) # if (--tu.tu_rcnt)
573: beql 1f # done
574: tstl (sp)+
575: POPR # registers saved in ubglue.s
576: rei # data handled, done
577: 1: # }
578: cmpl 16(r5),$8 # if (tu.tu_state != TUS_GETH)
579: beql 2f # let turintr handle it
580: 3:
581: rsb
582: 2:
583: movab _tudata,r4 # r4 = tudata
584: cmpb $1,(r4) # if (tudata.pk_flag != TUF_DATA)
585: bneq 3b # let turintr handle it
586: 1: # else
587: movl 24(r5),r1 # get buffer pointer to r1
588: movzbl 1(r4),r3 # counter to r3
589: movzwl (r4),r0 # first word of checksum (=header)
590: mtpr $0,$CSRS # disable receiver interrupts
591: 3:
592: bsbw 5f # wait for next byte
593: mfpr $CSRD,r5
594: movb r5,(r1)+ # *buffer = rdb
595: sobgtr r3,1f # continue with next byte ...
596: mfpr $CSRD,r2 # unless this was the last (odd count)
597: brb 2f
598:
599: 1: bsbw 5f # wait for next byte
600: mfpr $CSRD,r5
601: movb r5,(r1)+ # *buffer = rdb
602: movzwl -2(r1),r2 # get the last word back from memory
603: 2:
604: addw2 r2,r0 # add to checksum..
605: adwc $0,r0 # get the carry
606: sobgtr r3,3b # loop while r3 > 0
607: /*
608: * We're ready to get the checksum.
609: */
610: bsbw 5f
611: movab _tudata,r4
612: mfpr $CSRD,r5
613: movb r5,12(r4) # get first (lower) byte
614: bsbw 5f
615: mfpr $CSRD,r5
616: movb r5,13(r4) # ..and second
617: movab _tu,r5
618: cmpw 12(r4),r0 # is checksum ok?
619: beql 1f
620: movl $14,16(r5) # tu.tu_state = TUS_CHKERR
621: brb 2f # exit
622: 1:
623: movl $11,16(r5) # tu.tu_state = TUS_GET
624: 2:
625: mtpr $0x40,$CSRS # enable receiver interrupts
626: rsb # continue processing in turintr
627: /*
628: * Loop until a new byte is ready from
629: * the tu58, make sure we don't loop forever
630: */
631: 5:
632: movl $5000,r5 # loop max 5000 times
633: 1:
634: mfpr $CSRS,r2
635: bbs $7,r2,1f
636: sobgtr r5,1b
637: movab _tu,r5
638: movl $13,16(r5) # return TUS_RCVERR
639: tstl (sp)+ # and let turintr handle it
640: 1:
641: rsb
642: #endif
643:
644: /*
645: * Stray UNIBUS interrupt catch routines
646: */
647: .data
648: .align 2
649: #define PJ PUSHR;jsb _Xustray
650: .globl _catcher
651: _catcher:
652: PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ
653: PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ
654: PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ
655: PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ
656: PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ
657: PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ
658: PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ
659: PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ
660:
661: .globl _cold
662: _cold: .long 1
663: .data
664:
665: .text
666: SCBVEC(ustray):
667: blbc _cold,1f
668: mfpr $IPL,r11
669: subl3 $_catcher+8,(sp)+,r10
670: ashl $-1,r10,r10
671: POPR
672: rei
673: 1:
674: subl3 $_catcher+8,(sp)+,r0
675: ashl $-1,r0,-(sp)
676: mfpr $IPL,-(sp)
677: PRINTF(2, "uba?: stray intr ipl %x vec %o\n")
678: POPR
679: rei
680:
681: #ifdef VAX630
682: /*
683: * Emulation OpCode jump table:
684: * ONLY GOES FROM 0xf8 (-8) TO 0x3B (59)
685: */
686: #define EMUTABLE 0x43
687: #define NOEMULATE .long noemulate
688: #define EMULATE(a) .long _EM/**/a
689: .globl _emJUMPtable
690: _emJUMPtable:
691: /* f8 */ EMULATE(ashp); EMULATE(cvtlp); NOEMULATE; NOEMULATE
692: /* fc */ NOEMULATE; NOEMULATE; NOEMULATE; NOEMULATE
693: /* 00 */ NOEMULATE; NOEMULATE; NOEMULATE; NOEMULATE
694: /* 04 */ NOEMULATE; NOEMULATE; NOEMULATE; NOEMULATE
695: /* 08 */ EMULATE(cvtps); EMULATE(cvtsp); NOEMULATE; EMULATE(crc)
696: /* 0c */ NOEMULATE; NOEMULATE; NOEMULATE; NOEMULATE
697: /* 10 */ NOEMULATE; NOEMULATE; NOEMULATE; NOEMULATE
698: /* 14 */ NOEMULATE; NOEMULATE; NOEMULATE; NOEMULATE
699: /* 18 */ NOEMULATE; NOEMULATE; NOEMULATE; NOEMULATE
700: /* 1c */ NOEMULATE; NOEMULATE; NOEMULATE; NOEMULATE
701: /* 20 */ EMULATE(addp4); EMULATE(addp6); EMULATE(subp4); EMULATE(subp6)
702: /* 24 */ EMULATE(cvtpt); EMULATE(mulp); EMULATE(cvttp); EMULATE(divp)
703: /* 28 */ NOEMULATE; EMULATE(cmpc3); EMULATE(scanc); EMULATE(spanc)
704: /* 2c */ NOEMULATE; EMULATE(cmpc5); EMULATE(movtc); EMULATE(movtuc)
705: /* 30 */ NOEMULATE; NOEMULATE; NOEMULATE; NOEMULATE
706: /* 34 */ EMULATE(movp); EMULATE(cmpp3); EMULATE(cvtpl); EMULATE(cmpp4)
707: /* 38 */ EMULATE(editpc); EMULATE(matchc); EMULATE(locc); EMULATE(skpc)
708: #endif
709:
710: /*
711: * Trap and fault vector routines
712: */
713: #define TRAP(a) pushl $T_/**/a; jbr alltraps
714:
715: /*
716: * Ast delivery (profiling and/or reschedule)
717: */
718: SCBVEC(astflt):
719: pushl $0; TRAP(ASTFLT)
720: SCBVEC(privinflt):
721: pushl $0; TRAP(PRIVINFLT)
722: SCBVEC(xfcflt):
723: pushl $0; TRAP(XFCFLT)
724: SCBVEC(resopflt):
725: pushl $0; TRAP(RESOPFLT)
726: SCBVEC(resadflt):
727: pushl $0; TRAP(RESADFLT)
728: SCBVEC(bptflt):
729: pushl $0; TRAP(BPTFLT)
730: SCBVEC(compatflt):
731: TRAP(COMPATFLT);
732: SCBVEC(tracep):
733: pushl $0; TRAP(TRCTRAP)
734: SCBVEC(arithtrap):
735: TRAP(ARITHTRAP)
736: SCBVEC(protflt):
737: blbs (sp)+,segflt
738: TRAP(PROTFLT)
739: segflt:
740: TRAP(SEGFLT)
741:
742: /*
743: * The following is called with the stack set up as follows:
744: *
745: * (sp): Opcode
746: * 4(sp): Instruction PC
747: * 8(sp): Operand 1
748: * 12(sp): Operand 2
749: * 16(sp): Operand 3
750: * 20(sp): Operand 4
751: * 24(sp): Operand 5
752: * 28(sp): Operand 6
753: * 32(sp): Operand 7 (unused)
754: * 36(sp): Operand 8 (unused)
755: * 40(sp): Return PC
756: * 44(sp): Return PSL
757: * 48(sp): TOS before instruction
758: *
759: * Each individual routine is called with the stack set up as follows:
760: *
761: * (sp): Return address of trap handler
762: * 4(sp): Opcode (will get return PSL)
763: * 8(sp): Instruction PC
764: * 12(sp): Operand 1
765: * 16(sp): Operand 2
766: * 20(sp): Operand 3
767: * 24(sp): Operand 4
768: * 28(sp): Operand 5
769: * 32(sp): Operand 6
770: * 36(sp): saved register 11
771: * 40(sp): saved register 10
772: * 44(sp): Return PC
773: * 48(sp): Return PSL
774: * 52(sp): TOS before instruction
775: */
776:
777: SCBVEC(emulate):
778: #ifdef VAX630
779: movl r11,32(sp) # save register r11 in unused operand
780: movl r10,36(sp) # save register r10 in unused operand
781: cvtbl (sp),r10 # get opcode
782: addl2 $8,r10 # shift negative opcodes
783: subl3 r10,$EMUTABLE,r11 # forget it if opcode is out of range
784: bcs noemulate
785: movl _emJUMPtable[r10],r10 # call appropriate emulation routine
786: jsb (r10) # routines put return values into regs 0-5
787: movl 32(sp),r11 # restore register r11
788: movl 36(sp),r10 # restore register r10
789: insv (sp),$0,$4,44(sp) # and condition codes in Opcode spot
790: addl2 $40,sp # adjust stack for return
791: rei
792: noemulate:
793: addl2 $48,sp # adjust stack for
794: #endif VAX630
795: .word 0xffff # "reserved instruction fault"
796: SCBVEC(emulateFPD):
797: .word 0xffff # "reserved instruction fault"
798: SCBVEC(transflt):
799: bitl $2,(sp)+
800: bnequ tableflt
801: jsb Fastreclaim # try and avoid pagein
802: TRAP(PAGEFLT)
803: tableflt:
804: TRAP(TABLEFLT)
805:
806: alltraps:
807: mfpr $USP,-(sp); calls $0,_trap; mtpr (sp)+,$USP
808: incl _cnt+V_TRAP
809: addl2 $8,sp # pop type, code
810: mtpr $HIGH,$IPL ## dont go to a higher IPL (GROT)
811: rei
812:
813: SCBVEC(syscall):
814: pushl $T_SYSCALL
815: mfpr $USP,-(sp); calls $0,_syscall; mtpr (sp)+,$USP
816: incl _cnt+V_SYSCALL
817: addl2 $8,sp # pop type, code
818: mtpr $HIGH,$IPL ## dont go to a higher IPL (GROT)
819: rei
820:
821: /*
822: * System page table
823: * Mbmap and Usrptmap are enlarged by CLSIZE entries
824: * as they are managed by resource maps starting with index 1 or CLSIZE.
825: */
826: #define vaddr(x) ((((x)-_Sysmap)/4)*NBPG+0x80000000)
827: #define SYSMAP(mname, vname, npte) \
828: _/**/mname: .globl _/**/mname; \
829: .space (npte)*4; \
830: .globl _/**/vname; \
831: .set _/**/vname,vaddr(_/**/mname)
832:
833: .data
834: .align 2
835: SYSMAP(Sysmap ,Sysbase ,SYSPTSIZE )
836: SYSMAP(Forkmap ,forkutl ,UPAGES )
837: SYSMAP(Xswapmap ,xswaputl ,UPAGES )
838: SYSMAP(Xswap2map,xswap2utl ,UPAGES )
839: SYSMAP(Swapmap ,swaputl ,UPAGES )
840: SYSMAP(Pushmap ,pushutl ,UPAGES )
841: SYSMAP(Vfmap ,vfutl ,UPAGES )
842: SYSMAP(CMAP1 ,CADDR1 ,1 )
843: SYSMAP(CMAP2 ,CADDR2 ,1 )
844: SYSMAP(mmap ,vmmap ,1 )
845: SYSMAP(alignmap ,alignutl ,1 ) /* XXX */
846: SYSMAP(msgbufmap,msgbuf ,MSGBUFPTECNT )
847: SYSMAP(Mbmap ,mbutl ,NMBCLUSTERS*CLSIZE+CLSIZE )
848: SYSMAP(camap ,cabase ,16*CLSIZE )
849: #ifdef GPROF
850: SYSMAP(profmap ,profbase ,600*CLSIZE )
851: #endif
852: SYSMAP(ecamap ,calimit ,0 )
853:
854: SYSMAP(UMBAbeg ,umbabeg ,0 )
855: SYSMAP(Nexmap ,nexus ,16*MAXNNEXUS )
856: SYSMAP(UMEMmap ,umem ,UBAPAGES*NUBA )
857: SYSMAP(Ioamap ,ioa ,MAXNIOA*IOAMAPSIZ/NBPG )
858: SYSMAP(UMBAend ,umbaend ,0 )
859: #if VAX630
860: SYSMAP(Clockmap ,cldevice ,1 )
861: SYSMAP(Ka630map ,ka630cpu ,1 )
862: #endif
863:
864: SYSMAP(Usrptmap ,usrpt ,USRPTSIZE+CLSIZE )
865:
866: eSysmap:
867: .globl _Syssize
868: .set _Syssize,(eSysmap-_Sysmap)/4
869: .text
870:
871: /*
872: * Initialization
873: *
874: * ipl 0x1f; mapen 0; scbb, pcbb, sbr, slr, isp, ksp not set
875: */
876: .data
877: .globl _cpu
878: _cpu: .long 0
879: .text
880: .globl start
881: start:
882: .word 0
883: mtpr $0,$ICCS
884: /* set system control block base and system page table params */
885: mtpr $_scb-0x80000000,$SCBB
886: mtpr $_Sysmap-0x80000000,$SBR
887: mtpr $_Syssize,$SLR
888: /* double map the kernel into the virtual user addresses of phys mem */
889: mtpr $_Sysmap,$P0BR
890: mtpr $_Syssize,$P0LR
891: /* set ISP and get cpu type */
892: movl $_intstack+NISP*NBPG,sp
893: mfpr $SID,r0
894: movab _cpu,r1
895: extzv $24,$8,r0,(r1)
896: /* init RPB */
897: movab _rpb,r0
898: movl r0,(r0)+ # rp_selfref
899: movab _doadump,r1
900: movl r1,(r0)+ # rp_dumprout
901: movl $0x1f,r2
902: clrl r3
903: 1: addl2 (r1)+,r3; sobgtr r2,1b
904: movl r3,(r0)+ # rp_chksum
905: /* count up memory */
906: clrl r7
907: 1: pushl $4; pushl r7; calls $2,_badaddr; tstl r0; bneq 9f
908: acbl $MAXMEM*1024-1,$64*1024,r7,1b
909: 9:
910: #ifdef VAX630
911: /* leave an area for uVAX II console scratch pad at the top */
912: cmpb _cpu,$VAX_630
913: bneq 1f
914: subl2 $4096,r7
915: 1:
916: #endif
917: /* clear memory from kernel bss and pages for proc 0 u. and page table */
918: movab _edata,r6
919: movab _end,r5
920: bbcc $31,r5,0f; 0:
921: addl2 $(UPAGES*NBPG)+NBPG+NBPG,r5
922: 1: clrq (r6); acbl r5,$8,r6,1b
923: /* trap() and syscall() save r0-r11 in the entry mask (per ../h/reg.h) */
924: /* panic() is convenient place to save all for debugging */
925: bisw2 $0x0fff,_trap
926: bisw2 $0x0fff,_syscall
927: bisw2 $0x0fff,_panic
928: calls $0,_fixctlrmask
929: /* initialize system page table: uba vectors and int stack writeable */
930: clrl r2
931: movab eintstack,r1; bbcc $31,r1,0f; 0: ashl $-PGSHIFT,r1,r1
932: 1: bisl3 $PG_V|PG_KW,r2,_Sysmap[r2]; aoblss r1,r2,1b
933: /* make rpb, scb read-only as red zone for interrupt stack */
934: bicl2 $PG_PROT,_rpbmap
935: bisl2 $PG_KR,_rpbmap
936: /* make kernel text space read-only */
937: movab _etext+NBPG-1,r1; bbcc $31,r1,0f; 0: ashl $-PGSHIFT,r1,r1
938: 1: bisl3 $PG_V|PG_URKR,r2,_Sysmap[r2]; aoblss r1,r2,1b
939: /* make kernel data, bss, read-write */
940: movab _end+NBPG-1,r1; bbcc $31,r1,0f; 0:; ashl $-PGSHIFT,r1,r1
941: 1: bisl3 $PG_V|PG_KW,r2,_Sysmap[r2]; aoblss r1,r2,1b
942: /* now go to mapped mode */
943: mtpr $0,$TBIA; mtpr $1,$MAPEN; jmp *$0f; 0:
944: /* init mem sizes */
945: ashl $-PGSHIFT,r7,_maxmem
946: movl _maxmem,_physmem
947: movl _maxmem,_freemem
948: /* setup context for proc[0] == Scheduler */
949: movab _end+NBPG-1,r6
950: bicl2 $NBPG-1,r6 # make page boundary
951: /* setup page table for proc[0] */
952: bbcc $31,r6,0f; 0:
953: ashl $-PGSHIFT,r6,r3 # r3 = btoc(r6)
954: bisl3 $PG_V|PG_KW,r3,_Usrptmap # init first upt entry
955: incl r3
956: movab _usrpt,r0
957: mtpr r0,$TBIS
958: /* init p0br, p0lr */
959: mtpr r0,$P0BR
960: mtpr $0,$P0LR
961: /* init p1br, p1lr */
962: movab NBPG(r0),r0
963: movl $0x200000-UPAGES,r1
964: mtpr r1,$P1LR
965: mnegl r1,r1
966: moval -4*UPAGES(r0)[r1],r2
967: mtpr r2,$P1BR
968: /* setup mapping for UPAGES of _u */
969: movl $UPAGES,r2; movab _u+NBPG*UPAGES,r1; addl2 $UPAGES,r3; jbr 2f
970: 1: decl r3
971: moval -NBPG(r1),r1;
972: bisl3 $PG_V|PG_URKW,r3,-(r0)
973: mtpr r1,$TBIS
974: 2: sobgeq r2,1b
975: /* initialize (slightly) the pcb */
976: movab UPAGES*NBPG(r1),PCB_KSP(r1)
977: mnegl $1,PCB_ESP(r1)
978: mnegl $1,PCB_SSP(r1)
979: movl r1,PCB_USP(r1)
980: mfpr $P0BR,PCB_P0BR(r1)
981: mfpr $P0LR,PCB_P0LR(r1)
982: movb $4,PCB_P0LR+3(r1) # disable ast
983: mfpr $P1BR,PCB_P1BR(r1)
984: mfpr $P1LR,PCB_P1LR(r1)
985: movl $CLSIZE,PCB_SZPT(r1) # init u.u_pcb.pcb_szpt
986: movl r10,PCB_R10(r1)
987: movl r11,PCB_R11(r1)
988: movab 1f,PCB_PC(r1) # initial pc
989: clrl PCB_PSL(r1) # mode(k,k), ipl=0
990: ashl $PGSHIFT,r3,r3
991: mtpr r3,$PCBB # first pcbb
992: /* set regs, p0br, p0lr, p1br, p1lr, astlvl, ksp and change to kernel mode */
993: ldpctx
994: rei
995: /* put signal trampoline code in u. area */
996: 1: movab _u,r0
997: movc3 $19,sigcode,PCB_SIGC(r0)
998: /* save boot device in global _bootdev */
999: movl r10,_bootdev
1000: /* save reboot flags in global _boothowto */
1001: movl r11,_boothowto
1002: /* calculate firstaddr, and call main() */
1003: movab _end+NBPG-1,r0; bbcc $31,r0,0f; 0:; ashl $-PGSHIFT,r0,-(sp)
1004: addl2 $UPAGES+1,(sp); calls $1,_main
1005: /* proc[1] == /etc/init now running here; run icode */
1006: pushl $PSL_CURMOD|PSL_PRVMOD; pushl $0; rei
1007:
1008: /* signal trampoline code: it is known that this code takes exactly 19 bytes */
1009: /* in ../vax/pcb.h and in the movc3 above */
1010: sigcode:
1011: calls $4,8(pc) # params pushed by sendsig
1012: movl sp,ap # calls frame built by sendsig
1013: chmk $103 # cleanup mask and onsigstack
1014: halt # sigreturn() does not return!
1015: .word 0x3f # registers 0-5
1016: callg (ap),*16(ap) # call the signal handler
1017: ret # return to code above
1018:
1019: .set exec,11
1020: .set exit,1
1021: .globl _icode
1022: .globl _initflags
1023: .globl _szicode
1024: /*
1025: * Icode is copied out to process 1 to exec /etc/init.
1026: * If the exec fails, process 1 exits.
1027: */
1028: _icode:
1029: pushab b`argv-l0(pc)
1030: l0: pushab b`init-l1(pc)
1031: l1: pushl $2
1032: movl sp,ap
1033: chmk $exec
1034: chmk $exit
1035:
1036: init: .asciz "/etc/init"
1037: .align 2
1038: _initflags:
1039: .long 0
1040: argv: .long init+5-_icode
1041: .long _initflags-_icode
1042: .long 0
1043: _szicode:
1044: .long _szicode-_icode
1045:
1046: /*
1047: * Primitives
1048: */
1049:
1050: #ifdef GPROF
1051: #define ENTRY(name, regs) \
1052: .globl _/**/name; .align 1; _/**/name: .word regs; jsb mcount
1053: #define JSBENTRY(name, regs) \
1054: .globl _/**/name; _/**/name: \
1055: movl fp,-(sp); movab -12(sp),fp; pushr $(regs); jsb mcount; \
1056: popr $(regs); movl (sp)+,fp
1057: #else
1058: #define ENTRY(name, regs) \
1059: .globl _/**/name; .align 1; _/**/name: .word regs
1060: #define JSBENTRY(name, regs) \
1061: .globl _/**/name; _/**/name:
1062: #endif GPROF
1063: #define R0 0x01
1064: #define R1 0x02
1065: #define R2 0x04
1066: #define R3 0x08
1067: #define R4 0x10
1068: #define R5 0x20
1069: #define R6 0x40
1070:
1071: /*
1072: * badaddr(addr, len)
1073: * see if access addr with a len type instruction causes a machine check
1074: * len is length of access (1=byte, 2=short, 4=long)
1075: */
1076: .globl _badaddr
1077: _badaddr:
1078: .word 0
1079: movl $1,r0
1080: mfpr $IPL,r1
1081: mtpr $HIGH,$IPL
1082: movl 4(ap),r3
1083: movl 8(ap),r4
1084: movab 2f,nofault # jump to 2f on machcheck
1085: bbc $0,r4,1f; tstb (r3)
1086: 1: bbc $1,r4,1f; tstw (r3)
1087: 1: bbc $2,r4,1f; tstl (r3)
1088: 1: clrl r0 # made it w/o machine checks
1089: 2: clrl nofault
1090: mtpr r1,$IPL
1091: ret
1092:
1093: /*
1094: * update profiling information for the user
1095: * addupc(pc, &u.u_prof, ticks)
1096: */
1097: ENTRY(addupc, 0)
1098: movl 8(ap),r2 # &u.u_prof
1099: subl3 8(r2),4(ap),r0 # corrected pc
1100: blss 9f
1101: extzv $1,$31,r0,r0 # logical right shift
1102: extzv $1,$31,12(r2),r1 # ditto for scale
1103: emul r1,r0,$0,r0
1104: ashq $-14,r0,r0
1105: tstl r1
1106: bneq 9f
1107: bicl2 $1,r0
1108: cmpl r0,4(r2) # length
1109: bgequ 9f
1110: addl2 (r2),r0 # base
1111: probew $3,$2,(r0)
1112: beql 8f
1113: addw2 12(ap),(r0)
1114: 9:
1115: ret
1116: 8:
1117: clrl 12(r2)
1118: ret
1119:
1120: /*
1121: * Copy a null terminated string from the user address space into
1122: * the kernel address space.
1123: *
1124: * copyinstr(fromaddr, toaddr, maxlength, &lencopied)
1125: */
1126: ENTRY(copyinstr, R6)
1127: movl 12(ap),r6 # r6 = max length
1128: jlss 8f
1129: movl 4(ap),r1 # r1 = user address
1130: bicl3 $~(NBPG*CLSIZE-1),r1,r2 # r2 = bytes on first page
1131: subl3 r2,$NBPG*CLSIZE,r2
1132: movl 8(ap),r3 # r3 = kernel address
1133: 1:
1134: cmpl r6,r2 # r2 = min(bytes on page, length left);
1135: jgeq 2f
1136: movl r6,r2
1137: 2:
1138: prober $3,r2,(r1) # bytes accessible?
1139: jeql 8f
1140: subl2 r2,r6 # update bytes left count
1141: #ifdef NOSUBSINST
1142: # fake the locc instr. for processors that don't have it
1143: movl r2,r0
1144: 6:
1145: tstb (r1)+
1146: jeql 5f
1147: sobgtr r0,6b
1148: jbr 7f
1149: 5:
1150: decl r1
1151: jbr 3f
1152: 7:
1153: #else
1154: locc $0,r2,(r1) # null byte found?
1155: jneq 3f
1156: #endif
1157: subl2 r2,r1 # back up pointer updated by `locc'
1158: movc3 r2,(r1),(r3) # copy in next piece
1159: movl $(NBPG*CLSIZE),r2 # check next page
1160: tstl r6 # run out of space?
1161: jneq 1b
1162: movl $ENOENT,r0 # set error code and return
1163: jbr 9f
1164: 3:
1165: tstl 16(ap) # return length?
1166: beql 4f
1167: subl3 r6,12(ap),r6 # actual len = maxlen - unused pages
1168: subl2 r0,r6 # - unused on this page
1169: addl3 $1,r6,*16(ap) # + the null byte
1170: 4:
1171: subl2 r0,r2 # r2 = number of bytes to move
1172: subl2 r2,r1 # back up pointer updated by `locc'
1173: incl r2 # copy null byte as well
1174: movc3 r2,(r1),(r3) # copy in last piece
1175: clrl r0 # redundant
1176: ret
1177: 8:
1178: movl $EFAULT,r0
1179: 9:
1180: tstl 16(ap)
1181: beql 1f
1182: subl3 r6,12(ap),*16(ap)
1183: 1:
1184: ret
1185:
1186: /*
1187: * Copy a null terminated string from the kernel
1188: * address space to the user address space.
1189: *
1190: * copyoutstr(fromaddr, toaddr, maxlength, &lencopied)
1191: */
1192: ENTRY(copyoutstr, R6)
1193: movl 12(ap),r6 # r6 = max length
1194: jlss 8b
1195: movl 4(ap),r1 # r1 = kernel address
1196: movl 8(ap),r3 # r3 = user address
1197: bicl3 $~(NBPG*CLSIZE-1),r3,r2 # r2 = bytes on first page
1198: subl3 r2,$NBPG*CLSIZE,r2
1199: 1:
1200: cmpl r6,r2 # r2 = min(bytes on page, length left);
1201: jgeq 2f
1202: movl r6,r2
1203: 2:
1204: probew $3,r2,(r3) # bytes accessible?
1205: jeql 8b
1206: subl2 r2,r6 # update bytes left count
1207: #ifdef NOSUBSINST
1208: # fake the locc instr. for processors that don't have it
1209: movl r2,r0
1210: 6:
1211: tstb (r1)+
1212: jeql 5f
1213: sobgtr r0,6b
1214: jbr 7f
1215: 5:
1216: decl r1
1217: jbr 3b
1218: 7:
1219: #else
1220: locc $0,r2,(r1) # null byte found?
1221: jneq 3b
1222: #endif
1223: subl2 r2,r1 # back up pointer updated by `locc'
1224: movc3 r2,(r1),(r3) # copy in next piece
1225: movl $(NBPG*CLSIZE),r2 # check next page
1226: tstl r6 # run out of space?
1227: jneq 1b
1228: movl $ENOENT,r0 # set error code and return
1229: jbr 9b
1230:
1231: /*
1232: * Copy a null terminated string from one point to another in
1233: * the kernel address space.
1234: *
1235: * copystr(fromaddr, toaddr, maxlength, &lencopied)
1236: */
1237: ENTRY(copystr, R6)
1238: movl 12(ap),r6 # r6 = max length
1239: jlss 8b
1240: movl 4(ap),r1 # r1 = src address
1241: movl 8(ap),r3 # r3 = dest address
1242: 1:
1243: movzwl $65535,r2 # r2 = bytes in first chunk
1244: cmpl r6,r2 # r2 = min(bytes in chunk, length left);
1245: jgeq 2f
1246: movl r6,r2
1247: 2:
1248: subl2 r2,r6 # update bytes left count
1249: #ifdef NOSUBSINST
1250: # fake the locc instr. for processors that don't have it
1251: movl r2,r0
1252: 6:
1253: tstb (r1)+
1254: jeql 5f
1255: sobgtr r0,6b
1256: jbr 7f
1257: 5:
1258: decl r1
1259: jbr 3b
1260: 7:
1261: #else
1262: locc $0,r2,(r1) # null byte found?
1263: jneq 3b
1264: #endif
1265: subl2 r2,r1 # back up pointer updated by `locc'
1266: movc3 r2,(r1),(r3) # copy in next piece
1267: tstl r6 # run out of space?
1268: jneq 1b
1269: movl $ENOENT,r0 # set error code and return
1270: jbr 9b
1271:
1272: /*
1273: * Copy specified amount of data from user space into the kernel
1274: * Copyin(from, to, len)
1275: * r1 == from (user source address)
1276: * r3 == to (kernel destination address)
1277: * r5 == length
1278: */
1279: .align 1
1280: JSBENTRY(Copyin, R1|R3|R5)
1281: cmpl r5,$(NBPG*CLSIZE) # probing one page or less ?
1282: bgtru 1f # no
1283: prober $3,r5,(r1) # bytes accessible ?
1284: beql ersb # no
1285: movc3 r5,(r1),(r3)
1286: /* clrl r0 # redundant */
1287: rsb
1288: 1:
1289: blss ersb # negative length?
1290: pushl r6 # r6 = length
1291: movl r5,r6
1292: bicl3 $~(NBPG*CLSIZE-1),r1,r0 # r0 = bytes on first page
1293: subl3 r0,$(NBPG*CLSIZE),r0
1294: addl2 $(NBPG*CLSIZE),r0 # plus one additional full page
1295: jbr 2f
1296:
1297: ciloop:
1298: movc3 r0,(r1),(r3)
1299: movl $(2*NBPG*CLSIZE),r0 # next amount to move
1300: 2:
1301: cmpl r0,r6
1302: bleq 3f
1303: movl r6,r0
1304: 3:
1305: prober $3,r0,(r1) # bytes accessible ?
1306: beql ersb1 # no
1307: subl2 r0,r6 # last move?
1308: bneq ciloop # no
1309:
1310: movc3 r0,(r1),(r3)
1311: /* clrl r0 # redundant */
1312: movl (sp)+,r6 # restore r6
1313: rsb
1314:
1315: ersb1:
1316: movl (sp)+,r6 # restore r6
1317: ersb:
1318: movl $EFAULT,r0
1319: rsb
1320:
1321: /*
1322: * Copy specified amount of data from kernel to the user space
1323: * Copyout(from, to, len)
1324: * r1 == from (kernel source address)
1325: * r3 == to (user destination address)
1326: * r5 == length
1327: */
1328: .align 1
1329: JSBENTRY(Copyout, R1|R3|R5)
1330: cmpl r5,$(NBPG*CLSIZE) # moving one page or less ?
1331: bgtru 1f # no
1332: probew $3,r5,(r3) # bytes writeable?
1333: beql ersb # no
1334: movc3 r5,(r1),(r3)
1335: /* clrl r0 # redundant */
1336: rsb
1337: 1:
1338: blss ersb # negative length?
1339: pushl r6 # r6 = length
1340: movl r5,r6
1341: bicl3 $~(NBPG*CLSIZE-1),r3,r0 # r0 = bytes on first page
1342: subl3 r0,$(NBPG*CLSIZE),r0
1343: addl2 $(NBPG*CLSIZE),r0 # plus one additional full page
1344: jbr 2f
1345:
1346: coloop:
1347: movc3 r0,(r1),(r3)
1348: movl $(2*NBPG*CLSIZE),r0 # next amount to move
1349: 2:
1350: cmpl r0,r6
1351: bleq 3f
1352: movl r6,r0
1353: 3:
1354: probew $3,r0,(r3) # bytes writeable?
1355: beql ersb1 # no
1356: subl2 r0,r6 # last move?
1357: bneq coloop # no
1358:
1359: movc3 r0,(r1),(r3)
1360: /* clrl r0 # redundant */
1361: movl (sp)+,r6 # restore r6
1362: rsb
1363:
1364: /*
1365: * non-local goto's
1366: */
1367: #ifdef notdef /* this is now expanded completely inline */
1368: .align 1
1369: JSBENTRY(Setjmp, R0)
1370: movl fp,(r0)+ # current stack frame
1371: movl (sp),(r0) # resuming pc
1372: clrl r0
1373: rsb
1374: #endif
1375:
1376: #define PCLOC 16 /* location of pc in calls frame */
1377: #define APLOC 8 /* location of ap,fp in calls frame */
1378: .align 1
1379: JSBENTRY(Longjmp, R0)
1380: movl (r0)+,newfp # must save parameters in memory as all
1381: movl (r0),newpc # registers may be clobbered.
1382: 1:
1383: cmpl fp,newfp # are we there yet?
1384: bgequ 2f # yes
1385: moval 1b,PCLOC(fp) # redirect return pc to us!
1386: ret # pop next frame
1387: 2:
1388: beql 3f # did we miss our frame?
1389: pushab 4f # yep ?!?
1390: calls $1,_panic
1391: 3:
1392: movl newpc,r0 # all done, just return to the `setjmp'
1393: jmp (r0) # ``rsb''
1394:
1395: .data
1396: newpc: .space 4
1397: newfp: .space 4
1398: 4: .asciz "longjmp"
1399: .text
1400: /*
1401: * setjmp that saves all registers as the call frame may not
1402: * be available to recover them in the usual mannor by longjmp.
1403: * Called before swapping out the u. area, restored by resume()
1404: * below.
1405: */
1406: ENTRY(savectx, 0)
1407: movl 4(ap),r0
1408: movq r6,(r0)+
1409: movq r8,(r0)+
1410: movq r10,(r0)+
1411: movq APLOC(fp),(r0)+ # save ap, fp
1412: addl3 $8,ap,(r0)+ # save sp
1413: movl PCLOC(fp),(r0) # save pc
1414: clrl r0
1415: ret
1416:
1417: .globl _whichqs
1418: .globl _qs
1419: .globl _cnt
1420:
1421: .globl _noproc
1422: .comm _noproc,4
1423: .globl _runrun
1424: .comm _runrun,4
1425:
1426: /*
1427: * The following primitives use the fancy VAX instructions
1428: * much like VMS does. _whichqs tells which of the 32 queues _qs
1429: * have processes in them. Setrq puts processes into queues, Remrq
1430: * removes them from queues. The running process is on no queue,
1431: * other processes are on a queue related to p->p_pri, divided by 4
1432: * actually to shrink the 0-127 range of priorities into the 32 available
1433: * queues.
1434: */
1435:
1436: /*
1437: * Setrq(p), using fancy VAX instructions.
1438: *
1439: * Call should be made at splclock(), and p->p_stat should be SRUN
1440: */
1441: .align 1
1442: JSBENTRY(Setrq, R0)
1443: tstl P_RLINK(r0) ## firewall: p->p_rlink must be 0
1444: beql set1 ##
1445: pushab set3 ##
1446: calls $1,_panic ##
1447: set1:
1448: movzbl P_PRI(r0),r1 # put on queue which is p->p_pri / 4
1449: ashl $-2,r1,r1
1450: movaq _qs[r1],r2
1451: insque (r0),*4(r2) # at end of queue
1452: bbss r1,_whichqs,set2 # mark queue non-empty
1453: set2:
1454: rsb
1455:
1456: set3: .asciz "setrq"
1457:
1458: /*
1459: * Remrq(p), using fancy VAX instructions
1460: *
1461: * Call should be made at splclock().
1462: */
1463: .align 1
1464: JSBENTRY(Remrq, R0)
1465: movzbl P_PRI(r0),r1
1466: ashl $-2,r1,r1
1467: bbsc r1,_whichqs,rem1
1468: pushab rem3 # it wasn't recorded to be on its q
1469: calls $1,_panic
1470: rem1:
1471: remque (r0),r2
1472: beql rem2
1473: bbss r1,_whichqs,rem2
1474: rem2:
1475: clrl P_RLINK(r0) ## for firewall checking
1476: rsb
1477:
1478: rem3: .asciz "remrq"
1479:
1480: /*
1481: * Masterpaddr is the p->p_addr of the running process on the master
1482: * processor. When a multiprocessor system, the slave processors will have
1483: * an array of slavepaddr's.
1484: */
1485: .globl _masterpaddr
1486: .data
1487: _masterpaddr:
1488: .long 0
1489:
1490: .set ASTLVL_NONE,4
1491: .text
1492: sw0: .asciz "swtch"
1493:
1494: /*
1495: * When no processes are on the runq, Swtch branches to idle
1496: * to wait for something to come ready.
1497: */
1498: .globl Idle
1499: Idle: idle:
1500: mtpr $0,$IPL # must allow interrupts here
1501: tstl _whichqs # look for non-empty queue
1502: bneq sw1
1503: brb idle
1504:
1505: badsw: pushab sw0
1506: calls $1,_panic
1507: /*NOTREACHED*/
1508:
1509: /*
1510: * Swtch(), using fancy VAX instructions
1511: */
1512: .align 1
1513: JSBENTRY(Swtch, 0)
1514: movl $1,_noproc
1515: incl _cnt+V_SWTCH
1516: sw1: ffs $0,$32,_whichqs,r0 # look for non-empty queue
1517: beql idle # if none, idle
1518: mtpr $0x18,$IPL # lock out all so _whichqs==_qs
1519: bbcc r0,_whichqs,sw1 # proc moved via lbolt interrupt
1520: movaq _qs[r0],r1
1521: remque *(r1),r2 # r2 = p = highest pri process
1522: bvs badsw # make sure something was there
1523: sw2: beql sw3
1524: insv $1,r0,$1,_whichqs # still more procs in this queue
1525: sw3:
1526: clrl _noproc
1527: clrl _runrun
1528: tstl P_WCHAN(r2) ## firewalls
1529: bneq badsw ##
1530: cmpb P_STAT(r2),$SRUN ##
1531: bneq badsw ##
1532: clrl P_RLINK(r2) ##
1533: movl *P_ADDR(r2),r0
1534: #ifdef notdef
1535: cmpl r0,_masterpaddr # resume of current proc is easy
1536: beql res0
1537: #endif
1538: movl r0,_masterpaddr
1539: ashl $PGSHIFT,r0,r0 # r0 = pcbb(p)
1540: /* fall into... */
1541:
1542: /*
1543: * Resume(pf)
1544: */
1545: JSBENTRY(Resume, R0)
1546: mtpr $HIGH,$IPL # no interrupts, please
1547: movl _CMAP2,_u+PCB_CMAP2 # yech
1548: svpctx
1549: mtpr r0,$PCBB
1550: ldpctx
1551: movl _u+PCB_CMAP2,_CMAP2 # yech
1552: mtpr $_CADDR2,$TBIS
1553: res0:
1554: tstl _u+PCB_SSWAP
1555: bneq res1
1556: rei
1557: res1:
1558: movl _u+PCB_SSWAP,r0 # longjmp to saved context
1559: clrl _u+PCB_SSWAP
1560: movq (r0)+,r6
1561: movq (r0)+,r8
1562: movq (r0)+,r10
1563: movq (r0)+,r12
1564: movl (r0)+,r1
1565: cmpl r1,sp # must be a pop
1566: bgequ 1f
1567: pushab 2f
1568: calls $1,_panic
1569: /* NOTREACHED */
1570: 1:
1571: movl r1,sp
1572: movl (r0),(sp) # address to return to
1573: movl $PSL_PRVMOD,4(sp) # ``cheating'' (jfr)
1574: rei
1575:
1576: 2: .asciz "ldctx"
1577:
1578: /*
1579: * {fu,su},{byte,word}, all massaged by asm.sed to jsb's
1580: */
1581: .align 1
1582: JSBENTRY(Fuword, R0)
1583: prober $3,$4,(r0)
1584: beql fserr
1585: movl (r0),r0
1586: rsb
1587: fserr:
1588: mnegl $1,r0
1589: rsb
1590:
1591: .align 1
1592: JSBENTRY(Fubyte, R0)
1593: prober $3,$1,(r0)
1594: beql fserr
1595: movzbl (r0),r0
1596: rsb
1597:
1598: .align 1
1599: JSBENTRY(Suword, R0|R1)
1600: probew $3,$4,(r0)
1601: beql fserr
1602: movl r1,(r0)
1603: clrl r0
1604: rsb
1605:
1606: .align 1
1607: JSBENTRY(Subyte, R0|R1)
1608: probew $3,$1,(r0)
1609: beql fserr
1610: movb r1,(r0)
1611: clrl r0
1612: rsb
1613:
1614: /*
1615: * Copy 1 relocation unit (NBPG bytes)
1616: * from user virtual address to physical address
1617: */
1618: ENTRY(copyseg, 0)
1619: bisl3 $PG_V|PG_KW,8(ap),_CMAP2
1620: mtpr $_CADDR2,$TBIS # invalidate entry for copy
1621: movc3 $NBPG,*4(ap),_CADDR2
1622: ret
1623:
1624: /*
1625: * zero out physical memory
1626: * specified in relocation units (NBPG bytes)
1627: */
1628: ENTRY(clearseg, 0)
1629: bisl3 $PG_V|PG_KW,4(ap),_CMAP1
1630: mtpr $_CADDR1,$TBIS
1631: movc5 $0,(sp),$0,$NBPG,_CADDR1
1632: ret
1633:
1634: /*
1635: * Check address.
1636: * Given virtual address, byte count, and rw flag
1637: * returns 0 on no access.
1638: */
1639: ENTRY(useracc, 0)
1640: movl 4(ap),r0 # get va
1641: movl 8(ap),r1 # count
1642: tstl 12(ap) # test for read access ?
1643: bneq userar # yes
1644: cmpl $NBPG,r1 # can we do it in one probe ?
1645: bgeq uaw2 # yes
1646: uaw1:
1647: probew $3,$NBPG,(r0)
1648: beql uaerr # no access
1649: addl2 $NBPG,r0
1650: acbl $NBPG+1,$-NBPG,r1,uaw1
1651: uaw2:
1652: probew $3,r1,(r0)
1653: beql uaerr
1654: movl $1,r0
1655: ret
1656:
1657: userar:
1658: cmpl $NBPG,r1
1659: bgeq uar2
1660: uar1:
1661: prober $3,$NBPG,(r0)
1662: beql uaerr
1663: addl2 $NBPG,r0
1664: acbl $NBPG+1,$-NBPG,r1,uar1
1665: uar2:
1666: prober $3,r1,(r0)
1667: beql uaerr
1668: movl $1,r0
1669: ret
1670: uaerr:
1671: clrl r0
1672: ret
1673:
1674: /*
1675: * kernacc - check for kernel access privileges
1676: *
1677: * We can't use the probe instruction directly because
1678: * it ors together current and previous mode.
1679: */
1680: ENTRY(kernacc, 0)
1681: movl 4(ap),r0 # virtual address
1682: bbcc $31,r0,kacc1
1683: bbs $30,r0,kacerr
1684: mfpr $SBR,r2 # address and length of page table (system)
1685: bbss $31,r2,0f; 0:
1686: mfpr $SLR,r3
1687: brb kacc2
1688: kacc1:
1689: bbsc $30,r0,kacc3
1690: mfpr $P0BR,r2 # user P0
1691: mfpr $P0LR,r3
1692: brb kacc2
1693: kacc3:
1694: mfpr $P1BR,r2 # user P1 (stack)
1695: mfpr $P1LR,r3
1696: kacc2:
1697: addl3 8(ap),r0,r1 # ending virtual address
1698: addl2 $NBPG-1,r1
1699: ashl $-PGSHIFT,r0,r0
1700: ashl $-PGSHIFT,r1,r1
1701: bbs $31,4(ap),kacc6
1702: bbc $30,4(ap),kacc6
1703: cmpl r0,r3 # user stack
1704: blss kacerr # address too low
1705: brb kacc4
1706: kacc6:
1707: cmpl r1,r3 # compare last page to P0LR or SLR
1708: bgtr kacerr # address too high
1709: kacc4:
1710: movl (r2)[r0],r3
1711: bbc $31,4(ap),kacc4a
1712: bbc $31,r3,kacerr # valid bit is off
1713: kacc4a:
1714: cmpzv $27,$4,r3,$1 # check protection code
1715: bleq kacerr # no access allowed
1716: tstb 12(ap)
1717: bneq kacc5 # only check read access
1718: cmpzv $27,$2,r3,$3 # check low 2 bits of prot code
1719: beql kacerr # no write access
1720: kacc5:
1721: aoblss r1,r0,kacc4 # next page
1722: movl $1,r0 # no errors
1723: ret
1724: kacerr:
1725: clrl r0 # error
1726: ret
1727: /*
1728: * Extracted and unrolled most common case of pagein (hopefully):
1729: * resident and not on free list (reclaim of page is purely
1730: * for the purpose of simulating a reference bit)
1731: *
1732: * Built in constants:
1733: * CLSIZE of 2, any bit fields in pte's
1734: */
1735: .text
1736: .globl Fastreclaim
1737: Fastreclaim:
1738: PUSHR
1739: #ifdef GPROF
1740: movl fp,-(sp)
1741: movab 12(sp),fp
1742: jsb mcount
1743: movl (sp)+,fp
1744: #endif GPROF
1745: extzv $9,$23,28(sp),r3 # virtual address
1746: bicl2 $1,r3 # v = clbase(btop(virtaddr));
1747: movl _u+U_PROCP,r5 # p = u.u_procp
1748: # from vtopte(p, v) ...
1749: movl $1,r2 # type = CTEXT;
1750: cmpl r3,P_TSIZE(r5)
1751: jlssu 1f # if (isatsv(p, v)) {
1752: addl3 P_TSIZE(r5),P_DSIZE(r5),r0
1753: cmpl r3,r0
1754: jgequ 2f
1755: clrl r2 # type = !CTEXT;
1756: 1:
1757: ashl $2,r3,r4
1758: addl2 P_P0BR(r5),r4 # tptopte(p, vtotp(p, v));
1759: jbr 3f
1760: 2:
1761: cvtwl P_SZPT(r5),r4 # } else (isassv(p, v)) {
1762: ashl $7,r4,r4
1763: subl2 $0x400000,r4
1764: addl2 r3,r4
1765: ashl $2,r4,r4
1766: addl2 P_P0BR(r5),r4 # sptopte(p, vtosp(p, v));
1767: clrl r2 # type = !CTEXT;
1768: 3: # }
1769: bitb $0x82,3(r4)
1770: beql 2f # if (pte->pg_v || pte->pg_fod)
1771: POPR; rsb # let pagein handle it
1772: 2:
1773: bicl3 $0xffe00000,(r4),r0
1774: jneq 2f # if (pte->pg_pfnum == 0)
1775: POPR; rsb # let pagein handle it
1776: 2:
1777: subl2 _firstfree,r0
1778: ashl $-1,r0,r0
1779: incl r0 # pgtocm(pte->pg_pfnum)
1780: mull2 $SZ_CMAP,r0
1781: addl2 _cmap,r0 # &cmap[pgtocm(pte->pg_pfnum)]
1782: tstl r2
1783: jeql 2f # if (type == CTEXT &&
1784: jbc $C_INTRANS,(r0),2f # c_intrans)
1785: POPR; rsb # let pagein handle it
1786: 2:
1787: jbc $C_FREE,(r0),2f # if (c_free)
1788: POPR; rsb # let pagein handle it
1789: 2:
1790: bisb2 $0x80,3(r4) # pte->pg_v = 1;
1791: jbc $26,4(r4),2f # if (anycl(pte, pg_m)
1792: bisb2 $0x04,3(r4) # pte->pg_m = 1;
1793: 2:
1794: bicw3 $0x7f,2(r4),r0
1795: bicw3 $0xff80,6(r4),r1
1796: bisw3 r0,r1,6(r4) # distcl(pte);
1797: ashl $PGSHIFT,r3,r0
1798: mtpr r0,$TBIS
1799: addl2 $NBPG,r0
1800: mtpr r0,$TBIS # tbiscl(v);
1801: tstl r2
1802: jeql 2f # if (type == CTEXT)
1803: movl P_TEXTP(r5),r0
1804: movl X_CADDR(r0),r5 # for (p = p->p_textp->x_caddr; p; ) {
1805: jeql 2f
1806: ashl $2,r3,r3
1807: 3:
1808: addl3 P_P0BR(r5),r3,r0 # tpte = tptopte(p, tp);
1809: bisb2 $1,P_FLAG+3(r5) # p->p_flag |= SPTECHG;
1810: movl (r4),(r0)+ # for (i = 0; i < CLSIZE; i++)
1811: movl 4(r4),(r0) # tpte[i] = pte[i];
1812: movl P_XLINK(r5),r5 # p = p->p_xlink;
1813: jneq 3b # }
1814: 2: # collect a few statistics...
1815: incl _u+U_RU+RU_MINFLT # u.u_ru.ru_minflt++;
1816: moval _cnt,r0
1817: incl V_FAULTS(r0) # cnt.v_faults++;
1818: incl V_PGREC(r0) # cnt.v_pgrec++;
1819: incl V_FASTPGREC(r0) # cnt.v_fastpgrec++;
1820: incl V_TRAP(r0) # cnt.v_trap++;
1821: POPR
1822: addl2 $8,sp # pop pc, code
1823: mtpr $HIGH,$IPL ## dont go to a higher IPL (GROT)
1824: rei
1825: .globl _Xrkintr0
1826: .align 2
1827: _Xrkintr0:
1828: pushr $0x3f
1829: incl _fltintrcnt+(4*0)
1830: pushl $0
1831: calls $1,_rkintr
1832: popr $0x3f
1833: incl _cnt+V_INTR
1834: rei
1835:
1836: .globl _Xtmintr0
1837: .align 2
1838: _Xtmintr0:
1839: pushr $0x3f
1840: incl _fltintrcnt+(4*1)
1841: pushl $0
1842: calls $1,_tmintr
1843: popr $0x3f
1844: incl _cnt+V_INTR
1845: rei
1846:
1847: .globl _Xutintr0
1848: .align 2
1849: _Xutintr0:
1850: pushr $0x3f
1851: incl _fltintrcnt+(4*2)
1852: pushl $0
1853: calls $1,_utintr
1854: popr $0x3f
1855: incl _cnt+V_INTR
1856: rei
1857:
1858: .globl _Xtmscpintr0
1859: .align 2
1860: _Xtmscpintr0:
1861: pushr $0x3f
1862: incl _fltintrcnt+(4*3)
1863: pushl $0
1864: calls $1,_tmscpintr
1865: popr $0x3f
1866: incl _cnt+V_INTR
1867: rei
1868:
1869: .globl _Xupintr0
1870: .align 2
1871: _Xupintr0:
1872: pushr $0x3f
1873: incl _fltintrcnt+(4*4)
1874: pushl $0
1875: calls $1,_upintr
1876: popr $0x3f
1877: incl _cnt+V_INTR
1878: rei
1879:
1880: .globl _Xudintr0
1881: .align 2
1882: _Xudintr0:
1883: pushr $0x3f
1884: incl _fltintrcnt+(4*5)
1885: pushl $0
1886: calls $1,_udintr
1887: popr $0x3f
1888: incl _cnt+V_INTR
1889: rei
1890:
1891: .globl _Xidcintr0
1892: .align 2
1893: _Xidcintr0:
1894: pushr $0x3f
1895: incl _fltintrcnt+(4*6)
1896: pushl $0
1897: calls $1,_idcintr
1898: popr $0x3f
1899: incl _cnt+V_INTR
1900: rei
1901:
1902: .globl _Xrlintr0
1903: .align 2
1904: _Xrlintr0:
1905: pushr $0x3f
1906: incl _fltintrcnt+(4*7)
1907: pushl $0
1908: calls $1,_rlintr
1909: popr $0x3f
1910: incl _cnt+V_INTR
1911: rei
1912:
1913: .globl _Xdhrint0
1914: .align 2
1915: _Xdhrint0:
1916: pushr $0x3f
1917: incl _fltintrcnt+(4*8)
1918: pushl $0
1919: calls $1,_dhrint
1920: popr $0x3f
1921: incl _cnt+V_INTR
1922: rei
1923:
1924: .globl _Xdhxint0
1925: .align 2
1926: _Xdhxint0:
1927: pushr $0x3f
1928: incl _fltintrcnt+(4*9)
1929: pushl $0
1930: calls $1,_dhxint
1931: popr $0x3f
1932: incl _cnt+V_INTR
1933: rei
1934:
1935: .globl _Xdmintr0
1936: .align 2
1937: _Xdmintr0:
1938: pushr $0x3f
1939: incl _fltintrcnt+(4*10)
1940: pushl $0
1941: calls $1,_dmintr
1942: popr $0x3f
1943: incl _cnt+V_INTR
1944: rei
1945:
1946: .globl _Xdhrint1
1947: .align 2
1948: _Xdhrint1:
1949: pushr $0x3f
1950: incl _fltintrcnt+(4*11)
1951: pushl $1
1952: calls $1,_dhrint
1953: popr $0x3f
1954: incl _cnt+V_INTR
1955: rei
1956:
1957: .globl _Xdhxint1
1958: .align 2
1959: _Xdhxint1:
1960: pushr $0x3f
1961: incl _fltintrcnt+(4*12)
1962: pushl $1
1963: calls $1,_dhxint
1964: popr $0x3f
1965: incl _cnt+V_INTR
1966: rei
1967:
1968: .globl _Xdzrint0
1969: .align 2
1970: _Xdzrint0:
1971: pushr $0x3f
1972: incl _fltintrcnt+(4*13)
1973: pushl $0
1974: calls $1,_dzrint
1975: popr $0x3f
1976: incl _cnt+V_INTR
1977: rei
1978:
1979: .globl _Xdzxint0
1980: .align 2
1981: _Xdzxint0:
1982: pushr $0x3f
1983: incl _fltintrcnt+(4*14)
1984: movl $0,r0
1985: jmp dzdma
1986:
1987: .globl _Xdzrint1
1988: .align 2
1989: _Xdzrint1:
1990: pushr $0x3f
1991: incl _fltintrcnt+(4*15)
1992: pushl $1
1993: calls $1,_dzrint
1994: popr $0x3f
1995: incl _cnt+V_INTR
1996: rei
1997:
1998: .globl _Xdzxint1
1999: .align 2
2000: _Xdzxint1:
2001: pushr $0x3f
2002: incl _fltintrcnt+(4*16)
2003: movl $1,r0
2004: jmp dzdma
2005:
2006: .globl _Xdzrint2
2007: .align 2
2008: _Xdzrint2:
2009: pushr $0x3f
2010: incl _fltintrcnt+(4*17)
2011: pushl $2
2012: calls $1,_dzrint
2013: popr $0x3f
2014: incl _cnt+V_INTR
2015: rei
2016:
2017: .globl _Xdzxint2
2018: .align 2
2019: _Xdzxint2:
2020: pushr $0x3f
2021: incl _fltintrcnt+(4*18)
2022: movl $2,r0
2023: jmp dzdma
2024:
2025: .globl _Xdzrint3
2026: .align 2
2027: _Xdzrint3:
2028: pushr $0x3f
2029: incl _fltintrcnt+(4*19)
2030: pushl $3
2031: calls $1,_dzrint
2032: popr $0x3f
2033: incl _cnt+V_INTR
2034: rei
2035:
2036: .globl _Xdzxint3
2037: .align 2
2038: _Xdzxint3:
2039: pushr $0x3f
2040: incl _fltintrcnt+(4*20)
2041: movl $3,r0
2042: jmp dzdma
2043:
2044: .globl _Xdzrint4
2045: .align 2
2046: _Xdzrint4:
2047: pushr $0x3f
2048: incl _fltintrcnt+(4*21)
2049: pushl $4
2050: calls $1,_dzrint
2051: popr $0x3f
2052: incl _cnt+V_INTR
2053: rei
2054:
2055: .globl _Xdzxint4
2056: .align 2
2057: _Xdzxint4:
2058: pushr $0x3f
2059: incl _fltintrcnt+(4*22)
2060: movl $4,r0
2061: jmp dzdma
2062:
2063: .globl _Xdzrint5
2064: .align 2
2065: _Xdzrint5:
2066: pushr $0x3f
2067: incl _fltintrcnt+(4*23)
2068: pushl $5
2069: calls $1,_dzrint
2070: popr $0x3f
2071: incl _cnt+V_INTR
2072: rei
2073:
2074: .globl _Xdzxint5
2075: .align 2
2076: _Xdzxint5:
2077: pushr $0x3f
2078: incl _fltintrcnt+(4*24)
2079: movl $5,r0
2080: jmp dzdma
2081:
2082: .globl _Xdzrint6
2083: .align 2
2084: _Xdzrint6:
2085: pushr $0x3f
2086: incl _fltintrcnt+(4*25)
2087: pushl $6
2088: calls $1,_dzrint
2089: popr $0x3f
2090: incl _cnt+V_INTR
2091: rei
2092:
2093: .globl _Xdzxint6
2094: .align 2
2095: _Xdzxint6:
2096: pushr $0x3f
2097: incl _fltintrcnt+(4*26)
2098: movl $6,r0
2099: jmp dzdma
2100:
2101: .globl _Xdzrint7
2102: .align 2
2103: _Xdzrint7:
2104: pushr $0x3f
2105: incl _fltintrcnt+(4*27)
2106: pushl $7
2107: calls $1,_dzrint
2108: popr $0x3f
2109: incl _cnt+V_INTR
2110: rei
2111:
2112: .globl _Xdzxint7
2113: .align 2
2114: _Xdzxint7:
2115: pushr $0x3f
2116: incl _fltintrcnt+(4*28)
2117: movl $7,r0
2118: jmp dzdma
2119:
2120: .globl _Xtsintr0
2121: .align 2
2122: _Xtsintr0:
2123: pushr $0x3f
2124: incl _fltintrcnt+(4*29)
2125: pushl $0
2126: calls $1,_tsintr
2127: popr $0x3f
2128: incl _cnt+V_INTR
2129: rei
2130:
2131: .globl _Xdmfsrint0
2132: .align 2
2133: _Xdmfsrint0:
2134: pushr $0x3f
2135: incl _fltintrcnt+(4*30)
2136: pushl $0
2137: calls $1,_dmfsrint
2138: popr $0x3f
2139: incl _cnt+V_INTR
2140: rei
2141:
2142: .globl _Xdmfsxint0
2143: .align 2
2144: _Xdmfsxint0:
2145: pushr $0x3f
2146: incl _fltintrcnt+(4*31)
2147: pushl $0
2148: calls $1,_dmfsxint
2149: popr $0x3f
2150: incl _cnt+V_INTR
2151: rei
2152:
2153: .globl _Xdmfdaint0
2154: .align 2
2155: _Xdmfdaint0:
2156: pushr $0x3f
2157: incl _fltintrcnt+(4*32)
2158: pushl $0
2159: calls $1,_dmfdaint
2160: popr $0x3f
2161: incl _cnt+V_INTR
2162: rei
2163:
2164: .globl _Xdmfdbint0
2165: .align 2
2166: _Xdmfdbint0:
2167: pushr $0x3f
2168: incl _fltintrcnt+(4*33)
2169: pushl $0
2170: calls $1,_dmfdbint
2171: popr $0x3f
2172: incl _cnt+V_INTR
2173: rei
2174:
2175: .globl _Xdmfrint0
2176: .align 2
2177: _Xdmfrint0:
2178: pushr $0x3f
2179: incl _fltintrcnt+(4*34)
2180: pushl $0
2181: calls $1,_dmfrint
2182: popr $0x3f
2183: incl _cnt+V_INTR
2184: rei
2185:
2186: .globl _Xdmfxint0
2187: .align 2
2188: _Xdmfxint0:
2189: pushr $0x3f
2190: incl _fltintrcnt+(4*35)
2191: pushl $0
2192: calls $1,_dmfxint
2193: popr $0x3f
2194: incl _cnt+V_INTR
2195: rei
2196:
2197: .globl _Xdmflint0
2198: .align 2
2199: _Xdmflint0:
2200: pushr $0x3f
2201: incl _fltintrcnt+(4*36)
2202: pushl $0
2203: calls $1,_dmflint
2204: popr $0x3f
2205: incl _cnt+V_INTR
2206: rei
2207:
2208: .globl _Xdmzrinta0
2209: .align 2
2210: _Xdmzrinta0:
2211: pushr $0x3f
2212: incl _fltintrcnt+(4*37)
2213: pushl $0
2214: calls $1,_dmzrinta
2215: popr $0x3f
2216: incl _cnt+V_INTR
2217: rei
2218:
2219: .globl _Xdmzxinta0
2220: .align 2
2221: _Xdmzxinta0:
2222: pushr $0x3f
2223: incl _fltintrcnt+(4*38)
2224: pushl $0
2225: calls $1,_dmzxinta
2226: popr $0x3f
2227: incl _cnt+V_INTR
2228: rei
2229:
2230: .globl _Xdmzrintb0
2231: .align 2
2232: _Xdmzrintb0:
2233: pushr $0x3f
2234: incl _fltintrcnt+(4*39)
2235: pushl $0
2236: calls $1,_dmzrintb
2237: popr $0x3f
2238: incl _cnt+V_INTR
2239: rei
2240:
2241: .globl _Xdmzxintb0
2242: .align 2
2243: _Xdmzxintb0:
2244: pushr $0x3f
2245: incl _fltintrcnt+(4*40)
2246: pushl $0
2247: calls $1,_dmzxintb
2248: popr $0x3f
2249: incl _cnt+V_INTR
2250: rei
2251:
2252: .globl _Xdmzrintc0
2253: .align 2
2254: _Xdmzrintc0:
2255: pushr $0x3f
2256: incl _fltintrcnt+(4*41)
2257: pushl $0
2258: calls $1,_dmzrintc
2259: popr $0x3f
2260: incl _cnt+V_INTR
2261: rei
2262:
2263: .globl _Xdmzxintc0
2264: .align 2
2265: _Xdmzxintc0:
2266: pushr $0x3f
2267: incl _fltintrcnt+(4*42)
2268: pushl $0
2269: calls $1,_dmzxintc
2270: popr $0x3f
2271: incl _cnt+V_INTR
2272: rei
2273:
2274: .globl _Xdhurint0
2275: .align 2
2276: _Xdhurint0:
2277: pushr $0x3f
2278: incl _fltintrcnt+(4*43)
2279: pushl $0
2280: calls $1,_dhurint
2281: popr $0x3f
2282: incl _cnt+V_INTR
2283: rei
2284:
2285: .globl _Xdhuxint0
2286: .align 2
2287: _Xdhuxint0:
2288: pushr $0x3f
2289: incl _fltintrcnt+(4*44)
2290: pushl $0
2291: calls $1,_dhuxint
2292: popr $0x3f
2293: incl _cnt+V_INTR
2294: rei
2295:
2296: .globl _Xlpintr0
2297: .align 2
2298: _Xlpintr0:
2299: pushr $0x3f
2300: incl _fltintrcnt+(4*45)
2301: pushl $0
2302: calls $1,_lpintr
2303: popr $0x3f
2304: incl _cnt+V_INTR
2305: rei
2306:
2307: .globl _Xenxint0
2308: .align 2
2309: _Xenxint0:
2310: pushr $0x3f
2311: incl _fltintrcnt+(4*46)
2312: pushl $0
2313: calls $1,_enxint
2314: popr $0x3f
2315: incl _cnt+V_INTR
2316: rei
2317:
2318: .globl _Xenrint0
2319: .align 2
2320: _Xenrint0:
2321: pushr $0x3f
2322: incl _fltintrcnt+(4*47)
2323: pushl $0
2324: calls $1,_enrint
2325: popr $0x3f
2326: incl _cnt+V_INTR
2327: rei
2328:
2329: .globl _Xencollide0
2330: .align 2
2331: _Xencollide0:
2332: pushr $0x3f
2333: incl _fltintrcnt+(4*48)
2334: pushl $0
2335: calls $1,_encollide
2336: popr $0x3f
2337: incl _cnt+V_INTR
2338: rei
2339:
2340: .globl _Xecrint0
2341: .align 2
2342: _Xecrint0:
2343: pushr $0x3f
2344: incl _fltintrcnt+(4*49)
2345: pushl $0
2346: calls $1,_ecrint
2347: popr $0x3f
2348: incl _cnt+V_INTR
2349: rei
2350:
2351: .globl _Xeccollide0
2352: .align 2
2353: _Xeccollide0:
2354: pushr $0x3f
2355: incl _fltintrcnt+(4*50)
2356: pushl $0
2357: calls $1,_eccollide
2358: popr $0x3f
2359: incl _cnt+V_INTR
2360: rei
2361:
2362: .globl _Xecxint0
2363: .align 2
2364: _Xecxint0:
2365: pushr $0x3f
2366: incl _fltintrcnt+(4*51)
2367: pushl $0
2368: calls $1,_ecxint
2369: popr $0x3f
2370: incl _cnt+V_INTR
2371: rei
2372:
2373: .globl _Xdeintr0
2374: .align 2
2375: _Xdeintr0:
2376: pushr $0x3f
2377: incl _fltintrcnt+(4*52)
2378: pushl $0
2379: calls $1,_deintr
2380: popr $0x3f
2381: incl _cnt+V_INTR
2382: rei
2383:
2384: .globl _Xilrint0
2385: .align 2
2386: _Xilrint0:
2387: pushr $0x3f
2388: incl _fltintrcnt+(4*53)
2389: pushl $0
2390: calls $1,_ilrint
2391: popr $0x3f
2392: incl _cnt+V_INTR
2393: rei
2394:
2395: .globl _Xilcint0
2396: .align 2
2397: _Xilcint0:
2398: pushr $0x3f
2399: incl _fltintrcnt+(4*54)
2400: pushl $0
2401: calls $1,_ilcint
2402: popr $0x3f
2403: incl _cnt+V_INTR
2404: rei
2405:
2406: .globl _Xexcdint0
2407: .align 2
2408: _Xexcdint0:
2409: pushr $0x3f
2410: incl _fltintrcnt+(4*55)
2411: pushl $0
2412: calls $1,_excdint
2413: popr $0x3f
2414: incl _cnt+V_INTR
2415: rei
2416:
2417:
2418: .globl _intrnames
2419:
2420: .globl _eintrnames
2421: .data
2422: _intrnames:
2423: .asciz "clock"
2424: .asciz "cnr"
2425: .asciz "cnx"
2426: .asciz "tur"
2427: .asciz "tux"
2428: .asciz "mba0"
2429: .asciz "mba1"
2430: .asciz "mba2"
2431: .asciz "mba3"
2432: .asciz "uba0"
2433: .asciz "uba1"
2434: .asciz "uba2"
2435: .asciz "uba3"
2436: .asciz "rk0"
2437: .asciz "tm0"
2438: .asciz "ut0"
2439: .asciz "tmscp0"
2440: .asciz "up0"
2441: .asciz "ud0"
2442: .asciz "idc0"
2443: .asciz "rl0"
2444: .asciz "dhr0"
2445: .asciz "dhx0"
2446: .asciz "dm0"
2447: .asciz "dhr1"
2448: .asciz "dhx1"
2449: .asciz "dzr0"
2450: .asciz "dzx0"
2451: .asciz "dzr1"
2452: .asciz "dzx1"
2453: .asciz "dzr2"
2454: .asciz "dzx2"
2455: .asciz "dzr3"
2456: .asciz "dzx3"
2457: .asciz "dzr4"
2458: .asciz "dzx4"
2459: .asciz "dzr5"
2460: .asciz "dzx5"
2461: .asciz "dzr6"
2462: .asciz "dzx6"
2463: .asciz "dzr7"
2464: .asciz "dzx7"
2465: .asciz "ts0"
2466: .asciz "dmfsr0"
2467: .asciz "dmfsx0"
2468: .asciz "dmfda0"
2469: .asciz "dmfdb0"
2470: .asciz "dmfr0"
2471: .asciz "dmfx0"
2472: .asciz "dmfl0"
2473: .asciz "dmzra0"
2474: .asciz "dmzxa0"
2475: .asciz "dmzrb0"
2476: .asciz "dmzxb0"
2477: .asciz "dmzrc0"
2478: .asciz "dmzxc0"
2479: .asciz "dhur0"
2480: .asciz "dhux0"
2481: .asciz "lp0"
2482: .asciz "enx0"
2483: .asciz "enr0"
2484: .asciz "encollide0"
2485: .asciz "ecr0"
2486: .asciz "eccollide0"
2487: .asciz "ecx0"
2488: .asciz "de0"
2489: .asciz "ilr0"
2490: .asciz "ilc0"
2491: .asciz "excd0"
2492: _eintrnames:
2493:
2494: .globl _intrcnt
2495:
2496: .globl _eintrcnt
2497: .align 2
2498: _intrcnt:
2499: .space 4 * 13
2500: _fltintrcnt:
2501: .space 4 * 56
2502: _eintrcnt:
2503:
2504: .text
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.