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