mirror of
https://github.com/PDP-10/stacken.git
synced 2026-03-01 01:19:17 +00:00
418 lines
16 KiB
Plaintext
418 lines
16 KiB
Plaintext
TITLE MOSSER - MODULE TO SUPPORT MOS MEMORY - THGA - V033
|
||
SUBTTL J.M. FLEMMING/JMF TS 15 MAR 88
|
||
SEARCH F,S
|
||
$RELOC
|
||
$HIGH
|
||
|
||
|
||
;THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED
|
||
; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.
|
||
;
|
||
;COPYRIGHT (c) DIGITAL EQUIPMENT CORPORATION
|
||
; 1973,1974,1975,1976,1977,1978,1979,1980,1982,1984,1986,1988.
|
||
;ALL RIGHTS RESERVED.
|
||
|
||
.CPYRT<1973,1988>
|
||
|
||
XP VMOSSER,033 ; PUT VERSION NUMBER IN GLOB LISTING AND LOADER STORAGE MAP
|
||
|
||
ENTRY MOSSER ;LOAD MOSSER IF LIBRARY SEARCH
|
||
MOSSER::
|
||
;SEND AN IPCF MESSAGE TO THGA
|
||
;WORRY ABOUT HARD ERRORS
|
||
;TURN CLOCKS OFF ON ALL CPU'S
|
||
MOSTAB: -10,,10
|
||
-5,,0
|
||
|
||
PHASE 0
|
||
MOSERB:!BLOCK 0 ;(0) MOS ERROR REPORT BLOCK
|
||
MOSEID:!BLOCK 1 ;(0) MOS ERROR REPORT IDENTIFICATION WORD
|
||
MOSECN:!BLOCK 1 ;(1) ENTRY TYPE AND CONTROLLER NUMBER
|
||
MOSERA:!BLOCK 1 ;(2) ERA AT ERROR
|
||
MOSSAE:!BLOCK 1 ;(3) SYNDROME AT ERROR
|
||
MOSBLN:!BLOCK 1 ;(4) BLOCK NUMBER
|
||
MOSSBN:!BLOCK 1 ;(5) SPARE BIT NUMBER
|
||
MOSEAD:!BLOCK 1 ;(6) 22 BIT ERROR ADDRESS
|
||
MOSCSN:!BLOCK 4 ;(7) CONTROLLER SERIAL NUMBERS
|
||
MOSAID:!BLOCK 1 ;(13) APRID OF CPU ERROR OCCURED ON
|
||
MOSLEB==.-MOSERB ;LENGTH OF THE ERROR BLOCK
|
||
DEPHASE
|
||
|
||
|
||
|
||
|
||
MOSMEM: DEC 5 ;MAX MOS ERRORS/MIN TO REPORT
|
||
|
||
|
||
|
||
|
||
|
||
;HERE FROM CLOCK1 EACH MINUTE
|
||
MOSMIN:: SETZM .CPMET## ;CLEARS ERRORS THIS MINUTE
|
||
POPJ P,
|
||
|
||
;HERE FROM COMMON ON AN SBUS ERROR
|
||
|
||
SBERR:: PUSHJ P,SAVE4## ;SAVE PRESERVED ACS
|
||
PUSHJ P,SAVT## ;ALSO TEMPS SINCE AT INTERRUPT LEVEL
|
||
MOVEI P1,2 ;NUMBER OF ENTRIES IN MOSTAB
|
||
JRST SBERR3 ;GO PROCESS
|
||
SBERR1: MOVEI T1,0 ;FUNCTION 0
|
||
DPB P2,[POINT 5,T1,4] ;CONTROLLER NUMBER
|
||
SBDIAG T1 ;READ IT
|
||
MOVE P4,T2 ;SBDIAG FUNCTION 0 RESULTS
|
||
CAME T2,[-1] ;CONTROLLER EXIST?
|
||
TLNN T2,770000 ;YES, ANY ERRORS?
|
||
JRST SBERR2 ;NO, SKIP ON
|
||
HRRI T1,1 ;CONTROLLER NUMBER,,FUNCTION 1
|
||
SBDIAG T1 ;READ IT
|
||
LDB T3,[POINT 4,T2,11] ;CONTROLLER TYPE
|
||
CAIN T3,5 ;MOS?
|
||
TRNE T2,2000 ;AND ENABLED?
|
||
JRST SBERR2 ;NO
|
||
JRST SBERR4 ;YES, PROCESS THE ERROR
|
||
SBERR2: AOBJN P2,SBERR1 ;NEXT CONTROLLER
|
||
SBERR3: SOJL P1,SBERR6 ;SCANNED ALL OF MOSTAB?
|
||
MOVE P2,MOSTAB(P1) ;NO, NEXT ENTRY IN MOSTAB
|
||
JRST SBERR1 ;LOOP OVER ALL OF MOSTAB
|
||
SBERR4: TLNN P4,200000 ;CORRECTABLE ERROR?
|
||
XCT SBE## ;NO, SHOULDN'T GET HERE ON A DOUBLE BIT ERROR?
|
||
AOS .CPTME## ;COUNT AN ACTUAL MOS ERROR
|
||
AOS T1,.CPMET## ;ANOTHER THIS MINUTE
|
||
CAMLE T1,MOSMEM ;TOO MANY?
|
||
JRST SBERR6 ;YES DON'T FLOOD THE WORLD
|
||
AOS .CPMEC## ;NO, ANOTHER TO TGHA
|
||
MOVEI T2,MOSLEB ;LENGTH OF AN ERROR BLOCK
|
||
PUSHJ P,GETWDS## ;1 WORD HEADER, 11 WORDS OF ERROR INFO
|
||
JRST SBERR6 ;CAN'T DO IT
|
||
HRLI T1,MOSLEB ;PUT LENGTH IN THE LEFT HALF, IPCF WANTS IT THERE
|
||
PUSH P,T1 ;LENGTH,,ADDRESS
|
||
MOVSI T2,(T1) ;ZERO BLOCK SINCE SOME BITS/BYTES DON'T GET FILLED IN
|
||
HRRI T2,1(T1)
|
||
SETZM (T1) ;ZERO FIRST WORD OF THE BLOCK
|
||
BLT T2,MOSLEB-1(T1) ;ZAP, THE ERROR BLOCK IS ZERO
|
||
MOVE T2,[MOSLEB,,.IPCME##]
|
||
MOVEM T2,MOSEID(T1)
|
||
MOVEI T2,.PMMER ;ENTRY TYPE
|
||
DPB T2,[POINT 9,MOSECN(T1),8]
|
||
DPB P2,[POINT 18,MOSECN(T1),35] ;STORE CONTROLLER NUMBER
|
||
RDERA MOSERA(T1) ;ERA AT ERROR
|
||
TRZ P4,3 ;LEFT MOST 34 BITS OF ERROR ADDRESS
|
||
MOVEI T3,2 ;FUNCTION 2
|
||
DPB P2,[POINT 5,T3,4] ;CURRENT CONTROLLER
|
||
SBDIAG T3 ;RESULTS OF FUNCTION 2
|
||
LDB T4,[POINT 2,T4,6] ;LOW TWO BITS OF ADDRESS
|
||
IOR P4,T4 ;FULL WORD ADDRESS OF THE ERROR
|
||
MOVEM P4,MOSEAD(T1) ;STORE THAT
|
||
HRRI T3,1B27+6 ;FUNCTION 6.1
|
||
SBDIAG T3 ;SYNDROME
|
||
LDB T4,[POINT 6,T4,12] ;SYNDROME
|
||
MOVEM T4,MOSSAE(T1) ;SYNDROME AT ERROR
|
||
HRRI T3,12 ;SETUP TO GET BLOCK NUMBER
|
||
LDB T4,[POINT 8,P4,21] ;GET RAM ADDRESS FROM EFFECTIVE ADDRESS
|
||
DPB T4,[POINT 8,T3,27] ;WHAT TO READ
|
||
SBDIAG T3 ;READ IT
|
||
LDB T4,[POINT 4,T4,13] ;GET BLOCK NUMBER
|
||
MOVEM T4,MOSBLN(T1) ;STORE BLOCK NUMBER
|
||
HRRI T3,7 ;SETUP TO GET SPARE BIT NUMBER
|
||
DPB T4,[POINT 4,T3,24] ;BLOCK NUMBER
|
||
LDB T2,[POINT 3,P4,35] ;OFFSET WITHIN INTERLEAVE GROUP
|
||
DPB T2,[POINT 3,T3,27] ;STORE ADDRESS
|
||
SBDIAG T3 ;READ SPARE BIT NUMBER
|
||
LDB T2,[POINT 6,T4,12] ;SPARE BIT NUMBER
|
||
MOVEM T2,MOSSBN(T1) ;STORE IT
|
||
TLNN T4,(1B13)
|
||
TLC T4,(7B15) ;COMPLEMENT ICE FIELD (IGNORE CORRECTABLE ERROR)
|
||
IOR T3,T4 ;SUPPRESS CORRECTABLE ERROR REPORTING
|
||
TLNE P4,200000 ;IF NOT A HARD ERROR,
|
||
SBDIAG T3 ;CAUSE FUTURE ERRORS TO BE FIXED AND IGNORED
|
||
;HERE TO READ CONTROLLER SERIAL NUMBERS
|
||
MOVEI T3,2 ;HOW TO GET SERIAL NUMBERS
|
||
DPB P2,[POINT 5,T3,4] ;CONTROLLER
|
||
MOVE T4,MOSBLN(T1) ;BLOCK NUMBER
|
||
LSH T4,-2
|
||
DPB T4,[POINT 2,T3,10] ;SET BLOCK NUMBER DIVIDED BY 4
|
||
MOVE T2,[POINT 8,MOSCSN(T1),3]
|
||
MOVEI P3,^D16 ;NUMBER OF BYTES OF SERIAL NUMBER
|
||
SBERR5: SBDIAG T3 ;NEXT BYTE OF THE SERIAL NUMBER
|
||
LDB T4,[POINT 8,T4,14] ;GET THE BYTE
|
||
IDPB T4,T2 ;STORE IT IN THE ERROR BLOCK
|
||
ADD T3,[1B14] ;NEXT BYTE
|
||
TLNN T2,770000 ;TGHA WANTS THE SERIAL NUMBERS RIGHT JUSTIFIED
|
||
ADD T2,[POINT 0,1,3];SKIP THE HIGH FOUR BITS
|
||
SOJG P3,SBERR5 ;GET THE NEXT ONE
|
||
APRID MOSAID(T1) ;APR ID OF CPU ERROR WAS DECTECTED ON
|
||
PUSHJ P,MAPLOC## ;GET A MAP SLOT TO MAKE THE ERROR LOCATION ADDRESSABLE
|
||
LDB T4,[POINT 14,P4,26] ;PHYSICAL PAGE NUMBER WHERE THE ERROR OCCURED
|
||
HRLI T4,(<PM.DCD>B2+PM.WRT+PM.PUB)
|
||
|
||
DPB T4,T1 ;STORE MAPPING IN THE EXEC MAP
|
||
CLRPT (T3) ;MAKE SURE THE NEW MAPPING IS IN EFFECT
|
||
LDB T1,[POINT 9,P4,35] ;LINE NUMBER WITHIN THE PAGE
|
||
ADDI T3,(T1) ;VIRTUAL ADDRESS OF WORD CONTAINING THE ERROR
|
||
MOVES T3,(T3) ;READ, RE-WRITE THE WORD, CORRECTING THE ERROR
|
||
PUSHJ P,UNMAP## ;RETURN EXEC MAP SLOT
|
||
POP P,T1 ;LENGTH,,ADDRESS OF THE ERROR BLOCK
|
||
PUSHJ P,SNDTGH ;SEND THE ERROR BLOCK TO TGHA
|
||
JFCL ;IGNORE FAILURE
|
||
JRST SBERR2 ;PROCESS NEXT ERROR
|
||
SBERR6: PUSHJ P,CLRSBD## ;CLEAR ALL CONTROLLERS
|
||
POPJ P, ;AND RETURN
|
||
|
||
;INTERFACE ROUTINE TO SEND AN IPFC MESSAGE TO THGA
|
||
;CALLING SEQUENCE:
|
||
; MOVE T1,[LENGTH,,ADDRESS OF MESSAGE]
|
||
; PUSHJ P,SNDTGH
|
||
;ALWAYS RETURNS HERE
|
||
|
||
SNDTGH: SE1ENT ;ENTER SECTION 1
|
||
PUSH P,T1 ;SNDMDX WANTS THE ARGUMENT ON THE STACK
|
||
MOVEI T1,%SITGH## ;TGHA'S PID
|
||
PJRST SNDMDX## ;SEND IT
|
||
;HERE TO SETUP TO GIVE THGA CONTROL TO FIDDLE WITH THE MF/G20
|
||
|
||
MOSGTM::CAIL P1,4 ;MUST BE AT LEAST 4 ARGUMENTS
|
||
CAILE P1,6 ;6 IS ALLOWED FOR THE MG20
|
||
|
||
JRST DIAAIA## ;WRONG NUMBER OF ARGUMENTS
|
||
PUSHJ P,FNDPDS## ;POINT W AT THE PDB (NEEDED LATER)
|
||
PUSHJ P,GETWD1## ;FIRST USER PAGE
|
||
MOVE P2,T1 ;SAVE THAT
|
||
PUSHJ P,GETWD1## ;FIRST PHYSICAL PAGE
|
||
HRL P2,T1 ;AND THAT
|
||
PUSHJ P,GETWD1## ;NUMBER OF PAGES
|
||
JUMPL T1,DIAABA## ;NEGATIVE NUMBER OF PAGES IS ILLEGAL
|
||
MOVE P3,T1 ;SAVE COUNT
|
||
HLRZ T2,P2 ;FIRST PHYSICAL PAGE
|
||
ADD T1,T2 ;NUMBER OF PAGES
|
||
LSH T1,P2WLSH ;CONVERT TO HIGHEST PHYSICAL ADDRESS
|
||
CAMLE T1,MEMSIZ## ;MUST BE IN BOUNDS
|
||
JRST DIAABA## ;NOT, ILLEGAL ARGUMENT LIST
|
||
HRRZ T1,P2 ;FIRST USER PAGE
|
||
HRRZ T2,P2 ;AGAIN
|
||
ADDI T1,-1(P3) ;HIGHEST USER PAGE
|
||
SE1ENT ;FOR PAGE MAP ACCESS
|
||
CAIGE P1,6 ;TGHA VERSION 4 OR LATER?
|
||
JRST DIAGT0 ;NO, DO IT THE OLD WAY
|
||
CAIL T1,MXSECN*PAGSIZ+PG.BDY ;HIGHEST PAGE MUST BE IN LEGAL SECTION
|
||
JRST DIAABA## ;NOT, ILLEGAL ARGUMENT LIST
|
||
TRZ T1,PG.BDY ;HIGHEST PAGE ROUNDED DOWN TO SECTION BOUNDARY
|
||
TRZ T2,PG.BDY ;ROUND DOWN
|
||
CAIN T1,(T2) ;ALL REQUESTED PAGES MUST BE IN SAME SECTION
|
||
CAIGE P2,2000 ; AND MUST BE IN A SECTION GREATER THAN 2
|
||
JRST DIAABA## ;NOT, BAD ARGUMENT LIST
|
||
HRRI M,2(M) ;POINT AT SIXTH ARGUMENT
|
||
PUSHJ P,GETWDU## ;GET USER SUPPLIED SCRATCH PAGES ARGUMENT
|
||
|
||
HLRZ T3,T1 ;GET NUMBER OF PAGES PROVIDED
|
||
CAIGE T3,3 ;MUST BE AT LEAST 3, UPT, MAP, NZS MAP
|
||
JRST DIAAIA## ;WRONG NUMBER
|
||
HRRZS P4,T1 ;FIRST USER SCRATCH PAGE NUMBER
|
||
DIAGTA: PUSHJ P,GTPME## ;GET CONTENTS OF USER'S MAP
|
||
TLNE T2,(<PM.ACD>B2) ;MUST EXIST, ACCESS ALLOWED,
|
||
TLNN T2,(PM.WRT) ; AND BE WRITABLE
|
||
JRST DIAABA## ;BAD ARGUMENT LIST FOR LACK OF A BETTER RETURN
|
||
AOS T1 ;NEXT PAGE
|
||
SOJG T3,DIAGTA ;LOOP OVER ALL PAGES SUPPLIED
|
||
LSH P4,P2WLSH ;CONVERT TO USER VIRTUAL ADDRESS
|
||
MOVSI T1,.UPMAP ;COPY THE MAP AND UPT TO USER SCRATCH PAGES
|
||
HRRI T1,(P4)
|
||
EXCTXU <BLT T1,<2*PAGSIZ>-1(P4)>
|
||
HRRZ T1,P2 ;FIRST USER PAGE
|
||
ANDI T1,PG.BDY ;PAGE NUMBER WITHIN SECTION
|
||
ADDI T1,2*PAGSIZ(P4) ;STARTING ADDRESS IN SUBSTITUTION SECTION MAP
|
||
HLRZ T2,P2 ;FIRST PHYSICAL PAGE
|
||
HRLI T2,(<PM.DCD>B2+PM.WRT+PM.PUB) ;PAGE POINTER
|
||
MOVE T3,P3 ;NUMBER OF PAGES
|
||
DIAGTB: EXCTUX <MOVEM T2,(T1)> ;STORE POINTER IN SCRATCH SECTION MAP
|
||
AOS T1 ;NEXT PAGE IN SECTION
|
||
AOS T2 ;NEXT PHYSICAL PAGE
|
||
SOJG T3,DIAGTB ;LOOP FOR ALL PAGES
|
||
EXCTUX <MAP T1,(P4)> ;PHYSICAL ADDRESS OF WHAT WILL BE THE SECTION 0 MAP
|
||
TLZ T1,(MP.NAD) ;CLEAR EXTRANEOUS BITS
|
||
LSH T1,W2PLSH ;CONVERT TO PAGE NUMBER
|
||
HRLI T1,(<PM.DCD>B2+PM.PUB+PM.WRT)
|
||
EXCTXU <MOVEM T1,PAGSIZ+SECTAB+0(P4)> ;SECTION 0 MAP POINTER
|
||
MOVSI T1,SECTAB+0(<PM.ICD>B2+PM.WRT+PM.PUB)
|
||
EXCTXU <MOVEM T1,PAGSIZ+SECTAB+1(P4)> ;SECTION 1 IS @ SECTION 0
|
||
EXCTUX <MAP T1,2*PAGSIZ(P4)> ;PHYSICAL ADDRESS OF WHAT WILL BE
|
||
; SUBSTITUTION SECTION MAP
|
||
TLZ T1,(MP.NAD) ;CLEAR EXTRANEOUS BITS
|
||
LSH T1,W2PLSH ;CONVERT TO PAGE NUMBER
|
||
HRLI T1,(<PM.DCD>B2+PM.WRT+PM.PUB)
|
||
MOVE T2,P2 ;SECTION NUMBER TO MAP
|
||
LSH T2,W2PLSH
|
||
ADD T2,P4
|
||
EXCTXU <MOVEM T1,PAGSIZ+SECTAB(T2)> ;MAP POINTER FOR SUBSTITUTION SECTION
|
||
EXCTUX <MAP T1,PAGSIZ(P4)> ;PHYSICAL PAGE NUMBER OF WHAT WILL BE UPT
|
||
TLZ T1,(MP.NAD) ;CLEAR EXTRANEOUS BITS
|
||
LSH T1,W2PLSH ;CONVERT TO PAGE NUMBER
|
||
EXCTUX <HRRM T1,PAGSIZ+.UMUPT(P4)> ;MAP UPMP PER PROCESS IN THIS UPT
|
||
EXCTUX <HRRM T1,PAGSIZ+.UMUUP(P4)> ;DITTO FOR CACHED
|
||
HRLI T1,(LG.LUB) ;SET TO LOAD THE USER BASE REGISTER
|
||
HRRZ P2,JBTUPM##(J) ;GET CURRENT UPT
|
||
CONO PI,PI.OFF ;NO PIS
|
||
HRRM T1,@.CPSPT## ;SETUP THE SPT
|
||
HRRM T1,JBTUPM##(J) ;AND JBTUPM
|
||
DATAO PAG,T1 ;AND IF WE DIDN'T MISS ANY IMPORTANT POINTERS,
|
||
; EVERYTHING IS NOW ADDRESSABLE THROUGH THE SCRACH MAPS
|
||
CONO PI,PI.ON ;PIS ARE NOW OK
|
||
HRRI M,-2(M) ;POINT M BACK AT 4TH ARGUMNET
|
||
MOVE P3,P4 ;VIRTUAL ADDRESS OF SCRATCH MAPS
|
||
TLO P3,400000 ;TO DISTINGUISH IT FROM NUMBER OF PAGES
|
||
JRST DIAGTC ;JOIN COMMON CODE FOR OLD TGHA
|
||
DIAGT0:
|
||
CAIG T1,HLGPNO ;WITHIN THE USER'S ADDRESS SPACE
|
||
PUSHJ P,CKNZP## ;AND ARE ALL THE PAGES SPANNED NOT ALLOCATED?
|
||
JRST DIAABA## ;NO, ILLEGAL ARGUMENT LIST
|
||
SOS T1,T2 ;SET FOR IDPB
|
||
PUSHJ P,GTPME## ;CCOMPUTE A BYTE POINTER TO THE USER'S MAP
|
||
HLRZ T1,P2 ;FIRST PHYSICAL PAGE TO BE MAPPED
|
||
HRLI T1,(<PM.DCD>B2+PM.PUB+PM.WRT)
|
||
|
||
MOVE T2,P3 ;NUMBER OF PAGES TO MAP INTO THE USER'S ADDRESS SPACE
|
||
DIAGT1: MOVEM T1,(T4) ;MAKE THE PAGE ADDRESSABLE TO THE USER
|
||
AOS T4 ;ADVANCE POINTER
|
||
AOS T1 ;NEXT PAGE
|
||
SOJG T2,DIAGT1 ;LOOP UNTIL ALL PAGES HAVE BEEN MAPPED
|
||
CLRPGT ;MAKE SURE THE HARDWARE SEES THE CHANGE
|
||
DIAGTC: CAIG P1,4 ;A FIFTH ARGUMENT SUPPLIED?
|
||
TDZA T1,T1 ;NO, REMEMBER
|
||
PUSHJ P,GETWD1## ;YES, GET THE FIFTH ARGUMENT
|
||
MOVE P1,T1 ;SAVE AR/ARX PARITY ERROR NEW PC
|
||
MOVEI T2,2 ;TWO WORDS OF FREE SPACE
|
||
PUSHJ P,GETWDS## ;GET IT
|
||
JRST DIAAFC## ;ERROR, NOT ENOUGH FREE CORE
|
||
MOVEM T1,.PDDIA##(W) ;SAVE THE ADDRESS OF THE FREE CORE
|
||
DMOVEM P2,(T1) ;STORE USER PAGE,,PHYSICAL PAGE, NUMBER OF PAGES
|
||
MOVSI T2,(XC.USR+XC.PUB+XC.UIO) ;TRAP IN USER MODE ON PARITY ERROR
|
||
HRR T2,P1 ;USER TRAP ADDRESS
|
||
SKIPLE P1 ;SKIP IF NONE SUPPLIED OR USE EXEC SPECIFIED
|
||
MOVEM T2,.USPFN ;STORE PAGE FAIL NEW PC
|
||
MOVEI T1,[MOVEM J,.CPSTS##-.CPCDB##(P1) ;ROUTINE TO BE EXECUTED
|
||
POPJ P,] ; OVER ALL CPU'S
|
||
PUSHJ P,CPUAPP## ;RUN ONLY ME ON ALL CPU'S
|
||
MOVE J,.CPJOB## ;RESTORE THE CURRENT JOB NUMBER
|
||
IFN FTMP,<
|
||
PUSHJ P,ONCPU0## ;MAKE SURE THE REST OF THIS OCCURS ON THE BOOT CPU
|
||
SETOM MOFLPG## ;CAUSE ALL OTHER CPUS TO STOP
|
||
>; END IFN FTMP
|
||
IFN FTENET&FTKL10,<
|
||
PUSHJ P,KNIMOF## ;INFORM KLNI ABOUT MEMORY GOING OFFLINE
|
||
>; END IFN FTENET&FTKL10
|
||
IFN FTSCA,<
|
||
PUSHJ P,PPDMFL## ;DO PHYSICAL PORT DRIVER MEMORY OFFLINE CHECKS
|
||
>; END IFN FTSCA
|
||
MOVEI T1,10 ;10 SECONDS
|
||
DIAGT2: PUSHJ P,SLEEP## ;WAIT FOR ALL RH20S TO STOP
|
||
IFN FTMP,<
|
||
MOVEI T1,0 ;1 TIC
|
||
PUSHJ P,CP1STP## ;WAIT FOR ALL CPUS TO STOP
|
||
JRST DIAGT2 ;SOME ARE STILL RUNNING, SLEEP A TIC
|
||
>
|
||
PUSHJ P,ACCMOF## ;TURN OFF THE METERS
|
||
CONO TIM,0 ;AND THE INTERVAL TIMER
|
||
CONO PI,PI.OFF ;STOP THE WORLD
|
||
PUSHJ P,DTESPP## ;ENTER PROTOCOL PAUSE
|
||
CONSO PAG,LG.CSL+LG.CSW ;CACHE ON?
|
||
JRST DIAGT3 ;NO, SKIP ON
|
||
MOVEI T1,LG.CSW ;STRATEGY LOAD
|
||
ANDCAB T1,.CPEBR## ;CLEAR THAT
|
||
CONO PAG,@.CPEBR## ;TURN OFF CACHE STRATEGY LOAD
|
||
PUSHJ P,CSDMP## ;CLEAR THE CACHE
|
||
TRZ T1,LG.CSL ;CACHE STRATEGY LOOK, CLEAR THAT
|
||
MOVEM T1,.CPEBR## ;CLEAR LOOK AND LOAD
|
||
CONO PAG,@.CPEBR## ;LET THE HARDWARE KNOW
|
||
DIAGT3: MOVEI T1,^D50000 ;A FEW MILLISECONDS
|
||
SOJG T1,. ;JUST TO MAKE SURE ALL ACTIVITY HAS DIED OUT
|
||
JRST CPOPJ1## ;RETURN TO THE DIAGNOSTIC
|
||
|
||
;SUBROUTINE TO SHUTDOWN ALL DTES ON A CPU, CALL WITH P1 POINTING AT
|
||
; THE CPU UPON WHICH THE DTES ARE TO BE SHUTDOWN
|
||
DTESTP: MOVE T1,.CPCPN##-.CPCDB##(P1) ;CPU NUMBER
|
||
IFN FTMP,<
|
||
PUSHJ P,ONCPUS## ;GET TO THAT CPU
|
||
POPJ P, ;FORGET IT IF THE CPU ISN'T RUNNING
|
||
>
|
||
PUSH P,[EXP 4] ;NUMBER OF POSSIBLE DTES ON THIS CPU
|
||
DTEST1: HLRZ F,.CPSLF## ;ADDRESS OF THE CDB
|
||
HRR F,(P) ;DTE NUMBER
|
||
PUSHJ P,GETETD## ;GET THE ADDRESS OF THE DTE CONTROL BLOCK
|
||
JRST DTEST2 ;NON-EXISTANT DTE, SKIP ON
|
||
PUSHJ P,DTECLR## ;SHUTDOWN THIS DTE
|
||
DTEST2: SOSL (P) ;ANYMORE DTES?
|
||
JRST DTEST1 ;YES, GO SHUT THEM DOWN TOO
|
||
JRST TPOPJ## ;RETURN
|
||
;HERE WHEN THGA RELENQUISHES CONTROL AFTER FIDDLING WITH THE MF/G20
|
||
|
||
MOSGVM::PUSHJ P,CSDMP## ;SWEEP CACHE
|
||
MOVEI T1,LG.CSL+LG.CSW;CACHE STRATEGY LOOK AND LOAD
|
||
IORM T1,.CPEBR## ;TURN THAT ON
|
||
CONO PAG,@.CPEBR## ;REENABLE THE CACHE
|
||
PUSHJ P,DTERPP## ;CLEAR PROTOCOL PAUSE
|
||
CONO PI,PI.ON ;RESTORE THE PI SYSTEM
|
||
CONO TIM,TO.CTD!TO.CIT!TO.SIT!^D1667 ;TURN INTERVAL TIMER BACK ON
|
||
PUSHJ P,ACCMON## ;AND START UP THE METERS
|
||
IFN FTMP,<
|
||
SETZM MOFLPG## ;WAKEUP THE OTHER CPUS
|
||
MOVEI T1,2 ;GIVE OTHER CPU'S A CHANCE TO COME BACK TO LIFE
|
||
PUSHJ P,SLEEP## ;SO CAN CALL CPUAPP AND GET THINGS STARTED AGAIN EVERWHERE
|
||
>
|
||
;HERE TO RESTART DTE'S (BASED ON SAVED STATUS?)
|
||
MOVEI T1,DTESTR ;ROUTINE TO RESTART DTES
|
||
PUSHJ P,CPUAPP## ;APPLY THAT OVER ALL CPUS
|
||
IFN FTENET&FTKL10,<
|
||
PUSHJ P,KNIMON## ;LET KLNI KNOW THE COAST IS CLEAR
|
||
>; END IFN FTENET&FTKL10
|
||
IFN FTSCA,<
|
||
PUSHJ P,PPDMON## ;LET PHYSICAL PORT DRIVER CLEAN UP AS REQUIRED
|
||
>; END IFN FTSCA
|
||
MOVE J,.CPJOB##
|
||
PUSHJ P,FNDPDS## ;FETCH THE PDB POINTER
|
||
IFN FTMP,<
|
||
PUSHJ P,CRESET## ;RESET CPU SPECIFICATION
|
||
>
|
||
MOVEI T1,SEILM## ;NORMAL PAGE FAIL NEW PC
|
||
MOVEM T1,.USPFN ;RESTORE THAT
|
||
MOVE T1,.PDDIA##(W) ;ADDRESS OF ARGUMENT SAVE BLOCK
|
||
MOVE T3,1(T1) ;NUMBER OF PAGES MAPPED
|
||
JUMPG T3,DIAGVA ;JUMP IF OLD VERSION OF TGHA
|
||
; PUSHJ P,STEUB## ;RESTORE MAPS (CAN'T DO A PUSHJ)
|
||
HRRZ T1,(T1) ;T1 = THE PAGE NUMBER OF THE USER PROCESS TABLE
|
||
CONO PI,PI.OFF ;NO INTERRUPTS WHILE CHANGING UBR/SPT
|
||
HRRM T1,@.CPSPT## ;SETUP NEW SPT
|
||
HRRM T1,JBTUPM##(J) ;AND JBTUPM
|
||
HRLI T1,(LG.LUB) ;REQUEST LOADING UBR
|
||
DATAO PAG,T1 ;SETUP THE UBR AND CLEAR PAGING MEMORY
|
||
CONO PI,PI.ON ;INTERRUPTS ARE OK NOW
|
||
MOVSI T1,PAGSIZ(T3) ;WHERE THE PDL IS
|
||
HRRI T1,JOBPDO ;WHERE IT SHOULD BE
|
||
EXCTUX <BLT T1,JOBPDO+PDLLEN-1> ;PUT IT BACK
|
||
JRST DIAGVB ;JOIN COMMON CODE
|
||
DIAGVA: SE1ENT
|
||
HRRZ T1,(T1) ;FIRST USER PAGE
|
||
SUBI T1,1 ;SET FOR IDPB
|
||
PUSHJ P,GTPME## ;FORM A BYTE POINTER TO THE MAP
|
||
DIAGV1: AOS T4 ;INCRMENT
|
||
SETZM (T4) ;ZAP
|
||
SOJG T3,DIAGV1 ;LOOP OVER ALL MAPPED PAGES
|
||
DIAGVB: MOVE T2,.PDDIA##(W) ;ADDRESS OF ARGUMENT SAVE BLOCK
|
||
SETZM .PDDIA##(W) ;ZERO DIAG WORD
|
||
MOVEI T1,2 ;2 WORDS TO RETURN
|
||
PUSHJ P,GIVWDS## ;RETURN THE FUNNY SPACE
|
||
MOVEI T1,[SETZM .CPSTS##-.CPCDB##(P1) ;ROUTINE TO APPLY
|
||
POPJ P,] ; ACROSS ALL CPUS
|
||
PUSHJ P,CPUAPP## ;ALLOW JOBS TO RUN AGAIN ON OTHER CPUS
|
||
JRST CPOPJ1## ;AND GIVE GOOD RETURN TO THE DIAGNOSTIC
|
||
;SUBROUTINE TO START ALL DTES ON A CPU, CALL WITH (P1) = CPU CDB
|
||
DTESTR: MOVE T1,.CPCPN##-.CPCDB##(P1) ;CPU NUMBER
|
||
IFN FTMP,<
|
||
PUSHJ P,ONCPUS## ;GET ON THAT CPU
|
||
POPJ P, ;NOTHING TO DO IF THE CPU ISN'T RUNNING
|
||
>
|
||
PUSHJ P,ENTSPC## ;ENTER SECONDARY PROTOCOL ON THE MASTER DTE
|
||
PUSHJ P,STAPPC## ;START PRIMARY PROTOCOL ON ALL DTES
|
||
POPJ P, ;RETURN
|
||
|
||
MOSEND: END
|
||
|