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