TITLE ERRCON - MONITOR DETECTED ERROR HANDLING ROUTINES - V404 SUBTTL T.HASTINGS/TH/RCC TS 01 JUN 69 XP VERRCN,404 ;THIS MACRO PUTS VERSION NO. IN STORAGE MAP AND GLOB ENTRY ERRCON ;ALWAYS LOAD ERRCON(IF LIB SEARCH) ERRCON: ;THESE ERROR ROUTINE PRINT "ERROR IN JOB N" ;FOLLOWED BY AN APPROPRIATE ERROR MESSAGE ;THEN THE JOB IS STOPPED AND CONSOLE IS RETURNED TO ;MONITOR COMMAND MODE ;APR DETECTED ERRORS ;PUSHDOWN OVERFLOW,ILLEGAL MEMORY, NONEXISTENT MEMORY ;FOR WHICH THE USER IS NOT ENABLED. ;SEE APRSER TO SEE HOW APR INTERRUPTS ARE HANDLED ;CALL: SKIPE TAC,APRERR ;RESULT OF CONI APR,APRERR ; PUSHJ PDP,APRLIM ;FROM CLK SERVICE ROUT,(LOWEST PRIORTY PI) ; RETURN TO RESCHEDULE NEW USER INTERNAL APRILM EXTERNAL USRREL,APRPC EXTERNAL APRERR,CONMES,HOLD,INLMES,JOBN,PJOB,PRQM EXTERNAL STOP1,TTYFUW,USRXIT,UUO0,WSCHED APRILM: SETZM APRERR ;CLEAR FLAG IMMEDIATELY,IN CASE OTHER ERRORS OCCUR TRNN TAC,ILM ;ILLEGAL MEMORY? JRST APRNXM ;NO HRRZ TAC,APRPC ;YES, PC STORED BY APR INTERRUPT IFE FT2REL,< CAMG TAC,USRREL ;IS PC IN BOUNDS/ > IFN FT2REL,< EXTERN SEGILM CAMLE TAC,USRREL ;IS PC IN BOUNDS(LOG SEG)? PUSHJ PDP,SEGILM ;NO. IS PC IN LEGAL MEMORY IN HIGH SEG? > JRST APRILR ;YES. GO PRINT ILL MEM REF JSP TAC,ERRPTU ;NO. PRINT PC EXCEEDS MEM BOUND ASCIZ /PC OUT OF BOUNDS/ JRST APRSCD ;PRINT LOC, THEN STOP JOB APRILR: JSP TAC,ERRPTU ASCIZ /ILL MEM REF/ JRST APRSCD ;PRINT LOC, THEN STOP JOB APRNXM: TRNN TAC,NXM ;NON-EX MEM? JRST APRPDL ;NO JSP TAC,ERRPTU ;YES ASCIZ /NON EX MEM/ JRST APRSCD ;PRINT LOC, THEN STOP JOB APRPDL: TRNN TAC,POV ;PUSHDOWN OVERFLOW? JSP DAT,UERROR ;NO, MUST BE HARDWARE PROBLEM JSP TAC,ERRPTU ;YES ASCIZ /PDL OV/ APRSCD: MOVE TAC1,APRPC ;PRINT APR PC JRST PCPNT ;AS: ; 1)"AT USER LOC XXX" OR ; 2)"AT EXEC LOC XXX; EXEC CALLED FROM ; EXEC/USER LOC YYY ;ADDRESS CHECK ERROR AT ANY LEVEL ;DEVDAT MUST BE SET UP TO POINT TO OFFENDING DEVICE INTERNAL ADRERR ADRERR: JSP TAC,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 ;UNEXPLAINABLE MONITOR ERROR ;CALL: JSP DAT,UERROR ;AT UUO LEVEL(PDP SET UP) ; JSP DAT,ERROR ;AT INTERRUPT LEVEL(PDP NOT SET UP) ; JSP DAT,OERROR ;AT INTERRUPT OR UUO LEVEL (PDP SET UP) -MESSAGE TO ; ; OPERATOR'S CONSOLE RATHER THAN SPECIAL JOB ; JSP DAT,CERROR ;BLAME JOB=C(ITEM), PDP SETUP INTERNAL ERROR,UERROR,CERROR,OERROR EXTERNAL JOB,ERRPDL,NULADR NLADDR: EXP NULADR ERROR: MOVEI PDP,ERRPDL ;USE LOWER CORE FOR PD LIST OERROR: PUSH PDP,NLADDR ;PUSH ADR, OF NULJOB ON PD LIST IN CASE ; THIS ERROR IS AT PI LEVEL 7 OR HIGHER ; SO NULL JOB WILL BE STARTED WHEN LAST ; POPJ IS DONE(STOP2 IN RUNCSS) TDZA ITEM,ITEM ;BLAME JOB 0(PRINT ON OPERATORS TTY) UERROR: MOVE ITEM,JOB ;PRINT FOR CURRENT JOB CERROR: IFN FTHALT,< HALT .+1 ;PUT ADR OF JSP DAT, IN PC AND STOP SO A ; DUMP CAN BE TAKEN,CONTINUE WILL PRINT ERROR MESSAGE > JSP TAC,ERRPNT ;ITEM ALREADY SETUP ASCIZ /ERROR IN MONITOR/ MOVE TAC1,-1(PDP) ;GET LOC OF JSP DAT,ERROR JRST PCPNT ;PRINT "AT EXEC LOC XXX: ; EXEC CALLED FROM EXEC/USER YYY" ; THEN STOP JOB ;INPUT UUO FOR OUTPUT DEVICE ;CALLED AT UUO LEVEL ONLY INTERNAL ILLINP ILLINP: JSP TAC,ERRPTU ASCIZ /OUTPUT / PUSHJ PDP,ERNAM ;PRINT "DEVICE XXX" JSP TAC,UUOMES ;PRINT MESSAGE,UUOPC,STOP JOB ASCIZ / CANNOT DO INPUT/ ;OUTPUT UUO FOR INPUT DEVICE ;CALLED AT UUO LEVEL ONLY INTERNAL ILLOUT ILLOUT: JSP TAC,ERRPTU ASCIZ /INPUT / PUSHJ PDP,ERNAM ;PRINT "DEVICE XXX" JSP TAC,UUOMES ;PRINT MESSAGE,UUOPC,STOP JOB ASCIZ / CANNOT DO OUTPUT/ ;ILLEGAL DEVICE DATA MODE (INIT, OPEN, OR SETSTS UUOS) ;CALLED AT UUO LEVEL ONLY INTERNAL ILLMOD ILLMOD: JSP TAC,ERRPTU ASCIZ /ILLEGAL DATA MODE FOR / JRST DEVEXC ;PRINT "DEVICE XXX",UUO PC ;IO UUO TO USER CHANNEL WITH NO PREVIOUS INIT OR OPEN ;CALLED AT UUO LEVEL ONLY INTERNAL IOIERR IOIERR: JSP TAC,ERRPTU ASCIZ /IO TO UNASSIGNED CHANNEL/ JRST UUOPCP ;PRINT UUO PC ;ILLEGAL UUO ;CALLED AT UUO LEVEL ONLY INTERNAL UUOERR UUOERR: JSP TAC,ERRPTU ASCIZ /ILLEGAL UUO/ MOVE TAC1,UUO0 ;GET LAST UUO PC IFN FTHALT,< TLNN TAC1,USRMOD ;UUO FROM EXEC? HALT .+1 ;YES, HALT SO DUMP CAN BE TAKEN ; CONTINUE WILL PRINT MESSAGE > SOJA TAC1,PCPNT ;AND PRINT, PRINT USER UUO PC IF DIFF. ;ILLEGAL INSTRUCTION ;HALT INSTRUCTION IS A SPECIAL CASE WHICH STOPS JOB BUT ;THE USER MAY CONTINUE FROM IT(EFFECTIVE ADR.) ;CALLED AT UUO LEVEL WITH A JRST INTERNAL ILLINS EXTERNAL JOBPD1,TTYSTC ILLINS: HLRZ TAC,UUO ;ILLEGAL OPCODE CAIN TAC,254200+PROG ;IS IT A HALT? JRST HALTI ;YES, PRINT DIFFERENT MESSAGE JSP TAC,ERRPTU ASCIZ /ILL INST./ JRST UUOPCP ;PRINT UUO PC AD STOP JOB HALTI: JSP TAC,ERRPTU ASCIZ /HALT/ SOS TAC1,JOBPD1(JDAT) ;UUOPC=LOC OF HALT+1 PUSHJ PDP,PCP ;PRINT "USER LOC XXX" PUSHJ PDP,INLMES ;PRINT MONITOR MODE RESPONSE ASCIZ / ^C ./ HRRM UUO,JOBPD1(JDAT) ;SAVE EFFECTIVE ADDRESS OF HALT PUSHJ PDP,TTYSTC ;START TTY TYPING PUSHJ PDP,STOP1 ;STOP JOB ; RETURN ONLY IF HE TYPES CONT PUSH PDP,JOBPD1(JDAT) ;PUT USER RETURN ON END OF PD LIST JRST USRXIT ;RETURN TO USER IN CASE HE TYPES CONT COMMAND ;ROUTINE FOR HUNG IO DEVICE ;CALL MOVE DEVDAT,ADDRESS OF DEVICE DATA BLOCK ; PUSHJ PDP,DEVHNG INTERNAL DEVHNG DEVHNG: MOVEI TAC,IOACT ;TURN OFF IO DEVICE ACTIVE BIT IN ANDCAM TAC,DEVIOS(DEVDAT);MEMORY AND IOS TRZ IOS,IOACT JSP TAC,ERRDEV ASCIZ /HUNG / JRST DEVEXC ;BAD DECTAPE DIRECTORY ;CALLED AT INTERRUPT AND UUO LEVELS WITH DEVDAT AND ITEM SETUP INTERNAL BADDIR BADDIR: JSP TAC,ERRPNT ASCIZ /BAD DIRECTORY FOR / ;ROUTINE TO PRINT "DEVICE XXX; EXEC CALLED FOR EXEC/USER YYY" ;THEN STOP JOB ;TO BE USED BY DEVICE DEPENDENT ERROR MESSAGES AFTER JSP TAC,DEVERR INTERNAL DEVEXC DEVEXC: PUSHJ PDP,ERNAM ;PRINT "DEVICE XXX" JRST EXCALP ;PRINT "EXEC CALLED FROM EXEC/USER LOC YYY" ;ROUTINE TO HALT A JOB WHEN A DEVICE IS NOT READY FOR I/O ;CALLED FROM XXSER AT UUO LEVEL ;CALL MOVE DEVDAT,ADDR. OF DEV. DDB ; PUSHJ PDP,HNGSTP INTERNAL HNGSTP HNGSTP: PUSH PDP,ITEM PUSH PDP,IOS PUSH PDP,DEVDAT ;SAVE DEV'S IOS WORD & DDB PUSHJ PDP,TTYFUW ;FIND JOB'S TTY & WAIT UNTIL I/O IS FINISHED PUSHJ PDP,PRQM ;PRINT QUESTION MARK FOR BATCH PUSHJ PDP,ERNAM ;PRINT "DEVICE XXX" PUSHJ PDP,INLMES ;AND MSG. ASCIZ / OK? ^C ./ PUSHJ PDP,TTYSTC ;START UP TTY IN COMMAND MODE POP PDP,DEVDAT ;BRING BACK DEV DDB & IOS WORD POP PDP,IOS PUSHJ PDP,STOP1 ;STOP JOB & POP PDP,ITEM JRST WSCHED ;RESCHEDULE ;COMMON ERROR MESSAGE SETUP ROUTINES ;CALL: JSP TAC,ERRPTU, ERRDEV, OR ERRPNT ; ASCIZ /MESSAGE/ ; RETURNS HERE WITH DEVDAT SAVED 0(PDP) ; C(DEVDAT)=TTYDDB, DAT TO TTY OUTPUT BUFFER POINTER ; ITEM=JOB NUMBER ;USE ERRPTU IF AT UUO LEVEL FOR SURE ;ERRDEV IF ERROR FOR AN ASSIGNED DEVICE AT ANY LEVEL ;ERRPNT WITH ITEM ALREADY SET TO OFFENDING JOB NUMBER ;THE JSP CALL IS USED IN CASE PUSHDOWN SPACE BECOMES CRITICAL ;AGAIN AND ERRPNT HAS TO WIRE EXISTING LIST OUT INTERNAL ERRPTU INTERNAL ERRDEV,ERRPNT EXTERNAL PJOBN,JOB,JBTADR,JBTDAT,TTYFND,NULERR IFN FTTTYSER, ERRPTU: SKIPA ITEM,JOB ;BLAME CURRENT JOB IS NOT 0. ERRDEV: LDB ITEM,PJOBN ;JOB NO, FROM DEVICE DATA BLOCK ERRPNT: SKIPN ITEM ;ERROR IN NULL JOB? SETOM NULERR ;YES, SET FLAG FOR ERROR IN NULL JOB ; SO STATE OF NULL JOB WILL BE REESTABLISHED ; WHEN IS IT RUN AGAIN(SEE CLOCK1) PUSH PDP,DAT ;SAVE CALL TO ERROR(JSP DAT,ERROR) IFN FTRCHK,< CAIL ITEM,JOBN ;JOB NUMBER HALT . ;OUT OF RANGE? > PUSH PDP,DEVDAT ;SAVE ADR, OF DEV. DATA BLOCK PUSH PDP,TAC ;SAVE RETURN FROM ERRPNT MOVE JDAT,JBTDAT(ITEM) ;EVEN NULL JOB HAS JOB DATA AREA IFN JDAT-PROG,< MOVE PROG,JBTADR(ITEM) ;JOB RELOCATION > IFE FTTTYSER,< PUSHJ PDP,TTYFND ;FIND TTY FOR THIS JOB(ITEM)> IFN FTTTYSER,< PUSHJ PDP,TTYERP ;FIND THIS TTY AND ;SET MERTPO IN DDB > PUSHJ PDP,INLMES ASCIZ /? ERROR IN JOB / PUSHJ PDP,PJOB ;PRINT JOB NO. JRST INLMES ;PRINT MESSAGE SPECIFIED BY CALLER ; AND RETRUN TO LOC. AFTER MESSAGE ;ROUTINE TO PRINT UUO PC AND STOP JOB ;IF IN USER MODE PC WILL PRINT AS "AT USER LOC XXX" ;IF IN EXEC MODE "AT EXEC LOC XXX; EXEC CALLED FROM EXEC/USER/ LOC YYY INTERNAL UUOPCP,UUOMES EXTERNAL JOBPD1 UUOMES: PUSHJ PDP,CONMES ;PRINT MESSAGE POINTED TO BY TAC UUOPCP: MOVE TAC1,JOBPD1(JDAT) ;UUO PC STORED IN JOB DATA AREA ; FIRST LOC ON PD LIST SOJA TAC1,PCPNT ;DECREMENT TO POINT TO UUO IN USER AREA ;ROUTINE TO PRINT ONE OF THREE MESSAGES AND STOP JOB ;1) "AT EXEC LOC XXX; EXEC CALLED FROM EXEC LOC YYY" ;2) "AT EXEC LOC XXX; EXEC CALLED FROM USER LOC YYY" ;3) "AT USER LOC YYY" ;CALL: MOVE TAC1, XXX ;WITH PC FLAGS IN LH ; PUSHJ PDP,PCPNT ; NEVER RETURN IF AT UUO LEVEL INTERNAL PCPNT EXTERNAL TPOPJ PCPNT: PUSHJ PDP,PCP ;PRINT " AT EXEC XXX" OR "AT USER " TLNE TAC1,USRMOD ;WAS PC IN USER MODE? JRST PCSTOP ;YES, ENOUGH INFO. ;ROUTINE TO PRINT EITHER ;1) "; EXEC CALLED FROM EXEC LOC YYY" ;2) "; EXEC CALLED FROM USER LOC YYY" ;AND STOP JOB ;CALL: PUSHJ PDP,EXCALP ; NEVER RETURNS IF AT UUO LEVEL INTERNAL EXCALP,PCSTOP EXCALP: PUSHJ PDP,INLMES ASCIZ /; UUO/ MOVE TAC1,JOBPD1(JDAT) ;UUO PC IN JOB DATA AREA SUBI TAC1,1 ;BACK IT UP TO POINT TO UUO PUSHJ PDP,PCP ;PRINT "EXEC LOC " OF USER LOC PCSTOP: PUSHJ PDP,HOLD ;STOP JOB, START TTY AND SET JOB ERROR BIT POP PDP,DEVDAT ;RETURN ONLY IF AT INTERRUPT LEVEL JRST TPOPJ ;REMOVE ERROR CALL AND RETURN ;ROUTINE TO PRINT PC AS: ;1) "EXEC LOC XXX" OR "USER LOC XXX" ;CALL: MOVE TAC1,PC TO PRINT(LH=PC FLAGS) ; PUSHJ PDP,PCP XMODE: ASCIZ / AT EXEC / UMODE: ASCIZ / AT USER / PCP: MOVEI TAC,XMODE ;ASSUME PC IN EXEC MODE TLNE TAC1,USRMOD ;IS IT? MOVEI TAC,UMODE ;NO, USER MODE PUSHJ PDP,CONMES ;PRINT ONE OR OTHER HRRZ TAC,TAC1 ;PRINT RIGHT HALF IN OCTAL ; FALL INTO OCTPNT INTERN OCTPNT ;ROUTINE TO PRINT 6 DIGIT OCTAL NUMBER ;CALL: MOVE DAT,TTY OUTPUT BYTE POINTER ; HRR TAC, OCTAL NUMBER ; PUSHJ PDP,OCTPNT ; RETURN TAC1,PRESERVED,TAC DESTROYED OCTPNT: HRLZ TAC,TAC ;MOVE TO LH FOR ROTATING TRO TAC,700000 ;SETUP AN END FLAG OCTP1: ROT TAC,3 ;GET NEXT OCTAL DIGIT TLNN TAC,777777 ;WAS THAT FLAG? POPJ PDP, ;YES, DO NOT PRINT IT PUSHJ PDP,PRTNUM ;NO, PRINT OCTAL DIGIT HRRI TAC,0 ;CLEAR RH JRST OCTP1 ;GET NEXT OCTAL DIGIT ;ROUTINE TO ADD 1 TO TAC AND PRINT DECIMAL ;SAME CALL AS OCTPNT INTERN DECP1 DECP1: AOJA TAC,RADX10 ;ADD 1 AND GO PRINT ;ROUTINE TO PRINT DECIMAL ;CALL: SAME AS OCTPNT ;TAC1: PRESERVED INTERN RADX10 RADX10: PUSH PDP,TAC1 ;SAVE TAC1 PUSHJ PDP,PRTDIG ;PRINT DECIMAL DIGITS POP PDP,TAC1 ;RESTORE TAC1 POPJ PDP, ;AND RETURN ;RECURSIVE DECIMAL PRINT ROUTINE ;CALL: MOVE TAC,DECIMAL NO. ; PUSHJ PDP,PRTDIG PRTDIG: IDIVI TAC,12 ;DIVIDE BY 10 HRLM TAC1,(PDP) ;RT ON PD LIST JUMPE TAC,.+2 ;FINISHED? PUSHJ PDP,PRTDIG ;NO, CALL S OR F HRLZ TAC,(PDP) ;YES, GET LAST NUMBER PRTNUM: ADDI TAC,"0" ;CONVERT TO ASCIZ IFN FTTTYSER,< EXTERN OUTCHS MOVE TEM,TAC ;PUT CHAR IN CHAR AC JRST OUTCHS ;AND OUTPUT IN SCNSRF > IFE FTTTYSER,< IDPB TAC,DAT ;ADD CHAR TO HALGF DUPLEX OUTPUT STREAM POPJ PDP, > ;ROUTINE TO PRINT "DEVICE XXX" ;CALL MOVE DAT,ASCII OUTPUT BYTE POINTER ; PUSH PDP,DEVDAT ; PUSHJ PDP,ERNAM INTERNAL ERNAM ERNAM: PUSHJ PDP,INLMES ASCIZ /DEVICE / SKIPE TAC1,-1(PDP) ;IS DEVDAT = 0? MOVE TAC1,DEVNAM(TAC1) ;NO, GET DEVICE NAME ;ROUTINE TO PRINT SIXBIT NAME ;CALL MOVE DAT,ASCII OUTPUT BYTE POINTER ; MOVE TAC1,NAME ; PUSHJ PDP,PRNAME INTERNAL PRNAME EXTERNAL CPOPJ PRNAME: MOVEI TAC,0 LSHC TAC,6 ;SHIFT IN NEXT CHAR. JUMPE TAC,CPOPJ MOVEI TEM,40(TAC) ;ASCII VERSION INTO CHREC FOR OUTCHS IFN FTTTYSER,< EXTERN OUTCHS PUSHJ PDP,OUTCHS > IFE FTTTYSER,< IDPB TEM,DAT > JRST PRNAME ERREND: END