.NOBIN .TOC "PAGE FAIL REFIL LOGIC" ;WHEN THE CPU CAN NOT COMPLETE A MEMORY REFERENCE BECAUSE THE PAGE ; TABLE DOES NOT CONTAIN VALID INFORMATION FOR THE VIRTUAL PAGE INVOLVED ; THE HARDWARE CALLS THIS ROUTINE TO RELOAD THE HARDWARE PAGE TABLE. ; ;THIS CODE WILL EITHER DO THE RELOAD OR GENERATE A PAGE FAIL FOR THE ; SOFTWARE. THE INFORMATION LOADED CONSISTS OF THE PHYSICAL PAGE NUMBER, ; THE CACHE ENABLE BIT AND THE WRITE ENABLE BIT. ;THIS LOGIC USES MANY VARIABLES. THEY ARE DESCRIBED BRIEFLY HERE: ;THING WHERE KEPT USE ;OLD VMA WORKSPACE WORD 210 SAVES VMA ;OLD AR WORKSPACE WORD 211 SAVES AR ;OLD ARX WORKSPACE WORD 212 SAVES ARX ;OLD BR WORKSPACE WORD 213 SAVES BR ;OLD BRX WORKSPACE WORD 214 SAVES BRX ;KL PAGING BIT EBR BIT 1 (IN 2901) INDICATES KL STYLE (TOPS-20) PAGING ; INSTEAD OF KI STYLE (TOPS-10 AND DIAGNOSTIC) ; MODE PAGING ;W BIT FLG BIT 4 PAGE CAN BE WRITTEN ;C BIT FLG BIT 6 DATA IN THIS PAGE MAY BE PUT ; INTO CACHE ;PI CYCLE FLG BIT 5 STORING OLD PC DURING PI ;MAP FLAG FLG BIT 18 MAP INSTRUCTION IN PROGRESS ;CLEANUP CODE FLG BITS 32-35 WHAT TO DO SO INSTRUCTION MAY BE ; RESTARTED ;SPT BASE WORKSPACE WORD 215 ADDRESS OF SHARED-POINTER-TABLE ;CST BASE WORKSPACE WORD 216 ADDRESS OF CORE-STATUS-TABLE ;CST MASK WORKSPACE WORD 217 BITS TO KEEP ON CST UPDATE ;CST DATA (PUR) WORKSPACE WORD 220 BITS TO SET ON CST UPDATE ;PAGE TABLE ADDRESS AR WHERE THIS PAGE TABLE IS LOCATED ;PHYSICAL PAGE # (PPN) AR RESULT OF THIS PROCESS ;CST ENTRY AR CORE STATUS TABLE ENTRY ;SPT ENTRY AR WORD FROM SPT ;PAGE TABLE ENTRY AR WORD FROM PT ;PAGE NUMBER BR INDEX INTO CURENT PAGE TABLE ;PAGE FAIL WORD BRX WHAT HAPPENED (ALSO MAP RESULT) .IF/INHCST SKIP NO CST "AD/D,DBUS/RAM,RAMADR/#,WORK/CBR,DT/4T,SKIP/ADEQ0" .ENDIF/INHCST ; ; ; ; KL10 PAGING - WORD FORMATS ; ;Section Pointer ; ;The section pointer is found in the user or exec section table. ;(Part of UPT or EPT.) ; ;Section pointer provides (via the SPT) the physical address of ;the PAGE TABLE for the given section. ; ; Code: 0 No-access (trap) ; 1 Immediate ; 2 Share ; 3 Indirect ; 4-7 Unused, reserved ; ; 0 1 2 3 4 5 6 18 35 ; +----+-+-+-+-+---------+-------------------------+ ; !CODE!P!W! !C!/////////! PAGE TABLE IDENTIFIER ! ; !010 ! ! ! ! !/////////! (SPT INDEX) ! ; +----+-+-+-+-+---------+-------------------------+ ; ; NORMAL SECTION POINTER (Code = 2) ; ; 0 2 3 4 5 6 9 18 35 ; +----+-+-+-+-+---+-----------+------------------------+ ; !CODE!P!W! !C!///!SECTION !SECTION TABLE IDENTIFIER! ; !011 ! ! ! ! !///!TABLE INDEX! (SPT INDEX) ! ; +----+-+-+-+-+---+-----------+------------------------+ ; ; INDIRECT SECTION POINTER (Code = 3) ;PAGE POINTERS ; ;FOUND IN PAGE TABLES ; ; 0 1 2 3 4 5 6 12 35 ; +----+-+-+-+-+----+------------------------------+ ; !CODE!P!W! !C!////! PHYSICAL ADDRESS OF PAGE ! ; !001 ! ! ! ! !////! ! ; +----+-+-+-+-+----+------------------------------+ ; ; IMMEDIATE POINTER (code field = 1) ; ; B12-35 give PHYSICAL ADDRESS OF PAGE ; if B12-17 >< 0, page not in core-trap ; if B12-17 = 0, B23-35 give CORE PAGE ; NUMBER of page, B18-22 MBZ ; ; ; ; ; ; 0 2 3 6 18 35 ; +-----+-------+---------+------------------------+ ; !CODE !SAME AS!/////////! SPT INDEX ! ; !010 ! IMMED.!/////////! ! ; +-----+-------+---------+------------------------+ ; ; SHARED POINTER (code field = 2) ; ; B18-35 Give SPT INDEX (SPTX). SPTX + SPT BASE ; ADDRESS = physical core address of word ; holding physical address of page. ; 0 1 2 3 6 9 17 18 35 ; +----+--------+---+-------+----------------------+ ; !CODE!SAME AS !///! PAGE ! PAGE TABLE IDENTIFIER! ; !011 ! IMMED. !///!NUMBER ! (SPT INDEX) ! ; +----+--------+---+-------+----------------------+ ; ; INDIRECT POINTER (code field = 3) ; ; This pointer type causes another pointer to be fetched ; and interpreted. The new pointer is found in word N ; (B9-17) of the page addressed by C(SPT + SPTX). ; ; ; ; SPT ENTRY ; ; Found in the SPT, i.e., when fetching C(SPT +SPTX) ; ; 12 35 ; +--------------------+---------------------------+ ; !////////////////////! PHYSICAL ADDRESS OF PAGE ! ; !////////////////////! OR PAGE TABLE ! ; +--------------------+---------------------------+ ; ; B12-35 Give PHYSICAL ADDRESS of page. ; ; The base address (physical core address) of the SPT ; resides in one AC of the reserved AC block. ;PHYSICAL STORAGE ADDRESS ; ;Found in B12-35 of IMMEDIATE POINTERS and SPT ENTRIES. ; ; 12 17 18 23 35 ; +---------+----+-----------------+ ; ! !MBZ ! CORE PAGE NUMBER! ; ! ! ! IF B12-17 = 0 ! ; +---------+----+-----------------+ ; ; If B12-17 = 0, then B23-35 are CORE PAGE NUMBER (i.e., ; B14-26 of physical core address) of page and B18-22 ; MBZ. If B12-17 >< 0, then address is not core and ; pager traps. ; ; ; ;CORE STATUS TABLE ENTRY ; ;Found when fetching C(CBR + CORE PAGENO) ; ; 0 5 32 34 35 ; +-------+-------------------------------+------+-+ ; ! CODE ! ! !M! ; +-------+-------------------------------+------+-+ ; ; B0-5 are code field: ; ; 0 - unavailable, trap ; ; 1-77 - available ; ; ; ; B32-34 reserved for future hardware specification. ; ; B35 is "modified" bit, set on any write ref to page. ;QUANTITIES IN HARDWARE REGISTERS ; ;SPT SPT Base Register ; ; 14 35 ; +--------------------------------+ ; ! PHYSICAL CORE WORD ADDRESS ! ; +--------------------------------+ ; ;CBR CST Base Register ; ; 14 35 ; +--------------------------------+ ; ! PHYSICAL CORE WORD ADDRESS ! ; +--------------------------------+ ; ;CSTMSK CST Update Mask ; ; 0 32 35 ; +------------------------------------------+---+-+ ; ! MASK !111!1! ; +------------------------------------------+---+-+ ; ; ANDed with CST word during update ; ;(B32-35 must be all 1's to preserve existing CST information) ; ;CSTDATA CST Update Data ; ; 0 32 34 35 ; +------------------------------------------+---+-+ ; ! DATA !000!0! ; +------------------------------------------+---+-+ ; ; IORed with CST word during update ; ;(B32-35 must be all 0's to preserve existing CST information) ; ;All unspecified bits and fields are reserved for future ;specification by DEC. ; .BIN .DCODE 257: IOT, AC, J/MAP .UCODE 1553: MAP: [AR]_[AR].OR.#, ;ASSUME PHYSICAL REF #/160000, ;FAKE ANSWER HOLD RIGHT ; .. [BRX]_VMA ;PUT VMA AND FLAGS IN BRX [BRX]_[BRX].AND.#, ;JUST KEEP USER BIT #/400000, HOLD RIGHT ; .. WORK[SV.VMA]_[BRX] ;SAVE IN WORKSPACE [BR]_WORK[APR] ;GET APR FLAGS TR [BR], #/030000 ;PAGING ENABLED? =0 STATE_[MAP], J/PFMAP ;YES--DO REAL MAP AC_[AR], NEXT INST ;NO--RETURN VIRTUAL ADDRESS ;HARDWARE COMES HERE ON PAGE TABLE NOT VALID (OR INTERRUPT) WHEN ; STARTING A MEMORY REFERENCE. MICOWORD ADDRESS OF INSTRUCTION DOING ; MEM WAIT IS SAVED ON THE STACK. 3777: PAGE-FAIL: WORK[SV.AR]_[AR] ITRAP: WORK[SV.BRX]_[BRX] [BRX]_VMA WORK[SV.VMA]_[BRX] WORK[SV.ARX]_[ARX], SKIP IRPT ;SEE IF INTERRUPT (SAVE DISPATCH) =0000 PFD: DBM/PF DISP, DBUS/DBM, ;BRING CODE TO 2901'S AD/D, DEST/PASS, 4T, ;PUT ON DP 18-21 DISP/DP LEFT, J/PFD ;DISPATCH ON IT =0001 ;(1) INTERRUPT WORK[SV.BR]_[BR], J/PFPI1 =0011 ;(3) BAD DATA FROM MEMORY [BRX]_IO DATA, ;GET THE BAD DATA AD PARITY OK/0, ; DO NOT LOOK AT PARITY J/BADDATA ;SAVE IN AC BLK 7 =0101 ;(5) NXM ERROR [BRX]_[370000] XWD 0, J/HARD =0111 ;(7) NXM & BAD DATA [BRX]_[370000] XWD 0, J/HARD =1000 ;(10) WRITE VIOLATION WORK[SV.BR]_[BR], J/PFMAP =1001 ;[123] (11) 1 ms timer and movsrj WORK[SV.BR]_[BR], J/PFPI1 =1010 ;(12) PAGE NOT VALID WORK[SV.BR]_[BR], J/PFMAP =1011 ;(13) EXEC/USER MISMATCH WORK[SV.BR]_[BR], J/PFMAP = BADDATA: WORK[BADW0]_[BRX] ;SAVE BAD WORD WORK[BADW1]_[BRX] ;AGAIN [BRX]_[360000] XWD 0, J/HARD ;WE HAVE SAVED AR, ARX, BR AND BRX. WE MERGE IN HERE FROM MAP ; INSTRUCTION, SAVE THE VMA AND START THE PAGE FAIL WORD. PFMAP: ABORT MEM CYCLE ;CLEAR PAGE FAIL [FLG]_[FLG].OR.#, ;PRESET W AND C TO 1 FLG.W/1, FLG.C/1, ;BITS INVOLVED HOLD RIGHT ;LEAVE RH ALONE TL [BRX], WRITE TEST/1 ;IS THIS A WRITE TEST? =0 [BRX]_[BRX].OR.#, #/10000, HOLD RIGHT ;YES--TURN INTO WRITE REF [BRX]_[BRX].AND.#, ;START PAGE FAIL WORD #/411000, ;SAVE 3 INTERESTING BITS HOLD RIGHT ;SAVE VIRTUAL ADDRESS ;USER ADDR (400000) ;WRITE REF (010000) ;PAGED REF (001000) [BRX]_[BRX].XOR.#, ;FIX BIT 8 #/1000, HOLD RIGHT [BR]_[BRX], ;COPY VIRTUAL ADDRESS SC_7 ;PREPARE TO SHIFT 9 PLACES =0 PF25: [BR]_[BR]*.5, ;RIGHT ADJUST PAGE # STEP SC, ;COUNT SHIFT STEPS J/PF25 ;LOOP FOR 9 [BR]_[BR].AND.# CLR LH, ;MASK TO 9 BITS #/777 ; .. .IF/KLPAGE .IF/KIPAGE TL [EBR], ;KI MODE REFILL? #/40 ;FLAG BIT =0 .ENDIF/KIPAGE READ [BRX], ;USER REF? (KL MODE) SKIP DP0, ; .. J/PF30 ;CONTINUE AT PF30 .ENDIF/KLPAGE .IF/KIPAGE [ARX]_[BR]*.5, ;KI10 MODE REFILL J/KIFILL ;GO HANDLE EASY CASE .ENDIF/KIPAGE .IF/KLPAGE ;HERE IN TOPS-20 MODE ;PICK UP CORRECT SECTION POINTER =0 PF30: [ARX]_WORK[PTA.E], ;EXEC MODE SKIP AD.EQ.0, 4T, ;SEE IF VALID J/PF35 ;CONTINUE BELOW [ARX]_WORK[PTA.U], ;USER MODE SKIP AD.EQ.0, 4T ;SEE IF VALID =0 VMA_[ARX]+[BR], ;POINTER VALID VMA PHYSICAL READ, ;START MEMORY J/PF77 ;CONTINUE BELOW [AR]_[UBR]+#, 3T, ;USER MODE #/540, ;OFFSET TO UPT J/PF40 ;GO GET POINTER =0 PF35: VMA_[ARX]+[BR], ;POINTER VALID VMA PHYSICAL READ, ;START MEMORY J/PF77 ;CONTINUE BELOW [AR]_[EBR]+#, 3T, ;EXEC MODE #/540 ;OFFSET TO EPT PF40: VMA_[AR], ;LOAD THE VMA START READ, ;START THE MEMORY CRANKING VMA PHYSICAL ;ABSOLUTE ADDRESS MEM READ, ;WAIT FOR MEMORY [AR]_MEM ;POINT POINTER IN AR ;LOOK AT SECTION POINTER AND DISPATCH ON TYPE =000 PF45: SC_7, ;FETCH SECTION 0 POINTER CALL [SETPTR] ;FIGURE OUT POINTER TYPE SECIMM: TL [AR], ;IMMEDIATE POINTER #/77, ;TEST FOR 12-17 = 0 J/PF50 ;CONTINUE AT PF50 [AR]_[AR]+WORK[SBR], ;SHARED SECTION J/SECSHR ;GO FETCH POINTER FROM SPT [AR]_[AR]+WORK[SBR], ;INDIRECT SECTION POINTER CALL [RDPT] ;GO FETCH SPT ENTRY =111 TL [AR], ;12 TO 17 = 0? #/77 ; .. = =0 PAGE FAIL TRAP ;NO [AR]_[AR]*2, ;FIRST SHIFT STEP SC ;SC WAS LOADED AT PF45 =0*0 PF60: [AR]_[AR]*2, ;CONVERT TO ADDRESS OF STEP SC, ; SECTION TABLE J/PF60 CALL [RDPT] ;READ SECTION TABLE =1*1 J/PF45 ;TRY AGAIN = ;STILL .IF/KLPAGE ;HERE FOR SHARED SECTION. AR GETS THE ADDRESS OF PAGE TABLE =0** SECSHR: CALL [RDPT] ;READ WORD FROM SPT TL [AR], #/77 ;TEST FOR BITS 12-17 = 0 ;HERE WITH ADDRESS OF PAGE TABLE IN AR AND SKIP ON ; BITS 12 THRU 17 EQUAL TO ZERO =0 PF50: PAGE FAIL TRAP ;BITS 12-17 .NE. 0 [ARX]_[AR].AND.# CLR LH, ;PAGE NUMBER OF PAGE TABLE #/3777 ;11 BIT PHYSICAL PAGE # .IFNOT/NOCST =0* [AR]_[ARX], ;COPY ADDRESS CALL [UPCST] ;UPDATE CST0 PF70: [AR]_[AR].OR.WORK[PUR] ;PUT IN NEW AGE AND ; USE BITS .IFNOT/INHCST =0** START NO TEST WRITE, ;START MEMORY WRITE CALL [IBPX] ;GO STORE IN MEMORY .ENDIF/INHCST .IF/INHCST =0** SKIP NO CST, ;SEE IF A CST CALL [WRCST] ;AND GO WRITE IN MEMORY .ENDIF/INHCST SC_7 ;THIS CAN BE BUMMED =0 PF75: [ARX]_[ARX]*2, ;CONVERT PAGE NUMBER TO STEP SC, ; PAGE ADDRESS J/PF75 ;LOOP OVER 9 STEPS ;STILL .IF/KLPAGE ;WE NOW HAVE THE ADDRESS OF THE PAGE TABLE ENTRY. GO ; READ IT AND START ANALYSIS ;IF WE ARE HERE FOR THE FIRST TIME FOR THE USER OR EXEC SAVE THE ; ADDRESS OF THE PAGE TABLE IN PTA.E OR PTA.U SO THAT WE DO NOT ; HAVE TO DO THE SECTION LOOKUP EVERY TIME. READ [BRX], SKIP DP0 ;USER OR EXEC REF? =000 [AR]_WORK[PTA.E], ;EXEC MODE SKIP AD.EQ.0, 4T, ;SEE IF SET YET CALL [SHDREM] ;SHOULD WE REMEMBER PTR [AR]_WORK[PTA.U], ;USER MODE SKIP AD.EQ.0, 4T, ;SEE IF SET YET CALL [SHDREM] ;SHOULD WE REMEMBER PTR WORK[PTA.E]_[ARX], ;SAVE FOR EXEC J/PF76 ;CONTINUE BELOW WORK[PTA.U]_[ARX], ;SAVE FOR USER J/PF76 ;CONTINUE BELOW =111 PF76: VMA_[ARX]+[BR], ;READ PAGE POINTER START READ, VMA PHYSICAL = =00 PF77: MEM READ, ;START ANALYSIS OF POINTER [AR]_MEM, CALL [SETPTR] PTRIMM: TL [AR], ;IMMEDIATE POINTER #/77, ;CHECK FOR BITS 0-5 J/PF80 ;GO TO PF80 [AR]_[AR]+WORK[SBR], ;SHARED POINTER J/PTRSHR ;GO TO READ SPT ;STILL .IF/KLPAGE ;INDIRECT POINTER. CHANGE PAGE # AND LOOK FOR PAGE TABLE PTRIND: [BR]_[AR] SWAP, ;PUT IN RIGHT HALF SKIP/-1 MS ;DID CLOCK GO OFF =0 WORK[SV.AR1]_[AR], ;YES--UPDATE CLOCK J/PFTICK ; .. [BR]_[BR].AND.# CLR LH, ;UPDATE PAGE # AND RESTART #/777, ;MASK FOR PAGE # SKIP IRPT ;SEE IF THIS IS A LOOP =0 [AR]_[AR].AND.#, ;CHANGE INDIRECT POINTER #/277000, ; INTO SHARE POINTER HOLD RIGHT, ; .. J/PF45 ;GO BACK AND TRY AGAIN PAGE FAIL TRAP ;POINTER LOOP =0** PTRSHR: CALL [RDPT] ;GO LOOK AT POINTER TL [AR], ;BITS 12-17 .EQ. 0? #/77 ;HERE WITH FINAL POINTER. SKIP IF 12-17 NOT EQUAL TO ZERO .IFNOT/NOCST =00 PF80: PAGE FAIL TRAP ;NO--TAKE A TRAP [ARX]_[AR].AND.# CLR LH, ;SAVE PHYSICAL PAGE # #/3777, ;MASK TO 13 BITS CALL [UPCST] ;UPDATE CST0 =11 .IF/NOCST =0 PF80: PAGE FAIL TRAP ;NO--TAKE A TRAP .ENDIF/NOCST ;HERE WE HAVE CST ENTRY IN AR, PAGE FAIL WORD IN BRX. GO LOOK ; AT WRITABLE AND WRITTEN BITS PF90: [BRX]_[BRX].OR.#, ;TRANSLATION IS VALID #/100000, HOLD RIGHT ; .. TL [FLG], FLG.W/1 ;IS THIS PAGE WRITABLE? =0 [BRX]_[BRX].OR.#, ;YES--INDICATE THAT IN PFW #/020000, J/PF100 ;NOT WRITE VIOLATION TL [BRX], ;IS THIS A WRITE REF? WRITE TEST/1, WRITE CYCLE/1 =0 PAGE FAIL TRAP ;WRITE VIOLATION PF107: .IFNOT/NOCST [AR]_[AR].OR.WORK[PUR], ;PUT IN NEW AGE J/PF110 ;GO TO STORE CST ENTRY .ENDIF/NOCST .IF/NOCST PFDONE: TR [FLG], #/400000, J/PF140 .ENDIF/NOCST =0* PFTICK: [AR]_WORK[TIME1], ;UPDATE TIMER SPEC/CLRCLK, CALL [TOCK] [AR]_WORK[SV.AR1], ;RESTORE AR J/PTRIND ;GO TRY AGAIN ;STILL .IF/KLPAGE ;HERE IF PAGE IS WRITABLE PF100: TL [BRX], WRITE CYCLE/1 ;IS THIS A WRITE REF? =0 [AR]_[AR].OR.#, ;YES--SET WRITTEN BIT #/1, HOLD LEFT, J/PF105 TR [AR], ;NOT WRITE, ALREADY WRITTEN? #/1 =0 PF105: [BRX]_[BRX].OR.#, ;WRITTEN SET BIT #/040000, ;MARK PAGE AS HOLD RIGHT, ;WRITABLE J/PF107 ;STORE CST WORD [FLG]_[FLG].AND.NOT.#, ;NOT WRITTEN, CAUSE TRAP ON FLG.W/1, ; WRITE ATTEMPT HOLD RIGHT, ;ONLY CLEAR LH J/PF107 .IFNOT/NOCST =0** PF110: .IFNOT/INHCST START NO TEST WRITE, CALL [IBPX] ;STORE CST ENTRY .ENDIF/INHCST .IF/INHCST SKIP NO CST, CALL [WRCST] .ENDIF/INHCST .ENDIF/KLPAGE ;HERE WHEN WE HAVE FIGURED OUT PHYSICAL ADDRESS (IN ARX) AND FLAGS ; (IN BRX) RELOAD PAGE TABLE. PFDONE: TR [FLG], ;MAP INSTRUCTION? #/400000 .ENDIF/NOCST =0 PF140: [AR]_[ARX], ;GET PHYSCIAL PAGE # SC_7, ;PREPARE TO CONVERT TO J/PF130 ; WORD ADDRESS [AR]_WORK[SV.VMA], ;RESTORE VMA J/PF120 =0 PF130: [AR]_[AR]*2, ;CONVERT TO WORD # STEP SC, J/PF130 [AR]_[AR].AND.#, ;JUST ADDRESS BITS #/3, HOLD RIGHT END MAP ;CLEAR MAP FLAGS [BRX]_[BRX].OR.#, ;TURN ON THE TRANSLATION #/100000, ; VALID BIT HOLD RIGHT ; IN LEFT HALF ONLY TL [FLG], FLG.C/1 ;CACHE BIT SET? =0 [BRX]_[BRX].OR.#, ;YES--SET IN MAP WORD #/002000, HOLD RIGHT ; .. [BRX]_[BRX].AND.#, ;PRESERVE WORD # #/777, HOLD LEFT ; IN PAGE FAIL WORD [AR]_[AR].OR.[BRX], ;COMPLETE MAP INSTRUCTION EXIT PF120: [BR]_[AR] ;COPY PAGE FAIL WORD [BR]_[AR].AND.NOT.#, ;CLEAR BITS WHICH START A CYCLE READ CYCLE/1, ; .. WRITE CYCLE/1, ; .. WRITE TEST/1, ; .. HOLD RIGHT ;JUST DO LEFT HALF VMA_[BR], 3T, ;RESTORE VMA DP FUNC/1 ;SET USER ACCORDING TO WHAT IT WAS [ARX]_[ARX].AND.# CLR LH, ;JUST KEEP PAGE # #/3777 ; .. [BRX]_[ARX].OR.#, #/400000 ;SET VALID BITS TL [FLG], FLG.W/1 ;WANT WRITE SET? =0 [BRX]_[BRX].OR.#, #/040000 ;SET WRITE BIT TL [FLG], FLG.C/1, ;WANT CACHE SET? LOAD PAGE TABLE ;LOAD PAGE TABLE ON NEXT ; MICRO INSTRUCTION =0 [BRX]_[BRX].OR.#, ;SET CACHE BIT #/020000, J/PF125 ;CACHE BIT READ [BRX] ;LOAD PAGE TABLE PF125: [ARX]_WORK[SV.ARX] [BR]_WORK[SV.BR] [BRX]_WORK[SV.BRX] VMA_[AR], ;MAKE MEM REQUEST DP FUNC/1, 3T, ;FROM DATA PATH WAIT/1 ;WAIT FOR PREVIOUS CYCLE TO ; COMPLETE. (NEED THIS TO ; START ANOTHER CYCLE) [AR]_WORK[SV.AR], RETURN [0] .IF/KLPAGE .IFNOT/NOCST ;SUBROUTINE TO START CST UPDATE ;CALL WITH: ; AR/ PHYSICAL PAGE NUMBER ;RETURN 2 WITH ENTRY IN AR, PAGE FAIL IF AGE TOO SMALL .IFNOT/INHCST =0** UPCST: [AR]_[AR]+WORK[CBR], ;ADDRESS OF CST0 ENTRY CALL [RDPT] ;READ OLD VALUE TL [AR], ;0 - 5 = 0? #/770000 ; .. =0 [AR]_[AR].AND.WORK[CSTM], ;CLEAR AGE FIELD RETURN [2] ;AGE IS NOT ZERO PAGE FAIL TRAP ;AGE TOO SMALL .ENDIF/INHCST .IF/INHCST UPCST: SKIP NO CST ;SEE IF A CST IS PRESENT =0*0 [AR]_[AR]+WORK[CBR], ;YES, ADDRESS OF CST0 ENTRY CALL [RDPT] ;READ OLD VALUE [AR]_0,RETURN [2] ;NO CST, RETURN TL [AR], ;CHECK AGE FIELD #/770000 = =0 [AR]_[AR].AND.WORK[CSTM], ;CLEAR AGE FIELD RETURN [2] ;AGE IS NOT ZERO PAGE FAIL TRAP ;AGE TOO SMALL =0 WRCST: START NO TEST WRITE, J/IBPX RETURN [4] .ENDIF/INHCST .ENDIF/NOCST ;STILL .IF/KLPAGE ;SUBROUTINE TO LOOK AT PAGE POINTER ;CALL WITH POINTER IN AR ;RETURNS 1 IF TYPE 1 ;RETURNS 2 IF TYPE 2 ;RETURNS 3 IF TYPE 3 ;GOES TO PFT IF TYPE 0 OR 4 THRU 7 SETPTR: [ARX]_[AR].OR.#, ;AND C AND W BITS #/753777 ; OF ALL POINTERS [FLG]_[FLG].AND.[ARX], ; .. HOLD RIGHT ;KEEP IN LH OF FLG READ [AR], ;TYPE 4,5,6 OR 7? SKIP DP0 ; .. =0 TL [AR], ;HERE WE TEST FOR TYPE #/300000, ; ZERO POINTER J/STPTR1 ;CHECK AT STPTR1 PAGE FAIL TRAP ;BAD TYPE =0 STPTR1: TL [AR], ;NOT ZERO #/100000, ;SEPERATE TYPE 2 J/STPTR2 ; .. PAGE FAIL TRAP ;TYPE 0 =0 STPTR2: TL [AR], ;SEPERATE TYPE 1 #/200000, ; AND 3 J/STPTR3 ; .. RETURN [2] ;TYPE 2 =0 STPTR3: RETURN [3] ;TYPE 3 RETURN [1] ;TYPE 1 ;STILL .IF/KLPAGE ;SUBROUTINE TO FETCH A PAGE POINTER OR CST ENTRY ;CALL WITH ADDRESS IN AR ;RETURN 4 WITH WORD IN AR ; RDPT: VMA_[AR], ;LOAD THE VMA START READ, ;START MEM CYCLE VMA PHYSICAL, ;ABSOLUTE ADDRESS SKIP IRPT ;CHECK FOR INTERRUPTS =0 MEM READ, ;NO INTERRUPTS [AR]_MEM, ;PUT THE DATA INTO AR RETURN [4] ;AND RETURN PAGE FAIL TRAP ;INTERRUPT ;SUBROUTINE TO SEE IF WE SHOULD REMEMBER AN EXEC SECTION PTR ;CALL WITH SKIP ON ADR.EQ.0 ;RETURNS 2 IF WE SHOULD STORE AND 7 IF WE SHOULD NOT ; =0 SHDREM: RETURN [7] ;INDIRECT PTR [AR]_.NOT.[FLG] ;FLIP BITS TL [AR], FLG.W/1, FLG.C/1 ;BOTH BITS SET =0 RETURN [7] ;NO--DON'T STORE RETURN [2] ;STORE .ENDIF/KLPAGE .IF/KIPAGE ;HERE IN KI10 MODE ;BR CONTAINS PAGE # AND ARX CONTAINS PAGE #/2 KIFILL: READ [BRX], ;USER REF? SKIP DP0 ; .. =0 [BR]-#, ;EXEC--LESS THAN 340? #/340, ; .. SKIP DP18, 4T, ; .. J/KIF10 ;FOLLOW EXEC PATH KIUPT: [ARX]_[ARX]+[UBR], ;POINTER TO PAGE MAP ENTRY LOAD VMA, ;PUT ADDRESS IN VMA VMA PHYSICAL, ;ABSOLUTE ADDRESS START READ, ;FETCH UPT WORD J/KIF30 ;JOIN COMMON CODE =0 KIF10: [BR]-#, ;EXEC ADDRESS .GE. 340 #/400, ; SEE IF .GT. 400 SKIP DP18, 4T, ; .. J/KIEPT ;LOOK AT KIF20 [ARX]_[ARX]+#, 3T, ;EXEC ADDRESS .LT. 340 #/600, ;IN EBR+600 J/KIEPT ;JOIN COMMON CODE =0 KIEPT: [ARX]_[ARX]+[EBR], ;ADD OFFSET TO LOAD VMA, ; EPT START READ, ;START FETCH VMA PHYSICAL, ;ABSOLUTE ADDRESS J/KIF30 ;GO GET POINTER [ARX]_[ARX]+#, ;PER PROCESS PAGE #/220, 3T, ; IS IN UPT + 400 J/KIUPT ;JOIN COMMON CODE KIF30: MEM READ, ;WAIT FOR DATA [ARX]_MEM ;PLACE IT IN ARX TR [BR], ;SEE IF EVEN OR ODD #/1 ; .. ;STILL .IF/KIPAGE =0 KIF40: READ [ARX], ;ODD SKIP DP18, ;SEE IF VALID J/KIF50 ;JOIN COMMON CODE [ARX]_[ARX] SWAP, ;EVEN--FLIP AROUND J/KIF40 ; AND CONTINUE .ENDIF/KIPAGE =0 KIF50: PAGE FAIL TRAP ;AT THIS POINT WE HAVE THE PAGE MAP ENTRY IN RH OF AR [FLG]_[FLG].AND.NOT.#, ;CLEAR W AND C FLG.W/1, FLG.C/1 ; FLAGS TR [ARX], #/020000 ;CACHE ENABLED? =0 [FLG]_[FLG].OR.#, ;SET CACHE BITS FLG.C/1, HOLD RIGHT ; .. TR [ARX], #/040000 ;DO NOT CACHE ;SEE IF CACHE BIT SET =0 [BRX]_[BRX].OR.#, ;COPY BITS TO BRX #/020000, HOLD RIGHT TR [ARX], ; .. #/100000 =0 [FLG]_[FLG].OR.#, ;SAVE W FLG.W/1, ; .. HOLD RIGHT, ; .. J/KIF90 ;ALL DONE TL [BRX], ;W=0, WRITE REF? WRITE CYCLE/1 =0 KIF80: [BRX]_[BRX].OR.#, ;WRITE FAILURE #/100000, HOLD RIGHT, ;INDICATE THAT ACCESS WAS ON J/KIF50 ;GO PAGE FAIL J/PFDONE ;ALL DONE KIF90: [BRX]_[BRX].OR.#, ;PAGE IS WRITABLE #/40000, ;TURN ON IN BRX J/PFDONE ;ALL SET ;HERE ON HARD PAGE FAILURES HARD: WORK[SV.BR]_[BR] ;SAVE BR (CLEANUP MAY NEED IT) =0 [BR]_VMA, ;BUILD PAGE FAIL WORD CALL [ABORT] ;CLEAR ERROR [BR]_[BR].AND.#, ;SAVE THE FLAGS #/401237, ; .. HOLD RIGHT ; .. [BRX]_[BRX].OR.[BR], ;COMPLETE PAGE FAIL WORD J/KIF50 ;GO TRAP PFPI1: SKIP IRPT ;TIMER TRAP? =00 [AR]_WORK[TIME1], ;YES--GET LOW WORD SPEC/CLRCLK, ;CLEAR CLOCK FLAG CALL [TOCK] ;DO THE UPDATE J/PFT1 ;EXTERNAL INTERRUPT ABORT MEM CYCLE ;CLEAR 1MS FLAGS = PFPI2: [AR]_WORK[SV.VMA], ;RESTORE VMA J/PF125 ABORT: ABORT MEM CYCLE, RETURN [1] ;HERE ON PAGE FAIL TRAP =0 PFT: HALT [IOPF] ;IO PAGE FAILURE PFT1: [AR]_WORK[SV.VMA], SKIP/TRAP CYCLE ;SEE IF TRAP CYCLE =0 TL [AR], FETCH/1, ;IS THIS AN INSTRUCTION FETCH J/PFT1A ;GO LOOK BELOW [AR]_WORK[TRAPPC] ;RESTORE PC READ [AR], LOAD FLAGS, J/CLDISP =0 PFT1A: J/CLEANED ;YES--NO PC TO BACK UP FIXPC: [PC]_[PC]-1, HOLD LEFT ;DATA FAILURE--BACKUP PC =0 CLDISP: CLEANUP DISP ;GO CLEANUP AFTER PAGE FAIL =0000 CLEANUP: CLEANED: ;(0) NORMAL CASE END STATE, SKIP IRPT, ;NO MORE CLEANUP NEEDED J/PFT2 ;HANDLE PAGE FAIL OR INTERRUPT [AR]_WORK[SV.ARX], ;(1) BLT J/BLT-CLEANUP [PC]_[PC]+1, ;(2) MAP J/MAPDON STATE_[EDIT-SRC], ;(3) SRC IN STRING MOVE J/STRPF STATE_[EDIT-DST], ;(4) DST IN STRING MOVE J/STRPF STATE_[SRC], ;(5) SRC+DST IN STRING MOVE J/BACKD STATE_[EDIT-DST], ;(6) FILL IN MOVSRJ J/STRPF4 STATE_[EDIT-SRC], ;(7) DEC TO BIN J/PFDBIN STATE_[EDIT-SRC], ;(10) SRC+DST IN COMP J/CMSDST END STATE, J/BACKS ;(11) EDIT SRC FAIL END STATE, J/BACKD ;(12) EDIT DST FAIL STATE_[EDIT-SRC], ;(13) SRC+DST IN EDIT J/BACKD = =0 PFT2: [AR]_[UBR]+#, ;PREPARE TO STORE PFW #/500, 3T, J/PFT10 PFT3: TAKE INTERRUPT ;PROCESS INTERRUPT PFT10: VMA_[AR], ;WHERE TO STORE PFW VMA PHYSICAL WRITE =0 MEM WRITE, ;STORE PFW MEM_[BRX], CALL [NEXTAR] ;ADVANCE POINTER TO ;PREPARE TO STORE PC .IF/KLPAGE .IF/KIPAGE TL [EBR], #/400000 ;KL PAGING? =0 .ENDIF/KIPAGE [BR]_FLAGS,J/EAPF ;YES--DO EXTENDED THING .ENDIF/KLPAGE .IF/KIPAGE [BR]_PC WITH FLAGS ;GET OLD PC MEM WRITE, ;STORE OLD PC MEM_[BR], J/EAPF1 .ENDIF/KIPAGE MAPDON: END STATE, ;CLEAR MAP BIT SKIP IRPT ;ANY INTERRUPT? =0 [AR]_[BRX], ;RETURN PAGE FAIL WORD EXIT [PC]_[PC]-1, J/PFT3 ;INTERRUPTED OUT OF MAP ; RETRY INSTRUCTION .IF/KLPAGE =0 EAPF: MEM WRITE, MEM_[BR], ;STORE FLAGS CALL [NEXTAR] ;STORE PC WORD MEM WRITE, MEM_[PC] ; .. .ENDIF/KLPAGE EAPF1: [AR]_[AR]+1, VMA PHYSICAL READ, J/GOEXEC NEXTAR: NEXT [AR] PHYSICAL WRITE, RETURN [1]