.TITLE LOGROT .IDENT /V7.13/ ;******************************************************************** ; ; LOG - CPU/QIO LOGGING TASK AND REPORTING FACILITY ; ; THIS IS ONE OF THE MAIN ACCOUNTING SYSTEM TASKS, WHICH ; UNDER NORMAL CIRCUMSTANCES IS ALWAYS ACTIVE. COMMANDS ; FROM THE ACCOUNTING SYSTEM TASKS AND EXITING TASK PACKETS ; FROM THE POOL NODE ARE SERVICED BY THIS TASK. ; THIS MODULE IS THE ROOT SEGMENT OF LOG.... ; ; VERSION: V6 MAY 1979 ; VERSION: V7 JAN 1981 ; ; STEVE THOMPSON SCHOOL OF CHEMICAL ENGINEERING ; OLIN HALL ; CORNELL UNIVERSITY ; ITHACA NY 14853 ; ; REVISION HISTORY ; ---------------- ; ; SMT718 20-JUL-81 ADDED PAGE COUNT COMMAND. THIS COMMAND, ; SENT BY THE PRINT PROCESSOR LPP0, COUNTS ; PAGES PRINTED DURING A TERMINAL SESSION. ; IT REQUIRES THE QUEUE MANAGER. ; ; SMT740 14-AUG-81 ADDED CALL TO MACRO HDRDF$ AND CHANGED TKB ; COMMAND FILE TO ELIMINATE *DIAG* MESSAGE ; WHEN TASK BUILDING. ; ; SMT747 22-SEP-81 REMOVED THE WORD AT OFFSET L$LNK FROM THE ; UAB AND SAVED A WORD IN THE $LUAB ROUTINE ; SINCE L$UCB IS NOW THE FIRST WORD IN THE ; UAB. ; ; SMT753 7-OCT-81 CHANGED NAMES OF CONDITIONAL ASSEMBLY ; PARAMETERS; SEE THE FILES MODIFY.TXT AND ; CONDEF.MAC FOR DETAILS. ; ; SMT754 7-OCT-81 MOVED TSKOVR FROM AN OVERLAY BRANCH TO THE ; ROOT SEGMENT IN THE OVERLAID VERSION OF ; LOG... THIS REQUIRED A SMALL CHANGE IN THE ; OVERLAY LOADING SEQUENCE. ; ; SMT757 7-OCT-81 ADDED DATA STRUCTURES FOR MEMORY USAGE ; ACCOUNTING. ; ; SMT762 7-OCT-81 ADDED SUPPORT FOR BATCH/INTERACTIVE LOAD ; FEATURE. ADDED SUPPORT FOR BATCH V3 CALLS ; TO "USE" COMMAND FEATURES. ; ; SMT766 12-OCT-81 USE THE DIR$ MACRO WITH PREDEFINED DPBS ; INSTEAD OF $S FORMS IN THE PRINTING ROUTINE. ; ; SMT769 12-OCT-81 CHANGED TO CENTRALISED BATCH DEVICE NAME ; ; SMT787 13-NOV-81 KEEP MORE OF THE INFORMATION SENT BY ACNODE.TSK ; IN THE AC.NDE COMMAND ; ; SMT788 13-NOV-81 ADDED THE AC.GAC REQUEST FOR USE IN FUTURE ; ACCOUNTING UTILITIES ; ; SMT814 12-APR-82 ADDED RSX-11M V4.0 SUPPORT ; ; SMT819 12-APR-82 DON'T GIVE UP IMMEDIATELY IF THERE IS AN ; I/O ERROR WHEN LOADING AN OVERLAY, BUT ; TRY UP TO 5 TIMES. ; ; SMT850 24-MAY-83 ADD "INTERACTIVE CPU" FIELD TO "USE" COMMAND ; ; SMT851 22-JUL-83 ADDED RSX-11M V4.1 SUPPORT ; ;******************************************************************** .MCALL DIR$,QIO$,WTSE$,MRKT$,WTLO$,CMKT$S,EXST$S .MCALL WSIG$S .MCALL TCBDF$,UCBDF$,HDRDF$ ACCDF$ <:>,<=> ; DEFINE ACCOUNTING OFFSETS GLOBALLY BITDF$ <:>,<=> ; DEFINE ACCOUNTING BITS GLOBALLY BATDV$ <:> ; DEFINE BATCH DEVICE NAME GLOBALLY TCBDF$ <:>,<=> ; DEFINE TCB OFFSETS GLOBALLY UCBDF$ <:>,<=> ; DEFINE UCB OFFSETS GLOBALLY HDRDF$ <:>,<=> ; DEFINE TASK HEADER OFFSETS GLOBALLY ; ; LOCAL ASSIGNMENTS ; LUN1 == 1 ; LUN FOR TI: I/O (GLOBAL) EFN1 = 1 ; EVENT FLAG FOR TI: I/O EFN2 = 2 ; EVENT FLAG FOR I/O TIMEOUT CR = 15 ; CARRIAGE RETURN LF = 12 ; LINEFEED SPA = 40 ; SPACE BUFSIZ = 60. ; I/O BUFFER SIZE .IF DF AA$CPU & AA$QIO & AA$TCQ BUFSIZ = BUFSIZ + 20. ; BUFFER EXTENSION .ENDC ; DF AA$CPU & AA$QIO & AA$TCQ .IF DF AA$CPU & AA$MEM BUFSIZ = BUFSIZ + 10. ; BUFFER EXTENSION .ENDC ; DF AA$CPU & AA$MEM .PAGE .SBTTL MACRO DEFINITIONS ; ; MACROS ; .MACRO UABDF$,L,B ; ; LOG... USER ACCOUNTING BLOCK (UAB) OFFSET DEFINITIONS ; .ASECT .=0 L$UCB:'L' .BLKW 1 ; UCB ADDRESS L$UIC:'L' .BLKW 1 ; LOGON UIC L$NTSK:'L' .BLKW 1 ; NUMBER OF TASKS RUN L$SPCN:'L' .BLKW 1 ; SPECIAL CONNECT RATE WORD L$SPCP:'L' .BLKW 1 ; SPECIAL CPU RATE WORD L$ACNO:'L' .BLKW 1 ; ACCOUNT NUMBER FROM ...HEL L$CHWD:'L' .BLKW 1 ; CHAIN WORD FROM ...HEL .IF DF AA$CPU ! AA$ENA L$OPT:'L' .BLKW 1 ; REPORTING FLAG WORD WORD .ENDC ; DF AA$CPU ! AA$ENA L$CONN:'L' .BLKW 2 ; CONNECT TIME L$CPU:'L' .BLKW 2 ; TOTAL CPU TIME .IF DF AA$QIO & AA$TCQ L$QIO:'L' .BLKW 2 ; TOTAL I/O REQUESTS .ENDC ; DF AA$QIO & AA$TCQ L$TEFF:'L' .BLKW 2 ; TOTAL PRIO. ADJ. CPU TIME .IF DF AA$MEM L$CORE:'L' .BLKW 2 ; CORE-TIME COUNTER .ENDC ; DF AA$MEM L$PAGE:'L' .BLKW 1 ; TOTAL PAGES PRINTED L$LGTH='B'. ; LENGTH OF CONTROL BLOCK .PSECT .MACRO UABDF$,X,Y .ENDM .ENDM ; ; COMMAND -- MAKE AN ENTRY IN THE COMMAND TABLE ; .MACRO COMMAND CMDNAM .IF NB CMDNAM .WORD AC.'CMDNAM'!AC.CMD .IF DF AA$OVR .RAD50 /CMDNAM/ .ENDC ; DF AA$OVR .WORD $'CMDNAM'EP .IFF .WORD 0 .ENDC ; NB CMDNAM .ENDM ; ; DEFINE INTERNAL CONTROL BLOCK OFFSETS GLOBALLY ; UABDF$ <:>,<=> .PAGE .SBTTL COMMAND TABLES ; ; DEFINE THE COMMAND TABLES ; CMDTAB: COMMAND HEL COMMAND BYE .IF DF AA$TSF ! AA$BAT COMMAND TSF .ENDC ; DF AA$TSF ! AA$BAT .IF DF AA$CPU ! AA$ENA COMMAND CPU .ENDC ; DF AA$CPU ! AA$ENA .IF DF AA$USE ! AA$BAT COMMAND UPD COMMAND USE COMMAND USF .ENDC ; DF AA$USE ! AA$BAT COMMAND PAG COMMAND CHG COMMAND GAC COMMAND NDE COMMAND ; ZERO ENTRY ENDS COMMAND TABLE .PAGE .SBTTL GLOBAL AND LOCAL STORAGE .IF DF AA$USE ! AA$BAT TIME:: .WORD 0,0 ; TOTAL TIME FOR "USE" KERNEL::.WORD 0,0 ; EXECUTIVE TIME FOR "USE" NULL:: .WORD 0,0 ; NULL TIME FOR "USE" .IF DF AA$LDR LOADER::.WORD 0,0 ; # OF LOADER REQUESTS FOR "USE" LDRTOT::.WORD 0,0 ; TOTAL LOADER REQUESTS .ENDC ; DF AA$LDR .IF DF AA$QIO QIOCNT::.WORD 0,0 ; # OF I/O REQUESTS FOR "USE" QIOTOT::.WORD 0,0 ; TOTAL SYSTEM-WIDE QIOS .ENDC ; DF AA$QIO .IF DF AA$CSW SWTCNT::.WORD 0,0 ; # OF CONTEXT SWITCHES FOR "USE" SWTTOT::.WORD 0,0 ; TOTAL NO. OF CONTEXT SWITCHES .ENDC ; DF AA$CSW .IF DF AA$BAT BATCPU::.WORD 0,0 ; TOTAL BATCH CPU FOR "USE" COMMAND BATTOT::.WORD 0,0 ; TOTAL CPU TIME USED BY BATCH TASKS (EXITED) BATNOW::.WORD 0,0 ; TOTAL BATCH CPU USED NOW (EXITED+XEQ) BATLST::.WORD 0,0 ; VALUE OF "BATNOW" AT PREVIOUS UPDATE .IFTF INTCPU::.WORD 0,0 ; SAME AS ABOVE FOR INTERACTIVE TERMINALS INTTOT::.WORD 0,0 ; INTNOW::.WORD 0,0 ; INTLST::.WORD 0,0 ; .ENDC ; DF AA$BAT ELAPST::.WORD 0,0 ; TOTAL ELAPSED TIME KRNTOT::.WORD 0,0 ; TOTAL EXEC TIME NULTOT::.WORD 0,0 ; TOTAL NULL TIME UPNUM:: .WORD 0,0 ; STATISTICS UPDATES COUNTER UPTIM:: .BLKW 8. ; TIME OF LAST UPDATE .ENDC ; DF AA$USE ! AA$BAT TASKSZ::.LIMIT ; TKB DEFINES ADDRESS LIMITS $CHGFL::.WORD 0 ; CPU CHARGE ENABLE FLAG ; 0=CPU CHARGES ON, 1=CPU CHARGES OFF $ACCHD::.WORD 0 ; ACCOUNTING LISTHEAD POINTER $NDADR::.WORD 0 ; ACCOUNTING NODE ADDRESS $NDSIZ::.WORD 0 ; ACCOUNTING NODE SIZE $BKBUF::.WORD 0 ; STARTING ADDRESS OF USER BUFFER SPACE $MXUSR::.WORD 0 ; MAX. NUMBER OF USERS BUFFER CAN HOLD PKTADD: .WORD 0 ; RECEIVE PACKET ADDRESS $BUF:: .BLKB BUFSIZ ; OUTPUT BUFFER .EVEN .IF DF AA$OVR ERRCNT: .WORD 0 ; LOAD ERROR COUNT FOR OVERLAYS OVREQB: .BYTE 3,0 ; OVERLAY REQUEST BLOCK .RAD50 /OVR/ ; OVERLAY NAME, FIRST HALF. .RAD50 /OVR/ ; OVERLAY NAME, SECOND HALF ; REQUEST BLOCK SHOULD BE INITIALLY SET ; UP WITH A DUMMY OVERLAY NAME, OR ; THE OVERLAY LOAD ROUTINE WON'T WORK. .ENDC ; DF AA$OVR .IF DF AA$TOU MRKT: MRKT$ EFN2,AA$TOU,1 ; I/O TIMEOUT MARK TIME DPB WTLO: WTLO$ 0,EFN1!EFN2 ; WAIT FOR I/O OR MARK TIME $QIO:: QIO$ IO.WBT,LUN1,EFN1,,IOSB,,<0,0,40> ; OUTPUT DPB IOSB:: .BLKW 2 ; I/O STATUS BLOCK .IFF $QIO:: QIO$ IO.WBT,LUN1,EFN1,,,,<0,0,40> .ENDC ; DF AA$TOU WTSE: WTSE$ EFN1 ; WAIT FOR I/O DPB ; ; ERROR MESSAGES ; .NLIST BEX .IIF DF AA$V40 ! AA$V41, .ENABL LC ERR1: .ASCII /LOG... -- Bad command/ ERR1SZ=.-ERR1 .IF DF AA$OVR ERR2: .ASCII /LOG... -- Failed to load overlay "/ ERR2A: .ASCII /XXXOVR"/ ERR2SZ=.-ERR2 .ENDC ; DF AA$OVR .EVEN .PAGE .SBTTL ROOT SEGMENT CODE $LOGEP: .IF DF AA$OVR MOV (PC)+,R2 ; SET NAME OF INITIALISER OVERLAY .RAD50 /INI/ ; CALL LODOVR ; LOAD INITIALISATION OVERLAY BCC 1$ ; OK, WE MADE IT EXST$S #EX$SEV ; EXIT WITH SEVERE ERROR .ENDC ; DF AA$OVR 1$: CALL $INIEP ; CALL THE INITIALISATION ROUTINE ; FALL THROUGH TO DISPATCHER ; ; LOG... COMMAND DISPATCHER ROUTINE ; ; THE RECEIVE QUEUE IS EXAMINED FOR A DATA PACKET. IF THERE ; ISN'T ONE, WE GO TO SLEEP UNTIL AWAKENED BY SOMEONE NEEDING ; SERVICE. IF WE FIND ONE, IT IS GIVEN PRELIMINARY ANALYSIS ; AND THE RELEVANT OVERLAY (OR SUBROUTINE IF WE ARE NOT OVER- ; LAID) IS LOADED AND CALLED. ; ; DISPAT: MOV $TKTCB,R0 ; GET OUR TCB ADDRESS ADD #T.RCVL,R0 ; POINT TO THE RECEIVE QUEUE CLR PKTADD ; CLEAR THE PACKET ADDRESS CALL $SWSTK,10$ ; SWITCH TO SYSTEM STATE CALL $QRMVF ;; REMOVE A PACKET FROM THE QUEUE BCC 5$ ;; OK CALLR $STPCT ;; QUEUE EMPTY - GO TO SLEEP 5$: MOV R1,PKTADD ;; SAVE PACKET ADDRESS RETURN ;; GO BACK TO TASK LEVEL 10$: MOV PKTADD,R5 ; RETRIEVE PACKET ADDRESS BEQ DISPAT ; ZERO MEANS WE DIDN'T GET ONE ; ; DISPATCH THE COMMAND TO THE RIGHT SERVICE ROUTINE. ; ; THIS SECTION OF CODE USES THE FACT THAT A TCB IS ALWAYS ; ALIGNED ON A WORD BOUNDAY TO SORT OUT EXITING TASKS ; AND COMMANDS. COMMANDS ALWAYS HAVE BIT 0 SET IN THE ; MASK WORD (OFFSET B.MASK). ; BIT #AC.CMD,B.TCB(R5) ; IS IT A COMMAND OR A TASK? ; (B.TCB AND B.MASK ARE THE SAME OFFSET) BNE 15$ ; IT'S A COMMAND CALL $TSKEP ; CALL THE TASK PROCESSING ROUTINE BR DISPAT ; GET MORE WORK 15$: MOV #CMDTAB,R1 ; GET ADDRESS OF COMMAND TABLE 20$: MOV (R1)+,R2 ; GET NEXT BIT MASK BEQ 25$ ; END OF TABLE MEANS AN ILLEGAL COMMAND CMP R2,B.MASK(R5) ; COMMANDS MATCH? BEQ 30$ ; IF EQ YES .IF DF AA$OVR CMP (R1)+,(R1)+ ; NO, POINT TO NEXT ENTRY .IFF TST (R1)+ ; NO, POINT TO NEXT ENTRY .ENDC ; DF AA$OVR BR 20$ ; AND TRY IT 25$: MOV #ERR1,$QIO+Q.IOPL ; LOAD ERROR MESSAGE ADDRESS INTO DPB MOV #ERR1SZ,$QIO+Q.IOPL+2 ; AND ITS SIZE CALL $ASGCO ; MAKE SURE IT GOES TO THE RIGHT TERMINAL CALL $PRINT ; SEND IT OUT BR DISPAT ; AND CHECK THE QUEUE AGAIN 30$: ; REF. LABEL .IF DF AA$OVR MOV (R1)+,R2 ; LOAD OVERLAY NAME INTO R2 CALL LODOVR ; LOAD THE OVERLAY BCS DISPAT ; IF LOAD ERROR IGNORE THIS COMMAND .ENDC ; DF AA$OVR CALL @(R1) ; AND CALL THE SERVICE ROUTINE BR DISPAT ; AND GET THE NEXT COMMAND .PAGE .SBTTL OVERLAY LOAD ROUTINE .IF DF AA$OVR ;+ ; *** LODOVR ; ; THIS ROUTINE LOADS THE OVERLAY ACCORDING TO THE PARAMETERS ; ALREADY SET UP IN THE OVERLAY REQUEST BLOCK. ; IF THE OVERLAY IS ALREADY IN MEMORY, A SIMPLE ; RETURN IS MADE. ; ; INPUT: ; R2 RADIX-50 FIRST HALF OF OVERLAY NAME TO LOAD ; ;- LODOVR: MOV #OVREQB,R0 ; PUT ADDRESS OF REQUEST BLOCK IN R0 CMP R2,2(R0) ; IS THE OVERLAY ALREADY IN MEMORY? BEQ 10$ ; IF EQ YES, JUST RETURN MOV #5,ERRCNT ; SET INITIAL RETRY COUNT 5$: MOV R2,2(R0) ; NO, SET UP NAME READY TO LOAD CALL $LOAD ; LOAD THE OVERLAY BCC 10$ ; GOOD, WE MADE IT DEC ERRCNT ; TIME TO GIVE UP? BEQ 6$ ; IF EQ YES WSIG$S ; NO, WAIT FOR SIGNIFICANT EVENT BR 5$ ; AND TRY AGAIN 6$: MOV R2,R1 ; COPY OVERLAY NAME TO R1 MOV #ERR2A,R0 ; GET BUFFER ADDRESS FOR NAME CALL $C5TA ; CONVERT TO ASCII MOV #ERR2,$QIO+Q.IOPL ; SET UP MESSAGE ADDRESS MOV #ERR2SZ,$QIO+Q.IOPL+2 ; AND MESSAGE SIZE CALL $ASGCO ; ASSIGN UNIT TO CO: CALL $PRINT ; SEND OUT THE MESSAGE SEC ; SET FAILURE INDICATOR 10$: RETURN ; AND RETURN TO CALLER .ENDC ; DF AA$OVR .PAGE .SBTTL PACKET DEALLOCATION ROUTINE ;+ ; ; DEALLOCATE A COMMAND'S DSR PACKET ; ; THIS ROUTINE IS CALLED FROM MOST OF THE OVERLAYS WHEN A PACKET ; IS TO BE DEALLOCATED AND RETURNED TO THE DYNAMIC STORAGE ; REGION. ; ; INPUTS: ; R1 LENGTH OF PACKET TO DEALLOCATE ; R5 ADDRESS OF PACKET ; OUTPUTS: ; ALL REGISTERS PRESERVED ; ; ;- $DEALL::CALL $SWSTK,10$ ; SWITCH TO SYSTEM STACK MOV R5,R0 ;; COPY PACKET ADDRESS TO R0 CALLR $DEACB ;; DEALLOCATE THE PACKET 10$: RETURN ;; BACK TO TASK LEVEL AND CALLER .PAGE .SBTTL ROUTINE TO LOCATE UAB ;+ ; *** $LUAB - LOCATE USER ACCOUNTING BLOCK ; *** $LUAB1 - LOCATE CELL AT UAB OFFSET ; ; INPUT: ; R0 UCB TO LOCATE UAB FOR ; R1 MODIFIED BUFFER ADDRESS IF ENTRY AT $LUAB1 ; OUTPUT: ; CARRY CLEAR - FOUND THE UAB, ADDRESS IS IN R1 ; CARRY SET - UAB NOT CURRENTLY IN BUFFER (R1 MEANINGLESS) ; R2 IS USED BY THE ROUTINE ; ; *** NOTE *** THE OPERATION OF THIS ROUTINE DEPENDS ON THE OFFSET ; *** NOTE *** L$UCB BEING ZERO. ;- $LUAB:: MOV $BKBUF,R1 ; GET BUFFER ADDRESS $LUAB1::MOV $MXUSR,R2 ; AND MAX. USERS 10$: CMP R0,(R1) ; UCB'S MATCH? BEQ 20$ ; IF EQ YES ADD #L$LGTH,R1 ; NO, POINT TO NEXT SLOT DEC R2 ; ANY SLOTS LEFT? BNE 10$ ; IF NE YES SEC ; NO, SET FAILURE RETURN ; RETURN TO CALLER 20$: CLC ; SET SUCCESS RETURN ; AND RETURN TO CALLER .PAGE .SBTTL CO: ASSIGN ROUTINE ;+ ; *** $ASGCO - ASSIGN LUN 1 TO DEVICE CO: ; ;- $ASGCO::CALL $SWSTK,5$ ; SWITCH STACKS FOR THIS MOVE MOV $HEADR,R0 ;; GET OUR HEADER ADDRESS MOV $COPT,H.LUN+<*4>(R0) ;; ASSIGN THE LUN TO ;; DEVICE CO0: 5$: RETURN ;; BACK TO USER LEVEL AND CALLER .PAGE .SBTTL PRINTING ROUTINE ;+ ; *** $PRINT ; ; THIS ROUTINE IS CALLED BY OVERLAYS THAT WISH TO PRINT ; A MESSAGE AT WHATEVER TERMINAL THE LOGICAL UNIT NUMBER ; HAPPENS TO BE ASSIGNED TO AT THE TIME. THE REQUEST ; PARAMETERS ARE EXPECTED TO BE ALREADY SET UP IN THE DPB. ; IF MESSAGE TIMEOUT IS SUPPORTED, THE I/O IS KILLED IF IT ; HAS NOT COMPLETED BEFORE THE SPECIFIED TIME INTERVAL ; HAS ELAPSED. ; ;- $PRINT::DIR$ #$QIO ; ISSUE THE QIO .IF DF AA$TOU BCS 15$ ; IF ERROR, FORGET IT DIR$ #MRKT ; MARK TIME FOR DESIRED INTERVAL BCS 5$ ; IF ERROR, WAIT AS NORMAL DIR$ #WTLO ; WAIT FOR EITHER I/O OR MARK TIME CMKT$S ; CANCEL THE MARK TIME (IF IT WAS THE ; I/O THAT WOKE US) CMPB #IS.SUC,IOSB ; WAS IT THE I/O? BEQ 15$ ; IF EQ YES, RETURN MOV #IO.KIL,$QIO+Q.IOFN ; NO, SET UP TO KILL I/O DIR$ #$QIO ; KILL THE I/O BCS 10$ ; JUST IN CASE .IFTF 5$: DIR$ #WTSE ; ANOTHER WAIT... .IFT 10$: MOV #IO.WBT,$QIO+Q.IOFN ; RESET FUNCTION CODE 15$: ; REF. LABEL .ENDC ; DF AA$TOU RETURN ; BACK TO CALLER FOLKS .END $LOGEP