+#ifdef LOCORE
+#define P_LINK 0
+#define P_RLINK 4
+#define P_XLINK 100
+#define P_ADDR 8
+#define P_PRI 13
+#define P_STAT 15
+#define P_WCHAN 88
+#define P_TSIZE 60
+#define P_SSIZE 68
+#define P_P0BR 96
+#define P_SZPT 58
+#define P_TEXTP 92
+#define P_FLAG 36
+#define SSLEEP 1
+#define SRUN 3
+#define UBA_BRRVR 48
+#define UH_UBA 0
+#define UH_VEC 8
+#define UH_SIZE 52
+#define RP_FLAG 12
+#define X_CADDR 56
+#define V_SWTCH 0
+#define V_TRAP 4
+#define V_SYSCALL 8
+#define V_INTR 12
+#define V_PDMA 16
+#define V_FAULTS 88
+#define V_PGREC 48
+#define V_FASTPGREC 108
+#define UPAGES 8
+#define CLSIZE 2
+#define SYSPTSIZE 3584
+#define USRPTSIZE 1024
+#define MSGBUFPTECNT 8
+#define NMBCLUSTERS 256
+#define U_PROCP 124
+#define U_RU 1296
+#define RU_MINFLT 32
+#else
+asm(".set U_ARG,388");
+asm(".set U_QSAVE,-1881318947");
+#endif
+/* rpb.s 6.1 83/08/01 */
+
+/*
+ * This has to get loaded first (physical 0) as 780 memory restart rom
+ * only looks for rpb on a 64K page boundary (doc isn't wrong,
+ * it never says what size "page boundary" rpb has to be on).
+ */
+ .globl _rpb
+_rpb:
+ .space 508
+erpb:
+ .space 4
+/* scb.s 6.1 83/08/11 */
+
+#include "uba.h"
+
+/*
+ * System control block
+ */
+ .set INTSTK,1 # handle this interrupt on the interrupt stack
+ .set HALT,3 # halt if this interrupt occurs
+
+_scb: .globl _scb
+
+#define STRAY .long _Xstray+INTSTK
+#define STRAY8 STRAY;STRAY;STRAY;STRAY;STRAY;STRAY;STRAY;STRAY
+#define STRAY15 STRAY;STRAY;STRAY;STRAY;STRAY;STRAY;STRAY;STRAY8
+#define KS(a) .long _X/**/a
+#define IS(a) .long _X/**/a+INTSTK
+#define STOP(a) .long _X/**/a+HALT
+
+/* 000 */ STRAY; IS(machcheck); IS(kspnotval); STOP(powfail);
+/* 010 */ KS(privinflt); KS(xfcflt); KS(resopflt); KS(resadflt);
+/* 020 */ KS(protflt); KS(transflt); KS(tracep); KS(bptflt);
+/* 030 */ KS(compatflt); KS(arithtrap); STRAY; STRAY;
+/* 040 */ KS(syscall); KS(chme); KS(chms); KS(chmu);
+/* 050 */ STRAY; IS(cmrd); STRAY; STRAY;
+/* 060 */ IS(wtime); STRAY; STRAY; STRAY;
+/* 070 */ STRAY; STRAY; STRAY; STRAY;
+/* 080 */ STRAY; STRAY; KS(astflt); STRAY;
+/* 090 */ STRAY; STRAY; STRAY; STRAY;
+/* 0a0 */ IS(softclock); STRAY; STRAY; STRAY;
+/* 0b0 */ IS(netintr); STRAY; STRAY; STRAY;
+/* 0c0 */ IS(hardclock); STRAY; STRAY; STRAY;
+/* 0d0 */ STRAY; STRAY; STRAY; STRAY;
+/* 0e0 */ STRAY; STRAY; STRAY; STRAY;
+/* 0f0 */ IS(consdin); IS(consdout); IS(cnrint); IS(cnxint);
+/* 100 */ IS(nexzvec); STRAY15; /* ipl 0x14, nexus 0-15 */
+/* 140 */ IS(nexzvec); STRAY15; /* ipl 0x15, nexus 0-15 */
+/* 180 */ IS(nexzvec); STRAY15; /* ipl 0x16, nexus 0-15 */
+/* 1c0 */ IS(nexzvec); STRAY15; /* ipl 0x17, nexus 0-15 */
+
+ .globl _UNIvec
+_UNIvec: .space 512 # 750 unibus intr vector
+ # 1st UBA jump table on 780's
+#if NUBA > 1
+ .globl _UNI1vec
+_UNI1vec: .space 512 # 750 second unibus intr vector
+ # 2nd UBA jump table on 780's
+#endif
+/* locore.s 6.3 83/08/12 */
+
+#include "../machine/psl.h"
+#include "../machine/pte.h"
+
+#include "../h/errno.h"
+
+#include "../vax/mtpr.h"
+#include "../vax/trap.h"
+#include "../vax/cpu.h"
+#include "../vax/nexus.h"
+#include "../vax/cons.h"
+#include "../vax/clock.h"
+#include "../vaxuba/ubareg.h"
+
+#include "dh.h"
+#include "dz.h"
+#include "uu.h"
+#include "ps.h"
+#include "mba.h"
+
+ .set HIGH,0x1f # mask for total disable
+ .set MCKVEC,4 # offset into scb of machine check vector
+ .set NBPG,512
+ .set PGSHIFT,9
+
+ .set NISP,3 # number of interrupt stack pages
+
+/*
+ * User structure is UPAGES at top of user space.
+ */
+ .globl _u
+ .set _u,0x80000000 - UPAGES*NBPG
+
+ .globl _intstack
+_intstack:
+ .space NISP*NBPG
+eintstack:
+
+/*
+ * Do a dump.
+ * Called by auto-restart.
+ * May be called manually.
+ */
+ .align 2
+ .globl _doadump
+_doadump:
+ nop; nop # .word 0x0101
+#define _rpbmap _Sysmap # rpb, scb, UNI*vec, istack*4
+ bicl2 $PG_PROT,_rpbmap
+ bisl2 $PG_KW,_rpbmap
+ tstl _rpb+RP_FLAG # dump only once!
+ bneq 1f
+ incl _rpb+RP_FLAG
+ mtpr $0,$TBIA
+ movl sp,erpb
+ movab erpb,sp
+ mfpr $PCBB,-(sp)
+ mfpr $MAPEN,-(sp)
+ mfpr $IPL,-(sp)
+ mtpr $0,$MAPEN
+ mtpr $HIGH,$IPL
+ pushr $0x3fff
+ calls $0,_dumpsys
+1:
+ mfpr $TXCS,r0
+ bitl $TXCS_RDY,r0
+ beql 1b
+ mtpr $TXDB_BOOT,$TXDB
+ halt
+
+/*
+ * Interrupt vector routines
+ */
+ .globl _waittime
+
+#define SCBVEC(name) .align 2; .globl _X/**/name; _X/**/name
+#define PANIC(msg) clrl _waittime; pushab 1f; \
+ calls $1,_panic; 1: .asciz msg
+#define PRINTF(n,msg) pushab 1f; calls $n+1,_printf; MSG(msg)
+#define MSG(msg) .data; 1: .asciz msg; .text
+#define PUSHR pushr $0x3f
+#define POPR popr $0x3f
+
+SCBVEC(machcheck):
+ PUSHR; pushab 6*4(sp); calls $1,_machinecheck; POPR;
+ addl2 (sp)+,sp; rei
+SCBVEC(kspnotval):
+ PUSHR; PANIC("KSP not valid");
+SCBVEC(powfail):
+ halt
+SCBVEC(chme): SCBVEC(chms): SCBVEC(chmu):
+ PUSHR; PANIC("CHM? in kernel");
+SCBVEC(stray):
+ PUSHR; PRINTF(0, "stray scb interrupt\n"); POPR;
+ rei
+SCBVEC(nexzvec):
+ PUSHR; mfpr $IPL,-(sp); PRINTF(1, "nexus stray intr ipl%x\n"); POPR; rei
+SCBVEC(cmrd):
+ PUSHR; calls $0,_memerr; POPR; rei
+SCBVEC(wtime):
+ PUSHR; pushl 6*4(sp); PRINTF(1,"write timeout %x\n"); POPR;
+ PANIC("wtimo");
+
+#if NMBA > 0
+SCBVEC(mba3int):
+ PUSHR; pushl $3; brb 1f
+SCBVEC(mba2int):
+ PUSHR; pushl $2; brb 1f
+SCBVEC(mba1int):
+ PUSHR; pushl $1; brb 1f
+SCBVEC(mba0int):
+ PUSHR; pushl $0
+1: calls $1,_mbintr
+ POPR
+ incl _cnt+V_INTR
+ rei
+#endif
+
+#if VAX780
+/*
+ * Registers for the uba handling code
+ */
+#define rUBANUM r0
+#define rUBAHD r1
+#define rUVEC r3
+#define rUBA r4
+/* r2,r5 are scratch */
+
+SCBVEC(ua3int):
+ PUSHR; movl $3,rUBANUM; moval _uba_hd+(3*UH_SIZE),rUBAHD; brb 1f
+SCBVEC(ua2int):
+ PUSHR; movl $2,rUBANUM; moval _uba_hd+(2*UH_SIZE),rUBAHD; brb 1f
+SCBVEC(ua1int):
+ PUSHR; movl $1,rUBANUM; moval _uba_hd+(1*UH_SIZE),rUBAHD; brb 1f
+SCBVEC(ua0int):
+ PUSHR; movl $0,rUBANUM; moval _uba_hd+(0*UH_SIZE),rUBAHD;
+1:
+ incl _cnt+V_INTR
+ mfpr $IPL,r2 /* r2 = mfpr(IPL); */
+ movl UH_UBA(rUBAHD),rUBA /* uba = uhp->uh_uba; */
+ movl UBA_BRRVR-0x14*4(rUBA)[r2],rUVEC
+ /* uvec = uba->uba_brrvr[r2-0x14] */
+ubanorm:
+ bleq ubaerror
+ addl2 UH_VEC(rUBAHD),rUVEC /* uvec += uh->uh_vec */
+ bicl3 $3,(rUVEC),r1
+ jmp 2(r1) /* 2 skips ``pushr $0x3f'' */
+ubaerror:
+ PUSHR; calls $0,_ubaerror; POPR /* ubaerror r/w's r0-r5 */
+ tstl rUVEC; jneq ubanorm /* rUVEC contains result */
+ POPR
+ rei
+#endif
+SCBVEC(cnrint):
+ PUSHR; calls $0,_cnrint; POPR; incl _cnt+V_INTR; rei
+SCBVEC(cnxint):
+ PUSHR; calls $0,_cnxint; POPR; incl _cnt+V_INTR; rei
+SCBVEC(hardclock):
+ PUSHR
+ mtpr $ICCS_RUN|ICCS_IE|ICCS_INT|ICCS_ERR,$ICCS
+ pushl 4+6*4(sp); pushl 4+6*4(sp);
+ calls $2,_hardclock # hardclock(pc,psl)
+#if NPS > 0
+ pushl 4+6*4(sp); pushl 4+6*4(sp);
+ calls $2,_psextsync
+#endif
+ POPR;
+ incl _cnt+V_INTR ## temp so not to break vmstat -= HZ
+ rei
+SCBVEC(softclock):
+ PUSHR
+#if NDZ > 0
+ calls $0,_dztimer
+#endif
+#if NDH > 0
+ calls $0,_dhtimer
+#endif
+ pushl 4+6*4(sp); pushl 4+6*4(sp);
+ calls $2,_softclock # softclock(pc,psl)
+ POPR;
+ rei
+#include "../net/netisr.h"
+ .globl _netisr
+SCBVEC(netintr):
+ PUSHR
+ bbcc $NETISR_RAW,_netisr,1f; calls $0,_rawintr; 1:
+#ifdef INET
+#include "../netinet/in_systm.h"
+ bbcc $NETISR_IP,_netisr,1f; calls $0,_ipintr; 1:
+#endif
+#ifdef NS
+ bbcc $NETISR_NS,_netisr,1f; calls $0,_nsintr; 1:
+#endif
+ POPR
+ rei
+#if defined(VAX750) || defined(VAX730)
+SCBVEC(consdin):
+ PUSHR;
+#if defined(VAX750) && !defined(VAX730) && !defined(MRSP)
+ jsb tudma
+#endif
+ calls $0,_turintr;
+ POPR;
+ incl _cnt+V_INTR;
+ rei
+SCBVEC(consdout):
+ PUSHR; calls $0,_tuxintr; POPR; incl _cnt+V_INTR; rei
+#else
+SCBVEC(consdin):
+ halt
+SCBVEC(consdout):
+ halt
+#endif
+
+#if NDZ > 0
+/*
+ * DZ pseudo dma routine:
+ * r0 - controller number
+ */
+ .align 1
+ .globl dzdma
+dzdma:
+ mull2 $8*20,r0
+ movab _dzpdma(r0),r3 # pdma structure base
+ # for this controller
+dzploop:
+ movl r3,r0
+ movl (r0)+,r1 # device register address
+ movzbl 1(r1),r2 # get line number
+ bitb $0x80,r2 # TRDY on?
+ beql dzprei # no
+ bicb2 $0xf8,r2 # clear garbage bits
+ mull2 $20,r2
+ addl2 r2,r0 # point at line's pdma structure
+ movl (r0)+,r2 # p_mem
+ cmpl r2,(r0)+ # p_mem < p_end ?
+ bgequ dzpcall # no, go call dzxint
+ movb (r2)+,6(r1) # dztbuf = *p_mem++
+ movl r2,-8(r0)
+ brb dzploop # check for another line
+dzprei:
+ POPR
+ incl _cnt+V_PDMA
+ rei
+
+dzpcall:
+ pushl r3
+ pushl (r0)+ # push tty address
+ calls $1,*(r0) # call interrupt rtn
+ movl (sp)+,r3
+ brb dzploop # check for another line
+#endif
+
+#if NUU > 0 && defined(UUDMA)
+/*
+ * Pseudo DMA routine for tu58 (on DL11)
+ * r0 - controller number
+ */
+ .align 1
+ .globl uudma
+uudma:
+ movl _uudinfo[r0],r2
+ movl 16(r2),r2 # r2 = uuaddr
+ mull3 $48,r0,r3
+ movab _uu_softc(r3),r5 # r5 = uuc
+
+ cvtwl 2(r2),r1 # c = uuaddr->rdb
+ bbc $15,r1,1f # if (c & UUDB_ERROR)
+ movl $13,16(r5) # uuc->tu_state = TUC_RCVERR;
+ rsb # let uurintr handle it
+1:
+ tstl 4(r5) # if (uuc->tu_rcnt) {
+ beql 1f
+ movb r1,*0(r5) # *uuc->tu_rbptr++ = r1
+ incl (r5)
+ decl 4(r5) # if (--uuc->tu_rcnt)
+ beql 2f # done
+ tstl (sp)+
+ POPR # registers saved in ubglue.s
+ rei # }
+2:
+ cmpl 16(r5),$8 # if (uuc->tu_state != TUS_GETH)
+ beql 2f # let uurintr handle it
+1:
+ rsb
+2:
+ mull2 $14,r0 # sizeof(uudata[ctlr]) = 14
+ movab _uudata(r0),r4 # data = &uudata[ctlr];
+ cmpb $1,(r4) # if (data->pk_flag != TUF_DATA)
+ bneq 1b
+#ifdef notdef
+ /* this is for command packets */
+ beql 1f # r0 = uuc->tu_rbptr
+ movl (r5),r0
+ brb 2f
+1: # else
+#endif
+ movl 24(r5),r0 # r0 = uuc->tu_addr
+2:
+ movzbl 1(r4),r3 # counter to r3 (data->pk_count)
+ movzwl (r4),r1 # first word of checksum (=header)
+ mfpr $IPL,-(sp) # s = spl5();
+ mtpr $0x15,$IPL # to keep disk interrupts out
+ clrw (r2) # disable receiver interrupts
+3: bbc $7,(r2),3b # while ((uuaddr->rcs & UUCS_READY)==0);
+ cvtwb 2(r2),(r0)+ # *buffer = uuaddr->rdb & 0xff
+ sobgtr r3,1f # continue with next byte ...
+ addw2 2(r2),r1 # unless this was the last (odd count)
+ brb 2f
+
+1: bbc $7,(r2),1b # while ((uuaddr->rcs & UUCS_READY)==0);
+ cvtwb 2(r2),(r0)+ # *buffer = uuaddr->rdb & 0xff
+ addw2 -2(r0),r1 # add to checksum..
+2:
+ adwc $0,r1 # get the carry
+ sobgtr r3,3b # loop while r3 > 0
+/*
+ * We're ready to get the checksum
+ */
+1: bbc $7,(r2),1b # while ((uuaddr->rcs & UUCS_READY)==0);
+ cvtwb 2(r2),12(r4) # get first (lower) byte
+1: bbc $7,(r2),1b
+ cvtwb 2(r2),13(r4) # ..and second
+ cmpw 12(r4),r1 # is checksum ok?
+ beql 1f
+ movl $14,16(r5) # uuc->tu_state = TUS_CHKERR
+ brb 2f # exit
+1:
+ movl $11,16(r5) # uuc->tu_state = TUS_GET (ok)
+2:
+ movw $0x40,(r2) # enable receiver interrupts
+ mtpr (sp)+,$IPL # splx(s);
+ rsb # continue processing in uurintr
+#endif
+
+#if defined(VAX750) && !defined(VAX730) && !defined(MRSP)
+/*
+ * Pseudo DMA routine for VAX-11/750 console tu58
+ * (without MRSP)
+ */
+ .align 1
+ .globl tudma
+tudma:
+ movab _tu,r5 # r5 = tu
+ tstl 4(r5) # if (tu.tu_rcnt) {
+ beql 3f
+ mfpr $CSRD,r1 # get data from tu58
+ movb r1,*0(r5) # *tu.tu_rbptr++ = r1
+ incl (r5)
+ decl 4(r5) # if (--tu.tu_rcnt)
+ beql 1f # done
+ tstl (sp)+
+ POPR # registers saved in ubglue.s
+ rei # data handled, done
+1: # }
+ cmpl 16(r5),$8 # if (tu.tu_state != TUS_GETH)
+ beql 2f # let turintr handle it
+3:
+ rsb
+2:
+ movab _tudata,r4 # r4 = tudata
+ cmpb $1,(r4) # if (tudata.pk_flag != TUF_DATA)
+ bneq 3b # let turintr handle it
+1: # else
+ movl 24(r5),r1 # get buffer pointer to r1
+ movzbl 1(r4),r3 # counter to r3
+ movzwl (r4),r0 # first word of checksum (=header)
+ mtpr $0,$CSRS # disable receiver interrupts
+3:
+ bsbw 5f # wait for next byte
+ mfpr $CSRD,r5
+ movb r5,(r1)+ # *buffer = rdb
+ sobgtr r3,1f # continue with next byte ...
+ mfpr $CSRD,r2 # unless this was the last (odd count)
+ brb 2f
+
+1: bsbw 5f # wait for next byte
+ mfpr $CSRD,r5
+ movb r5,(r1)+ # *buffer = rdb
+ movzwl -2(r1),r2 # get the last word back from memory
+2:
+ addw2 r2,r0 # add to checksum..
+ adwc $0,r0 # get the carry
+ sobgtr r3,3b # loop while r3 > 0
+/*
+ * We're ready to get the checksum.
+ */
+ bsbw 5f
+ movab _tudata,r4
+ mfpr $CSRD,r5
+ movb r5,12(r4) # get first (lower) byte
+ bsbw 5f
+ mfpr $CSRD,r5
+ movb r5,13(r4) # ..and second
+ movab _tu,r5
+ cmpw 12(r4),r0 # is checksum ok?
+ beql 1f
+ movl $14,16(r5) # tu.tu_state = TUS_CHKERR
+ brb 2f # exit
+1:
+ movl $11,16(r5) # tu.tu_state = TUS_GET
+2:
+ mtpr $0x40,$CSRS # enable receiver interrupts
+ rsb # continue processing in turintr
+/*
+ * Loop until a new byte is ready from
+ * the tu58, make sure we don't loop forever
+ */
+5:
+ movl $5000,r5 # loop max 5000 times
+1:
+ mfpr $CSRS,r2
+ bbs $7,r2,1f
+ sobgtr r5,1b
+ movab _tu,r5
+ movl $13,16(r5) # return TUS_RCVERR
+ tstl (sp)+ # and let turintr handle it
+1:
+ rsb
+#endif
+
+/*
+ * Stray UNIBUS interrupt catch routines
+ */
+ .data
+ .align 2
+#define PJ PUSHR;jsb _Xustray
+ .globl _catcher
+_catcher:
+ PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ
+ PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ
+ PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ
+ PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ
+ PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ
+ PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ
+ PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ
+ PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ;PJ
+
+ .globl _cold
+_cold: .long 1
+ .data
+
+ .text
+SCBVEC(ustray):
+ blbc _cold,1f
+ mfpr $IPL,r11
+ subl3 $_catcher+8,(sp)+,r10
+ ashl $-1,r10,r10
+ POPR
+ rei
+1:
+ subl3 $_catcher+8,(sp)+,r0
+ ashl $-1,r0,-(sp)
+ mfpr $IPL,-(sp)
+ PRINTF(2, "uba?: stray intr ipl %x vec %o\n")
+ POPR
+ rei
+
+/*
+ * Trap and fault vector routines
+ */
+#define TRAP(a) pushl $T_/**/a; jbr alltraps
+
+/*
+ * Ast delivery (profiling and/or reschedule)
+ */
+SCBVEC(astflt):
+ pushl $0; TRAP(ASTFLT)
+SCBVEC(privinflt):
+ pushl $0; TRAP(PRIVINFLT)
+SCBVEC(xfcflt):
+ pushl $0; TRAP(XFCFLT)
+SCBVEC(resopflt):
+ pushl $0; TRAP(RESOPFLT)
+SCBVEC(resadflt):
+ pushl $0; TRAP(RESADFLT)
+SCBVEC(bptflt):
+ pushl $0; TRAP(BPTFLT)
+SCBVEC(compatflt):
+ TRAP(COMPATFLT);
+SCBVEC(tracep):
+ pushl $0; TRAP(TRCTRAP)
+SCBVEC(arithtrap):
+ TRAP(ARITHTRAP)
+SCBVEC(protflt):
+ blbs (sp)+,segflt
+ TRAP(PROTFLT)
+segflt:
+ TRAP(SEGFLT)
+SCBVEC(transflt):
+ bitl $2,(sp)+
+ bnequ tableflt
+ jsb Fastreclaim # try and avoid pagein
+ TRAP(PAGEFLT)
+tableflt:
+ TRAP(TABLEFLT)
+
+alltraps:
+ mfpr $USP,-(sp); calls $0,_trap; mtpr (sp)+,$USP
+ incl _cnt+V_TRAP
+ addl2 $8,sp # pop type, code
+ mtpr $HIGH,$IPL ## dont go to a higher IPL (GROT)
+ rei
+
+SCBVEC(syscall):
+ pushl $T_SYSCALL
+ mfpr $USP,-(sp); calls $0,_syscall; mtpr (sp)+,$USP
+ incl _cnt+V_SYSCALL
+ addl2 $8,sp # pop type, code
+ mtpr $HIGH,$IPL ## dont go to a higher IPL (GROT)
+ rei
+
+/*
+ * System page table
+ */
+#define vaddr(x) ((((x)-_Sysmap)/4)*NBPG+0x80000000)
+#define SYSMAP(mname, vname, npte) \
+_/**/mname: .globl _/**/mname; \
+ .space npte*4; \
+ .globl _/**/vname; \
+ .set _/**/vname,vaddr(_/**/mname)
+
+ .data
+ .align 2
+ SYSMAP(Sysmap ,Sysbase ,SYSPTSIZE )
+ SYSMAP(UMBAbeg ,umbabeg ,0 )
+ SYSMAP(Nexmap ,nexus ,16*MAXNNEXUS )
+ SYSMAP(UMEMmap ,umem ,512*MAXNUBA )
+ SYSMAP(UMBAend ,umbaend ,0 )
+ SYSMAP(Usrptmap ,usrpt ,USRPTSIZE )
+ SYSMAP(Forkmap ,forkutl ,UPAGES )
+ SYSMAP(Xswapmap ,xswaputl ,UPAGES )
+ SYSMAP(Xswap2map,xswap2utl ,UPAGES )
+ SYSMAP(Swapmap ,swaputl ,UPAGES )
+ SYSMAP(Pushmap ,pushutl ,UPAGES )
+ SYSMAP(Vfmap ,vfutl ,UPAGES )
+ SYSMAP(CMAP1 ,CADDR1 ,1 )
+ SYSMAP(CMAP2 ,CADDR2 ,1 )
+ SYSMAP(mcrmap ,mcr ,1 )
+ SYSMAP(mmap ,vmmap ,1 )
+ SYSMAP(msgbufmap,msgbuf ,MSGBUFPTECNT )
+ SYSMAP(camap ,cabase ,16*CLSIZE )
+ SYSMAP(ecamap ,calimit ,0 )
+ SYSMAP(Mbmap ,mbutl ,NMBCLUSTERS*CLSIZE)
+
+eSysmap:
+ .globl _Syssize
+ .set _Syssize,(eSysmap-_Sysmap)/4
+ .text
+
+/*
+ * Initialization
+ *
+ * ipl 0x1f; mapen 0; scbb, pcbb, sbr, slr, isp, ksp not set
+ */
+ .data
+ .globl _cpu
+_cpu: .long 0
+ .text
+ .globl start
+start:
+ .word 0
+/* set system control block base and system page table params */
+ mtpr $_scb-0x80000000,$SCBB
+ mtpr $_Sysmap-0x80000000,$SBR
+ mtpr $_Syssize,$SLR
+/* double map the kernel into the virtual user addresses of phys mem */
+ mtpr $_Sysmap,$P0BR
+ mtpr $_Syssize,$P0LR
+/* set ISP and get cpu type */
+ movl $_intstack+NISP*NBPG,sp
+ mfpr $SID,r0
+ movab _cpu,r1
+ extzv $24,$8,r0,(r1)
+/* init RPB */
+ movab _rpb,r0
+ movl r0,(r0)+ # rp_selfref
+ movab _doadump,r1
+ movl r1,(r0)+ # rp_dumprout
+ movl $0x1f,r2
+ clrl r3
+1: addl2 (r1)+,r3; sobgtr r2,1b
+ movl r3,(r0)+ # rp_chksum
+/* count up memory */
+ clrl r7
+1: pushl $4; pushl r7; calls $2,_badaddr; tstl r0; bneq 9f
+ acbl $8192*1024-1,$64*1024,r7,1b
+9:
+/* clear memory from kernel bss and pages for proc 0 u. and page table */
+ movab _edata,r6
+ movab _end,r5
+ bbcc $31,r5,0f; 0:
+ addl2 $(UPAGES*NBPG)+NBPG+NBPG,r5
+1: clrq (r6); acbl r5,$8,r6,1b
+/* trap() and syscall() save r0-r11 in the entry mask (per ../h/reg.h) */
+ bisw2 $0x0fff,_trap
+ bisw2 $0x0fff,_syscall
+ calls $0,_fixctlrmask
+/* initialize system page table: scb and int stack writeable */
+ clrl r2
+ movab eintstack,r1; bbcc $31,r1,0f; 0: ashl $-PGSHIFT,r1,r1
+1: bisl3 $PG_V|PG_KW,r2,_Sysmap[r2]; aoblss r1,r2,1b
+/* make rpb read-only as red zone for interrupt stack */
+ bicl2 $PG_PROT,_rpbmap
+ bisl2 $PG_KR,_rpbmap
+/* make kernel text space read-only */
+ movab _etext+NBPG-1,r1; bbcc $31,r1,0f; 0: ashl $-PGSHIFT,r1,r1
+1: bisl3 $PG_V|PG_KR,r2,_Sysmap[r2]; aoblss r1,r2,1b
+/* make kernel data, bss, read-write */
+ movab _end+NBPG-1,r1; bbcc $31,r1,0f; 0:; ashl $-PGSHIFT,r1,r1
+1: bisl3 $PG_V|PG_KW,r2,_Sysmap[r2]; aoblss r1,r2,1b
+/* now go to mapped mode */
+ mtpr $1,$TBIA; mtpr $1,$MAPEN; jmp *$0f; 0:
+/* init mem sizes */
+ ashl $-PGSHIFT,r7,_maxmem
+ movl _maxmem,_physmem
+ movl _maxmem,_freemem
+/* setup context for proc[0] == Scheduler */
+ movab _end+NBPG-1,r6
+ bicl2 $NBPG-1,r6 # make page boundary
+/* setup page table for proc[0] */
+ bbcc $31,r6,0f; 0:
+ ashl $-PGSHIFT,r6,r3 # r3 = btoc(r6)
+ bisl3 $PG_V|PG_KW,r3,_Usrptmap # init first upt entry
+ incl r3
+ movab _usrpt,r0
+ mtpr r0,$TBIS
+/* init p0br, p0lr */
+ mtpr r0,$P0BR
+ mtpr $0,$P0LR
+/* init p1br, p1lr */
+ movab NBPG(r0),r0
+ movl $0x200000-UPAGES,r1
+ mtpr r1,$P1LR
+ mnegl r1,r1
+ moval -4*UPAGES(r0)[r1],r2
+ mtpr r2,$P1BR
+/* setup mapping for UPAGES of _u */
+ movl $UPAGES,r2; movab _u+NBPG*UPAGES,r1; addl2 $UPAGES,r3; jbr 2f
+1: decl r3
+ moval -NBPG(r1),r1;
+ bisl3 $PG_V|PG_URKW,r3,-(r0)
+ mtpr r1,$TBIS
+2: sobgeq r2,1b
+/* initialize (slightly) the pcb */
+ movab UPAGES*NBPG(r1),PCB_KSP(r1)
+ mnegl $1,PCB_ESP(r1)
+ mnegl $1,PCB_SSP(r1)
+ movl r1,PCB_USP(r1)
+ mfpr $P0BR,PCB_P0BR(r1)
+ mfpr $P0LR,PCB_P0LR(r1)
+ movb $4,PCB_P0LR+3(r1) # disable ast
+ mfpr $P1BR,PCB_P1BR(r1)
+ mfpr $P1LR,PCB_P1LR(r1)
+ movl $CLSIZE,PCB_SZPT(r1) # init u.u_pcb.pcb_szpt
+ movl r11,PCB_R11(r1)
+ movab 1f,PCB_PC(r1) # initial pc
+ clrl PCB_PSL(r1) # mode(k,k), ipl=0
+ ashl $PGSHIFT,r3,r3
+ mtpr r3,$PCBB # first pcbb
+/* set regs, p0br, p0lr, p1br, p1lr, astlvl, ksp and change to kernel mode */
+ ldpctx
+ rei
+/* put signal trampoline code in u. area */
+1: movab _u,r0
+ movc3 $16,sigcode,PCB_SIGC(r0)
+/* save reboot flags in global _boothowto */
+ movl r11,_boothowto
+/* calculate firstaddr, and call main() */
+ movab _end+NBPG-1,r0; bbcc $31,r0,0f; 0:; ashl $-PGSHIFT,r0,-(sp)
+ addl2 $UPAGES+1,(sp); calls $1,_main
+/* proc[1] == /etc/init now running here; run icode */
+ pushl $PSL_CURMOD|PSL_PRVMOD; pushl $0; rei
+
+/* signal trampoline code: it is known that this code takes exactly 16 bytes */
+/* in ../vax/pcb.h and in the movc3 above */
+sigcode:
+ calls $4,5(pc) # params pushed by sendsig
+ chmk $139 # cleanup mask and onsigstack
+ rei
+ .word 0x7f # registers 0-6 (6==sp/compat)
+ callg (ap),*16(ap)
+ ret
+
+/*
+ * Primitives
+ */
+
+/*
+ * badaddr(addr, len)
+ * see if access addr with a len type instruction causes a machine check
+ * len is length of access (1=byte, 2=short, 4=long)
+ */
+ .globl _badaddr
+_badaddr:
+ .word 0
+ movl $1,r0
+ mfpr $IPL,r1
+ mtpr $HIGH,$IPL
+ movl _scb+MCKVEC,r2
+ movl 4(ap),r3
+ movl 8(ap),r4
+ movab 9f+INTSTK,_scb+MCKVEC
+ bbc $0,r4,1f; tstb (r3)
+1: bbc $1,r4,1f; tstw (r3)
+1: bbc $2,r4,1f; tstl (r3)
+1: clrl r0 # made it w/o machine checks
+2: movl r2,_scb+MCKVEC
+ mtpr r1,$IPL
+ ret
+ .align 2
+9:
+ casel _cpu,$1,$VAX_MAX
+0:
+ .word 8f-0b # 1 is 780
+ .word 5f-0b # 2 is 750
+ .word 5f-0b # 3 is 730
+5:
+#if defined(VAX750) || defined(VAX730)
+ mtpr $0xf,$MCESR
+#endif
+ brb 1f
+8:
+#if VAX780
+ mtpr $0,$SBIFS
+#endif
+1:
+ addl2 (sp)+,sp # discard mchchk trash
+ movab 2b,(sp)
+ rei
+
+_addupc: .globl _addupc
+ .word 0x0
+ movl 8(ap),r2 # &u.u_prof
+ subl3 8(r2),4(ap),r0 # corrected pc
+ blss 9f
+ extzv $1,$31,r0,r0 # logical right shift
+ extzv $1,$31,12(r2),r1 # ditto for scale
+ emul r1,r0,$0,r0
+ ashq $-14,r0,r0
+ tstl r1
+ bneq 9f
+ bicl2 $1,r0
+ cmpl r0,4(r2) # length
+ bgequ 9f
+ addl2 (r2),r0 # base
+ probew $3,$2,(r0)
+ beql 8f
+ addw2 12(ap),(r0)
+9:
+ ret
+8:
+ clrl 12(r2)
+ ret
+
+_Copyin: .globl _Copyin # <<<massaged for jsb by asm.sed>>>
+ movl 12(sp),r0 # copy length
+ blss ersb
+ movl 4(sp),r1 # copy user address
+ cmpl $NBPG,r0 # probing one page or less ?
+ bgeq cishort # yes
+ciloop:
+ prober $3,$NBPG,(r1) # bytes accessible ?
+ beql ersb # no
+ addl2 $NBPG,r1 # incr user address ptr
+ acbl $NBPG+1,$-NBPG,r0,ciloop # reduce count and loop
+cishort:
+ prober $3,r0,(r1) # bytes accessible ?
+ beql ersb # no
+ movl 4(sp),r1
+ movl 8(sp),r3
+ jbr 2f
+1:
+ subl2 r0,12(sp)
+ movc3 r0,(r1),(r3)
+2:
+ movzwl $65535,r0
+ cmpl 12(sp),r0
+ jgtr 1b
+ movc3 12(sp),(r1),(r3)
+ clrl r0 #redundant
+ rsb
+
+ersb:
+ movl $EFAULT,r0
+ rsb
+
+_Copyout: .globl _Copyout # <<<massaged for jsb by asm.sed >>>
+ movl 12(sp),r0 # get count
+ blss ersb
+ movl 8(sp),r1 # get user address
+ cmpl $NBPG,r0 # can do in one probew?
+ bgeq coshort # yes
+coloop:
+ probew $3,$NBPG,(r1) # bytes accessible?
+ beql ersb # no
+ addl2 $NBPG,r1 # increment user address
+ acbl $NBPG+1,$-NBPG,r0,coloop # reduce count and loop
+coshort:
+ probew $3,r0,(r1) # bytes accessible?
+ beql ersb # no
+ movl 4(sp),r1
+ movl 8(sp),r3
+ jbr 2f
+1:
+ subl2 r0,12(sp)
+ movc3 r0,(r1),(r3)
+2:
+ movzwl $65535,r0
+ cmpl 12(sp),r0
+ jgtr 1b
+ movc3 12(sp),(r1),(r3)
+ clrl r0 #redundant
+ rsb
+
+/*
+ * non-local goto's
+ */
+ .globl _Setjmp
+_Setjmp:
+ movq r6,(r0)+
+ movq r8,(r0)+
+ movq r10,(r0)+
+ movq r12,(r0)+
+ addl3 $4,sp,(r0)+
+ movl (sp),(r0)
+ clrl r0
+ rsb
+
+ .globl _Longjmp
+_Longjmp:
+ movq (r0)+,r6
+ movq (r0)+,r8
+ movq (r0)+,r10
+ movq (r0)+,r12
+ movl (r0)+,r1
+ cmpl r1,sp # must be a pop
+ bgequ lj2
+ pushab lj1
+ calls $1,_panic
+lj2:
+ movl r1,sp
+ jmp *(r0) # ``rsb''
+
+lj1: .asciz "longjmp"
+
+ .globl _whichqs
+ .globl _qs
+ .globl _cnt
+
+ .globl _noproc
+ .comm _noproc,4
+ .globl _runrun
+ .comm _runrun,4
+
+/*
+ * The following primitives use the fancy VAX instructions
+ * much like VMS does. _whichqs tells which of the 32 queues _qs
+ * have processes in them. Setrq puts processes into queues, Remrq
+ * removes them from queues. The running process is on no queue,
+ * other processes are on a queue related to p->p_pri, divided by 4
+ * actually to shrink the 0-127 range of priorities into the 32 available
+ * queues.
+ */
+
+/*
+ * Setrq(p), using fancy VAX instructions.
+ *
+ * Call should be made at spl6(), and p->p_stat should be SRUN
+ */
+ .globl _Setrq # <<<massaged to jsb by "asm.sed">>>
+_Setrq:
+ tstl P_RLINK(r0) ## firewall: p->p_rlink must be 0
+ beql set1 ##
+ pushab set3 ##
+ calls $1,_panic ##
+set1:
+ movzbl P_PRI(r0),r1 # put on queue which is p->p_pri / 4
+ ashl $-2,r1,r1
+ movaq _qs[r1],r2
+ insque (r0),*4(r2) # at end of queue
+ bbss r1,_whichqs,set2 # mark queue non-empty
+set2:
+ rsb
+
+set3: .asciz "setrq"
+
+/*
+ * Remrq(p), using fancy VAX instructions
+ *
+ * Call should be made at spl6().
+ */
+ .globl _Remrq # <<<massaged to jsb by "asm.sed">>>
+_Remrq:
+ movzbl P_PRI(r0),r1
+ ashl $-2,r1,r1
+ bbsc r1,_whichqs,rem1
+ pushab rem3 # it wasn't recorded to be on its q
+ calls $1,_panic
+rem1:
+ remque (r0),r2
+ beql rem2
+ bbss r1,_whichqs,rem2
+rem2:
+ clrl P_RLINK(r0) ## for firewall checking
+ rsb
+
+rem3: .asciz "remrq"
+
+/*
+ * Masterpaddr is the p->p_addr of the running process on the master
+ * processor. When a multiprocessor system, the slave processors will have
+ * an array of slavepaddr's.
+ */
+ .globl _masterpaddr
+ .data
+_masterpaddr:
+ .long 0
+
+ .text
+sw0: .asciz "swtch"
+/*
+ * Swtch(), using fancy VAX instructions
+ */
+ .globl _Swtch
+_Swtch: # <<<massaged to jsb by "asm.sed">>>
+ movl $1,_noproc
+ clrl _runrun
+sw1: ffs $0,$32,_whichqs,r0 # look for non-empty queue
+ bneq sw1a
+ mtpr $0,$IPL # must allow interrupts here
+ jbr sw1 # this is an idle loop!
+sw1a: mtpr $0x18,$IPL # lock out all so _whichqs==_qs
+ bbcc r0,_whichqs,sw1 # proc moved via lbolt interrupt
+ movaq _qs[r0],r1
+ remque *(r1),r2 # r2 = p = highest pri process
+ bvc sw2 # make sure something was there
+sw1b: pushab sw0
+ calls $1,_panic
+sw2: beql sw3
+ insv $1,r0,$1,_whichqs # still more procs in this queue
+sw3:
+ clrl _noproc
+ tstl P_WCHAN(r2) ## firewalls
+ bneq sw1b ##
+ movzbl P_STAT(r2),r3 ##
+ cmpl $SRUN,r3 ##
+ bneq sw1b ##
+ clrl P_RLINK(r2) ##
+ movl *P_ADDR(r2),r0
+ movl r0,_masterpaddr
+ ashl $PGSHIFT,r0,r0 # r0 = pcbb(p)
+/* mfpr $PCBB,r1 # resume of current proc is easy
+ * cmpl r0,r1
+ */ beql res0
+ incl _cnt+V_SWTCH
+/* fall into... */
+
+/*
+ * Resume(pf)
+ */
+ .globl _Resume # <<<massaged to jsb by "asm.sed">>>
+_Resume:
+ mtpr $0x18,$IPL # no interrupts, please
+ movl _CMAP2,_u+PCB_CMAP2 # yech
+ svpctx
+ mtpr r0,$PCBB
+ ldpctx
+ movl _u+PCB_CMAP2,_CMAP2 # yech
+ mtpr $_CADDR2,$TBIS
+res0:
+ tstl _u+PCB_SSWAP
+ beql res1
+ movl _u+PCB_SSWAP,r0
+ clrl _u+PCB_SSWAP
+ movab _Longjmp,(sp)
+ movl $PSL_PRVMOD,4(sp) # ``cheating'' (jfr)
+res1:
+ rei
+
+/*
+ * {fu,su},{byte,word}, all massaged by asm.sed to jsb's
+ */
+ .globl _Fuword
+_Fuword:
+ prober $3,$4,(r0)
+ beql fserr
+ movl (r0),r0
+ rsb
+fserr:
+ mnegl $1,r0
+ rsb
+
+ .globl _Fubyte
+_Fubyte:
+ prober $3,$1,(r0)
+ beql fserr
+ movzbl (r0),r0
+ rsb
+
+ .globl _Suword
+_Suword:
+ probew $3,$4,(r0)
+ beql fserr
+ movl r1,(r0)
+ clrl r0
+ rsb
+
+ .globl _Subyte
+_Subyte:
+ probew $3,$1,(r0)
+ beql fserr
+ movb r1,(r0)
+ clrl r0
+ rsb
+
+/*
+ * Copy 1 relocation unit (NBPG bytes)
+ * from user virtual address to physical address
+ */
+_copyseg: .globl _copyseg
+ .word 0x0
+ bisl3 $PG_V|PG_KW,8(ap),_CMAP2
+ mtpr $_CADDR2,$TBIS # invalidate entry for copy
+ movc3 $NBPG,*4(ap),_CADDR2
+ ret
+
+/*
+ * zero out physical memory
+ * specified in relocation units (NBPG bytes)
+ */
+_clearseg: .globl _clearseg
+ .word 0x0
+ bisl3 $PG_V|PG_KW,4(ap),_CMAP1
+ mtpr $_CADDR1,$TBIS
+ movc5 $0,(sp),$0,$NBPG,_CADDR1
+ ret
+
+/*
+ * Check address.
+ * Given virtual address, byte count, and rw flag
+ * returns 0 on no access.
+ */
+_useracc: .globl _useracc
+ .word 0x0
+ movl 4(ap),r0 # get va
+ movl 8(ap),r1 # count
+ tstl 12(ap) # test for read access ?
+ bneq userar # yes
+ cmpl $NBPG,r1 # can we do it in one probe ?
+ bgeq uaw2 # yes
+uaw1:
+ probew $3,$NBPG,(r0)
+ beql uaerr # no access
+ addl2 $NBPG,r0
+ acbl $NBPG+1,$-NBPG,r1,uaw1
+uaw2:
+ probew $3,r1,(r0)
+ beql uaerr
+ movl $1,r0
+ ret
+
+userar:
+ cmpl $NBPG,r1
+ bgeq uar2
+uar1:
+ prober $3,$NBPG,(r0)
+ beql uaerr
+ addl2 $NBPG,r0
+ acbl $NBPG+1,$-NBPG,r1,uar1
+uar2:
+ prober $3,r1,(r0)
+ beql uaerr
+ movl $1,r0
+ ret
+uaerr:
+ clrl r0
+ ret
+
+/*
+ * kernacc - check for kernel access privileges
+ *
+ * We can't use the probe instruction directly because
+ * it ors together current and previous mode.
+ */
+ .globl _kernacc
+_kernacc:
+ .word 0x0
+ movl 4(ap),r0 # virtual address
+ bbcc $31,r0,kacc1
+ bbs $30,r0,kacerr
+ mfpr $SBR,r2 # address and length of page table (system)
+ bbss $31,r2,0f; 0:
+ mfpr $SLR,r3
+ brb kacc2
+kacc1:
+ bbsc $30,r0,kacc3
+ mfpr $P0BR,r2 # user P0
+ mfpr $P0LR,r3
+ brb kacc2
+kacc3:
+ mfpr $P1BR,r2 # user P1 (stack)
+ mfpr $P1LR,r3
+kacc2:
+ addl3 8(ap),r0,r1 # ending virtual address
+ addl2 $NBPG-1,r1
+ ashl $-PGSHIFT,r0,r0
+ ashl $-PGSHIFT,r1,r1
+ bbs $31,4(ap),kacc6
+ bbc $30,4(ap),kacc6
+ cmpl r0,r3 # user stack
+ blss kacerr # address too low
+ brb kacc4
+kacc6:
+ cmpl r1,r3 # compare last page to P0LR or SLR
+ bgtr kacerr # address too high
+kacc4:
+ movl (r2)[r0],r3
+ bbc $31,4(ap),kacc4a
+ bbc $31,r3,kacerr # valid bit is off
+kacc4a:
+ cmpzv $27,$4,r3,$1 # check protection code
+ bleq kacerr # no access allowed
+ tstb 12(ap)
+ bneq kacc5 # only check read access
+ cmpzv $27,$2,r3,$3 # check low 2 bits of prot code
+ beql kacerr # no write access
+kacc5:
+ aoblss r1,r0,kacc4 # next page
+ movl $1,r0 # no errors
+ ret
+kacerr:
+ clrl r0 # error
+ ret
+/*
+ * Extracted and unrolled most common case of pagein (hopefully):
+ * resident and not on free list (reclaim of page is purely
+ * for the purpose of simulating a reference bit)
+ *
+ * Built in constants:
+ * CLSIZE of 2, USRSTACK of 0x7ffff000, any bit fields
+ * in pte's or the core map
+ */
+ .text
+ .globl Fastreclaim
+Fastreclaim:
+ PUSHR
+ extzv $9,$23,28(sp),r3 # virtual address
+ bicl2 $1,r3 # v = clbase(btop(virtaddr));
+ movl _u+U_PROCP,r5 # p = u.u_procp
+ # from vtopte(p, v) ...
+ cmpl r3,P_TSIZE(r5)
+ jgequ 2f # if (isatsv(p, v)) {
+ ashl $2,r3,r4
+ addl2 P_P0BR(r5),r4 # tptopte(p, vtotp(p, v));
+ movl $1,r2 # type = CTEXT;
+ jbr 3f
+2:
+ subl3 P_SSIZE(r5),$0x3ffff8,r0
+ cmpl r3,r0
+ jgequ 2f # } else if (isadsv(p, v)) {
+ ashl $2,r3,r4
+ addl2 P_P0BR(r5),r4 # dptopte(p, vtodp(p, v));
+ clrl r2 # type = !CTEXT;
+ jbr 3f
+2:
+ cvtwl P_SZPT(r5),r4 # } else (isassv(p, v)) {
+ ashl $7,r4,r4
+ subl2 $(0x3ffff8+UPAGES),r4
+ addl2 r3,r4
+ ashl $2,r4,r4
+ addl2 P_P0BR(r5),r4 # sptopte(p, vtosp(p, v));
+ clrl r2 # type = !CTEXT;
+3: # }
+ bitb $0x82,3(r4)
+ beql 2f # if (pte->pg_v || pte->pg_fod)
+ POPR; rsb # let pagein handle it
+2:
+ bicl3 $0xffe00000,(r4),r0
+ jneq 2f # if (pte->pg_pfnum == 0)
+ POPR; rsb # let pagein handle it
+2:
+ subl2 _firstfree,r0
+ ashl $-1,r0,r0
+ incl r0 # pgtocm(pte->pg_pfnum)
+ mull2 $12,r0
+ addl2 _cmap,r0 # &cmap[pgtocm(pte->pg_pfnum)]
+ tstl r2
+ jeql 2f # if (type == CTEXT &&
+ jbc $29,4(r0),2f # c_intrans)
+ POPR; rsb # let pagein handle it
+2:
+ jbc $30,4(r0),2f # if (c_free)
+ POPR; rsb # let pagein handle it
+2:
+ bisb2 $0x80,3(r4) # pte->pg_v = 1;
+ jbc $26,4(r4),2f # if (anycl(pte, pg_m)
+ bisb2 $0x04,3(r4) # pte->pg_m = 1;
+2:
+ bicw3 $0x7f,2(r4),r0
+ bicw3 $0xff80,6(r4),r1
+ bisw3 r0,r1,6(r4) # distcl(pte);
+ ashl $PGSHIFT,r3,r0
+ mtpr r0,$TBIS
+ addl2 $NBPG,r0
+ mtpr r0,$TBIS # tbiscl(v);
+ tstl r2
+ jeql 2f # if (type == CTEXT)
+ movl P_TEXTP(r5),r0
+ movl X_CADDR(r0),r5 # for (p = p->p_textp->x_caddr; p; ) {
+ jeql 2f
+ ashl $2,r3,r3
+3:
+ addl3 P_P0BR(r5),r3,r0 # tpte = tptopte(p, tp);
+ bisb2 $1,P_FLAG+3(r5) # p->p_flag |= SPTECHG;
+ movl (r4),(r0)+ # for (i = 0; i < CLSIZE; i++)
+ movl 4(r4),(r0) # tpte[i] = pte[i];
+ movl P_XLINK(r5),r5 # p = p->p_xlink;
+ jneq 3b # }
+2: # collect a few statistics...
+ incl _u+U_RU+RU_MINFLT # u.u_ru.ru_minflt++;
+ moval _cnt,r0
+ incl V_FAULTS(r0) # cnt.v_faults++;
+ incl V_PGREC(r0) # cnt.v_pgrec++;
+ incl V_FASTPGREC(r0) # cnt.v_fastpgrec++;
+ incl V_TRAP(r0) # cnt.v_trap++;
+ POPR
+ addl2 $8,sp # pop pc, code
+ mtpr $HIGH,$IPL ## dont go to a higher IPL (GROT)
+ rei
+ .globl _Xrkintr0
+ .align 2
+_Xrkintr0:
+ pushr $0x3f
+ pushl $0
+ calls $1,_rkintr
+ popr $0x3f
+#if defined(VAX750) || defined(VAX730)
+ incl _cnt+V_INTR
+#endif
+ rei
+
+ .globl _Xtmintr0
+ .align 2
+_Xtmintr0:
+ pushr $0x3f
+ pushl $0
+ calls $1,_tmintr
+ popr $0x3f
+#if defined(VAX750) || defined(VAX730)
+ incl _cnt+V_INTR
+#endif
+ rei
+
+ .globl _Xutintr0
+ .align 2
+_Xutintr0:
+ pushr $0x3f
+ pushl $0
+ calls $1,_utintr
+ popr $0x3f
+#if defined(VAX750) || defined(VAX730)
+ incl _cnt+V_INTR
+#endif
+ rei
+
+ .globl _Xupintr0
+ .align 2
+_Xupintr0:
+ pushr $0x3f
+ pushl $0
+ calls $1,_upintr
+ popr $0x3f
+#if defined(VAX750) || defined(VAX730)
+ incl _cnt+V_INTR
+#endif
+ rei
+
+ .globl _Xudintr0
+ .align 2
+_Xudintr0:
+ pushr $0x3f
+ pushl $0
+ calls $1,_udintr
+ popr $0x3f
+#if defined(VAX750) || defined(VAX730)
+ incl _cnt+V_INTR
+#endif
+ rei
+
+ .globl _Xidcintr0
+ .align 2
+_Xidcintr0:
+ pushr $0x3f
+ pushl $0
+ calls $1,_idcintr
+ popr $0x3f
+#if defined(VAX750) || defined(VAX730)
+ incl _cnt+V_INTR
+#endif
+ rei
+
+ .globl _Xrlintr0
+ .align 2
+_Xrlintr0:
+ pushr $0x3f
+ pushl $0
+ calls $1,_rlintr
+ popr $0x3f
+#if defined(VAX750) || defined(VAX730)
+ incl _cnt+V_INTR
+#endif
+ rei
+
+ .globl _Xdhrint0
+ .align 2
+_Xdhrint0:
+ pushr $0x3f
+ pushl $0
+ calls $1,_dhrint
+ popr $0x3f
+#if defined(VAX750) || defined(VAX730)
+ incl _cnt+V_INTR
+#endif
+ rei
+
+ .globl _Xdhxint0
+ .align 2
+_Xdhxint0:
+ pushr $0x3f
+ pushl $0
+ calls $1,_dhxint
+ popr $0x3f
+#if defined(VAX750) || defined(VAX730)
+ incl _cnt+V_INTR
+#endif
+ rei
+
+ .globl _Xdmintr0
+ .align 2
+_Xdmintr0:
+ pushr $0x3f
+ pushl $0
+ calls $1,_dmintr
+ popr $0x3f
+#if defined(VAX750) || defined(VAX730)
+ incl _cnt+V_INTR
+#endif
+ rei
+
+ .globl _Xdhrint1
+ .align 2
+_Xdhrint1:
+ pushr $0x3f
+ pushl $1
+ calls $1,_dhrint
+ popr $0x3f
+#if defined(VAX750) || defined(VAX730)
+ incl _cnt+V_INTR
+#endif
+ rei
+
+ .globl _Xdhxint1
+ .align 2
+_Xdhxint1:
+ pushr $0x3f
+ pushl $1
+ calls $1,_dhxint
+ popr $0x3f
+#if defined(VAX750) || defined(VAX730)
+ incl _cnt+V_INTR
+#endif
+ rei
+
+ .globl _Xdzrint0
+ .align 2
+_Xdzrint0:
+ pushr $0x3f
+ pushl $0
+ calls $1,_dzrint
+ popr $0x3f
+#if defined(VAX750) || defined(VAX730)
+ incl _cnt+V_INTR
+#endif
+ rei
+
+ .globl _Xdzxint0
+ .align 2
+_Xdzxint0:
+ pushr $0x3f
+ movl $0,r0
+ jmp dzdma
+
+ .globl _Xdzrint1
+ .align 2
+_Xdzrint1:
+ pushr $0x3f
+ pushl $1
+ calls $1,_dzrint
+ popr $0x3f
+#if defined(VAX750) || defined(VAX730)
+ incl _cnt+V_INTR
+#endif
+ rei
+
+ .globl _Xdzxint1
+ .align 2
+_Xdzxint1:
+ pushr $0x3f
+ movl $1,r0
+ jmp dzdma
+
+ .globl _Xdzrint2
+ .align 2
+_Xdzrint2:
+ pushr $0x3f
+ pushl $2
+ calls $1,_dzrint
+ popr $0x3f
+#if defined(VAX750) || defined(VAX730)
+ incl _cnt+V_INTR
+#endif
+ rei
+
+ .globl _Xdzxint2
+ .align 2
+_Xdzxint2:
+ pushr $0x3f
+ movl $2,r0
+ jmp dzdma
+
+ .globl _Xdzrint3
+ .align 2
+_Xdzrint3:
+ pushr $0x3f
+ pushl $3
+ calls $1,_dzrint
+ popr $0x3f
+#if defined(VAX750) || defined(VAX730)
+ incl _cnt+V_INTR
+#endif
+ rei
+
+ .globl _Xdzxint3
+ .align 2
+_Xdzxint3:
+ pushr $0x3f
+ movl $3,r0
+ jmp dzdma
+
+ .globl _Xdzrint4
+ .align 2
+_Xdzrint4:
+ pushr $0x3f
+ pushl $4
+ calls $1,_dzrint
+ popr $0x3f
+#if defined(VAX750) || defined(VAX730)
+ incl _cnt+V_INTR
+#endif
+ rei
+
+ .globl _Xdzxint4
+ .align 2
+_Xdzxint4:
+ pushr $0x3f
+ movl $4,r0
+ jmp dzdma
+
+ .globl _Xdzrint5
+ .align 2
+_Xdzrint5:
+ pushr $0x3f
+ pushl $5
+ calls $1,_dzrint
+ popr $0x3f
+#if defined(VAX750) || defined(VAX730)
+ incl _cnt+V_INTR
+#endif
+ rei
+
+ .globl _Xdzxint5
+ .align 2
+_Xdzxint5:
+ pushr $0x3f
+ movl $5,r0
+ jmp dzdma
+
+ .globl _Xdzrint6
+ .align 2
+_Xdzrint6:
+ pushr $0x3f
+ pushl $6
+ calls $1,_dzrint
+ popr $0x3f
+#if defined(VAX750) || defined(VAX730)
+ incl _cnt+V_INTR
+#endif
+ rei
+
+ .globl _Xdzxint6
+ .align 2
+_Xdzxint6:
+ pushr $0x3f
+ movl $6,r0
+ jmp dzdma
+
+ .globl _Xdzrint7
+ .align 2
+_Xdzrint7:
+ pushr $0x3f
+ pushl $7
+ calls $1,_dzrint
+ popr $0x3f
+#if defined(VAX750) || defined(VAX730)
+ incl _cnt+V_INTR
+#endif
+ rei
+
+ .globl _Xdzxint7
+ .align 2
+_Xdzxint7:
+ pushr $0x3f
+ movl $7,r0
+ jmp dzdma
+
+ .globl _Xtsintr0
+ .align 2
+_Xtsintr0:
+ pushr $0x3f
+ pushl $0
+ calls $1,_tsintr
+ popr $0x3f
+#if defined(VAX750) || defined(VAX730)
+ incl _cnt+V_INTR
+#endif
+ rei
+
+ .globl _Xdmfsrint0
+ .align 2
+_Xdmfsrint0:
+ pushr $0x3f
+ pushl $0
+ calls $1,_dmfsrint
+ popr $0x3f
+#if defined(VAX750) || defined(VAX730)
+ incl _cnt+V_INTR
+#endif
+ rei
+
+ .globl _Xdmfsxint0
+ .align 2
+_Xdmfsxint0:
+ pushr $0x3f
+ pushl $0
+ calls $1,_dmfsxint
+ popr $0x3f
+#if defined(VAX750) || defined(VAX730)
+ incl _cnt+V_INTR
+#endif
+ rei
+
+ .globl _Xdmfdaint0
+ .align 2
+_Xdmfdaint0:
+ pushr $0x3f
+ pushl $0
+ calls $1,_dmfdaint
+ popr $0x3f
+#if defined(VAX750) || defined(VAX730)
+ incl _cnt+V_INTR
+#endif
+ rei
+
+ .globl _Xdmfdbint0
+ .align 2
+_Xdmfdbint0:
+ pushr $0x3f
+ pushl $0
+ calls $1,_dmfdbint
+ popr $0x3f
+#if defined(VAX750) || defined(VAX730)
+ incl _cnt+V_INTR
+#endif
+ rei
+
+ .globl _Xdmfrint0
+ .align 2
+_Xdmfrint0:
+ pushr $0x3f
+ pushl $0
+ calls $1,_dmfrint
+ popr $0x3f
+#if defined(VAX750) || defined(VAX730)
+ incl _cnt+V_INTR
+#endif
+ rei
+
+ .globl _Xdmfxint0
+ .align 2
+_Xdmfxint0:
+ pushr $0x3f
+ pushl $0
+ calls $1,_dmfxint
+ popr $0x3f
+#if defined(VAX750) || defined(VAX730)
+ incl _cnt+V_INTR
+#endif
+ rei
+
+ .globl _Xdmflint0
+ .align 2
+_Xdmflint0:
+ pushr $0x3f
+ pushl $0
+ calls $1,_dmflint
+ popr $0x3f
+#if defined(VAX750) || defined(VAX730)
+ incl _cnt+V_INTR
+#endif
+ rei
+
+ .globl _Xlpintr0
+ .align 2
+_Xlpintr0:
+ pushr $0x3f
+ pushl $0
+ calls $1,_lpintr
+ popr $0x3f
+#if defined(VAX750) || defined(VAX730)
+ incl _cnt+V_INTR
+#endif
+ rei
+