io动漫上传图片 io错误dskdsk

PDP-10 Archive: 10,7/mon/errcon.mac from bb-bt99s-bb
Enter your search terms
Submit search form
10,7/mon/errcon.mac
There are 13 other files named errcon.mac in the archive.
to see a list.TITLE ERRCON - MONITOR DETECTED ERROR HANDLING ROUTINES - V1266
SUBTTL T. HASTINGS/TH/CHW/TW/RCC/DAL 02-JAN-90
SEARCH F,S,DEVPRM
;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
; 75,78,82,88,1990.
;ALL RIGHTS RESERVED.
XP VERRCN,1266 ;THIS MACRO PUTS VERSION NO. IN STORAGE MAP AND GLOB
ENTRY ERRCON
;ALWAYS LOAD ERRCON(IF LIB SEARCH)
SUBTTL CLOCK LEVEL APR ERROR HANDLING
;HERE ON PI 7 CLOCK INTERRUPT TO PROCESS APR ERRORS FOR INDIVIDUAL JOBS
;.CPAEF HOLDS COMMUNICATION FLAGS SET BY APR PI INTERRUPT LEVEL
;CALL: MOVE S,.CPAEF
; JUMPN S,APRILM ;COME HERE IF ANYTHING HAPPENED
; RETURN TO RESCHEDULE NEW USER
APRILM::MOVEM S,.CPSAC## ;HERE ON ANY APR ERROR OR MEM PARITY
SKIPN J,.CPJOB## ;CURRENT JOB ON THIS CPU
SETOM .CPNJE## ;MAKE SURE NULL JOBS AC'S ARE RESTORED
JUMPGE S,APRIL1 ;REQUEST TO SCAN MEMORY FOR PARITY OR NXM?
TLNN S,(CP.PSX!CP.CSX) ;YES IS THIS JUST A PRINT JOB MESSAGES REQUEST?
JRST APRIL2
;YES--GO LOOP THRU JOBS AND PRINT MESSAGES TO TTY'S
PUSHJ P,PARSWP ;NO--SWEEP CORE (AND FLAG JOBS ON KI10)
APRIL2: MOVE J,HIGHJB## ;HIGHEST JOB NUMBER
TRNE S,UE.NXM ;NXM INSTEAD OF PARITY ERROR?
JRST NXMLOP
;YES--REPORT NXM TO ALL JOBS AFFECTED
;NO--REPORT PARITY TO ALL JOBS AFFECTED
; FALL INTO PARLOP
;;LOOP TO SCAN ALL JOBS, ZAP BAD ONES AND PRINT PARITY ERROR MESSAGE
PARLOP: MOVEI T1,JS.MPE ;MEM PARITY FOR JOB
TDNN T1,JBTSTS##(J) ;JOB HAVE MEM PAR IN LOW/HIGH SEG OR UPMP?
JRST PARLO1
;NO--KEEP LOOKING
ANDCAM T1,JBTSTS##(J) ;YES, CLEAR IN JOB STATUS WORD
SKIPN JBTADR##(J) ;IS LOW SEG STILL IN CORE? (NO IF SWAPOUT ERROR)
JRST PARLO1
;NO--KEEP LOOKING
PUSHJ P,ZAPHIM ;RETURN ALL HIS RESOURCES
PUSHJ P,PARSTP ;STOP JOB AND PRINT MESSAGE
PARLO1: SOJG J,PARLOP ;LOOP OVER ALL JOBS
IFN FTMP,&
PUSHJ P,GETMM## ;GET THE MM
;MUST WAIT
PUSHJ P,CPINXF ;FIX CORE TABLES, IF NEEDED
;CORMAX WAS DECREASED
JRST PARXIT
;ALL JOBS NOT ZAPPED CAN CONTINUE TO RUN
IFN FTMP,&
PUSHJ P,GIVMM## ;RETURN THE MM
;HERE IF CORMAX WAS DECREASED SO ALL JOBS MUST BE SCANNED AND ANY
; WHICH ARE TOO BIG TO BE SWAPPED IN MUST BE ZAPPED ALSO
;FIRST CALL ARG. TO JBSTBG
PARLP2: MOVE T1,CORMAX## ;GET CURRENT VALUE OF CORMAX
PUSHJ P,JBSTBG ;SEE IF THIS JOB IS NOW TOO BIG TO RUN
JRST PARXI1
;ALL JOBS HAVE BEEN LOOKED AT
PUSHJ P,PARSTP ;STOP THE JOB AND TELL THE USER
JRST PARLP2
;KEEP GOING
;EXIT FROM PARITY SWEEP AND PRINT ROUTINE
IFN FTMP,&
PUSHJ P,GIVMM## ;RETURN THE MM
PARXI1: HRROI S,UE.PEF ;CLEAR PARITY ERROR FLAG
ANDCAB S,.CPAEF## ;OTHER APR ERRORS?
JUMPN S,APRILM ;YES, GO PROCESS THEM
NXMLOP: MOVEI T1,JS.NXM ;JOB OVERLAPS NXM BIT
TDNN T1,JBTSTS##(J) ;DOES THIS JOB OVERLAP NXM?
JRST NXMLP1
;NO, KEEP LOOKING
ANDCAM T1,JBTSTS##(J) ;CLEAR THE BIT
CAME J,MOFLPG## ;IS THIS THE JOB THAT TYPED SET MEM ON?
SKIPN JBTADR##(J) ;DOES THIS JOB HAVE CORE IN CORE?
JRST NXMLP1
;IF NO TO EITHER, DO NOTHING
PUSHJ P,ZAPUSR ;ZAP THE PROGRAM
IFN FTLOCK,&
PUSHJ P,UNLOCK## ;UNLOCK IT IF LOCKED
PUSHJ P,NXMSTP ;STOP THE JOB AND TELL THE USER WHAT HAPPENED
NXMLP1: SOJG J,NXMLOP ;LOOP OVER ALL JOBS ON THE SYSTEM
MOVE J,.CPJOB## ;JOB CURRENTLY RUNNING ON THIS CPU
CAMN J,MOFLPG## ;JOB SETTING MEMORY ON-LINE?
JRST NXMXI1
;YES, IT CAUSED NXM, SET MEM ON WILL CALL CPINXF
IFN FTMP,&
PUSHJ P,GETMM## ;GET THE MM
;MUST WAIT
PUSHJ P,CPINXF ;FIX CORE ALLOCATION TABLES, ETC.
;CORMAX WAS DECREASED
JRST NXMXIT
;ALL JOBS NOT ZAPPED CAN CONTINUE TO RUN
IFN FTMP,&
PUSHJ P,GIVMM##
;HERE IF CORMAX WAS DECREASED SO ALL JOBS MUST BE SCANNED AND ANY
; WHICH ARE TOO BIG TOO BE SWAPPED IN MUST BE ZAPPED
;STARTING WITH JOB 0,
NXMLP2: MOVE T1,CORMAX## ; AND THE CURRENT VALUE OF CORMAX
PUSHJ P,JBSTBG ;SEE IF THIS JOB IS NOW TO BIG TO BE RUN
JRST NXMXI1
;ALL JOBS HAVE BEEN LOOKED AT
PUSHJ P,NXMSTP ;STOP THE JOB AND TELL THE USER
JRST NXMLP2
;SEE IF ANYMORE JOBS ARE TOO BIG
IFN FTMP,&
PUSHJ P,GIVMM##
NXMXI1: HRROI S,UE.NXM ;CLEAR SOFTWARE NXM FLAG
ANDCAB S,.CPAEF## ; ..
JUMPN S,APRILM ;GO PROCESS OTHER ERRORS IF THEY EXIST
;OTHERWISE, RETURN
;SUBROUTINE TO PRINT MEM PAR ERROR FOR JOB N AND STOP JOB
;CALL: MOVE J,JOB NO
; PUSHJ P,PARSTP
; ALWAYS RETURN
PARSTP: PUSHJ P,SVEUB## ;MAKE JOB ADDRESSABLE
PUSHJ P,ZAPPGM## ;"CORE 0"
JSP T1,ERRPNT ;PRINT STANDARD ERROR IN JOB MESSAGE
ASCIZ /Memory parity error/
JRST NXMST1
;PRINT MESSAGE AND STOP HIM
;SUBROUTINE TO PRINT NXM ERROR FOR JOB N AND STOP JOB
NXMSTP: PUSHJ P,SVEUB## ;MAKE JOB ADDRESSABLE
PUSHJ P,ZAPPGM## ;"CORE 0"
JSP T1,ERRPNT ;PRINT ERROR MESSAGE FOR THE USER
ASCIZ /Non-existent memory error/
AOS .CPNJA## ;COUNT NUMBER OF JOBS ZAPPED BECAUSE OF NXM
NXMST1: DMOVE T1,.CPMDP## ;PC WHERE THE ERROR OCCURRED
PJRST DPCPNT
;PRINT INFO FOR USER AND STOP HIM
;SUBROUTINE CALLED TO HALT CPU ON SERIOUS ERROR IN MEMORY
PARHLT::CONO PI,PI.OFF ;NO INTERRUPTS DURING TYPEOUT
PUSHJ P,PARHL1 ;TYPE OUT APPROPRIATE MESSAGE ON CTY
;GIVE DIE LOCK BACK
STOPCD .,HALT,FEM ;++FATAL ERROR IN MONITOR
PARHL1: MOVEI T1,CTYWAT## ;NON-PI CTY TYPEOUT ROUTINE ADDRESS
MOVEM T1,.CPTOA## ;MAKE IT THE ONE TO USE HERE
IFN FTKL10,&
PUSHJ P,SVPPC## ;MAKE SURE WE'RE IN SECONDARY PROTOCOL ON KL10
SKIPN .CPREP## ;A PARITY ERROR? (NOT NXM)
JRST NXMCTY
;NO, NXM REPORT NXM INSTEAD
PUSHJ P,INLMES## ;PRINT MESSAGE TO INFORM OPER OF HALT
?Non-recoverable memory parity error in monitor.
[CPU Halt]
;RETURN AND HALT
NXMCTY: PUSHJ P,INLMES## ;INFORM OPR OF HALT
?Non-existent memory detected in monitor.
[CPU Halt]
;RETURN AND HALT
;ROUTINE TO SCAN MEMORY FOR PARITY OR NXM ERRORS (APR PI OR PI 7)
;CALLED AT APR PI IF MAY BE A SERIOUS ERROR IN MONITOR AND PIS IN PROGRESS
; MOVE J,CURRENT JOB NO. ON THIS CPU
; MOVE S,.CPAEF SWEEP REQUEST BITS
; PUSHJ P,PARSWP
; ALWAYS RETURNS - LH .CPMPC SET NEG. IF SERIOUS MONITOR PARITY
; S PRESERVED
PARSWP::HRRZ U,.CPCTN## ;GET CPU'S CTY LINE NUMBER
MOVE U,LINTAB##(U) ;NOW GET HIS LDB
TRNN S,UE.PEF ;PARITY ERROR?
JRST NXMSWP
;NO, SWEEP FOR NXM
PUSHJ P,ANNSWP## ;YES, TELL OPR THAT A SWEEP IS IN PROGRESS
SETOM .CPREP## ;TELL REPORTERS WHICH ERROR TYPE TO REPORT
SETOM .CPPAA## ;YES, SET PARITY AND OF BAD ADDRESSES TO -1
SETOM .CPPAC## ;SET PARITY AND OF BAD CONTENTS TO -1
SETZM .CPPOA## ;SET PARITY OR OF BAD ADDRESSES TO 0
SETZM .CPPOC## ;SET PARITY OR OF BAD CONTENTS TO 0
AOS .CPPSC## ;INCREMENT PARITY SWEEP COUNT
SETZM .CPPTS## ;SET NO OF PARITIES THIS SWEEP TO 0
IFN FTKL10,&
PUSHJ P,SVPPC## ;DON'T LET FE TIME US OUT WHILE SWEEPING
PUSHJ P,APRMPS## ;CALL MEMORY SWEEP ROUTINE
SETZM .CPLPP## ;CLEAR LAST PARITY ERROR PC
SKIPE .CPPTS## ;WERE SOME BAD WORDS FOUND ON SWEEP?
SKIPA T1,[EDELIM] ;YES--JUST GET END DELIMITER TEXT
MOVEI T1,[ASCIZ /No parity errors were found.
***************
;NO--TELL THEM THAT
PUSHJ P,CONMES## ;PRINT IT
PUSHJ P,PARELG ;DO PARITY TRAP ERROR LOGGING
SKIPE .CPPTS## ;IF SOME REAL ERRORS WERE FOUND
; THEN JUST RETURN NOW
TLNN S,(CP.PSX) ;DID PROCESSOR DETECT PARITY?
AOSA .CPPCS## ;NO, COUNT CHANNEL SPURIOUS COUNT
AOS .CPSPE## ;YES, COUNT PROCESSOR SPURIOUS COUNT
PARELG: HLRE T1,PSETBL+.EXFLG ;GET TRANSFER TABLE LENGTH
;MAKE POSITIVE
ADDI T1,.CPPRL##+M.CBAT## ;PLUS LENGTHS OF PARITY & BAT SUBTABLES
PUSHJ P,ALCSEB ;ALLOCATE CORE FOR SYSTEM ERROR BLOCK
;NONE AVAILABLE
XMOVEI T2,PSETBL ;POINT TO TRANSFER TABLE
PUSHJ P,XFRSEB ;FILL IN THE STATIC PORTION
MOVSI T2,.CPLPA## ;POINT TO START OF PARITY TABLE
HRRI T2,15(T1) ;AND TO STORAGE
MOVEI T3,15+.CPPRL##(T1) ;COMPUTE END OF BLT
BLT T2,-1(T3) ;COPY PARITY TABLE
HRLI T2,.CPBAT## ;POINT TO START OF BAD ADDRESS TABLE
BLT T2,M.CBAT##-1(T3) ;COPY IT
PJRST QUESEB
;QUEUE ERROR BLOCK AND RETURN
;TRANSFER TABLE FOR PARITY REPORTING
PSETBL: SEBTBL (.ERSPR,PSEEND,&EX.SYE&)
MOVE .CPPHY## ;(R00) PHYSICAL CPU NAME
MOVE .CPTPE## ;(R01) TOTAL ERRORS ON SWEEP OF CORE
MOVE .CPSPE## ;(R02) TOTAL ERRORS NOT REPRODUCABLE
MOVE .CPMPW## ;(R03) CONTENS OF FIRST BAD WORD
MOVE .CPMPA## ;(R04) FIRST BAD ADDRESS
MOVE [-.CPPRL##,,15] ;(R05) OFFSET TO PARITY DATA
MOVE [-M.CBAT##,,15+.CPPRL##] ;(R06) OFFSET TO BAD ADDRESS TABLE
;ROUTINE TO PRINT WHO REQUESTED SCAN, WHERE, AND AT WHAT TIME
PRCHCP::TLNN S,(CP.PSX) ;REQUESTED BY CPU?
JRST PRCHC1
;NO--BY CHANNEL
MOVEI T1,[ASCIZ /CPU/]
PUSHJ P,CONMES## ;APPEND "CPU"
MOVEI T1,5
;START WITH CPU 5
;COPY OF S
PRCHC0: LSH T2,-1
TLNN T2,(CP.PS5_-1) ;IS IT THIS CPU?
SOJGE T1,PRCHC0 ;NO--TRY NEXT
PUSHJ P,RADX10## ;YES--APPEND CPU NUMBER
JRST PRCHC3
PRCHC1: MOVEI T1,[ASCIZ /channel /]
PUSHJ P,CONMES## ;APPEND "CHANNEL"
MOVEI T1,7
;START WITH CHANNEL 7
;COPY OF S
PRCHC2: LSH T2,-1
;NEXT CHANNEL
TLNN T2,(CP.CS7_-1) ;IS IT THIS CHANNEL?
SOJGE T1,PRCHC2 ;NO--TRY NEXT
PUSHJ P,RADX10## ;YES--APPEND CHANNEL NUMBER
PRCHC3: MOVEI T1,[ASCIZ / on /]
PUSHJ P,CONMES## ;APPEND "ON"
MOVE T2,.CPLOG## ;SCANNING CPU'S (THIS) NAME
PUSHJ P,PRNAME## ;APPEND IT
MOVEI T1,[ASCIZ / on /]
PUSHJ P,CONMES## ;APPEND "ON"
PUSHJ P,DATIME## ;AND THE DATE AND TIME
PUSHJ P,PCRLF## ;FINISH WITH A CRLF
;SUBROUTINE TO SWEEP CORE LOOKING FOR NON-EXISTENT MEMORY
NXMSWP: PUSHJ P,ANNSWP## ;ANNOUNCE SWEEP
SETZM .CPLNA## ;ZERO HIGHEST NXM SEEN
SETZM .CPREP## ;SET NXM FLAG
SETOM .CPNAA## ;CLEAR AND OF NON-EXISTENT ADDRESSES
SETZM .CPNOA## ; AND OR OF NON-EXISTENT ADDRESSES
SETZM .CPNJA## ;NO JOBS AFFECTED YET
AOS .CPNSC## ;INCREMENT THE NUMBER OF NXM SWEEPS DONE
SETZM .CPNTS## ;CLEAR THE COUNT OF NXMS SEEN THIS SWEEP
IFN FTKL10,&
PUSHJ P,SVPPC## ;DON'T LET FE TIME US OUT
PUSHJ P,APRMPS## ;SWEEP MEMORY
SETZM .CPLPP## ;CLEAR LAST ERROR PC
SKIPE T1,.CPNTS## ;ANY NON-EXISTANT MEMORY SEEN?
JRST [SOSE T1 ;ANY SEEN?
PUSHJ P,PRTEMS ;YES, REPORT THEM
MOVEI T1,EDELIM;GET ENDING MESSAGE
JRST .+2] ;PRINT THAT
MOVEI T1,[ASCIZ /No non-existent memory was found.
***************
;NO--TELL THEM THAT
PUSHJ P,CONMES## ;PRINT IT
PUSHJ P,NXMELG ;DO NXM TRAP ERROR LOGGING
SKIPE .CPNTS## ;IF SOME REAL ERRORS WERE FOUND
; THEN JUST RETURN NOW
TLNE S,(CP.PSX) ;DID THE PROCESSOR SEE THE NXM?
AOSA .CPSNE## ;YES, COUNT PROCESSOR SPURIOUS COUNT
AOS .CPNCS## ;NO, COUNT SPURIOUS CHANNEL NXMS
PRTEMS: MOVEI T1,[ASCIZ / to /]
PUSHJ P,CONMES## ;PRINT END OF RANGE TEXT
MOVE T1,.CPLNA## ;LAST NXM ADDRESS IN RANGE
PUSHJ P,PRTDI8## ;PRINT HIGHEST NXM ADDRESS SEEN
MOVEI T1,[ASCIZ / (phys.)
PJRST CONMES## ;PRINT THAT
;DELIMITER TEXT FOR CTY SYSTEM ERROR MESSAGES
SDELIM::ASCIZ /
***************
EDELIM::ASCIZ /***************
NXMELG: HLRE T1,NXETBL+.EXFLG ;GET TRANSFER TABLE LENGTH
;MAKE POSITIVE
ADDI T1,&2*NXMTBL##&+M.CBAT## ;PLUS 2 COPIES OF NXMTAB AND BAT
PUSHJ P,ALCSEB ;ALLOCATE CORE FOR SYSTEM ERROR BLOCK
;NONE AVAILABLE
XMOVEI T2,NXETBL ;POINT TO TRANSFER TABLE
PUSHJ P,XFRSEB ;FILL IN THE STATIC PORTION
MOVSI T2,OLDNXM## ;ADDR OF OLD NXMTAB
HRRI T2,.EBHDR+21(T1) ;WHERE TO PUT OLD NXMTAB
MOVEI T3,.EBHDR+21+NXMTBL##(T1) ;COMPUTE END OF BLT
BLT T2,-1(T3) ;COPY OLD NXMTAB
HRLI T2,NXMTAB## ;POINT TO CURRENT NXMTAB
ADDI T3,NXMTBL## ;COMPUTE END OF BLT
BLT T2,-1(T3) ;COPY CURRENT NXMTAB
HRLI T2,.CPBAT## ;POINT TO START OF BAD ADDRESS TABLE
BLT T2,M.CBAT##-1(T1) ;COPY IT
PJRST QUESEB
;QUEUE ERROR BLOCK AND RETURN
;TRANSFER TABLE FOR NXM REPORTING
NXETBL: SEBTBL (.ERSNX,NXEEND,&EX.SYE&)
MOVE .CPPHY## ;(R00) PHYSICAL CPU NAME
MOVE .CPTNE## ;(R01) COUNT OF ERROR ON SWEEP OF CORE
MOVE .CPSNE## ;(R02) NOT REPRODUCIBLE ERROR COUNT
MOVE .CPMNA## ;(R03) FIRST BAD ADDR FROM SWEEP
MOVE .CPLNA## ;(R04) LAST NXM ADDRESS
MOVE .CPMNR## ;(R05) LAST NXM RELATIVE ADDRESS
MOVE .CPNTS## ;(R06) NUMBER OF NXMS FOUND THIS SWEEP
MOVE .CPNSC## ;(R07) NUMBER OF NXM SWEEPS DONE
MOVE .CPUEN## ;(R10) NUMBER OF USER ENABLED NXMS
MOVE .CPNAA## ;(R11) LOGICAL AND OF BAD ADDRESSES
MOVE .CPNOA## ;(R12) INCLOSIVE OR OF BAD ADDRESSES
MOVE .CPNCS## ;(R13) NUMBER OF SPURIOUS CHANNEL NXMS
MOVE [] ;(R14) SYSERR CODE,,PAGING MACHINE
MOVE [-NXMTBL##,,26] ;(R15) OFFSET TO OLD NXMTAB
MOVE [-NXMTBL##,,26+NXMTBL##] ;(R16) OFFSET TO NEW NXMTAB
MOVE [-M.CBAT##,,26+&2*NXMTBL##&] ;(R17) OFFSET TO BAD ADDRESS TABLE
;SUBROUTINE TO RECORD MEM PARITY DATA FOR EACH BAD WORD
;CALL: MOVE T1,REL ADDR WITHIN HIGH OR LOW SEG,
-1 IF NEITHER IN MONITOR NOR HIGH NOR LOW SEG
; MOVE P1,ABS ADR OF BAD WORD (22 BITS)
; MOVE S,.CPAEF FLAG BITS
; MOVE P2,CONTENTS OF BAD WORD
; PUSHJ P,PARRBD ;RECORD BAD DATA
; ALWAYS RETURN EVEN IF SERIOUS ERROR
;CALLED FROM CPU DPENDENT MEMORY SWEEP LOOP
PARRBD::TRNN S,UE.PEF ;A PARITY ERROR?
JRST NXMRBD
;NO, RECORD NXM
AOS .CPTPE## ;INCREMENTATION NO OF MEM PARITY ERRORS FOR SYSTEM
AOS T2,.CPPTS## ;INCREMENT NO OF PARITY ERRORS THIS SWEEP
SOJG T2,PARSEC ;IS THIS THE FIRST ERROR THIS SWEEP?
MOVEM P1,.CPMPA## ;YES, SAVE BAD ADDRESS
MOVEM P2,.CPMPW## ;BAD CONTENTS
MOVEI T1,[ASCIZ /Parity errors detected:
PUSHJ P,CONMES## ;ANNOUNCE ERRORS SEEN
PARSEC: MOVEI T1,[ASCIZ /
PUSHJ P,CONMES## ;PRINT "AT"
MOVE T1,P1
;BAD ADDRESS
PUSHJ P,PRTDI8## ;PRINT IT
MOVEI T1,[ASCIZ / (phys.), Contents = /]
PUSHJ P,CONMES## ;PRINT MORE MESSAGE
MOVE T1,P2
;GET BAD CONTENTS
PUSHJ P,HWDPNT## ;PRINT IT
IFN FTKL10,&
MOVEI T1,[ASCIZ /, ERA = /]
PUSHJ P,CONMES## ;CONTINUE MESSAGE
MOVE T1,.CPSTE## ;GET ERA FROM LAST SCAN TRAP
PUSHJ P,HWDPNT## ;PRINT IT
PUSHJ P,CRLF## ;END WITH CRLF
ANDM P1,.CPPAA## ;ACCUM AND OF BAD ADDRESSES THIS SWEEP
ANDM P2,.CPPAC## ;ACCUM AND OF BAD CONTENTS THIS SWEEP
IORM P1,.CPPOA## ;ACCUM OR OF BAD ADDRESSES THIS SWEEP
IORM P2,.CPPOC## ;ACCUM OR OF BAD CONTENTS THIS SWEEP
MOVE T2,.CPPTS## ;PARITY ERRORS FOUND ON CURRENT SCAN
CAIG T2,M.CBAT## ;IS THERE ROOM FOR THIS BAD ADR IN TABLE?
MOVEM P1,.CPBAT##-1(T2) ;YES, STORE IN I-TH POSITION IN CDB
MOVEM P1,.CPLPA## ;ALWAYS STORE LAST PARITY ADDRESS
;HERE TO RECORD NON-EXISTANT MEMORY FOUND ON THE SWEEP
NXMRBD: PUSH P,T1
AOS .CPTNE## ;COUNT TOTAL NUMBER OF NXMS SEEN
AOS T2,.CPNTS## ;COUNT UP THE NUMBER SEEN THIS SWEEP
SOJG T2,NXMSEC ;JUMP IF NOT THE FIRST NXM THIS SWEEP
MOVEM P1,.CPMNA## ;FIRST THIS SWEEP, RECORD BAD ADDRESS
MOVEI T1,[ASCIZ /Non-existent memory detected:
PUSHJ P,CONMES## ;ANNOUNCE ERRORS
NXMSEC: SKIPN T2,.CPLNA## ;SEEN A NXM?
JRST NXMSE1
;CONTIGUOUS WITH PREVIOUS NON-EXISTANT WORD?
CAMN P1,T2
JRST NXMSE2
;NO, JUST RECORD
PUSHJ P,PRTEMS ;YES, REPORT THE NXM RANGE
NXMSE1: MOVEI T1,[ASCIZ /
PUSHJ P,CONMES## ;PRINT "AT"
MOVE T1,P1
;GET BAD ADDRESS
PUSHJ P,PRTDI8## ;PRINT IT
MOVEI T1,[ASCIZ / (phys.)/]
PUSHJ P,CONMES## ;AND THIS
NXMSE2: ANDM P1,.CPNAA## ;AND OF BAD ADDRESSES
IORM P1,.CPNOA## ;OR OF BAD ADDRESSES
MOVE T2,.CPNTS## ;NUMBER OF NXM'S SEEN ON CURRENT SCAN
CAIG T2,M.CBAT## ;HAVE THE MAXIMUM NUMBER OF BAD ADDRESSES BEEN STORED?
MOVEM P1,.CPBAT##-1(T2) ;NO, STORE THIS ONE
MOVEM P1,.CPLNA## ;ALWAYS STORE THE LAST BAD ADDRESS
MOVE T1,P1
;BAD ADDRESS TO T1
LSH T1,W2PLSH ;CONVERT TO BAD PAGE
IDIVI T1,^D36
;36 BITS/WORD
MOVE T2,BITTBL##(T2) ;BIT POSITION WITHIN THE WORD
IORM T2,NXMTAB##(T1) ;MARK THIS PAGE AS NON-EXISTANT
;RESTORE T1
JUMPE T1,CPOPJ## ;RETURN IF BAD ADDRESS NOT IN THE MONITOR OR A JOB
JUMPN J,NXMJHS ;JUMP IF BAD ADDRESS IN SOME SEGMENT
HRROS .CPMPC## ;BAD ADDRESS IS IN THE MONITOR,
; FLAG THIS AS A SERIOUS ERROR
;AND CONTINUE THE SWEEP
NXMJHS: JUMPL J,NXMJH2 ;FLAG JOB IF IN UPMP
CAILE J,JOBMAX## ;BAD ADDRESS IN A HIGH SEGMENT?
PJRST HGHPAR## ;YES, FLAG HIGH SEGMENT AS IN NXM
NXMJH2: MOVEI T1,JS.NXM ;BAD ADDRESS IN A LOW SEGMENT, FLAG
IORM T1,JBTSTS##(J) ; THE JOB TO BE STOPPED
;AND RETURN TO CONTINUE THE SWEEP
;SUBROUTINE TO FLAG JOB FOR MESSAGE - IF APR DETECTED (RATHER THAN CHANNEL)
;CALL: MOVE J,JOB NUMBER
; MOVE S.CPAEF ;CPU OR CHAN DETECTED PARITY
; PUSHJ P,PARJOB
; ALWAYS RETURN
;CALLED ON CPU0 AND CPU1
PARJOB: TLNN S,(CP.PSX) ;PARITY FOUND BY ANY PROCESSOR?
;NO, RETURN
;YES, FALL INTO PARJB1
;SUBROUTINE TO FLAG JOB FOR MEM PAR MESSAGE - ALWAYS
;CALL: MOVE J,JOB NUMBER
; PUSHJ P,PARJB1
; ALWAYS RETURN
PARJB1::MOVSI T1,JACCT ;CLEAR JACCT SO THAT DAMAGED PROGRAM
ANDCAM T1,JBTSTS##(J) ; WILL NOT HAVE PRIVILEGES
MOVEI T1,JS.MPE ;MEMORY PARITY ERROR IN JOB FLAG
IORM T1,JBTSTS##(J) ;SET JOB STATUS WORD
;SUBROUTINE TO RETURN ALL JOBS WHICH ARE OR WOULD BE TOO BIG TO RUN
; IF MEMORY HAS DROPPED OFF LINE OR WERE TO BE SET OFF LINE
;CALLING SEQUENCE:
; MOVE T1,NEW VALUE OF CORMAX
; MOVEI J,0 ;FIRST CALL
; PUSHJ P,JBSTBG
;RETURN CPOPJ IF NO JOB OR NONE OF THE REMAINING JOBS ARE TOO BIG, CPOPJ1
; IF A JOB IS TOO BIG, J = JOB NUMBER OF THE JOB WHICH IS TOO BIG
JBSTBG::PUSH P,T1
;SAVE THE NEW VALUE OF CORMAX
JBSTB1: ADDI J,1
;LOOK AT THE NEXT JOB
CAMLE J,HIGHJB## ;LOOKED AT ALL JOBS?
JRST TPOPJ##
;YES, GIVE ALL DONE RETURN
PUSHJ P,SEGSIZ## ;SIZE OF THIS JOBS LOW SEGMENT
HRRZ T1,JBTSGN##(J) ;POINT TO SEGMENT CHAIN
JUMPE T1,JBTSB4 ;NO SEGS
;SAVE THE JOB NUMBER
JBTSB2: SKIPLE J,.HBSGN(T1) ;SEGMENT WORD FOR THIS SEGMENT
PUSHJ P,SEGSIZ## ;REAL, GET THE SIZE OF THE HIGH SEGMENT
ADDM T2,-1(P) ;ADD IT IN
HRRZ T1,.HBLNK(T1) ;POINT TO NEXT SEGMENT
JUMPN T1,JBTSB2 ;LOOP ON
;RESTORE THE JOB NUMBER
JBTSB4: POP P,T1
;RESTORE SUMMED SIZE
LSH T1,P2WLSH ;SIZE OF THE JOB IN WORDS
CAMLE T1,(P)
;IS THE JOB TOO BIG TO CONTINUE TO RUN?
JRST TPOPJ1## ;YES, SKIP RETURN TO CALLER
JRST JBSTB1
;NO, LOOK AT THE NEXT JOB
;HERE IF NO MEM PARITY - MUST BE APR ERROR
APRIL1: SETZM .CPAEF## ;CLEAR APR ERROR FLAG (IN CASE OTHER APR ERRORS
; OCCUR BEFORE EXIT THIS CODE)
DMOVE T1,.CPAPC## ;ERROR PC STORED BY APR PI LEVEL
; (REAL PC MAY HAVE BEEN ZEROED TO DISMISS INT)
DMOVEM T1,.CPPC## ;STORE IN CURRENT USER PROTECTED PC
; (SO DUMP WILL KNOW REAL PC)
DMOVEM T1,.JDAT+JOBPD1##STORE FOR POSSIBLE .JBINT
TRNE S,AP.PPV ;PROPRIETARY VIOLATION?
JRST APRPPV
TRNN S,AP.ILM ;ILLEGAL MEMORY?
JRST APRNXM
SIGNAL C$IMR
;SIGNAL ILL MEM REF CONDITION
;USER DOESN'T WANT TRAP
;WANTS INTERCEPT GO TO USER
MOVE T1,.CPAPC##+1 ;PC STORED BY APR INTERRUPT
XOR T1,.USPFW ;PAGE FAULT WORD
TDNE T1,[MXSECN*&HLGPNO+1&+&HLGPNO_P2WLSH&+PG.BDY]
JRST APRILR
;YES, GO PRINT ILL MEM REF
JSP T1,ERRPTU ;NO, PRINT PC EXCEEDS MEM BOUND
ASCIZ /PC out of bounds/
JRST APRSCD
;PRINT LOC, THEN STOP JOB
APRILR: JSP T1,ERRPTU
ASCIZ /Illegal memory reference/
JRST APRSCD
;PRINT LOC, THEN STOP JOB
APRNXM: TRNN S,AP.NXM ;NON-EX MEM?
JRST APRPDL
SIGNAL C$NXM
;SIGNAL JOB
;NOT INTERRESTED
;TRAP TO USER
SKIPE J,.CPJOB## ;JOB RUNNING WHEN NXM HAPPENED
PUSHJ P,GIVRES ;RETURN RESOURCES, ETC.
JSP T1,ERRPTU ;YES
NXMMES::ASCIZ /Non-existent memory/
JRST APRSCD
;PRINT LOC, THEN STOP JOB
APRPPV: JSP T1,ERRPTU
ASCIZ /Proprietary violation/
JRST APRSCD
;SUBROUTINE TO PRINT JOB NUMBER AND PROG NAME ON OPR
;CALL: MOVEI T1,JOB STATUS BIT (JS.MPE OR JS.DPM)
; MOVE U,LINE DATA BLOCK FOR CTY OR OPR
; PUSHJ P,OPRPJN ;PRINT JOB NUMBERS
; ALWAYS RETURN
OPRPJN: PUSH P,T1
;SAVE JOB STATUS BIT TO TEST FOR MESSAGE
PUSHJ P,INLMES## ;TELL HIM JOB NOS. SO HE WILL RESTART
; SYSTEM JOBS IF THEY HAVE PROBLEM
ASCIZ / for job/
MOVE J,HIGHJB## ;HIGHEST JOB NUMBER
;LOOP TO PRINT JOB NOS. AND PROGRAM NAME OF ALL JOBS WITH BAD PARITY
; OR DAEMON PROBLEM MESS
PARLP1: MOVE T1,JBTSTS##(J) ;JOB STATUS WORD
TDNE T1,(P)
;DOES THIS JOB HAVE BAD PARITY OR DAEMON
; PROBLEM? (DEPENDING ON CALLERS ARG)
PUSHJ P,PRJBNM ;YES, PRINT JOB# AND PROGRAM NAME
SOJG J,PARLP1 ;ANY MORE JOBS?
;RESTORE STACK
PJRST CRLF##
;NO, PRINT CRLF AND RETURN
;SUBROUTINE TO PRINT SWAP OUT MEM PAR ERROR
;CALL: MOVE J,JOB USING HIGH SEG (WHETHER IN CORE OR NOT)
; PUSHJ P,SWOMES
; ALWAYS RETURN JOB SWAPPED, DAEMON CALLED
SWOMES::MOVSI T1,JERR
;SET JERR SO WE DO NOT
IORM T1,JBTSTS##(J) ;TRY TO INTERCEPT
JSP T1,ERRPNT ;PRINT MESSAGE
ASCIZ /Swap out channel memory parity error/
PJRST APRSCD
;PRINT PC AND STOP JOB
;SUBROUTINE TO PRINT &SPACE& JOB NO. [PROG. NAME]
; MOVE J,JOB NUMBER
; MOVE U,LDB FOR OPR OR CTY
; PUSHJ P,PRJBNM
;PRINT JOB NO. AND PROG. NAME
; ALWAYS RETURN
PRJBNM::PUSHJ P,PRSPC## ;YES, PRINT LEADING SPACE
;PRINT JOB NO.
PUSHJ P,RADX10## ;AS DECIMAL
PUSHJ P,PRLBK## ;PRINT LEFT BRACKET
MOVE T2,JBTPRG##(J) ;PROGRAM NAME
PUSHJ P,PRNAME## ;PRINT SO OPER WILL RECOGNIZE HIS JOBS
PJRST PRRBK##
;PRINT RIGHT BRACKET AND RETURN TO CALLER
;SUBROUTINE TO CHECK IF JOB HAS BEEN WAITING FOR TWO SUCCESSIVE
; MINUTE CHECKS FOR DAEMON.
CALLED ONCE A MINUTE FOR EACH JOB
;CALL: MOVE J,JOB NUMBER
; PUSHJ P,DPMJOB
YES RETURN - MESSAGE PRINTED ON JOB CONSOLE
; NO RETURN
DPMJOB::MOVE T1,JBTSTS##(J) ;JOB STATUS WORD
TRNN T1,JS.DPM ;THIS JOB BEEN WAITING FOR 2 CONSECUTIVE MIN?
JRST CPOPJ1## ;NO
PUSHJ P,STDAEM## ;START DAEMON
PJRST DAEDON## ;NO DAEMON
PUSHJ P,TTYFND## ;YES, FIND CONTROLLING TTY
JUMPE U,CPOPJ##
PUSHJ P,DAEPRB ;PRINT PROBLEM WITH DAEMON
PUSHJ P,INLMES## ;TELL USER WHAT SYSTEM IS DOING ABOUT IT
ASCIZ /, operator action requested
PJRST TTYSTR## ;START TTY
;SUBROUTINE TO PRINT ON OPR PROBLEM WITH DAEMON
;CALLED ONCE A MIN ONLY IF A JOB IS STILL WAITING
;CALL: PUSHJ P,DPMOPR
DPMOPR::MOVE U,OPRLDB## ;OPR LINE DATA BLOCK HDR
PUSHJ P,DAEPRB ;PRINT PROBLEM WITH DAEMON
MOVEI T1,JS.DPM ;JOB STATUS BIT - NEED DAEMON PROB MESS.
PJRST OPRPJN
;TELL OPR WHICH JOBS ARE STUCK
;SUBROUTINE TO PRINT PROBLEM WITH DAEMON
;CALL: MOVE U,LINE DATA BLOCK ADR
; PUSHJ P,DAEPRB
DAEPRB: PJSP T1,CONMES## ;PRINT MESSAGE AND RETURN
%Problem with DAEMON/
APRPDL: TRNE S,AP.POV ;PUSHDOWN OVERFLOW?
JRST PRTPOV
;YES - PRINT USER ERROR MESSAGE
TRNN S,AP.FOV!AP.AOV ;ARITHMETIC OR FLOATING OVERFLOW?
JRST APRLTH
;NO, SEE IF LOOP
JSP T1,ERRPTU ;OUTPUT MESSAGE
ASCIZ /Arithmetic overflow at extended/
JRST APRSCD
APRLTH: TRNN S,XP.LTH ;LOOP IN TRAP HANDLER?
STOPCD CPOPJ##,DEBUG,SAC, ;++STRANGE APR CONDITION
JSP T1,ERRPTU ;TYPE MESSAGE
ASCIZ /Loop in trap handler/
JRST APRSCD
;AND PC OF ERROR
SIGNAL C$PLOV
;SEE IF USER CARES
JSP T1,ERRPTU ;PRINT ERROR MESSAGE
PDLMES::ASCIZ /Push down list overflow/
APRSCD: DMOVE T1,.CPAPC## ;PRINT APR PC
JRST DPCPNT
; 1)"AT USER LOC XXX" OR
; 2)"AT EXEC LOC XXX; EXEC CALLED FROM
; EXEC/USER LOC YYY
SUBTTL PDL OVERFLOW RECOVERY CODE
;THIS CODE WILL EXTEND A UUO LEVEL PDL; IT SHOULD BE JRSTD TO (IN SECTION 1
;FOR FTXMON MONITORS) FROM K?SER ON A PDL OVERFLOW TRAP.
THE PDL IS EXTENDED
;USING FUNNY SPACE.
THE FOLLOWING RESTRICTIONS APPLY:
;1) IF SUFFICIENT FUNNY SPACE IS NOT AVAILABLE (INSUFFICIENT CONTIGUOUS
; FREE SLOTS, NO SWAP SPACE, ETC.) THE PDLOVF STOPCODE WILL STILL OCCUR.
;2) IF A PDL OVERFLOW OCCURS WHILE UP.EPL IS LIT IN .USBTS, THE CODE WILL
; NOT ATTEMPT TO RECOVER AND A PDLOVF STOPCODE WILL RESULT.
; CURRENTLY TRUE ONLY WHILE THE JOB IS IN THE RECOVERY CODE ITSELF.
;ADDITIONALLY, THERE IS A THIRD RESTRICTION WHICH COULD BE REMOVED IF IT IS
;DEEMED NECESSARY, AND THE APPROPRIATE CHECKS ARE MADE:
;3) IF THE STACK IS ALREADY EXTENDED, WE WILL NOT ATTEMPT TO EXTEND THE
; STACK AGAIN.
THE CODE CAN DO THIS, HOWEVER, IN ORDER TO DO THIS, IT
; IS NECESSARY TO MOVE THE ORIGIN OF THE STACK.
PAGES ALLOCATED TO THE
; OLD STACK WILL BE RECLAIMED AT THAT TIME.
CODE ELSEWHERE IN THE MONITOR
; WHICH PASSES AROUND AN ADDRESS ON THE STACK WILL THEREFORE NO LONGER
; POSSESS A VALID ADDRESS IN THAT POINTER.
ALTHOUGH THE STACK IS MOVED
; FROM JOBPDO WHEN EXTENDED THE FIRST TIME, PAGES ARE NOT RECLAIMED SO
; ANY POINTERS THUS SET UP ARE STILL VALID EVEN THOUGH THE STACK HAS
TRVAR AND OTHER T-20 MACROS USE ONE AC FOR THIS PURPOSE (FP),
; THE ROUTINES AND MACROS WHICH SET UP AND CLEAR THE USE OF FP COULD
; SET FLAGS SO THAT CODE COULD BE ADDED TO THIS ROUTINE TO GET FP ADJUSTED
; IF THE STACK MOVES.
THERE ARE, HOWEVER, OTHER PLACES (AT LEAST ONE
; IN FEDSER) WHICH ALSO WOULD NEED TO BE FIXED; THE EXISTENCE OF OTHER
; PLACES NEEDS ALSO TO BE RESEARCHED FURTHER BEFORE ANY OF THIS CAN
; BE IMPLEMENTED.
;TO REMOVE RESTRICTION THREE, REMOVE THE LINE OF CODE UNDER "REPEAT 1" AT
;EXTPDL+1 AND ADD THE APPROPRIATE CODE ENUMERATED IN RESTRICTION 3 ABOVE.
MOVEI P,UP.EPL ;ARE WE ALREADY TRYING TO RECOVER?
REPEAT 1,&
;UNTIL FRAME POINTERS EXIST,
SKIPN .USEPL
;WE CAN'T MOVE AN EXTENDED STACK
;(SEE COMMENTS ABOVE)
TDNE P,.USBTS ;?
JRST EPOSTP
;YES, ERROR
IORM P,.USBTS ;FLAG IN EMERGENCY PDL
DMOVEM T1,.CPSTT## ;SAVE A COUPLE OF ACS
MOVE T1,.CPAPC##+1 ;GET PC
MOVEM T1,.USMUP ;PUT IT BACK IN CASE WE NEED IT LATER
MOVE T1,-1(T1) ;GET INSTRUCTION WHICH OVERFLOWED
TLNN T1,(&Z &17^!P&,&) ;BE SURE IT'S P THAT OVERFLOWED
TLNN T1,(&Z P,&)
JRST EPOSTP
;NO, ERROR
MOVE P,@.CPEPL## ;GET OVERFLOWED PDL
;MAKE IT ONLY OVERFLOW BY 1 WORD (ADJSP)
ADJSP P,(T1)
HRLI P,-EPDLEN ;THEN SET UP FOR EMERGENCY AREA
DMOVE T1,.CPSTT
PUSHJ P,EXTPD2 ;MUST DO THE FOLLOWING AS A SUBROUTINE
MOVE P,@.CPEPL## ;REAL PDL TO RESTART USER WITH
AOS EPOREC## ;INCREMENT # OF EPOS RECOVERED FROM
XJRSTF .USMUO
;RESTORE FLAGS AND RETURN
;HERE TO DO THE REAL WORK OF EXTENDING THE STACK
EXTPD2: PUSHJ P,SAVT## ;SAVE ALL TS
MOVE T1,@.CPEPL## ;IN CASE IT GETS CHANGED WHEN WE BLOCK
IFN FTMP,&
PUSHJ P,MMOWN## ;OWN MM?
PUSHJ P,GGVMM## ;NO, MUST HAVE IT FOR THE FOLLOWING
;SAVE OVERFLOWED STACK POINTER
HLRZ T2,(P)
;MINIMUM # OF WORDS WE NEED -1
SKIPN T1,.USEPL ;IF MOVING FROM JOBPDO
ADDI T2,PDLLEN ;INCLUDE PDLLEN HERE (TAKEN CARE OF LATER
;IF ALREADY EXTENDED)
LSH T2,W2PLSH ;MINIMUM # OF PAGES WE NEED, -1
;# OF PAGES WE NEED
JUMPE T1,DOPDL2 ;NOT ALREADY EXTENDED, PROCEED
MOVE T3,T2
;CLEAR LEFT HALF
LSH T1,W2PLSH ;PAGE # PREVIOUS TO PAGE WHERE EPL STARTS
SUBI T1,FYSORG/PAGSIZ ;PAGE # RELATIVE TO FUNNY SPACE
DOPDL0: SKIPE .UPMP+.UMORG(T1) ;IS PREVIOUS PAGE FREE?
JRST DOPDL1
;NO, MUST MOVE PDL AGAIN
SOJLE T2,DOPDL7 ;YES, JUST USE PREVIOUS PAGE(S)
SOJGE T1,DOPDL0 ;CHECK PREVIOUS PAGE IF THERE IS ONE
DOPDL1: HLRE T2,.USEPL ;# OF WORDS IN CURRENT EXTENDED STACK
ASH T2,W2PLSH ;CONVERT TO PAGES
SUBM T3,T2
;# OF ADDITIONAL PAGES WE NEED
DOPDL2: MOVNI T2,(T2)
MOVSI T2,(T2)
;AOBJN COUNTER
MOVEI T1,.UMWSB-.UMORG-1 ;START LOOKING AT THE TOP OF FUNNY SPACE
DOPDL3: SKIPN .UPMP+.UMORG(T1) ;IS THIS SLOT FREE?
JRST DOPDL5
TRNN T2,-1
;ALREADY STARTED A CONTIGUOUS BLOCK?
JRST DOPDL4
MOVEI T3,(T2)
;RESET THE AOBJN POINTER
DOPDL4: SOJGE T1,DOPDL3 ;NO, CHECK NEXT
JRST EPOSTP
DOPDL5: AOBJN T2,DOPDL4 ;CONTINUE IF NEED MORE PAGES
TLOA T1,(1B0) ;FLAG WE ALREADY KNOW ENTIER PDL SIZE
;HERE WE HAVE FOUND ENOUGH PAGES TO EXTEND THE PDL.
T3=# OF PAGES, T1=FIRST
;PAGE NUMBER RELATIVE TO BEGINNING OF FUNNY SPACE
;(WE ALSO FALL INTO THIS CODE FROM ABOVE WITH T2=# OF PAGES AND IGNORE THE
;FIRST INSTR WHICH LOADS T2 FROM T3)
DOPDL7: MOVEI T2,(T3)
;GET # OF PAGES FROM T3
;SAVE RELATIVE PAGE #+FLAG
MOVEI T1,.MCFV/PAGSIZ(T1) ;PAGE # OF THE PAGE DESIRED
;SAVE T2 (# OF PAGES REQUIRED)
PUSHJ P,GETMPG## ;GET PAGES FOR THE JOB'S PDL
JRST EPOSTP
;LOSE IF CAN'T ALLOCATE IT
;RESTORE T2 (# OF PAGES ADDED)
;RESTORE STARTING ADDRESS
TLZE T1,(1B0) ;ADDED PAGES OR CREATED NEW SET?
JRST DOPD12
;CREATED NEW SET
HLRE T3,.USEPL ;-# OF WORDS IN OLD STACK
;# OF WORDS IN OLD STACK
MOVEI T3,PG.BDY(T3) ;FOR ROUNDING TO # OF PAGES
LSH T3,W2PLSH ;PAGES
;# OF PAGES IN NEW (EXTENDED) STACK
TDZA T3,T3
;FLAG NO DELETE OF OLD STACK
;HERE ON A NON-RECOVERABLE PDL OVERFLOW
MOVE P,.CPEPL## ;GET NEW PDL POINTER
HRLI P,-&EPLLEN##-1&
STOPCD .,JOB,PDLOVF, ;++EXEC PDL OVERFLOW
;HERE TO MOVE THE CURRENT PDL TO SOME NEW ADDRESS.
T1 CONTAINS THE
;PAGE # RELATIVE TO FYSORG/PAGSIZ WHERE NEW STACK WILL BE, T2 CONTAINS # OF PAGES
DOPD12: SETO T3,
;DELETE OLD STACK IF NOT JOBPDO
MOVEI T1,FYSORG/PAGSIZ(T1) ;MAKE FIRST PAGE #
LSHC T1,P2WLSH ;CONVERT TO WORDS
;SAVE DELETE FLAG
;SAVE # OF WORDS IN NEW STACK (INCLUDES EPDLEN)
;FINAL WORD TO MOVE FROM
;SAVE WORD ADDR
SKIPN T4,.USEPL ;ALREADY EXTENDED?
MOVEI T4,.JDAT+JOBPDL## ;NO, MOVE FROM JOBPDL
HRLI T1,1(T4) ;MAKE BLT POINTER
SUBI T3,1(T4) ;# OF WORDS TO MOVE
ADDI T3,(T1)
;FINAL ADDRESS TO MOVE TO
BLT T1,(T3)
;MOVE THE STACK
SUBI T2,EPDLEN ;# OF WORDS IN NEW PDL (LEAVING EMERGENCY ROOM)
;-# OF WORDS
;NEW STACK POINTER ORIGIN
HRLI T4,(T2)
;NEW STACK POINTER COUNT
MOVEI T1,(P)
;CURRENT ADDRESS OF OLD TOP OF STACK
HRRI P,(T3)
;NEW STACK POINTER
SUBI T3,(T1)
;NEW STACK-OLDSTACK
ADDM T3,-2(P) ;UPDATE OVERFLOWED POINTER
;TOTAL # OF WORDS IN NEW STACK
SUBI T1,EPDLEN ;SUBTRACT OUT EMERGENCY ROOM
SKIPN T3,.USEPL ;# OF WORDS IN OLD STACK
MOVSI T3,MJOBPD## ;IF MOVING FROM JOBPDL
;-# WORDS IN OLD STACK,,0
;-# OF WORDS IN NEW STACK
;-# OF WORDS IN NEW STACK,,0
;-NEW--OLD=OLD-NEW
ADDM T1,-1(P) ;-OLD+(OLD-NEW)=-NEW
;NODELETE FLAG
POP P,@.CPEPL ;PUT IT FOR RECOVERY CODE TO FIND
EXCH T4,.USEPL ;SET NEW STACK POINTER
JUMPE T4,DOPD14 ;NO OLD PAGES TO DELETE
JUMPE T3,DOPD14
PUSHJ P,SAVE2##
;-# WORDS IN OLD STACK,,1ST PAGE
ASH P1,W2PLSH ;-# PAGES IN OLD STACK,,JUNK(9)1ST PAGE(9)
TRZ P1,-1^!&PG.BDY& ;CLEAR JUNK
DOPD13: MOVEI P2,(P1)
;PAGE TO RETURN
PUSHJ P,DLTFSP## ;DELETE FUNNY PAGE
AOBJN P1,DOPD13
DOPD14: MOVEI T1,UP.EPL
ANDCAM T1,.USBTS
;HERE TO GO BACK TO THE NORMAL STACK
;THIS MAY BE CALLED AT EITHER UUO OR CLOCK LEVEL, BUT IF CALLED
;AT CLOCK LEVEL THE CPU MUST POSSESS THE MM.
ZAPEPL::SKIPN T1,.USEPL ;ANY EXTENDED STACK?
;NO, NOTHING TO DO THEN
PUSHJ P,SAVE2## ;NEED TO USE THE PS
MOVEI T1,1(T1) ;ADDRESS OF STACK
HRLI P1,(T1)
;FIRST WORD TO MOVE FROM
MOVEI P2,(T1)
;ONE MORE COPY
PUSHJ P,INTLVL## ;IF AT UUO LEVEL,
JRST ZAPEP0
;TAKE STACK FROM CURRENT P
SKIPN JBTADR##(J) ;IF THERE IS NO CORE FOR JOB
JRST ZAPEP1
;JUST GET RID OF THE PAGES
HRRZ T3,.JDAT+JOBDAC##+P ;GET P FROM JOB DATA AREA
JRST ZAPEP3
IFN FTMP,&
PUSHJ P,MMOWN## ;OWN THE MM?
PUSHJ P,GGVMM## ;GET IT IF WE DON'T
MOVEI T3,(P)
ZAPEP3: CAIL T3,.JDAT+JOBPDL##+1 ;IS IT IN FUNNY SPACE OR .UUPMP?
JRST ZAPEP1
;.UUPMP, SOMEONE (COMCON) MUST HAVE PUT IT BACK
SUBI T1,(T3)
;-# OF WORDS IN CURRENT STACK
MOVNS T3,T1
;NEGATE AND SAVE (MAKE POSITIVE)
CAILE T1,PDLLEN ;ONLY GET RID OF EXTENDED STACK IF WHAT'S THERE FITS
ADDI T1,.JDAT+JOBPDL##+1 ;LAST WORD TO MOVE TO
HRRI P1,.JDAT+JOBPDL##+1 ;FIRST WORD TO MOVE FROM
BLT P1,(T1)
;MOVE THE STACK
MOVE T1,[MJOBPD##,,.JDAT+JOBPDL##]
ADJSP T1,1(T3) ;MAKE CURRENT
PUSHJ P,INTLVL## ;AT UUO LEVEL?
SKIPA P,T1
;YES, SET UP P
MOVEM T1,.JDAT+JOBDAC##+P ;NO, STORE NEW P
ZAPEP1: HLRE P1,.USEPL ;# OF WORDS IN EXTENDED PDL (NEGATIVE)
SUBI P1,EPDLEN ;INCLUDING EMERGENCY WORDS
LSH P1,^D18+W2PLSH ;-# OF PAGES
LSH P2,W2PLSH ;1ST PAGE
HRRI P1,(P2)
;SAVE IN P1
ZAPEP2: MOVEI P2,(P1)
PUSHJ P,DLTFSP## ;DELETE PAGE
AOBJN P1,ZAPEP2
SETZM .USEPL
;NO MORE EXTENDED PDL
;ADDRESS CHECK ERROR AT ANY LEVEL
;F MUST BE SET UP TO POINT TO OFFENDING DEVICE
ADRERR::LDB J,PJOBN## ;OFFENDING JOB'S JOB NUMBER
;GIVRES CLOBBERS F
PUSHJ P,GIVRES ;RETURN ANY RESOURCES THE JOB MIGHT HAVE
;RESTORE F
SIGNAL C$ADCK
;SEE IF USER ENABLED FOR ADDRESS CHECK
;USER DOESN'T WANT TRAP
JRST ERRGOU
;GO TO USER
JSP T1,ERRDEV ;GET JOB NO. FROM DEVICE DATA BLOCK
ASCIZ /Address check for /
JRST DEVEXC
;PRINT "DEVICE XXX; EXEC CALLED FROM
; EXEC/USER LOC YYY"
; THEN STOP JOB
;SUBROUTINE TO CLEAR ALL DDB'S, IO CHARS
;CALL WITH JOB NUMBER IN J
ZAPHIM: PUSHJ P,SVEUB## ;MAKE HIM ADDRESSABLE
ZAPHER::PUSHJ P,SWPCLN## ;ZAP THE ACCESS TABLES
PUSHJ P,GIVRSC ;GIVE UP RESOURCES
PJRST ZAPUSC
;PITCH INITED DDB'S
ZAPUSR::JUMPE J,CPOPJ##
PUSHJ P,GIVRSC ;GIVE UP ANY INTERLOCKS JOB MAY OWN
;RELEASE NETSER INTERLOCK TOO
CAMN J,.CPJOB## ;CURRENT JOB?
;YES, GIVE UP INITED DDB'S ON RESET
; (ALL SHARED RESOURCES ALREADY GIVEN UP)
ZAPUSC::PUSHJ P,CTXJCJ## ;GET CURRENT CONTEXT NUMBER FOR TARGET JOB
MOVEI T1,(J)
PUSHJ P,ZAPDSK## ;REMOVE ALL DDBS OWNED BY JOB FROM UNI/CHN Q'S
IFN FTNET,&SETOM NETZAP##& ;AVIOD WEM STOPCODES
ZAPUS1: HLRZ F,DEVLST## ;LOC OF FIRST DDB
ZAPUS2: LDB T1,PJCHN## ;OWNER OF DDB
JUMPE T1,ZAPUS3 ;DON'T TRY TO ZAP IT IF NOT OWNED (MPXDDB)
MOVEI T2,DEPMSG ;IS THIS DDB CONTROLLED BY MPX
TDNN T2,DEVMSG(F) ;IF SO, GIVE IT UP WHEN WE ZAP MPX
CAME T1,(P)
;RIGHT GUY OWN IT
JRST ZAPUS3
;NO, DON'T RELEASE
CAIE F,DSKDDB## ;NO, DON'T RELEASE IT (TRYING TO RELEASE DSKDDB
; WILL CAUSE AN IME
PUSHJ P,RELEA4## ;YES, RELEASE IT
JUMPE F,ZAPUS1 ;F=0 IF NETWORK DDB WAS RELEASED
ZAPUS3: HLRZ F,DEVSER(F)
JUMPN F,ZAPUS2
IFN FTNET,&SETZM NETZAP##& ;CLEAR FLAG
JRST TPOPJ##
;PRUNE STACK AND RETURN
;SUBROUTINE TO RESET A JOB WHOSE ASSOCIATED
;HISEG HAD A SWAP INPUT ERROR
ZAPHGH::SKIPN JBTADR##(J)
PUSHJ P,CLRJOB##
PUSHJ P,ZAPUSR
PJRST ERRSWP
;SUBROUTINE TO RETURN ALL RESOURCES
;CALL WITH J=JOB#
GIVRES::NTGIVE
;RETURN THE NETWORK INTERLOCK
JUMPE J,CPOPJ##
CAMN J,.CPJOB## ;NO DEVICES ACTIVE IF NOT CURRENT JOB
PUSHJ P,IOWAIT## ;WAIT FOR ANY ACTIVE DEVICES TO FINISH
GIVRSC::HLRZ F,SWPDDB##+DEVSER ;START AT FIRST DSK
GIVRS0: MOVE T1,DEVMOD(F) ;IS THIS A DISK?
TLNN T1,DVDSK
SKIPGE DEVSPL(F) ;NO, SPOOLED DDB?
JRST GIVRS3
MOVE S,DEVIOS(F)
LDB T1,PJOBN## ;YES, THIS JOB OWN IT?
PUSHJ P,RETRES## ;YES, RETURN ANY RESOURCES IT OWNS
GIVRS3: PUSHJ P,NXDDB## ;AND TRY NEXT DDB
JRST [JUMPE F,GIVRS1 ;DONE IF 0
CAMN J,.USJOB
JRST GIVRS0 ;CONTINUE IF JOB IS ADDRESSABLE
JRST GIVRS1] ;NEXT ADDRESSABLE - DONE
JRST GIVRS0
GIVRS1: SETZ T1,
;START WITH FIRST RESOURCE
DPB T1,PJBSTS## ;MAKE SURE THAT JOB DOESN'T APPEAR
; TO HAVE ACTIVE DISK I/O
GIVRS2: CAMN J,USRTAB##(T1) ;OWNED BY JOB?
PUSHJ P,DVFREE##(T1) ;YES--FREE IT UP
CAIGE T1,AVLNUM## ;DONE YET?
AOJA T1,GIVRS2 ;NO--CONTINUE
PUSHJ P,ADFREE## ;RETURN AU, DA, AND FA IF OWNED
PUSHJ P,IPCULK## ;GIVE ANY IPCF INTERLOCK WE OWN
PUSHJ P,DTXFRE## ;AND ANY DECTAPE KONTROLLERS
PUSHJ P,DWNCX## ;CX IF OWNED
PUSHJ P,TPFREE## ;FREE UP TAPE KONTROLLERS
IFN FTKL10,&
PUSHJ P,GIVPMR## ;DOES THIS JOB HAVE THE PERFORMANCE METER?
;NO, SO DON'T GIVE IT UP.
;YES, GIVE IT BACK SO OTHERS MAY MEASURE
&;END IFN FTKL10
IFN FTLOCK,&
PUSHJ P,UNLOCK## ;UNLOCK THE JOB IF LOCKED
NPDUFL::STOPCD .,STOP,NPU, ;++NULL PUSH-DOWN-LIST UNDERFLOW
;JSR TO HERE FROM INTRPT LOC
EXCH P,PIEPDL
STOPCD .,CPU,PIE, ;++PRIORITY INTERRUPT ERROR
PIEPDL::XWD 0,.
SUBTTL COMMON ROUTINES FOR HANDLING ERRORS IN MEMORY
;SUBROUTINE - ABSOLUTE ADDRESS TO SEGMENT NUMBER
;CALL: MOVE P1,ABSOLUTE ADDRESS
; PUSHJ P,CPIASN
ERROR RETURN IF NOT IN MONITOR OR A HIGH OR LOW SEGMENT OR A UPMP
; OK RETURN J=0 IF IN MONITOR, OR HIGH OR LOW SEG NO., OR -J IF JOB'S UPMP
;ENTER AT CPIASP IF T1 ALREADY CONTAINS PAGE #
CPIASN::LDB T1,[POINT 13,P1,26] ;SET REL. ADR. FROM ABS. ADR IN MONITOR
CPIASP::SE1ENT
;PAGTAB LIVES IN MS.MEM, HAVE TO RUN EXTENDED
MOVE T3,T1
;AND IN CASE WE NEED IT...
SETZB T2,J
;ASSUME IN MONITOR (JOB 0 NOT A LEGAL JOB #)
MOVE T1,@[IW MS.MEM,PAGTAB(T1)] ;GET PAGTAB ENTRY FOR THIS PAGE
TLNE T1,MONTRB ;IS THIS A MONITOR PAGE?
JRST CPOPJ1## ;YES, GIVE OK RETURN WITH J=0
SSX T3,MS.MEM ;POINT TO MEMTAB SECTION
MOVSI T1,(P2.TRN) ;TRANSIENT PAGE?
TDNN T2,PT2TAB(T3) ;?
JRST CPIAS2
LDB J,[POINT MT.SJB,MEMTAB(T3),^L&MT.JOB&+MT.SJB-1] ;GET JOB
JRST CPOPJ1## ;FOUND JOB
CPIAS2: HRRZ T2,PT2TAB(T3) ;POINT TO PREVIOUS PAGE
JUMPE T2,CPIAS3 ;FOUND STARTING PAGE
HRRI T3,(T2)
;POINT BACK ANOTHER PAGE
JRST CPIAS2
CPIAS3: MOVEI T2,JOBMAX## ;SCAN TO SEE IF BAD ADDRESS IS IN A UPMP
AUPLOP: HRRZ T1,JBTUPM##(T2) ;T1=PAGE NUMBER OF THE UPMP
CAIE T1,(T3)
;BAD WORD IN THIS UPMP OR MAP?
SOJG T2,AUPLOP ;NO, SCAN ALL USER PAGE MAP PAGES
AUPLO1: JUMPG T2,[MOVN J,T2 ;IF YES, NEGATIVE JOB NUMBER TO J
PJRST CPOPJ1##] ;SKIP RETURN
;NOW SCAN ALL HIGH/LOW SEGS. STARTING WITH JOB 1
ASNLOP: SKIPN JBTADR##(J) ;IS THIS JOB OR HIGH SEG IN CORE?
JRST ASNAOJ
;NO, LOOK AT THE NEXT SEGMENT
MOVEI T1,0
;ASSUME PARITY ERROR IS IN PAGE 0 OF THIS SEGMENT
MOVSI T2,SHRSEG ;SHARABLE SEGMENT BIT
CAILE J,JOBMAX## ;IS THIS A LOW SEGMENT?
TDNE T2,JBTSTS##(J) ;NO--THEN IT IS A SHARABLE HIGH SEG?
;LOW SEG OR SHARABLE HIGH SEG
JRST ASNAOJ
LDB T2,JBYSSA## ;;GET FIRST PAGE OF SEGMENT
CAIN T2,(T3)
;IS THIS PAGE THE SAME PAGE WHICH CONTAINED AN ERROR?
JRST ASNMAP
;YES--SEE IF A MAP
ASNAOJ: CAIG J,JBTMAX## ;LOOKED AT ALL SEGMENTS?
AOJA J,ASNLOP ;NO, LOOK AT NEXT SEGMENT
;NOT IN MONITOR OR ANY JOB
ASNMAP: CAILE J,JOBMAX ;A JOB?
JRST CPOPJ1## ;NO, NOT A MAP IF A HIGH SEG
PUSHJ P,SVEUB## ;MAP THIS USER
MOVE T3,P1
;GET WORD IN QUESTION AGAIN
LSH T3,W2PLSH ;CONVERT TO PAGE
MOVE T1,[-&MXSECN+1&,,.UPMVP/PAGSIZ]
AOBJP T1,CPOPJ1## ;NOT A MAP; S0 CAUGHT ABOVE
;FOR PAGE MAP REFERENCES
SKIPA T4,[.UPMVP/PAGSIZ]
ASNMP1: AOSA T4
;INCREMENT
PUSHJ P,GMPTR## ;GET ENTRY (FIRST TIME)
MOVE T2,(T4)
;GET NEXT ENTRY
TLZ T2,(PM.NAD^!PM.COR)
TLZE T2,(PM.COR) ;IN-CORE POINTER?
CAIE T2,(T3)
;AND THE ONE WE WANT?
AOBJN T1,ASNMP1 ;NO, LOOK ON
;YES, IS A MAP, NEGATIVE JOB #
JRST CPOPJ1##
;SUBROUTINE TO CHECK IF THE PAGE IN T1 IS A HIGH SEG MAP.
IF SO, RETURN
;CPOPJ1 WITH J CONTAINING AOBJN PTR FOR SEG IN QUESTION,
;ELSE J UNCHANGED WITH CPOPJ RETURN
;CALL WITH J=0 FIRST TIME, J=PREVIOUS POINTER RETURNED SUCCEEDING TIMES
CKHMAP::PUSHJ P,SAVE1## ;SAVE P1
;IF NOT FIRST TIME
MOVE J,SEGPTR## ;POINT TO HIGH SEGS
CKHM1: HRRZ T2,JBTUPM##(J) ;GET MAP
CAIE T1,(T2)
;PAGE MATCH?
AOBJN J,CKHM1
JUMPGE J,JPOPJ## ;NOT FOUND AS ANY HIGH SEG MAP
MOVEM J,(P)
;RETURN THIS VALUE FOR J
JRST JPOPJ1## ;GIVE GOOD RETURN
;SUBROUTINE TO FIX CORE ALLOCATION TABLES AFTER PAGES HAVE BEEN
; MARKED OUT IN NXMTAB DUE TO PARITY ERRORS OR NXM'S
;CALLING SEQUENCE:
; MAKE NXMTAB REFLECT CURRENT STATE OF MEMORY, GIVE BACK CORE
; BELONGING TO ALL SEGMENTS WHICH OVERLAP NXM, AND
; PUSHJ P,CPLNXF ;FIX UP RELEVANT TABLES AND VARIABLES
;RETURNS CPOPJ IF NEW VALUE OF CORMAX .LE. OLD VALUE OF CORMAX (SOME
; JOB MAY BE TOO BIG TO SWAP IN), CPOPJ1 IF ALL IS OK.
;MUST HAVE THE MM RESOURCE-CALLER'S RESPONSIBILITY
CPINXF::SE1ENT
;PAGTAB AND MEMTAB ARE IN THE SKYSEG
PUSHJ P,SAVE2## ;SAVE WORKING ACS
SETZB T1,T2
;INITIALIZE INDEXS INTO PAGTAB AND NXMTAB
MOVSI T3,400000 ;FIRST BIT TO LOOK AT IN NXMTAB
LDB T4,[POINT 14,MEMSIZ##,26]
MOVSI P1,NXMBIT ;LOOK FOR NON-EXISTANT PAGES
HRROI P2,-PAGSIZ ;DECREASE MAXMAX BY 1 PAGE FOR EACH NON-EXISTANT PAGE SEEN
CPINX1: TDNN P1,@[IW MS.MEM,PAGTAB(T1)] ;PAGE ALREADY MARKED AS NON-EXISTANT?
TDNN T3,NXMTAB##(T2) ;NO, IS IT NON-EXISTANT NOW?
JRST CPINX2
;NO, FORGE AHEAD
SKIPL @[IW MS.MEM,PAGTAB(T1)] ;IS THIS NON-EXISTANT PAGE ON THE FREE CORE LIST?
STOPCD .,STOP,NPN, ;++NON-EXISTANT PAGE NOT FREE
ADDM P2,MAXMAX## ;DECREASE MAXMAX BY 1 PAGE
ADDM P2,RMCMAX## ;AND REAL MAXIMUM CORMAX
HLLM P1,@[IW MS.MEM,PAGTAB(T1)] ;AND MARK THIS PAGE AS NON-EXISTANT
CPINX2: ADDI T1,1
;NEXT PAGE
;NEXT BIT POSITION IN NXMTAB
;CROSSED A WORD BOUNDARY?
;YES, BUMP TO NEXT WORD IN NXMTAB
SOJG T4,CPINX1 ;LOOP OVER ALL PAGES
CPINX3: MOVE T1,PAGPTR## ;POINTER TO THE FREE CORE LIST
JUMPE T1,CPINX5 ;JUMP IF THERE ARE CURRENTLY NO PAGES ON THE FREE LIST
TDNN P1,@[IW MS.MEM,PAGTAB(T1)] ;IS THIS PAGE NOW NON-EXISTANT?
JRST CPINX5
MOVE T2,@[IW MS.MEM,PAGTAB(T1)] ;YES, LINK FREE CORE LIST AROUND IT
HRRZM T2,PAGPTR## ;STORE NEW FIRST PAGE ON FREE CORE LIST
SOS CORTAL## ;DECREMENT COUNT OF POTENTIALLY FREE PAGES
SOS BIGHOL## ;DECREMENT COUNT OF FREE PAGES
JRST CPINX3
;CONTINUE TO LOOK AT PAGES AT THE BEGINNING
; OF THE FREE CORE LIST
CPINX4: HRRZ T1,T2
;CURRENT INDEX INTO PAGTAB
CPINX5: HRRZ T2,@[IW MS.MEM,PAGTAB(T1)] ;NEXT PAGE IN PAGTAB
JUMPE T2,CPINX6 ;JUMP IF THIS IS THE END OF THE FREE CORE LIST
CPNX5A: TDNN P1,@[IW MS.MEM,PAGTAB(T2)] ;IS THIS PAGE NOW NON-EXISTANT?
JRST CPINX4
HRRZ T2,@[IW MS.MEM,PAGTAB(T2)] ;YES, LINK FREE CORE LIST AROUND IT
HRRM T2,@[IW MS.MEM,PAGTAB(T1)] ; ..
SOS CORTAL## ;DECREMENT THE COUNT OF POTENTIALLY FREE PAGES
SOS BIGHOL## ;AND THE COUNT OF FREE PAGES
HRRM T1,@[IW MS.MEM,PT2TAB(T2)]
JUMPN T2,CPNX5A ;LOOP OVER THE ENTIER FREE CORE LIST
CPINX6: MOVEI T1,0
;INITIALIZE COUNT OF EXISTANT UNLOCKED PAGES
MOVE T2,MEMSIZ## ;PREVIOUS HIGHEST ADDRESS + 1
SUB T2,SYSSIZ## ;RANGE OF USERS CORE
LSH T2,W2PLSH ;NUMBER OF PAGES FROM TOP OF THE MONITOR
; TO THE PREVIOUS TOP OF MEMORY
MOVE T3,SYSSIZ## ;WHERE TO START LOOKING FOR UNLOCKED EXISTANT PAGES
LSH T3,W2PLSH ;PAGE NUMBER TO START AT
CPINX7: MOVE P1,@[IW MS.MEM,PAGTAB(T3)] ;PAGE DESCRIPTOR BITS FROM PAGTAB
TLNE P1,LKBITS-MONTRB;IS THIS PAGE LOCKED OR NON-EXISTANT?
JRST CPINX8
;YES, DON'T CONSIDER IT IN COMPUTING NEW CORMAX
MOVEI T4,1(T3) ;HIGHEST EXISTANT PAGE + 1 THAT WAS SEEN
TLNN P1,MONTRB ;IS THIS A MONITOR PAGE?
ADDI T1,PAGSIZ ;NO, INCREASE NEW CORMAX BY ONE PAGE
CPINX8: ADDI T3,1
;NEXT PAGE IN PAGTAB
SOJG T2,CPINX7 ;LOOP OVER ALL PAGES
MOVEI T2,PAGTAB-1(T4) ;BYTE POINTER TO HIGHEST PAGE
SSX T2,MS.MEM ;SECTION NUMBER IN LEFT HALF
MOVEM T2,CORLST## ;STORE THAT FOR CHKTAL
LSH T4,P2WLSH ;HIGHEST EXISTANT ADDRESS + 1
MOVEM T4,MEMSIZ## ;STORE THAT AS THE SIZE OF MEMORY
MOVE T2,RMCMAX## ;REAL MAXIMUM CORMAX INCLUDING FUNNY SPACE
CAMLE T1,T2
;ROOM FOR FUNNY PAGES?
MOVE T1,T2
;NO, MAKE ROOM
CAML T1,CORMAX## ;NEW CORMAX LESS THAN THE OLD CORMAX?
;NO, INDICATE ALL JOBS CAN STILL RUN
MOVEM T1,CORMAX## ;YES, STORE NEW VALUE OF CORMAX AND GIVE
; A NON-SKIP RETURN TO INDICATE THAT SOME
; JOBS MAY BE TOO LARGE TO BE SWAPPED IN
SUBTTL ERROR REPORTING FOR CHANNEL ERRORS
IFN FTKL10,&
;SUBROUTINE TO STORE CHANNEL DATA ON ALL HARD AND SOFT ERRORS
;CALL: MOVE F,DEVICE DATA BLOCK ADR
; MOVE U,UNIT DATA BLOCK ADR
; MOVE P1,CHANNEL DATA BLOCK ADDRESS(CHN'N'CB)
; MOVE T1,ADDRESS OF FIRST CCW IN CCW LIST
; PUSHJ P,CHEMPE OR CHENXM (MEMORY PARITY OR NXM)
; RETURN WILL ALL REGISTERS PRESERVED EXCEPT T1-T4
;SUBROUTINE FOR MEMORY PARITY
CHEMPE::AOS CHNMPE(P1) ;INCREMENT NO. OF MEM PARITY ERRORS
PUSHJ P,SAVE4## ;SAVE P REGISTERS
;INDICATE PARITY ERROR
JRST CHNCOM
;JOIN COMMON CODE
;SUBROUTINE FOR NXM
CHENXM::AOS CHNNXM(P1) ;INCREMENT NO. OF NXMS
PUSHJ P,SAVE4## ;SAVE P REGISTERS
;INDICATE NXM ERROR
CHNCOM: SETOM .CPCHE## ;FLAG CHANNEL ERROR CODE IS RUNNING
HRRM U,CHNLUE(P1) ;SAVE UNIT DATA BLOCK ADR
HRRM F,CHNLDE(P1) ;SAVE DEVICE DATA BLOCK ADR
HRRZ U,.CPCTN## ;GET CPU'S CTY LINE NUMBER
MOVE U,LINTAB##(U) ;GET CTY'S LDB
PUSHJ P,CHNCCW ;COLLECT CCW DATA
;IS THIS A NXM ERROR?
PUSHJ P,CHNDAT ;NO--COLLECT DATA WORDS ALSO
MOVEI T1,SDELIM ;GET ADRESS OF TEXT
PUSHJ P,CONMES## ;PRINT START DELIMITER
MOVE T2,.CPLOG## ;GET THIS CPU'S NAME
PUSHJ P,PRNAME## ;PRINT IT
;NXM ERROR?
SKIPA T1,[[ASCIZ / channel memory parity error on /]] ;NO--PARITY ERROR
MOVEI T1,[ASCIZ / channel non-existent memory error on /] ; YES--NXM
PUSHJ P,CONMES## ;PRINT ERROR TYPE
PUSHJ P,DATIME## ;APPEND DATE AND TIME
PUSHJ P,PCRLF## ;AND A CRLF
MOVEI T1,[ASCIZ /Device in use is /] ;GET TEXT
PUSHJ P,CONMES## ;PRINT DEVICE PREFIX MESSAGE
MOVE T2,DEVMOD(F) ;GET DEVICES CHARACTERISTICS
HRR T2,CHNLUE(P1) ;UDB OF DEVICE WHERE ERROR HAPPENED
TLNE T2,DVDSK ;IS THIS A DISK?
SKIPA T2,(T2)
;YES--GET NAME FROM UDB
MOVE T2,DEVNAM(F) ;NO--GET DEVICE NAME FROM DDB
PUSHJ P,PRNAME## ;APPEND IT
MOVEI T1,[ASCIZ /
Channel type is /] ;GET TEXT
PUSHJ P,CONMES## ;PRINT CHANNEL TYPE PREFIX MESSAGE
MOVE T2,CHNTYP(P1) ;GET CHANNEL TYPE BITS
MOVEI T1,[ASCIZ /DF10-C/] ;ASSUME A DF10-C
TLNE T2,CP.DX1 ;IS IT A DX10?
MOVEI T1,[ASCIZ /DX10/] ;YES--GET ITS TEXT
TLNE T2,CP.RH2 ;IS IT AN RH20?
MOVEI T1,[ASCIZ /RH20/] ;YES--GET ITS TEXT
TLNE T2,CP.KLP ;IS IT A KLIPA?
MOVEI T1,[ASCIZ /CI20/] ;YES--GET ITS TEXT
TLNE T2,CP.KNI ;IS IT A KLNI?
MOVEI T1,[ASCIZ /NIA20/] ;YES--GET ITS TEXT
TLNE T2,CP.SAX ;IS IT AN SA10?
MOVEI T1,[ASCIZ /SA10/] ;YES--GET ITS TEXT
PUSHJ P,CONMES## ;APPEND CHANNEL TYPE
MOVEI T1,[ASCIZ /
Termination channel program address = /] ;GET TEXT
PUSHJ P,CONMES## ;PRINT TERM. CCW ADDRESS MESSAGE
HLRZ T1,CHNFCW(P1) ;GET LH TERMINATION CCW
;ONLY 14 BITS ARE CCW ADDRESS
PUSHJ P,OCTPNT## ;PRINT IT
MOVEI T1,[ASCIZ /
Termination data transfer address = /] ;GET TEXT
PUSHJ P,CONMES## ;PRINT TERM. DATA ADDRESS MESSAGE
MOVE T1,CHNFCW(P1) ;GET RH TERMINATION CCW
TLZ T1,777760 ;GET JUST DATA ADDRESS (22 BITS)
PUSHJ P,PRT22A## ;PRINT IT
MOVEI T1,[ASCIZ /
Last three channel commands executed are:
PUSHJ P,CONMES## ;PRINT THIS
MOVE T1,CHNCW0(P1) ;ARE ALL CCW'S ZERO?
IOR T1,CHNCW1(P1) ;...
IOR T1,CHNCW2(P1) ;...
JRST CHNCO1
;NO--GO PRINT THEM OUT
PUSHJ P,PR3SPC## ;YES--INDENT
MOVEI T1,[ASCIZ /** Indeterminate **
PUSHJ P,CONMES## ;TELL THEM WE DON'T KNOW
JRST CHNCO3
CHNCO1: MOVSI P2,-3
;FORM AOBJN POINTER
HRRI P2,CHNCW2(P1) ; TO SAVED CCW'S
CHNCO2: PUSHJ P,PR3SPC## ;INDENT
MOVE T1,(P2)
;PICK UP CCW
PUSHJ P,HWDPNT## ;PRINT IT
PUSHJ P,CRLF## ;PRINT CRLF
AOBJN P2,CHNCO2 ;LOOP IF MORE
CHNCO3: MOVEI T1,EDELIM ;GET ENDING DELIMITER
PUSHJ P,CONMES## ;PRINT IT
;RESTORE U
;SAVE AN AC
;CUZ XFRSEB NEEDS P1
SETZM .CPCHE## ;CLEAR CHANNEL ERROR IN PROGRESS FLAG
;LET XFR ROUTINE ALLOCATE
XMOVEI T2,CPETBL ;POINT TO TRANSFER TABLE
PUSHJ P,XFRSEB ;COPY DATA
;RESTORE J
CPETBL: SEBTBL (.ERCPE,CPEEND,&EX.QUE!EX.SYE&)
MOVE UDBNAM(U) ;(R00) UNIT NAME
MOVE CHNNXM(J) ;(R01) NXM COUNT
MOVE CHNMPE(J) ;(R02) MEM PAR ERROR COUNT
;(R03) DEVICE PARITY ERRORS (OBSOLETE)
MOVE CHNICW(J) ;(R04) INITIAL CONTROL WORD
MOVE CHNFCW(J) ;(R05) FINAL CONTROL WORD
MOVE CHNCW2(J) ;(R06) COMMAND WORD -2
MOVE CHNCW1(J) ;(R07) COMMAND WORD -1
MOVE CHNCW0(J) ;(R10) COMMAND WORD
MOVE CHNDW2(J) ;(R11) DATA WORD -2
MOVE CHNDW1(J) ;(R12) DATA WORD -1
MOVE CHNDW0(J) ;(R13) DATA WORD
MOVE CHNTCW(J) ;(R14) EXPECTED TERMINATION CONTROL WORD
;END OF TABLE
;ROUTINE TO STORE CCW DATA FOR CHANNEL ERRORS
CHNCCW: MOVE T3,CHNTYP(P1) ;PICK UP CHANNEL TYPE BITS
MOVE T2,0(T1) ;GET FIRST CCW IN LIST
MOVEM T2,CHNICW(P1) ;SAVE IN CDB FOR F.S.
TLNN T3,CP.RH2 ;IS THIS AN RH20?
JRST CHNCC1
;NO--PROCEED
HRRZ T2,1(T1) ;YES--GET LAST CCW ADDR + 1
MOVE P3,2(T1) ;GET TERMINATION CCW
MOVEM P3,CHNFCW(P1) ;SAVE IN CDB FOR F.S.
JRST CHNCC4
CHNCC1: TLNN T3,CP.DX1 ;IS THIS A DX10?
JRST CHNCC2
;NO--PROCEED
DPB P2,[POINT 14,P3,13] ;YES--COMBINE IN TERM. CHANNEL PROGRAM COUNTER
JRST CHNCC3
CHNCC2: MOVE P3,1(T1) ;GET TERMINATION CCW FOR DF10/DF10-C
CHNCC3: MOVEM P3,CHNFCW(P1) ;SAVE IN CDB FOR F.S.
HLRZ T2,P3
;GET ADDRESS OF LAST CCW
;ONLY 14 BITS ARE CCW ADDRESS
CHNCC4: TLNE T3,CP.RH2 ;IS THIS AN RH20?
;BACK UP LAST CCW ADDRESS BY 1
MOVE P2,T2
;SAVE REAL FINAL CCW ADDRESS HERE
;IS FIRST SOURCE ABOVE LOC 0?
CAML T2,MEMSIZ## ;YES, IS LAST SOURCE ADR IN BOUNDS?
JRST CHNCC6
;NO--JUNK DATA, DON'T ATTEMPT RETRIEVAL
CHNCC5: MOVE P3,CHNCW0(P1) ;PUSH EVERYBODY DOWN ONE
EXCH P3,CHNCW1(P1) ;...
MOVEM P3,CHNCW2(P1) ;...
MOVE P3,(T1)
;GET THIS CCW
MOVEM P3,CHNCW0(P1) ; AND SAVE AS LAST CCW
CAMN P2,T1
;DOES ITS ADDRESS MATCH THE CHANNEL TERM ADDR?
JRST CHNCC7
;YES--WE'RE DONE, STOP CHASING LIST
TLNE P3,577777 ;IS CCW A DATA TRANSFER?
AOJA T1,CHNCC5 ;YES--BUMP CCW ADDRESS AND GO AROUND AGAIN
JUMPE P3,CHNCC6 ;NO--IF IT'S A HALT, WE'VE RUN OUT UNEXPECTEDLY
TLNE T3,CP.DX1 ;IS THIS A DX10?
TLNE P3,200000 ;YES--IS THIS A DX10 DEVICE COMMAND CCW?
;NO--NOT DX10 OR IT'S A DX10 JUMP
AOJA T1,CHNCC5 ;YES--BUMP CCW ADDRESS AND GO AROUND AGAIN
MOVE T1,(T1)
;IT'S A JUMP, GET NEXT CCW ADDRESS
TLZ T1,777760 ;GET JUST ADDRESS (22-BITS)
JRST CHNCC5
; AND GO AROUND AGAIN
CHNCC6: SETZM CHNCW2(P1) ;ZERO THE CCW LOCATIONS
SETZM CHNCW1(P1) ;...
SETZM CHNCW0(P1) ;...
CHNCC7: MOVE T2,CHNTCW(P1) ;GET EXPECTED TERMINATION CCW
MOVEM T2,CHNETW(P1) ;SAVE FOR F.S.
;HERE TO COLLECT RELEVANT DATA WORDS ON PARITY ERROR
CHNDAT: MOVE T4,CHNFCW(P1) ;GET TERMINATION CCW
TLZ T4,777760 ;GET JUST ADDRESS (22-BITS)
;IS LAST DATA ADR ABOVE 0?
CAML T4,MEMSIZ## ;YES, IS IT IN BOUNDS?
JRST CHNDA2
;NO--JUNK DATA, DON'T ATTEMPT RETRIEVAL
PUSHJ P,MAPLOC ;GET EVA SLOT
;BACK UP STARTING ADDRESS BY TWO
MOVEI P2,CHNDW2(P1) ;PLACE TO STORE DATA WORDS
HRLI P2,-3
;MAKE AOBJN PNTR
CHNDA1: LDB P3,[POINT 13,T4,26] ;GET PAGE NUMBER
TLO P3,(&PM.DCD&B2+PM.WRT+PM.PUB) ;BITS
;MAP THIS PAGE
;CLEAR PAGING MEMORY
DPB T4,[POINT 9,T3,35] ;SET LINE # IN PAGE
MOVE P3,(T3)
;FETCH DATA WORD
MOVEM P3,(P2)
;STASH IN CDB
;ADVANCE TO NEXT LOC
AOBJN P2,CHNDA1 ;LOOP TILL DONE
MOVEI T2,^D50
;WAIT FOR ANY PARITY INTERRUPTS
;TO HAPPEN (IF ANY)
PUSHJ P,UNMAP
;RESTORE EXEC MAP SLOT
;AND RETURN
CHNDA2: SETZM CHNDW0(P1) ;ZERO THE DATA LOCATIONS
SETZM CHNDW1(P1) ;...
SETZM CHNDW2(P1) ;...
&;END IFN FTKL10
IFN FTKS10,&
CHENXM::POPJ P,
&;END IFN FTKS10
;ROUTINE TO MAKE AVAILABLE A PAGE MAP SLOT IN EVA SPACE
;MAY BE CALLED AT UUO OR INTERRUPT LEVEL
;CALLING SEQUENCE:
; PUSHJ P,MAPLOC
; RETURN HERE
C(T1) := BYTE PNTR TO EPMP SLOT
C(T3) := VIRTUAL ADDRESS OF START OF MAPPED PAGE
;CALL UNMAP TO RETORE PREVIOUS CONTENTS OF THE MAP SLOT
MAPLOC::MOVE T3,.CPMAP## ;ADDRESS OF CURRENT CPU'S EXEC MAP
MOVE T1,[POINT 36,.ERPIL/PAGSIZ,35]
MOVE T2,.ERPIL/PAGSIZ(T3) ;CURRENT CONTENTS OF THE MAP SLOT
EXCH T2,(P)
;SAVE CURRENT CONTENTS OF THE MAP SLOT
MOVEI T3,.ERPIL ;VIRTUAL ADDRESS OF THE PAGE TO BE RETURNED
PJRST (T2)
;AND RETURN
;ROUTINE TO RESTORE THE CONTENTS OF A MAP SLOT AFTER HAVING CALLED MAPLOC
;CALLING SEQUENCE:
; PUSHJ P,UNMAP
; RETURNS HERE
;PRESERVES ALL ACS
UNMAP:: EXCH T1,-1(P) ;GET PREVIOUS CONTENTS OF THE MAP
;SAVE A WORKING AC
MOVE T2,.CPMAP## ;ADDRESS OF THIS CPU'S EXEC MAP
MOVEM T1,.ERPIL/PAGSIZ(T2) ;RESTORE MAP SLOT CONTENTS
CLRPT .ERPIL
;MAKE OLD MAPPING VISABLE AGAIN
;RETURN ADDRESS
EXCH T1,(P)
;RESTORE T1, STORE RETURN ADDRESS ON STACK
;AND RETURN
SUBTTL SYSTEM ERROR BLOCK SUPPORT
;ROUTINE TO ALLOCATE A SYSTEM ERROR BLOCK.
; T1/ LENGTH OF DATA SEGMENT (NOT INCLUDING HEADER)
; PUSHJ P,ALCSEB
; CPOPJ IF CAN'T ALLOCATE BLOCK
; CPOPJ1 IF BLOCK ALLOCATED WITH:
; T1/ ADDRESS OF ERROR BLOCK
;CLOBBERS T2-T4
$CSENT (ALCSEB::)
SKIPE DINITF## ;OUT OF ONCE CODE YET?
;NO, TAKE IMMEDIATE ERROR RETURN
;SAVE THE LENGTH
MOVEI T2,.EBHDR(T1) ;LENGTH INCLUDING HEADER TO T2
PUSHJ P,GETWDS## ;GET SOME SECTION 0 SPACE
JRST [AOS ERRLAP## ;COUNT THIS AS A DAEMON OVERRUN
JRST TPOPJ##] ;CLEAN STACK AND RETURN
;GET LENGTH BACK
HRRZM T2,.EBTYP(T1) ;STORE IN TYPE WORD
MOVEI T2,.EBHDR-.EBTYP ;LENGTH OF HEADER
DPB T2,[POINT 3,.EBTYP(T1),26] ;STORE HEADER LENGTH
MOVE T2,DATE## ;GET NOW IN UNIVERSAL FORMAT
MOVEM T2,.EBDTM(T1) ;STORE
MOVE T2,SYSUPT## ;GET SYSTEM UPTIME
PUSHJ P,SEBTIM ;CONVERT TO A UDT-STYLE INTERVAL
MOVEM T2,.EBUPT(T1) ;STORE
MOVE T2,.CPASN## ;GET APR SERIAL NUMBER OF THIS CPU
MOVEM T2,.EBASN(T1) ;STORE
JRST CPOPJ1## ;SKIP RETURN
;ROUTINE TO CALL TO DELETE EXPIRED SYSTEM ERROR BLOCKS
;CALLED FROM MINUTE IN CLOCK1
SEBMIN::PUSHJ P,SAVE1## ;SUPERSTITION
MOVNI T2,SEBAGE## ;GET MINUS NUMBER OF MINUTES OF SEB LIFETIME
JUMPE T2,CPOPJ## ;THE FOOL WANTS THEM TO CLOG CORE FOREVER?!?
IMUL T2,TICMIN## ;CONVERT FROM MINUTES TO JIFFIES
ADD T2,SYSUPT## ;GET SYSTEM UPTIME N MINUTES AGO
JUMPLE T2,CPOPJ## ;WE HAVEN'T BEEN UP THAT LONG--GO AWAY
PUSHJ P,SEBTIM ;CONVERT TO A UDT-STYLE VALUE FOR COMPARISONS
MOVE P1,T2
;KEEP THE EXPIRATION TIME SAFE
SEBMI1: CONO PI,PI.OFF ;DON'T ALLOW RACES
IFN FTMP,&
SKIPGE SEQLOK
;IF INTERLOCK ISN'T TOO BUSY,
AOSE SEQLOK
;TRY TO GET IT
;WAIT FOR IT
SKIPE T2,SEQTOP ;GET THE HEAD OF THE QUEUE
CAMG P1,.EBUPT(T2) ;IS IT FROM THE ANCIENT PAST?
JRST SEBMI2
;NO--WE'RE DONE
HRRZ T1,.EBLNK(T2) ;YES--GET ITS FORWARD POINTER
MOVEI T3,SEQTOP ;PREPARE TO RESET BOTTOM POINTER JUST IN CASE
;IF EMPTYING THE QUEUE,
MOVEM T3,SEQBOT ;FIX THE TAIL POINTER
MOVEM T1,SEQTOP ;ADVANCE THE LIST
IFN FTMP,&SETOM SEQLOK&
;RELEASE THE INTERLOCK
CONO PI,PI.ON ;INTERRUPTS ARE OK AGAIN
LDB T1,[POINT 9,.EBTYP(T2),35] ;GET LENGTH OF ERROR BLOCK BODY
ADDI T1,.EBHDR ;INCLUDE HEADER AND LINK WORD
PUSHJ P,GIVWDS## ;RETURN THE BLOCK TO FREE CORE
AOS ERRLAP## ;COUNT THIS AS A DAEMON OVERRUN
JRST SEBMI1
;LOOP UNTIL WE FIND NO MORE OVERRIPE PACKETS
IFN FTMP,&SETOM SEQLOK&
;RELEASE THE INTERLOCK
CONO PI,PI.ON ;INTERRUPTS ARE OK AGAIN
;BACK TO CLOCK1
;SUBROUTINE TO CONVERT AN UPTIME IN JIFFIES TO A UDT-STYLE UPTIME NUMBER
; MOVEI T2,UPTIME-IN-TICKS
; PUSHJ P,SEBTIM
; CPOPJ ALWAYS
;CLOBBERS T2-T4
;PRESERVES T1
SEBTIM::SETZ T3,
;CLEAR FOR ASHC
ASHC T2,-^D17 ;JIFFIES*2**18 IN T3
MOVE T4,TICSEC## ;TICKS PER SECOND
IMULI T4,^D24*^D3600
;DAYS IN LH, FRACTION IN RH
;GIVE IT BACK
;ROUTINE TO COPY DATA INTO A SYSTEM ERROR BLOCK
;CALL: MOVE T1, SEB ADDRESS OR ZERO
; MOVE T2, ADDRESS OF TRANSFER TABLE
; PUSHJ P,XFRSEB
; &NON-SKIP&
;NO CORE (IF ALLOCATING) OR DISABLED BY DEPDEL
;ERROR RECORD FILLED
;PRESERVES T2-T4 ON SUCCESS UNLESS QUESEB IS CALLED
$CSENT (XFRSEB::)
;MAKE ROOM TO SAVE ACS
DMOVEM P1,-3(P) ;SAVE SOME NOW
MOVEI P2,EX.DEL ;BIT TO TEST
TDNN P2,.EXFLG(T2) ;WANT TO CHECK FOR DIABLED LOGGING?
JRST XFRSE1
MOVEI P2,DEPDEL ;BIT TO TEST
TDNN P2,DEVSTA(F) ;ERROR LOGGING DISABLED?
JRST XFRSE1
AOS DELCNT## ;COUNT IT
DMOVE P1,-3(P) ;RESTORE ACS
ADJSP P,-4
;TRIM STACK AGAIN
SKIPN T2,T1
;COPY SEB ADDR
;RETURN IF NO BLOCK ALLOCATED YET
LDB T1,[POINT 9,.EBTYP(T2),35] ;GET LENGTH OF ERROR BLOCK BODY
ADDI T1,.EBHDR ;INCLUDE HEADER AND LINK WORD
PJRST GIVWDS## ;RETURN CORE
XFRSE1: MOVEI P2,EX.SYE ;BIT TO TEST
TDNE P2,.EXFLG(T2) ;WANT TO COUNT UP A SYSTEM ERROR?
AOS SYSERR## ;YES
MOVE P2,T2
;COPY TRANSFER TABLE ADDRESS
JUMPN T1,XFRSE2 ;JUMP IF ALREADY HAVE SEB
HLRE T1,.EXFLG(P2) ;GET -VE LENGTH
;MAKE POSITIVE
DMOVEM T3,-1(P) ;SAVE SOME MORE CALLER ACS
PUSHJ P,ALCSEB ;ALLOCATE SYSTEM ERROR BLOCK
;NO CORE--FIX STACK
JRST XFRSE2
;GOT IT--GO USE IT
DMOVE P1,-3(P) ;RESTORE ACS
DMOVE T3,-1(P) ; ...
ADJSP P,-4
;TRIM STACK
;PROPAGATE ERROR RETURN
XFRSE2: MOVE P1,T1
;COPY SEB ADDRESS
DMOVE T3,-1(P) ;RESTORE SOME CALLER ACS
DMOVEM P3,-1(P) ;SAVE OTHER ACS THAT WE'LL USE
XMOVEI P3,.EBHDR(P1) ;POINT TO START OF DATA STORAGE
HLL P3,.EXFLG(P2) ;MAKE AN AOBJN POINTER
MOVE T1,.EXREC(P2) ;GET RECORD TYPE CODE
DPB T1,[POINT 9,.EBTYP(P1),8] ;STORE IN HEADER
MOVSI T2,EH.AVL ;GET DAEMON'S AVAIL.SYS BIT
MOVE T1,.EXFLG(P2) ;GET FLAGS FROM TABLE HEADER
TRNE T1,EX.AVL ;IS THIS TO BE PROPAGATED TO AVAIL.SYS?
IORM T2,.EBTYP(P1) ;YES, TELL DAEMON
MOVSI T2,EH.NER ;GET THE "NO ERROR.SYS" BIT
TRNE T1,EX.NER ;SUPPRESS WRITING TO ERROR.SYS?
IORM T2,.EBTYP(P1) ;YES, TELL DAEMON
MOVSI T2,EH.CRS ;GET THE "FROM A CRASH" BIT
TRNE T1,EX.CRS ;THIS ENTRY FROM THE CRASH READER?
IORM T2,.EBTYP(P1) ;YES, TELL DAEMON
XMOVEI P4,.EXHDR(P2) ;POINT BEYOND TABLE HEADER
EXCH P1,-3(P) ;SAVE POINTER AND RESTORE AC
EXCH P2,-2(P) ;SAME WITH P2
XFRSE3: MOVE T2,(P4)
;GET PARTIAL INSTRUCTION
TLO T2,(Z T1,) ;INCLUDE AC
EXCH P3,-1(P) ;SWAP ACS AGAIN
EXCH P4,(P)
;FETCH DATA
EXCH P3,-1(P) ;SWAP ACS AGAIN
EXCH P4,(P)
MOVEM T1,(P3)
;STORE WORD IN ERROR RECORD
;ADVANCE POINTER TO NEXT STORAGE
AOBJN P3,XFRSE3 ;LOOP FOR ALL WORDS
DMOVE P3,-1(P) ;RESTORE CALLER ACS
MOVE T2,-2(P) ;AND XFER TABLE ADDRESS
ADJSP P,-3
;TRIM ALL BUT SEB ADDRESS
MOVEI T1,EX.QUE ;BIT TO TEST
TDNN T1,.EXFLG(T2) ;WANT TO QUEUE THIS BLOCK UP?
JRST TPOPJ1## ;NO
;YES, RESTORE SEB ADDRESS
PUSHJ P,QUESEB ;SEND RECORD TO DAEMON
SETZB T1,T2
;ADDRESSES NO LONGER VALID
JRST CPOPJ1## ;RETURN
;ROUTINE TO BUILD A STANDARD SOFTWARE EVENT RECORD CONSISTING
;OF A SINGLE EVENT-SPECIFIC DATA WORD
;CALL: MOVE T1, EVENT CODE
; MOVE T2, DATA WORD
; PUSHJ P,SWESEB
$CSENT (SWESEB::)
PUSHJ P,SAVT## ;SAVE SOME ACS
;SAVE EVENT CODE
;SAVE DATA WORD
;CAUSE SEB ALLOCATION TO HAPPEN
XMOVEI T2,SWETBL ;POINT TO TRANSFER TABLE
PUSHJ P,XFRSEB ;LOAD UP THE RECORD
JRST TTPOPJ## ;NO CORE
POP P,.EBHDR+6(T1) ;STORE EVENT-SPECIFIC DATA WORD
POP P,.EBHDR+0(T1) ;STORE SOFTWARE EVENT CODE
;SAVE S (NOTHING IS SAFE FROM SCNSER)
PUSHJ P,TTYSRC## ;FIND TTY DDB
;MUST BE DETACHED
PUSHJ P,GTNTS0## ;GET NODE,,LINE
;TTY NOT CONNTECTED
;CLEAR TEMP
DPB T1,[POINT 12,T2,23] ;PUT LINE IN A STRANGE PLACE
DPB T1,[POINT 12,T2,11] ;PUT IN AN EQUALLY STRANGE PLACE
MOVE T1,T2
;COPY DATA
EXCH T1,(P)
;GET SEB ADDR BACK
POP P,.EBHDR+4(T1) ;STORE POSSIBLE NODE,,LINE
;RESTORE S
;RESTORE U
;RESTORE F
PJRST QUESEB
;QUEUE UP BLOCK AND RETURN
;COMMON TRANSFER TABLE FOR SOFTWARE EVENTS
;THIS TABLE DEFINES A RECORD WHERE THE STANDARD ONE WORD IS
;RESERVED FOR EVENT-SPECIFIC DATA.
IF THIS IS INSUFFICIENT,
;THE CALLER MUST ADJUST THE POINTER IN R05 AND COMPUTE THE
;ADDITIONAL WORDS NECESSARY TO ALLOCATE A RECORD.
SWETBL::SEBTBL (.ERSWE,SWEEND,)
;(R00) SOFTWARE EVENT CODE
;(R01) JOB NUMBER
MOVE JBTPPN##(J) ;(R02) PPN
MOVE JBTNAM##(J) ;(R03) PROGRAM NAME
;(R04) NODE,,LINE
;(R05) POINTER TO FUNCTION SPECIFIC DATA
;(R06) RESERVE WORD FOR DATA
;END OF TABLE
;ROUTINE TO QUEUE A SYSTEM ERROR BLOCK TO DAEMON.
; T1/ ADDRESS OF ERROR BLOCK
; PUSHJ P,QUESEB
; CPOPJ ALWAYS
$CSENT (QUESEB::)
CONI PI,T2
;READ PI STATUS
CONO PI,PI.OFF ;TURN OFF INTERRUPTS
IFN FTMP,&
SKIPGE SEQLOK
;GIVE OTHER CPUS A CHANCE
AOSE SEQLOK
;GET THE INTERLOCK
&; END IFN FTMP
SETZM .EBLNK(T1) ;MAKE SURE LINK TO NEXT BLOCK IS ZERO
MOVEM T1,@SEQBOT ;APPEND THIS ENTRY TO BOTTOM OF QUEUE
MOVEM T1,SEQBOT ;MAKE THIS THE NEW LAST ENTRY
IFN FTMP,&
SETOM SEQLOK
;RELEASE THE INTERLOCK
&; END IFN FTMP
TRNE T2,PI.ON ;WAS PI SYSTEM ON BEFORE?
CONO PI,PI.ON ;YES, TURN IT BACK ON
PUSHJ P,STDAEM## ;PROD THE DEVIL INTO ACTION
;DON'T CARE IF HE'S NOT THERE
;POINTER TO FIRST ENTRY IN QUEUE
SEQBOT: SEQTOP
;POINTER TO LAST ENTRY IN QUEUE
IFN FTMP,&
SEQLOK: -1
;INTERLOCK
&; END IFN FTMP
;SEBLK. UUO USED BY DAEMON TO RETURN THE NEXT ERROR BLOCK FROM THE
;SYSTEM ERROR BLOCK QUEUE.
THE BLOCK IS COPIED INTO THE CALLER'S
;ARGUMENT BLOCK, AND TRUNCATED IF NECESSARY.
; MOVE AC,[LENGTH,,ADDRESS]
; SEBLK. AC,
ERROR RETURN, AC/ ZERO
; NORMAL RETURN, AC/ LENGTH OF BLOCK
USEBLK::PUSHJ P,PRVJ## ;IS THIS GUY PRIVILEGED?
JRST RTZER##
;NO, RETURN A ZERO
HLRE T2,T1
;GET LENGTH OF CALLER'S ARGUMENT BLOCK
CAIG T2,.EBHDR ;ROOM FOR AT LEAST A ONE WORD ENTRY?
JRST UADERR
;NO, ZAP THE FOOL
CONO PI,PI.OFF ;PREVENT RACES
IFN FTMP,&
SKIPGE SEQLOK
;GIVE OTHER CPUS A CHANCE
AOSE SEQLOK
;GET THE INTERLOCK
&; END IFN FTMP
SKIPN T2,SEQTOP ;IS THERE A FIRST ENTRY?
JRST SEBLK2
MOVE T2,.EBLNK(T2) ;GET LINK TO NEXT BLOCK
JUMPN T2,SEBLK1 ;JUMP IF MORE ENTRIES IN QUEUE
MOVEI T3,SEQTOP ;QUEUE NOW EMPTY, RESET BOTTOM POINTER
MOVEM T3,SEQBOT ;...
SEBLK1: EXCH T2,SEQTOP ;SAVE NEW FIRST BLOCK ADDRESS, GET OLD
IFN FTMP,&
SETOM SEQLOK
;RELEASE INTERLOCK
&; END IFN FTMP
CONO PI,PI.ON ;ALLOW INTERRUPTS AGAIN
JUMPE T2,ECOD1## ;RETURN AN ERROR IF NO BLOCKS QUEUED
HLRE T4,T1
;GET LENGTH OF CALLER'S ARGUMENT BLOCK AGAIN
LDB T3,[POINT 9,.EBTYP(T2),35] ;GET LENGTH OF ERROR BLOCK BODY
ADDI T3,.EBHDR-.EBTYP ;INCLUDE HEADER LENGTH
;SAVE LENGTH FOR RETURN TO USER
CAMGE T3,T4
;IF ERROR BLOCK LONGER THAN USER'S BLOCK,
MOVE T4,T3
; ONLY COPY AS MUCH AS THEY CAN HANDLE
;KEEP JUST CALLER'S ADDRESS
;COMPUTE END ADDRESS
HRLI T1,.EBTYP(T2) ;SOURCE ADDRESS OF ERROR BLOCK HEADER
EXCTXU &BLT T1,-1(T4)& ;COPY THE ERROR BLOCK TO THE USER
ERJMP SEBLK3
;ADDRESS CHECK, NAUGHTY USER
LDB T1,[POINT 9,.EBTYP(T2),35] ;GET LENGTH OF ERROR BLOCK BODY
ADDI T1,.EBHDR ;INCLUDE HEADER AND LINK WORD
PUSHJ P,GIVWDS## ;RETURN THE BLOCK TO FREE CORE
;RESTORE THE LENGTH OF THE BLOCK
PJRST STOTC1## ;STORE IN USER'S AC AND SKIP RETURN
SEBLK3: LDB T1,[POINT 9,.EBTYP(T2),35] ;GET LENGTH OF ERROR BLOCK BODY
ADDI T1,.EBHDR ;INCLUDE HEADER AND LINK WORD
PUSHJ P,GIVWDS## ;RETURN THE BLOCK TO FREE CORE
JRST UADERR
;ZAP THE NAUGHTY USER
SUBTTL STOPCODE PROCESSING
;ROUTINE TO RECOVER/RELOAD AFTER AN INTERNAL
; SYSTEM ERROR.
CALLED ONLY BY STOPCD MACRO
; (SEE S.MAC) WITH:
; PUSHJ P,DIE
;SEE ALSO ROUTINE PERISH
;MUST BE ADDRESSABLE BY ALL CODE SEGMENTS
DIE:: AOSE .CPDWD## ;INTERLOCK STOPCD CODE
STOPCD .,HALT,REH, ;++RECURSION IN ERROR HANDLER
POP P,.CPSPC##+1 ;GET PC OF STOPCD
XSFM .CPSPC## ; AND FLAGS
JRST @[0,,DIE0] ;JOIN COMMON CODE
;ANOTHER ROUTINE TO RECOVER/RELOAD AFTER AN INTERNAL SYSTEM ERROR.
CALLED ONLY BY TRAPCD MACRO (SEE S.MAC) WITH:
; XPCW CROAK
;(CROAK IS PSUEDONYM FOR .CPSPC)
;SEE ALSO ROUTINE DIE
;REACHED ONLY IN SECTION 0
PERISH::AOSE .CPDWD## ;INTERLOCK STOPCD CODE
STOPCD .,HALT,RID, ;++RECURSION IN DIE
; JRST @[0,,DIE0] ;JOIN COMMON CODE [ALREADY IN SECTION 0]
;RUNNING IN SECTION 0
DIE0: SKIPE .UONCE## ;IS THIS USRONC?
JRST DIE00
;YES--SKIP THE ILLEGAL UUOS
CONI PI,.CPCPI## ;SAVE STATE OF MACHINE
CONO PI,PI.TFP+177 ; ..
JSR .CPSVA## ;SAVE ALL AC SETS
JRST DIE001
;SKIP USER-MODE STUFF
DIE00: MOVEM 17,CRSHAC##+17 ;SAVE AN AC
MOVEI 17,CRSHAC## ;POINT TO SAVE ACS BLOCK
MOVEM 17,.CPACA## ;NOTE WHERE WE'RE SAVING THE ACS
BLT 17,CRSHAC##+16 ;SAVE THE REST
DIE001: MOVSI T1,^-MXSECN ;MASK OF EVERYTHING BUT PC COUNTER
ANDCAB T1,.CPSPC##+1 ;CLEAR SPURIOUS BITS
IFN FTXMON,&
TLNE T1,MXSECN ;STOPCODE IN NON-ZERO SECTION?
XJRST [MCSEC1+DIE01] ;YES, ENTER SECTION 1 FOR STOPCODE PROCESSING
&; END IFN FTXMON
;RUNNING IN SECTION 1
DIE01: SKIPE .UONCE## ;IF USER-MODE,
JRST DIE01A
;CAN'T REFERENCE .UPMP
HRLZ T1,.USMUO ;GET MUUO OPCODE AND AC
IOR T1,.USMUE ;INCLUDE EFFECTIVE ADDRESS
MOVEM T1,.CPTRP## ;STORE
DIE01A: SKIPN T1,.CPSPC##+1 ;GET PC OF STOPCD
MOVEI T1,DIEBPC+1 ;POINT AT A GENERIC STOPCODE
MOVEM T1,.CPSUP## ;STORE IN CDB
MOVE M,-1(T1) ;GET XCT INSTRUCTION
TLC M,(XCT)
;CLEAR THE XCT OUT OF WORD
;MAKE SURE NOTHING IS LEFT
MOVEI M,DIEBAD ;OOPS. SOMETHING BAD, POINT TO GENERIC RELOAD.
IFN FTXMON,&
HLL M,.CPSPC##+1 ;GET SECTION OF STOPCODE
&; END IFN FTXMON
MOVE P,.CPEPD## ;SET UP ERROR STACK
LDB T1,[POINT 4,2(M),17] ;GET STOPCODE TYPE
CAIL T1,S$STOP ;IS IT IN RANGE?
CAILE T1,STPMAX ;BOTH WAYS?
MOVEI T1,S$STOP ;BAD--DON'T MAKE THINGS WORSE
MOVEM T1,.CPSTY## ;SAVE AS LAST STOPCODE TYPE
SKIPE .UONCE## ;IS THIS USER-MODE?
JRST DIE010
;YES--SKIP BAD THINGS
MOVE T1,PRCTAB(T1) ;GET CONTROL BITS
TLNN T1,(S%NCSB) ;SUPPRESS CPU/DEVICE STATUS BLOCK STUFF?
S0PSHJ RCDSTB## ;READ CPU AND DEVICE STATUS BLOCKS
IFN FTKL10,&
PUSHJ P,CSDMP## ;MAKE SURE IT'S ALL IN CORE
PUSHJ P,SKPMRN## ;SKIP IF MASTER -11 IS RUNNING
STOPCD .,HALT,MNR, ;++MASTER -11 NOT RUNNING
DIE010: PUSHJ P,DIE1
;CALL MAIN PROCESSING ROUTINE AS A SUBROUTINE
SKIPE .UONCE## ;USER-MODE?
JRST DIE011
;YES--SKIP JUNK
PUSHJ P,DIELOG ;MAKE AN ERROR LOG ENTRY
MOVEI T1,177
;ALL PI BITS
AND T1,.CPCPI## ;TURN ON ONLY
IORI T1,PI.TNP ;ONES WHICH WERE ON
MOVEM T1,.CPCPI## ;SAVE FOR CONO
DIE011: HRLZ 17,.CPACA## ;WHERE TO RESTORE THE AC'S FROM
;RESTORE THEM ALL
.CREF DF.SBD
;(FLAG BIT TESTED)
SKIPL DEBUGF## ;WANT DDT?
JRST DIE02
;DEFINITELY NOT, DON'T WASTE TIME
; PUSH P,T1
;SAVE T1 (CAN'T, SINCE STACK MAY NOW BE BAD)
MOVE T1,.CPSTY## ;GET STOPCODE TYPE
SKIPGE PRCTAB(T1) ;BUGINF IN DRAG?
.CREF S%FAST
; (NOTE BIT WE TESTED)
JRST [MOVE T1,.CPACA## ;WHERE THE AC'S WERE STORED
MOVE T1,T1(T1) ;RESTORE T1
JRST DIE02] ;FINISH UP
MOVE T1,.CPACA## ;WHERE THE AC'S WERE STORED
MOVE T1,T1(T1) ;RESTORE T1
XCT .CPDDT## ;CALL ON DDT
DIE02: SETOM .CPDWD## ;ALLOW STOPCD'S
;NO LONGER THE OWNER OF THE INTERLOCK
;IF STACK IS TRASHED, THIS IS WHERE WE GENERATE ANOTHER STOPCODE.
;SINCE WE HAVE RETURNED THE INTERLOCKS, THIS IS REASONABLY SAFE.
GOBACK::PUSH P,.CPSPC## ;SAVE RETURN FLAGS
PUSH P,.CPSPC##+1 ;SAVE RETURN PC
SETZM .CPSPC##+1 ;LEAVE RECOGNIZABLE TRASH
SKIPN .UONCE## ;IF EXEC MODE,
CONO PI,@.CPCPI## ;TURN ON PI SYSTEM
SETZM SYSSNP## ;THIS COULD BE WHY WE GOT HERE.
ADJSP P,-2
;LEAVE STACK THE WAY IT WAS
SKIPE 2(P)
;MAKE SURE WE HAVE A REAL RETURN ADDRESS
XJRSTF 1(P)
;RETURN TO CALLER
DIEBPC: STOPCD .,STOP,DIEBAD, ;++ BAD PC IN DIE
;RUNNING IN SECTION 1 IF STOPCODE WAS IN A NON-ZERO SECTION
DIE1: SKIPE .UONCE## ;IF USER-MODE,
;DON'T TRY TO TALK TO THE -11
MOVE T1,.CPSTY## ;GET STOPCODE TYPE
SKIPL PRCTAB(T1) ;DO WE WANT SECONDARY PROTOCOL?
.CREF S%FAST
;NOTE BIT WE TESTED
PUSHJ P,SVPPC## ;YES, SAVE PROTOCOL & FORCE SECONDARY
IFN FTMP,&
;CAN'T USE MACRO AS WE TEST CRSHWD BELOW
AOSE .CPDIE## ;ALREADY OWN THE INTERLOCK?
JRST DIE2B
SKIPE .UONCE## ;IF USER-MODE,
JRST DIE2B
;WE OWN IT NOW
DIE2A: SKIPE CRSHWD## ;RELOADING?
S0JRST REBOOT## ;YES
SKIPGE INTDIE## ;IS INTERLOCK AVAILABLE?
AOSE INTDIE## ;YES, TRY TO GET IT
JRST DIE2A
;COULDN'T, LOOP TO TRY AGAIN
APRID INODIE## ;MAKE ME THE OWNER OF THE INTERLOCK
DIE2B: SETZM DIEFLG## ;CLEAR TYPE FLAG (JUST IN CASE)
MOVE T1,.CPSTY## ;GET STOPCODE TYPE AGAIN
SKIPL PRCTAB(T1) ;IS IT REAL?
.CREF S%FAST
;(FLAG BIT TESTED)
SOSA DIEFLG## ;YES, GO NEGATIVE
AOS DIEFLG## ;NO, GO POSITIVE
& ;END IFN FTMP
;THE FOLLOWING CODE IS EXPLICITLY TO MAKE IT EASIER TO AUTOMATICALLY MAP IN
;A CRASH. THE USUAL SEQUENCE WOULD BE TO USE A DDT FILE WHICH (FOR KL PAGING)
;WOULD SAY:
; DIECDB[$Q+.CPEPT-.CPCDB[$Q'1000$U
; SPTTAB$6U
; .CPACA[$Q$5U
MOVE T1,.CPSLF## ;GET PHYSICAL POINTER TO THE CDB
MOVEM T1,DIECDB## ;SAVE WHERE FILDDT WILL BE ABLE TO FIND IT
;THE FOLLOWING IS TO ALLOW FILDDT TO SETUP MAPPING FOR A CRASHED CPU
;AUTOMATICALLY.
THIS REQUIRES A CORRESPONDING EDIT TO FILDDT, BUT WHY NOT
PUSH P,.JBEDV## ;SAVE OLD VALUE FOR SYMBOL MAPPING IN EDDT
ADDI T1,.CPEDV##-.CPCDB## ;RELOCATE TO OUR EDV
MOVEM T1,.JBEDV## ;SAVE FOR FILDDT
MOVE T1,1(M)
;GET NAME OF STOPCODE
MOVEM T1,.CPSNM## ;SAVE NAME IN CDB
MOVEM T1,%SYSCD## ;AND IN SYSTEM WIDE LOCATION
MOVE T1,.CPSUP## ;GET STOPCODE PC
MOVEM T1,%SYSPC## ;STORE IN TRADITIONAL WORD
MOVE T1,.CPSTY## ;GET STOPCODE TYPE AGAIN
MOVEM T1,%SYSTY## ;STORE IN SYSTEM WIDE LOCATION
MOVE T1,DATE## ;GET UDT
MOVEM T1,.CPSDT## ;SAVE AS LAST STOPCD DATE-TIME
MOVEM T1,%SYSDT## ;BOTH PER-CPU AND SYSTEM-WIDE
MOVE T1,.CPCPN## ;GET OUR CPU NUMBER
MOVEM T1,%SYSCP## ;STORE AS LAST CPU THAT DID A STOPCD
HRRZ T1,2(M)
;GET CONTINUATION ADDRESS
;IS THERE ANY?
HRRM T1,.CPSPC##+1 ;YES, SAVE AS SECTION LOCAL CONTINUATION
PUSH P,.CPTOA## ;SAVE ADDRESS OF TYPEOUT ROUTINE
MOVE T1,.CPSTY## ;RECOVER STOPCODE TYPE
SKIPN DINITF## ;UNLESS IN ONCE-ONLY,
SKIPL PRCTAB(T1) ;LEAVE IT ALONE FOR EVENTS
.CREF S%FAST
;(NOTE TESTED BIT)
SKIPA T2,[CTYWAT##] ;NOPE, REPLACE IT WITH ONE THAT DOESN'T USE PI'S
MOVEI T2,DIETYO ;YEP, USE OUR OWN HANDY TYPEOUT ROUTINE
SKIPE .UONCE## ;UNLESS USER-MODE,
MOVEI T2,XTYO## ;THEN USE OUTCHR'S
MOVEM T2,.CPTOA## ;MODIFY SCNSER
MOVE T1,PRCTAB(T1) ;GET ITS CONTROL BITS
TLNN T1,(S%EVNT) ;IS IT AN EVENT?
;NO, IT'S A REAL STOPCODE
PUSHJ P,INLMES## ;YES, TYPE HEADER
%% Event /
MOVE T2,.CPSNM## ;GET STOPCODE NAME
PUSHJ P,PRNAME## ;PRINT IT OUT
;RE-JOIN COMMON CODE
DIE3: MOVEI T2,^D10
;TYPE SOME BELLS
PUSHJ P,BELLEN ; ...
PUSHJ P,INLMES## ;PRINT MESSAGE
?Stopcode /
MOVE T2,.CPSNM## ;GET STOPCODE NAME
PUSHJ P,PRNAME## ;PRINT IT OUT
PUSHJ P,INLMES## ;SAY WHICH KIND
ASCIZ /, type=/
MOVE T1,.CPSTY## ;GET STOPCODE TYPE AGAIN
MOVE T2,STPTYP(T1) ;GET STOPCODE TYPE NAME
PUSHJ P,PRNAME## ;PRINT IT OUT
MOVEI T3,","
;A SEPARATOR
PUSHJ P,COMTYO## ;TYPE IT
DIE4: PUSHJ P,INLMES## ;SEPARATION
ASCIZ / on /
MOVE T2,.CPLOG##
PUSHJ P,PRNAME##
PUSHJ P,INLMES## ;SEPARATION
ASCIZ / at /
PUSHJ P,DATIME## ;SAY WHEN
PUSHJ P,PCRLF## ;ADD A CRLF
MOVE T1,.CPSTY## ;GET STOPCODE TYPE AGAIN
MOVE T1,PRCTAB(T1) ;GET ITS CONTROL BITS
SKIPN .UONCE## ;NO DDB STUFF IN USER MODE
TLNE T1,(S%NDDB) ;SUPPRESS JOB TYPEOUT?
JRST NODDB
;YES, SKIP THIS
MOVE J,.CPJOB##
MOVEI S,PI.IPA ;GET PI ON MASK
AND S,.CPCPI## ;MAS

我要回帖

更多关于 上传图片 io错误 的文章

 

随机推荐