TITLE RTTRP - REAL TIME TRAPPING ROUTINES - V137 SUBTTL P. HURLEY/PFC/JE TS 10 SEP 85 SEARCH F,S $RELOC $HIGH ;THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED ; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ; .CPYRT<1973,1986> ;COPYRIGHT (C) 1973,1974,1975,1976,1977,1978,1979,1980,1982,1984,1986 ;BY DIGITAL EQUIPMENT CORP., MAYNARD, MASS. ;ALL RIGHTS RESERVED. ; ; ; ; XP VRTTRP,137 ; PETER M HURLEY MAY 13, 1970 ;RTTRP IS A COMPLETELY REENTRANT UUO CALLABLE ;FROM ALL PI LEVELS TO CHAIN AND UNCHAIN DEVICES ;ONTO THE MONITOR DEVICE CHAINS. ;IT ALSO PROVIDES THE CAPABILITY OF ALLOWING AN ;INTERRUPT FROM ANY DEVICE TO TRANSFER PROGRAM ;CONTROL TO A USER PROGRAM AT INTERRUPT LEVEL ;IN RESPONSE TO THAT INTERRUPT. ;RTTRP TAKES CARE OF ALL CONTEXT SWITCHING WHICH ;IS NECESSARY AND CHANGING THE RELOCATION AND ;PROTECTION REGISTER, THUS PERMITTING MORE THAN ;ONE JOB AT A TIME TO BE CONTROLING DEVICES ON THE ;INTERRUPT LEVELS WITHOUT STOPPING TIME SHARING. ENTRY RTTRP ; RIGHT HALF OF S - ERROR BIT DEFINITIONS E35==1B35 ;PI CHANNEL NOT AVAILABLE, USED BY MONITOR FOR BLKI/O E34==1B34 ;PI CHANNEL NOT CURRENTLY AVAILABLE FOR BLKI/O E33==1B33 ;TRAP ADDRESS OUT OF BOUNDS E32==1B32 ;ERROR ADDRESS OUT OF BOUNDS E31==1B31 ;BLKADR OR POINTER WORD OUT OF BOUNDS E30==1B30 ;SYNTAX ERROR IN FORMAT, NO CONSO OR BLKI/O INSTRUCTION E29==1B29 ;NO MORE RT BLOCKS LEFT E28==1B28 ;JOB NOT LOCKED IN CORE E27==1B27 ;ILLEGAL AC USED AT INTERRUPT LEVEL CALL E26==1B26 ;DEVICE ALREADY IN USE BY ANOTHER JOB E25==1B25 ;JOB SET TO RUN ON CPU1 ONLY - TEMPORARILY NOT SUPPORTED E24==1B24 ;JOB DOES NOT HAVE PRIVILEGES E23==1B23 ;NON-EXISTANT CPU SPECIFIED ;LEFT HALF OF S BIT DEFINITIONS INDBIT==1 ;INDIRECT BIT SET IN CONSO INSTRUCTION CNSO==2 ;CONSO INSTRUCTION RTINT==4 ;UUO ENTERED FROM INTERRUPT LEVEL BLKIO==10 ;BLKI/O TO GO ON CHANNEL NOREM==20 ;DO NOT REMOVE DEVICES FROM CHAINS BEFORE LINKING ; ANOTHER DEVICE ONTO THE CHAIN NOSAV==40 ;EXEC MODE TRAPPING, DON'T DO CONTEXT SWITCH VECTOR==100 ;DEVICE INTERRUPTS BY EXECUTING AN INTERRUPT VECTOR EPTREL==200 ;INTERRUPT INSTRUCTION IS TO BE STORED RELATIVE TO THE EPT ;.CPRCT LEFT HALF BIT DEFINITIONS BLKENB==:1 ;BLKI/O INSTRUCTIONS ALLOWED ON THIS CHANNEL BINUSE==2 ;BLKI/O INSTRUCTION IN USE PRESENTLY ON THIS CHANNEL BLKSAV==4 ;BLKI/O INSTRUCTION BEING REPLACED BY ANOTHER BLKI/O BM1==400000 ;CHANNEL CAN CURRENTLY BE USED FOR BLKI/O REPEAT 0,< ;AC DEFINITIONS - *** CHANGED TO STANDARD ON JUNE 1, 1971 IWD=U ;BLKI/O IOWD BLK=F ;BLKI/O INSTRUCTION RTB=T4 ;RT BLOCK BASE ADDRESS PIAC=P1 ;PI CHANNEL NUMBER TRP=P2 ;TRAP ADDRESS INS=W ;CONSO INSTRUCTION ENB=M ;ENABLE BITS RTUUO=17 ;THESE TWO AC'S CANNOT BE USED IN CALLS FROM INTERRUPT LEVEL RTUUO1=16 ;RTUUO CONTAINS USER PC, AND RTUUO1 IS A SCRATCH > ;OTHER DEFINITIONS RTUUON==57 ;UUO CALLI NUMBER USER==10000 ;USER MODE BIT USRIOT==4000 ;USER IOT PRIVELEGE BIT RTUSE==1000 ;REAL TIME BLOCK IS BEING USED VECUSE==2000 ;RTBLK IN USE BY A VECTOR INTERRUPT DEVICE ; NOT ON THE CONSO CHAIN WAKUUO==73 ;WAKE UUO CALLI NUMBER JSRMOD==1 ;DO JSR TO TRPADR WITH NO CONTEXT SWITCH VTRMOD==2 ;IF DEVICE DOES VECTORED INTERRUPTS EPTMOD==4 ;IF THE INTERRUPT JSR INSTRUCTION IS TO BE STORED RELATIVE ; TO THE EPT ;REAL TIME BLOCK DEFINITIONS AND FORMAT O==3 ;FOR XPCW RTCNSO==0+O ;CONSO DEV,BITS ;CHAIN INSTRUCTION RTJRST==1+O ;JRST NXTDEV ;CONTINUE ON IN CHAIN RTBLKO==2+O ;BLKO DEV,POINTR ;IF NO BLKI/O THEN JRST .+3 RJRST1==3+O ;JRST .+2 ;BLKI/O COUNTED OUT RTJEN==4+O ;JEN @CHN ;DISMISS INTERRUPT RTJSR==5+O ;JSR SAV'PI ;SAVE THE AC'S RTJSP==6+O ;JSP J,TRPGO ;SAVE THE STATE OF THE MACHINE TABST==RTJSP+1 ENBTAB==7+O ;APR CONO BITS RELTAB==10+O ;RELOCATION-PROTECTION TABLE UENBTB==11+O ;USER APR INTERRUPT ENABLE BITS TRPTAB==12+O ;USER TRAP ADDRESS JADRTB==13+O ;JBTADR VALUE FOR THIS JOB APRTAB==14+O ;XWD R, APRTRP JOBTB==15+O ;XWD DEV CODE, JOB # PITAB==16+O ;XWD 0,PI CHANNEL DISMTB==17+O ;JRST CHAND'PI ENBTB1==:ENBTAB-TABST RELTB1==:RELTAB-TABST UENBT1==:UENBTB-TABST TRPTB1==:TRPTAB-TABST JADRT1==:JADRTB-TABST APRTB1==:APRTAB-TABST JOBTB1==:JOBTB-TABST PITB1==:PITAB-TABST DISMT1==:DISMTB-TABST IFN ENBTB1, MRELTB==:-RELTAB RTBSIZ==:20+O ;REAL TIME BLOCK SIZE ;DESCRIPTION OF TABLES USED BY RTTRP ;JBTRDT = COUNT OF REAL TIME DEVICES ON INTERRUPT SYSTEM FOR EACH JOB ;JBTRTD IS INDEXED BY JOB NUMBER ;.CPRCU = COUNT OF REAL TIME DEVICES ON EACH PI CHANNEL ;.CPRCU IS INDEXED BY PI NUMBER MINUS 1 ;.CPRCT = XWD STATUS,CH'PI ;STATUS DESCRIBES STATE OF CHANNEL IE BEING USED BY BLKI INSTRUCTION ;CH'PI IS THE ADDRESS OF THE CHANNEL ROUTINE FOR THAT LEVEL ;.CPRCT IS INDEXED BY PI NUMBER MINUS 1 ;.CPRDT = XWD JSRADR,DISMIS ADR ;JSR ADR = ADDRESS OF CHANNEL ROUTINE TO SAVE THE AC'S ;DISMIS ADR IS THE ADDRESS OF CHANNEL DISMISS ROUTINE ;.CPRDT IS INDEXED BY PI NUMBER MINUS 1 ;.CPRIT = C(CH'PI+1) ;THIS IS USED TO RESTORE THE PI CHAINS TO ORIGINAL ;STATE DURING A 140 OR A 143 RESTART ;.CPRIT IS INDEXED BY PI NUMBER MINUS 1 ;RTTRP IS THE ENTRY POINT FROM UUOCON DURING A CALL ;FROM A USER ON LEVEL 8 (I.E. NORMAL TIME SHARING). ;RTTRP1 IS THE ENTRY POINT FROM A UUO GIVEN FROM ;A PROGRAM RUNNING AT PRIORITY INTERRUPT LEVEL ;J = JOB # ;R = JBTADR(J) ;T1 = CONTENTS OF UUO AC ;RTUUO= RETURN ADDRESS IF ENTERED FROM INTERRUPT LEVEL RTTRP:: PUSHJ P,SAVE3## ;SAVE P1-P3 PUSH P,M ;SAVE THE UUO AC SETZ S, ;INITIALIZE FLAG REGISTER MOVE T2,JBTPRV##(J) ;GET USER PRIVILEGE BITS TLNN T2,PVRTT ;DOES THE USER HAVE THE PROPER PRIVILEGES TRO S,E24 ;NO, SET THE ERROR BIT IFN FTLOCK,< ;LOCK UUO FEATURE? PUSHJ P,LOKCHK## ;JOB LOCKED IN CORE? PUSHJ P,LOKEVC## ;ALSO MUST BE LOCKED IN EVM ON KI10 > TRO S,E28 ;NO, SET ERROR BIT PUSHJ P,GETTAC## ;SET UP T1 AGAIN ;HERE AT INTERRUPT LEVEL TO DO RTTRP UUO SKIPA P1,[15] ;FIRST NONUSABLE AC RTTRP1: SETZ P1, ;NO AC AT INTERRUPT LEVEL HRRZS P2,T1 ;ADDRESS OF ARG LIST & ZERO IDX & INDIRECT BITS MOVS U,R ;GET LENGTH OF USER LOW SEGMENT CAILE P2,JOBPFI## ;IS ADR ABOVE PROTECTED AREA CAILE P2,(U) ;YES, IS ADR BELOW TOP OF USER AREA JRST [CAIL P2,(P1) ;VALID AC? JRST ERR30 ;NO JRST .+1] ;YES EXCTUX ;PICK UP PI CHANNEL # LDB W,[POINT 3,P1,26];CPU NUMBER JUMPGE P1,[TLO W,(1B0) ;IS THIS A REGULAR RTTRP CALL JRST RTTRP2] TRNN P1,(17B5) TRZA P1,(577B8) TLOA W,(1B0) TRZE P1,(1B1) TLO S,NOREM ;NOTE THAT NO DEVICES ARE TO BE REMOVED TRNE P1,(17B5) MOVMS P1 ;NO, GET POSITIVE PI LEVEL HRRZS P1 TLNE S,NOREM JUMPE P1,ERR30 RTTRP2: CAIG W,CPUN##-1 ;LEGAL CPU OR OLD STYLE CALL? JRST RTTRP3 ;YES TRO S,E23 ;NO, INDICATE NON-EXISTANT CPU JRST ERROR ;AND DON'T TRY TO RESCHEDULE ONTO THAT CPU RTTRP3: IFN FTMP,< PUSH P,T1 ;SAVE ADDRESS OF ARG BLOCK JUMPGE W,RTTR3A ;OK IF CPU SPECIFIED PUSHJ P,CHKCPU## ;FOR OLD CALLS, USE ONLY 1 CPU TRO S,E25 ;NOT "ONLY" ON A CPU MOVE W,T1 ;REMEMBER CPU WE ARE LOCKED ON RTTR3A: MOVE T1,W ;CPU NUMBER WHERE DEVICE IS TLNN S,RTINT ;AT INTERRUPT LEVEL? PUSHJ P,ONCPUN## ;NO, GET ON THE PROPER CPU POP P,T1 ;RESTORE ARG POINTER CAMN W,.CPCPN## ;ON THE PROPER CPU? JRST RTTRP4 ;YES TRO S,E25 ;NO, INDICATE ERROR IN CPU SPEC JRST ERROR ;AND DON'T CONTINUE RTTRP4:> JUMPE P1,REMOVE ;IF NO PI CHANNEL THEN REMOVE DEVICE CAIGE P1,7 ;IS PI OUT OF BOUNDS SKIPN .CPRCT##-1(P1) ;IS CHANNEL LEGAL FOR RTTRP USE TRO S,E35 ;NO, SET ERROR BIT EXCTUX ;GET TRAP ADDRESS CAILE P2,JOBPFI## ;IS THIS ABOVE THE PROTECTED AREA? CAILE P2,(U) ;IS THIS LESS THAN TOP OF CORE AREA? TRO S,E33 ;NO, SET PROPER ERROR BIT HRRI T1,1(T1) ;MAKE T1 POINT TO NEXT ARGUMENT EXCTUX ;GET APR TRAP ADDRESS CAILE M,JOBPFI## ;IS IT ABOVE PROTECTED AREA CAILE M,(U) ;AND BELOW TOP OF CORE AREA? TRO S,E32 ;NO, SET ERROR BIT EXCTUX ;GET LEFT HALF OF SECOND WORD TLNE M,JSRMOD ;IS THIS AN EXEC MODE TRAPPING REQUEST TLO S,NOSAV ;YES, REMEMBER IT TLNE M,VTRMOD ;WAS VECTORED INTERRUPT MODE SPECIFIED? TLO S,VECTOR ;YES, REMEMBER THAT TLNE M,EPTMOD ;INTERRUPT INSTRUCTION TO BE STORED RELATIVE TO THEE EPT? TLO S,EPTREL ;YES, REMEMBER THAT HRRI T1,1(T1) ;T1 NOW POINTS TO THIRD ARGUMENT EXCTUX ;PICK UP INTERRUPT INSTRUCTION TRZ T2,77400 ;ZERO OUT DEVICE CODE TRZE T2,17 ;INDEX FIELD SHOULD ALSO BE ZERO TRO S,E30 ;IT ISN'T, SET ERROR BIT TRZE T2,20 ;IS THE INDIRECT BIT ON TLO S,INDBIT ;YES, NOTE THAT FACT CAIE T2,(CONSO) ;IS THIS A CONSO INSTRUCTION? JRST BLKINS ;NO, TRY FOR BLKI/O INSTRUCTION ;FALL THROUGH TO NEXT PAGE TLO S,CNSO ;MARK THAT THIS IS A CONSO INSTRUCTION TLNN S,INDBIT ;IS THIS AN INDIRECTION CALL JRST RTTRP5 ;NO EXCTUX ;YES, PICK UP INSTRUCTION CAILE T2,JOBPFI## ;CHECK IF IT IS IN BOUNDS CAILE T2,(U) ;ABOVE LOWER LIMIT AND BELOW UPPER LIMIT? TRO S,E30 ;NO, SET ERROR BIT RTTRP5: EXCTUX ;PICK UP INSTRUCTION AGAIN TLZE S,INDBIT ;IS THE INDIRECT BIT SET ADDI P3,(R) ;YES, RELOCATE ONCE HRRI T1,1(T1) ;MAKE T1 POINT TO NEXT ARGUMENT EXCTUX ;GET INSTRUCTION PART OF ARG JUMPE T2,BLKRET ;IF IT IS ZERO THEN FORGET IT TRZ T2,77400 ;ZERO OUT DEVICE CODE TRZE T2,37 ;INDEX OR INDIRECT BITS ON TRO S,E30 ;YES, ERROR ;BLKI/O INSTRUCTION, CHECK BOUNDRY CONDITIONS BLKINS: TRZ T2,100 ;COMMON BIT TO BLKI AND BLKO TLNN S,INDBIT ;INDIRECT BIT SET CAIE T2,(BLKI) ;BLKI OR BLKO JRST VECINS ;NO, MAYBE VECTORED INTERRUPT EXCTUX ;GET BLKADR CAILE T2,JOBPFI## ;CHECK BOUNDRY CONDITIONS CAILE T2,(U) ;ABOVE LOWER BOUND AND BELOW UPPER BOUND? JRST ERR31 ;NO, GO SET ERROR BIT EXCTUX ;PICK UP BLOCK ADDRESS AND WORD COUNT HLRO T4,T3 ;GET NEGATIVE WORD COUNT MOVNS T4 ;MAKE IT POSITIVE ADDI T4,(T3) ;CALCULATE END OF BLOCK CAILE T4,JOBPFI## ;CHECK BOUNDS CAILE T4,(U) ;UPPER AND LOWER BOUNDS OK? JRST ERR31 ;NO, GO SET ERROR BIT MOVEI T4,1(T3) ;GET START OF BLOCK CAILE T4,JOBPFI## ;IS IT IN BOUNDS CAILE T4,(U) ;UPPER AND LOWER BOUNDS OK? JRST ERR31 ;NO,GO SET ERROR BIT EXCTUX ;SAVE BLKI/O INSTRUCTION FOR LATER ADDI F,(R) ;RELOCATE BLKI/O INSTRUCTION EXCTUX ;GET ADDRESS OF WORD COUNT, START ADR ADDI T2,(R) ;RELOCATE IT MOVE U,(T2) ;LOAD U WITH THE IOWD FOR BLKI/O ADDI U,(R) ;RELOCATE IT MOVEM U,(T2) ;SET UP RELOCATED IOWD IN USER AREA TLO S,BLKIO ;NOTE THAT A BLKI/O IS TO BE DONE JRST BLKRET ;GO GET RT BLOCK ERR31: TROA S,E31 ;SET ERROR BIT 31 ERR30: TRO S,E30 ;SET ERROR BIT 30 JRST ERROR ; GO RETURN TO USER VECINS: TLNN S,INDBIT ;INDIRECT BIT SPECIFIED? TLNN S,VECTOR ;AND WAS VECTOR TYPE INTERRUPT REQUESTED? JRST ERR30 ;ERROR EXCTUX ;EXEC VIRTUAL ADDRESS OF THE INTERRUPT VECTOR TLNN S,EPTREL ;IS ADDRESS RELATIVE TO THE EPT? JRST BLKRET ;NO, USER SPECIFIED THE EVA OF IRP VECTOR TRNE F,MPGSIZ## ;MUST BE LESS THAN PAGSIZ JRST ERR31 ;NOT, THE EPT IS ONLY A PAGE LONG ADD F,.CPEPT## ;RELOCATE BY ADDRESS OF THE EPT ;FALL INTO BLKRET ;ARRIVE HERE AFTER PROCESSING ARGUMENT LIST. ;IF THERE ARE ANY ERRORS SO FAR, DON'T GO ON. ;AT THIS POINT THERE ARE FOUR AC'S SET UP: ;F=INTERRUPT INSTRUCTION(CONSO OR BLKI/O), ;M=APR INFO (XWD ENABLE,APRTRP), ;P1=PI CHANNEL NUMBER, AND P2=TRAP ADDRESS BLKRET: TRNE S,-1 ;ANY ERRORS YET? JRST ERROR ;YES, DONT GO ANY FURTHER ;AT THIS POINT THE ARGUMENT LIST HAS BEEN VERIFIED, NOW ;TRY TO OBTAIN A FREE REAL TIME BLOCK. SYSPIF ;LOCK OUT HIGHER PRIORITY INTERRUPTS SKIPE T4,RTLINK ;IS THE FREE LIST EMPTY? MOVE T4,@RTLINK ;NO, GET FIRST FREE BLOCK EXCH T4,RTLINK ;STORE NEW POINTER IN RTLINK SYSPIN JUMPE T4,NORTBL ;ANY BLOCKS? ;FALL THROUGH TO NEXT SECTION ;THE RT BLOCK HAS BEEN OBTAINED. ;NOW AN INTERRLOCK IS SET ( JOBTB(RTBLK) = XWD DEV-CODE,0) ;TO PREVENT THE SAME DEVICE FROM BEING PUT ON OR TAKEN OFF ;OTHER CHANNELS DURING THE TIME IT TAKES TO COMPLETE THE ;CHAINING OF THIS RT BLOCK. TLNN S,CNSO ;IS THERE A CONSO INSTRUCTION MOVE P3,F ;NO, SET P3 UP PROPERLY LDB T3,[POINT 7,P3,9] ; GET DEV CODE IORI T3,RTUSE ; MARK THAT RTBLOCK IS BEING USED HRLZM T3,JOBTB(T4) ;STORE DEV CODE IN RT BLOCK FOR INTERLOCK IFN FTMP,< DPB W,[POINT 3,JOBTB(T4),2] ;STORE CPU NUMBER > MOVE T2,[XWD MRTRPN##,RTBLK##] ;SET UP COUNTER AC ;CHKDEV MAKES SURE THAT THERE ARE NO OTHER OCCURENCES OF THIS DEVICE ;ON ANY OTHER CHANNELS EXCEPT WHEN OWNED BY THIS JOB CHKDEV: LDB T1,[POINT 10,JOBTB(T2),17] ;DEVICE CODE + USE BIT CAMN T1,T3 ;IS THIS THE SAME AS CURRENT DEVICE JRST CHKDV2 ;YES, GO SEE IF LEGAL CHKDV1: HRRI T2,RTBSIZ-1(T2) ;LOOK AT NEXT BLOCK AOBJN T2,CHKDEV ;LOOP BACK FOR REST OF CHECKS TLNE S,VECTOR ;VECTOR INTERRUPT DEVICE? JRST CHKDV4 ;YES TLNN S,CNSO ;CONSO INSTRUCTION? JRST NOCNSO ;NO, GO SET UP BLKI/O INSTRUCTION CHKDV4: SYSPIF ;POSSIBLE RACE CONDITIONS HERE SKIPG T1,.CPRCT##-1(P1) ;ENABLED FOR BLKI/O TLZA T1,400000 ;YES, CLEAR BLKI/O BIT TLNN T1,BINUSE ;IS THERE A BLKI/O OPERATION IN USE AOSA .CPRCU##-1(P1) ;NO, COUNT UP CONSO IN USE TABLE JRST ERR35 ;CHANNEL BEING USED, GIVE BACK RT F MOVEM T1,.CPRCT##-1(P1);RESTORE NEW CHANNEL STATUS WORD SYSPIN ;TURN PI SYSTEM BACK ON ;FALL THROUGH TO LOADRB ;THE RT BLOCK HAS BEEN OBTAINED, AND THE CHANNEL HAS BEEN SECURED ;NOW THE RT BLOCK CAN BE SET UP ;T4 CONTAINS THE START ADDRESS OF THE RT BLOCK ;P1 CONTAINS PI# LOADRB: TLZ M,-1 MOVEM M,APRTAB(T4) ;STORE IN APRTRP TABLE MOVEM R,JADRTB(T4) ;STORE JBTADR VALUE IN TABLE MOVEM P1,PITAB(T4) ;SAVE PI NUMBER SKIPN T1,.CPRTT## ;ARE WE AT INTERRUPT LEVEL SKIPA T2,.CPCN1## ;NO, GET USER ENABLE BITS SKIPA T2,UENBT1(T1) ;YES, GET USER ENABLE BITS FROM T4 SKIPA T1,.CPDTO## ;NO, USE KT10A VALUE MOVE T1,RELTB1(T1) ;YES, USE CURRENT INTERRUPT LEVEL VALUE MOVEM T1,RELTAB(T4) ;STORE FOR INTERRUPT LEVEL USE IFN FTKL10,;KL10 BITS FOR NXM AND PAGE FAIL IFN FTKS10, ;KS10 BITS FOR NXM HRRZM T2,UENBTB(T4) ;STORE FOR LATER USE MOVSI T1,(JRST) ;SET UP JRST CHAND'PI HRR T1,.CPRDT##-1(P1) ;FOR INTERRUPT LEVEL USE MOVEM T1,DISMTB(T4) ;STORE IT IN TABLE HLRZ T1,.CPRDT##-1(P1) ;GET JSR ADDRESS HRLI T1,(JSR) ;SET UP INSTRUCTION PART MOVEM T1,RTJSR(T4) ;STORE IN RTBLK MOVE T1,[JSP J,TRPGO##] MOVEM T1,RTJSP(T4) ;SET UP JSP INSTRUCTION IN RT BLOCK HRLI P2,USER+USRIOT ;TURN ON USER MODE AND USER IOT MODE BITS MOVEM P2,TRPTAB(T4) ;STORE TRAP ADDRESS HRRZ T1,.CPRCT##-1(P1) ;GET CHANNEL ADDRESS ADDI T1,1+O ;T1 = CHANX+1+OFFSET HRLI T4,(JRST) ;SET UP JRST T4 LDB T2,[POINT 7,P3,9] ;GET DEVICE CODE TLNN S,NOREM ;SHOULD WE REMOVE ANY DEVICES? JSP T3,REMDEV ;GO REMOVE ALL DEVICES WITH THIS CODE FOR THIS JOB AOS JBTRTD##(J) ;COUNT UP REAL TIME DEVICE COUNT MOVSI T3,(JSR) ;SET UP JSR TO TRPADR HRR T3,TRPTAB(T4) ;GET USER TRAP ADDRESS ADDI T3,(R) ;RELOCATE IT TLNE S,VECTOR ;VECTORED MODE TRAPPING? JRST VECST1 ;YES, SETUP RTBLK FOR THAT STYLE OF RTTRP MOVEM T3,RJRST1(T4) ;STORE IT IN RT BLOCK MOVSI T3,(XJEN) ;SET UP XJEN CHN HRR T3,.CPRCT##-1(P1) ;GET CHANNEL RETURN ADDRESS MOVEM T3,RTJEN(T4) ;STORE IN JEN ADDRESS TLNN S,CNSO ;CONSO OR BLKI/O JRST BLKSET ;BLKI/O, GO SET UP PI LOCATIONS MOVEM P3,RTCNSO(T4) ;STORE THE CONSO INSTRUCTION MOVSI T2,(JRST) ;SET UP JRST INSTRUCTION HRRI T2,RTJSR(T4) ;GET ADDRESS OF JSR SAVCHN TLNE S,NOSAV ;EXEC MODE TRAPPING HRRI T2,RJRST1(T4) ;YES, GET ADR OF JSR TRPADR MOVEM T2,RTBLKO(T4) ;STORE IT IN RT BLOCK TLNE S,BLKIO ;IS THERE A BLKI/O TO GO ON JRST BLKST1 ;YES, GO DO IT RTRET1: SYSPIF ;PI MUST BE OFF NOW MOVE T2,(T1) ;PICK UP FIRST JRST OF CHAIN MOVEM T4,(T1) ;CHANGE IT TO JRST RTBLK MOVEM T2,RTJRST(T4) ;SET UP JRST NXTDEV INSTRUCTION MOVEI T2,O ;OFFSET ADDM T2,(T1) ;SKIP SPACE RESURVED FOR XPCW RTRET2: HRRM J,JOBTB(T4) ;COMPLETE RT BLOCK SET UP PUSHJ P,ONIFO ;INTERLOCK REMOVED RTRET: TLNE S,RTINT ;ARE WE AT INTERRUPT LEVEL AOSA P4 ;YES, ADD ONE TO RETURN AOSA -1(P) ;NO, ADD ONE TO RETURN JRST 2,@P4 ;RETURN MOVSI T2,USRIOT ;SET USER IOT PRIVELEGE BIT IORM T2,.JDAT+JOBPD1## ;IN USER RETURN ADDRESS HLRZ F,JOBTB(T4) ;CPU AND DEVICE CODE HRRZ U,PITAB(T4) ;PI CHANNEL MOVE T1,[.SWERT,,.ERSWE] ;RTTRP EVENT,,SW EVENT PUSHJ P,DAERPT## ;TELL DAEMON SETZ F, ;AVOID IME JRST MPOPJ## ;RESTORE M AND RETURN ;ODD PEICES AND ROUTINES NOCNSO: SYSPIF ;ROUTINE TO MARK A BLKI/O IN PROGRESS SKIPL T1,.CPRCT##-1(P1);ARE BLKI/O INSTRUCTIONS ALLOWED JRST NCNSO1 ;NO, SEE IF ONLY RESETTING BLKI/O POINTR TLC T1,400000!BINUSE ;MARK THAT BLKI/O IS IN USE MOVEM T1,.CPRCT##-1(P1);STORE NEW CHANNEL STATUS WORD SYSPIN JRST LOADRB ;GO SET UP RT BLOCK NCNSO1: TLNN T1,BINUSE ;IS THERE ALREADY A BLOCK IN OR OUT GOING JRST ERR34 ;NO, THEN THIS IS AN ERROR TLO T1,BLKSAV ;YES, THEN WE ARE ONLY CHANGING POINTER'S MOVEM T1,.CPRCT##-1(P1) ;STORE NEW VALUE SYSPIN ;TURN ON PI SYSTEM JRST LOADRB ;GO SET UP RT BLOCK BLKST1: MOVEM F,RTBLKO(T4) ;STORE BLKI/O INSTRUCTION TLNN S,NOSAV ;EXEC MODE TRAPPING? MOVEM T2,RJRST1(T4) ;STORE JRST RTJSR JRST RTRET1 ;GO SET UP CONSO CHAIN VECST1: MOVSI T1,VECUSE ;INDICATE VECTORED INTERRUPT DEVICE IORM T1,JOBTB(T4) ; THEREFORE NO CONSO INSTRUCTION ON THE SKIP CHAIN SETZM RTCNSO-1(T4) ;INTERRUPT FLAGS MOVEI T1,RTCNSO+1(T4) ;INTERRUPT NEW PC MOVEM T1,RTCNSO(T4) ;FOR XPCW MOVSI T1,(EXCH T1,) ;"EXCH T1,RTCNSO-3", FLAGS STORED BY XPCW HRRI T1,RTCNSO-3(T4) ; .. MOVEM T1,RTJRST(T4) ;STORE THAT IN RTBLK ADD T1,[1,1] ;"EXCH T2,RTCNSO-2", PC STORED BY XPCW MOVEM T1,RTBLKO(T4) ;STORE THAT IN RTBLK MOVSI T1,(DMOVEM T1,) ;"DMOVEM T1,CHN", SO CAN USE CHANNEL SAVE ROUTINES HRR T1,.CPRCT##-1(P1) ; .. MOVEM T1,RJRST1(T4) ;STORE THAT MOVSI T1,(DMOVE T1,) ;"DMOVE T1,RTCNSO-3", TO RESTORE ACS HRRI T1,RTCNSO-3(T4) ; .. MOVEM T1,RTJEN(T4) ;STORE THAT IN RTBLK TLNN S,NOSAV ;EXEC MODE TRAPING? JRST VECST2 ;NO, REST OF THE BLOCK IS SETUP MOVEM T3,RTJEN(T4) ;STORE "JSR TRPADR" MOVSI T1,(XJEN) ;"XJEN CHN" HRR T1,.CPRCT##-1(P1) ; .. MOVEM T1,RTJSR(T4) ;STORE THAT IN RTBLK VECST2: MOVSI T1,(XPCW) ;"XPCW RTCNSO-3" HRRI T1,RTCNSO-3(T4) ; .. MOVEM T1,(F) ;STORE THAT AT THE VECTOR ADDRESS JRST RTRET2 ;COMPLETE RTBLK AND RETURN TO THE USER CHKDV2: CAIN T4,(T2) ;IS THIS DEVICE CODE OK? JRST CHKDV1 ;YES, GO BACK AND LOOK AT THE REST HRRZ T1,JOBTB(T2) ;CHECK TO SEE IF THIS IS OUR JOB CAIN J,(T1) ;IS IT US? JRST CHKDV1 ;YES, THEN IT IS OK. TRO S,E26 ;NO, SET ERROR BIT CHKDV3: SETZM JOBTB(T4) ;ZERO OUT DEVICE CODE MOVEI T1,(T4) ;GET BLOCK START ADDRESS SYSPIF ;PUT IT BACK ON FREE LIST EXCH T1,RTLINK ;GET NEXT ENTRY ON LIST MOVEM T1,(T4) ;PUT IT IN FIRST WORD OF CURRENT BLOCK SYSPIN ;LET INTERRUPTS COME AGAIN ERROR: TLNN S,RTINT ;ARE WE AT INTERRUPT LEVEL JRST ERROR1 ;NO, GO DISMISS PROPERLY ADDI R,-1(P4) ;GET ADDR OF UUO IN USER AREA LDB T1,[POINT 4,(R),12] ;GET USER AC NUMBER HRRZM S,(T1) ;STORE THE ERROR BITS IN USER AC JRST 2,@P4 ;RETURN ERROR1: POP P,M ;RESTORE UUO AC MOVE T1,S ;PUT ERROR CODE IN T1 JRST STOTAC## ;GO STORE T1 IN USER AC ERR34: TROA S,E34 ;SET ERROR BIT 34 ERR35: TRO S,E35 ;SET ERROR BIT 35 SYSPIN ;TURN PI SYSTEM BACK ON JRST CHKDV3 ;GO CLEAN UP AND RETURN NORTBL: TRO S,E29 ;SET THE ERROR BIT JRST ERROR ;GO GIVE ERROR RETURN BLKSET: MOVSI T1,(XPCW) HRR T1,.CPRCT##-1(P1) ;GET CH'PI ADDRESS HRRZ T2,P1 ;GET CHANNEL NUMBER LSH T2,1 ;MULTIPLY IT BY 2 ADD T2,.CPEPT## MOVEM T1,41(T2) ;STORE JSR INSTRUCTION IN TRAP LOCATION MOVSI T3,(JRST) ;SET UP JRST TO RT BLOCK HRRI T3,RTJSR(T4) ;GET START OF RT BLOCK CODE TLNE S,NOSAV ;EXEC MODE TRAPING HRRI T3,RJRST1(T4) ;YES, GET ADR OF "JSR TRPADR" INSTRUCTION MOVEM T3,O+1(T1) ;STORE INSTRUCTION IN CH'PI + 1 SYSPIF MOVEM F,40(T2) ;STORE BLKI/O INSTRUCTION IN TRAP LOC HRRM J,JOBTB(T4) ;REMOVE INTERLOCK SYSPIN JRST RTRET ;GO RETURN TO USER ;ENTERED BY INTERRUPT LEVEL UUO FROM LOC 41 WITH JSP RTUUO,UUOHND ;DECODE UUO, AND IF IT IS LEGAL GO EXECUTE IT ;OTHERWISE DISMIS THE INTERRUPT ;THE FASTEST METHOD OF DISMISSING IS TO EXECUTE AN INSTRUCTION ;WHICH TRAPS TO LOC 60 (IE OPCODE 100). THIS BYPASSES THE UUO DECODING. ;*** ACS 16 AND 17 SHOULD NOT BE SYMBOLIC IN THIS ROUTINE ;***SINCE THEY ARE DOCUMENTED AS 16 AND CANNOT IF SYMBOLIC ;***NAMES ARE CHANGED UUOHND::LDB 16,RTMUAC## ;PICK UP UUO AC CAIN 16,17 ;IS THIS AN ILLEGAL USER AC? JRST UUOHD3 ;YES, GO GIVE IMMMEDIATE ERROR RETURN MOVE T1,(16) ;LOAD T1 WITH USER'S AC SKIPL J,.CPRTT## ;GET RT BLOCK INDEX REGISTER JRST .CPDMI## ;IF RT BLOCK RELEASED GO DISMISS LDB T2,RTMUOC## ;GET UUO OPCODE MOVE R,JADRT1(J) ;LOAD PROTECTION-RELOCATION CAIE T2,47 ;CALLI UUO? JRST .CPDMI## ;NO,DISMIS HRRZ J,JOBTB1(J) ;LOAD J WITH JOB NUMBER HRRZ T2,RTMCAN## ;PICK UP CALLI # XCT @.CPDMI## ;SET UP P AOBJN P,.+1 ;SKIP CONI APR INFORMATION CAIE T2,RTUUON ;IS IT A RTTRP UUO? JRST UUOHD2 ;TRY OTHER LEGAL UUOS MOVSI S,RTINT ;SET INTERRUPT LEVEL UUO BIT MOVE P4,17 ;RTRET AND ERROR EXPECT TO RETURN THRU P4 CAIN 16,16 ; RTUUO AND RTUUO1 ARE ILLEGAL TROA S,E27 ;YES, ERROR JRST RTTRP1 ;NO, GO EXECUTE UUO HRRZM S,(16) ;STORE ERROR CODE JRST 2,@17 ;GIVE ERROR RETURN UUOHD3: MOVE T1,17 ;SAVE CONTENTS OF RETURN AC MOVEI 17,E27 ;SET ERROR BIT IN AC RTUUO JRST 2,@T1 ;GIVE ERROR RETURN UUOHD2: CAIE T2,WAKUUO ;IS THIS A WAKE UUO ? JRST .CPDMI## ;NO,DISMIS(OR CHECK FOR OTHER LEGAL UUOS) MOVEI T2,WAKEUP## ;SET UP FOR UUO DISPATCH UUODPT: CAIE 16,16 ;IS THIS AN ILLEGAL UUO AC (UUODPT= UUO DISPATCH ENTRY) ? PUSHJ P,(T2) ;DISPATCH TO UUO JRST 2,@17 ;ERROR RETURN AOS 17 ;NORMAL SKIP RETURN JRST 2,@17 ;RETURN TO CALLER ;REMDEV REMOVES ALL INSTANCES OF A DEVICE WITH THE CORRECT ;JOB NUMBER FROM THE CHAINS ;CALLING SEQUENCE: ; MOVE T2,DEVCODE ; JSP T3,REMDEV ;AC'S T1, W, U, AND T4 ARE PRESERVED REMDEV: PUSHJ P,ONIFO ;COULD BE ENTERED WITH PI OFF MOVE P2,[XWD MRTRPN##,RTBLK##] ;SET UP COUNTER AC REMDV1: LDB M,[POINT 7,JOBTB(P2),17] ;GET DEVICE CODE CAMN M,T2 ;IS IT A MATCH JRST REMDV3 ;YES, GO REMOVE IT FROM CHAIN REMDV2: PUSHJ P,ONIFO ;CAN GET HERE WITH PI SYSTEM OFF HRRI P2,RTBSIZ-1(P2) ;GO ON TO NEXT BLOCK AOBJN P2,REMDV1 ;LOOP BACK FOR REST OF BLOCKS JRST (T3) ;NO DEVICES, GO RETURN REMDV3: PUSH P,P1 ;SAVE CHANNEL NUMBER SYSPIF ;GUARD AGAINST THE RACE CONDITION LDB M,[POINT 7,JOBTB(P2),17] ;GET DEVICE CODE AGAIN IFN FTMP,< LDB P1,[POINT 3,JOBTB(P2),2] ;CPU NUMBER CAMN P1,.CPCPN## ;DEVICE ON THIS CPU? > CAME M,T2 ;IS IT STILL THE SAME? JRST [POP P,P1 ;NO, GO TRY AGAIN JRST REMDEV] MOVE M,JOBTB(P2) ;GET JOB NUMBER CAIE J,(M) ;IS THIS OUR JOB? JRST CLRRT2 ;NO, GO BACK FOR ANOTHER TRY PUSH P,T2 ;SAVE DEVICE CODE HRRZS JOBTB(P2) ;SET INTERLOCK TLNE M,VECUSE ;VECTORED INTERRUPT DEVICE? JRST CHFND0 ;YES, NO CONSO'S ON THE SKIP CHAIN SYSPIN ;FINISHED STICKY AREA HRRZ P1,PITAB(P2) ;GET PI CHANNEL NUMBER MOVE T2,.CPRCT##-1(P1);GET CHANNEL STATUS WORD TLNE T2,BINUSE ;IS THIS A BLKI/O CASE JRST BLKREM ;YES, GO REMOVE THAT CHLPB: PUSHJ P,ONIFO ;ENTERED WITH PI OFF SOMETIMES MOVSI T2,(JRST) ;SET UP CHAIN INSTRUCTION TO LOOK FOR HRRI T2,O(P2) ;GET ADDRESS OF BLOCK HRRZ M,.CPRCT##-1(P1) ;GET CHANNEL ADDRESS ADDI M,O ;SKIP XPCW BLOCK CHLOOP: CAMN T2,1(M) ;IS THIS THE RIGHT CHAIN ENTRY? JRST CHFND ;YES, GO REMOVE IT HRRZ M,1(M) ;POINT TO NEXT CONSO ELEMENT JRST CHLOOP ;GO BACK FOR MORE REMOVE: TRNE S,E24+E25 ;ANY ERRORS SO FAR? JRST ERROR ;YES, DON'T CONTINUE HRRI T1,2(T1) ;MAKE T1 POINT TO INSTRUCTION ARG EXCTUX ;PICK UP DEVICE CODE JSP T3,REMDEV ;GO REMOVE ALL DEVICES WITH THIS CODE JRST RTRET ;GO RETURN TO USER ;SUBROUTINE TO TURN ON PI IF OFF ;PRESERVES ALL ACS ONIFO: CONSZ PI,CLKBIT## ;CHANNEL 7 DISABLED CONSO PI,PI.ON ;OR PI TURNED OFF SYSPIN ;RELEASE INTERLOCK POPJ P, ;RETURN ;ENTERED AFTER FINDING THIS DEVICE CHFND: SYSPIF ;GUARD AGAINST INTERRUPTS FROM ABOVE CAME T2,1(M) ;IS IT STILL A MATCH? JRST CHLPB ;NO, GO TRY AGAIN MOVE T2,1+O(P2) ;GET NEXT CHAIN LINK MOVEM T2,1(M) ;CUT THIS RT BLOCK OUT OF CHAIN CHFND0: SYSPIN ;ALLOW INTERRUPTS PENDING TO GO SYSPIF SOSE .CPRCU##-1(P1) ;DECREMENT COUNT OF CONSO'S JRST CHFND1 ;STILL MORE CONSO'S ON CHAIN MOVE T2,.CPRCT##-1(P1);GET CHANNEL STATUS WORD TLNE T2,BLKENB ;BLKI/O ALLOWED TLO T2,400000 ;YES, MARK THAT THIS CHANNEL IS FREE MOVEM T2,.CPRCT##-1(P1);STORE NEW STATUS WORD CHFND1: SYSPIN ;TURN ON PI SYSTEM AGAIN CLRRTB: HRRZ T2,.CPRTT## ;GET RT BLOCK POINTER ADDRESS CAIE T2,RTJSP+1(P2) ;IS THIS THE BLOCK THAT IS BEING REMOVED? JRST CLRRT1 ;NO HRRZ M,.CPRDT##-1(P1) ;GET ADDRESS OF DISMISS ROUTINE HRRZI M,RTOFST##(M) ;ADD IN RELTAB OFSET MOVE T2,RELTAB(P2) ;GET RELOC/PROTECTION MOVEM T2,RELTB1(M) ;STORE IN PI LEVEL AREA MOVE T2,UENBTB(P2) ;GET ENABLE BITS MOVEM T2,UENBT1(M) ;STORE IN PI LEVEL AREA MOVEM M,.CPRTT## ;STORE NEW .CPRTT WORD CLRRT1: MOVEI T2,(P2) ;PICK UP RT BLOCK ADDRESS SYSPIF SETZM JOBTB(P2) ;CLEAR OUT DEV CODE EXCH T2,RTLINK ;PUT THIS BLOCK BACK ON LIST MOVEM T2,(P2) ;SET UP REST OF LINKS SYSPIN SOS JBTRTD##(J) ;COUNT DOWN RT DEVICE COUNT POP P,T2 ;RESTORE DEVICE CODE CLRRT2: POP P,P1 ;RESTORE CHANNEL NUMBER JRST REMDV2 ;ALL FINISHED ;ENTER HERE TO REMOVE A BLKI/O FROM A PI LOCATION BLKREM: TLNE T2,BLKSAV ;ARE WE JUST RESETTING POINTER WORD JRST BLKRM1 ;YES, DON'T REMOVE BLKI/O MOVE T2,.CPEPT## ;GET PROPER PI LOCATION ADDI T2,40(P1) ADD T2,P1 ;40 + 2*N HRLI M,(XPCW) ;SET UP XPCW CHAN HRR M,.CPRCT##-1(P1) ;GET CHAN ADDRESS MOVEM M,(T2) ;STORE IN 40+2*N HRLI M,(XJEN) MOVEM M,O+1(M) ;T4+1 = JEN @ T4 SYSPIF ;TURN OFF PI MOVE M,.CPRCT##-1(P1) ;GET STATUS WORD TLC M,400000+BINUSE ;SET THAT CHANNEL IS FREE MOVEM M,.CPRCT##-1(P1);STORE NEW STATUS WORD SYSPIN JRST CLRRTB ;GO CLEAN UP RT BLOCK BLKRM1: MOVSI T2,BLKSAV ;CLEAR OUT BIT ANDCAM T2,.CPRCT##-1(P1) JRST CLRRTB ;GO CLEAN UP ;RTREL IS CALLED BY RESET TO REMOVE ALL DEVICES FROM ;THE PI CHANNELS. ;BEFORE REMOVING ANY DEVICE A CONO DEV,0 IS EXECUTED RTREL:: MOVEI T1,777 ;ARE THERE ANY DEVICES ON PI LEVELS TDNN T1,JBTRTD##(J) ;CHECK RIGHT HALF ONLY POPJ P, ;NO, RETURN MOVEI T1,RTTRPN## ;SET UP COUNTER MOVEI T2,RTBLK## ;SET UP TO LOOK FOR DEVICES RTREL1: SKIPE T3,JOBTB(T2) ;ANY JOB USING THIS BLOCK JRST RTREL3 ;YES, GO SEE IF IT IS THIS JOB RTREL2: MOVEI T2,RTBSIZ(T2) ;GET NEXT ENTRY SOJG T1,RTREL1 ;GO LOOK AT OTHER ENTRIES JRST RTREL ;GO RETURN RTREL3: CAIE J,(T3) ;IS THIS US? JRST RTREL2 ;NO, GO LOOK AT REST OF BLOCKS IFN FTMP,< LDB T1,[POINT 3,T3,2] ;CPU NUMBER PUSHJ P,ONCPUN## ;GET TO THE CPU THAT OWNS THE DEVICE > HLRZ T2,T3 ;GET DEVICE NUMBER ANDI T2,177 ;CLEAR RTUSE BIT MOVSI T3,(CONO) ;SET UP TO DO A CONO DEV,0 DPB T2,[POINT 7,T3,9] IFN FTKL10,< CAIN T2,_-2 ;IF KL10 INTERVAL TIMER TRO T3,420000 ;CLEAR TIMER AND THE DONE FLAG > CAILE T2,1 ;DON'T CONO 0 TO PI OR APR XCT T3 ;CONO DEV,0 JSP T3,REMDEV ;REMOVE THE DEVICE FROM THE CHAIN JRST RTREL ;GO LOOK AT REST OF BLOCKS ;VARIABLE STORAGE ALLOCATION $LOW RTLINK::Z ;POINTER TO FIRST FREE BLOCK ON LIST $LIT END