.TITLE TSKOVR .IDENT /V7.16/ ;**************************************************************** ; ; THIS ROUTINE IS CALLED WHEN THE DISPATCHER RECEIVES A ; REQUEST THAT DOES NOT HAVE BIT ZERO OF THE MASK WORD SET. ; THIS CONDITION INDICATES THE EXIT OF A TASK. THIS ROUTINE ; CALCULATES THE CHARGES FOR THE TASK, AND LOGS ITS ; EXIT FOR THE RIGHT USER. ; THIS ROUTINE IS PART OF THE ROOT SEGMENT OF LOG... ; ; VERSION: V6 MAY 1979 ; VERSION: V7 JANUARY 1981 ; ; STEVE THOMPSON SCHOOL OF CHEMICAL ENGINEERING ; OLIN HALL ; CORNELL UNIVERSITY ; ITHACA NY 14853 ; ; REVISION HISTORY ; ---------------- ; ; SMT735 5-AUG-81 ADDED EXIT STATUS DISPLAY FOR CPU-I/O ; MESSAGES (REQUIRES AA$CPU) ; ; SMT753 7-OCT-81 CHANGED NAMES OF CONDITIONAL ASSEMBLY ; PARAMETERS; SEE THE FILES MODIFY.TXT AND ; CONDEF.MAC FOR DETAILS. ; ; SMT757 7-OCT-81 ADDED CODE FOR MEMORY USAGE ACCOUNTING. ; MEMORY USAGE IS RECORDED AS 64W BLOCKS ; TIMES TIME IN SECONDS. ; ; SMT762 9-OCT-81 ADDED USE COMMAND SUPPORT FOR INTERACTIVE/ ; BATCH LOADING FIGURES. ; ; SMT769 12-OCT-81 CHANGED TO CENTRALISED BATCH DEVICE NAME ; ; SMT813 5-APR-82 REMOVED LEADING ZEROES FROM EXIT STATUS ; DISPLAY PRODUCED WHEN CPU/ON. ; ; SMT821 23-APR-82 CHANGED ENTRY POINT NAMES OF ACCOUNTING ; SUPPORT ROUTINES (SEE MODIFY.TXT) ; ; SMT823 23-APR-82 CORRECT AN ERROR CAUSING AN ODD ADDRESS ; TRAP IF PRIORITY FACTOR SUPPORT NOT ; INCLUDED. ; ; SMT827 12-JUL-82 IGNORE PRT... IN CPU MESSAGES AND REQUESTS ; TO ALT... ; ; SMT828 27-JUL-82 REPLACED "$FMTDV" BY "FM.DEV" ; ; SMT842 13-APR-83 ADDED BATCH V3 SUPPORT ; ; SMT850 24-MAY-83 ADDED "USER CPU" FIELD TO "USE" DISPLAY ; ; SMT855 1-NOV-83 FIXED REFERENCE TO R4 INSTEAD OF R1 WHEN ; NO PRIORITY FACTOR SUPPORT. ; ;******************************************************************* .MCALL GTIM$S CR = 15 ; CARRIAGE RETURN SPA = 40 ; SPACE ; ; MACROS ; .MACRO IGNORE TSKNAM,LAB MOV #TSKNAM,R2 CALL NAMCHK BCC LAB .ENDM ; ; TEXT MESSAGES ; .IF DF AA$CPU .ENABL LC CPUSTR: .ASCIZ /) CPU=/ .IF DF AA$QIO & AA$TCQ QIOSTR: .ASCIZ % I/O=% .ENDC ; DF AA$QIO & AA$TCQ .IF DF AA$MEM MEMSTR: .ASCIZ / KWS=/ .ENDC ; DF AA$MEM .ENDC ; DF AA$CPU .PAGE .SBTTL TASK NAMES TABLE ; ; TASK NAMES TABLE (SPECIAL SYSTEM TASKS ONLY) ; THESE TASKS ARE NOT ACCOUNTED IF /SYSUIC IS NOT LOGGED ON TT0: ; .EVEN .IF DF AA$ALT ! AA$USE UPD: .RAD50 /UPD.../ HEL: .RAD50 /...HEL/ BYE: .RAD50 /...BYE/ DMO: .RAD50 /...DMO/ .ENDC ; DF AA$ALT ! AA$USE .IF DF E$$DVC ! E$$NSI ! E$$PER ERRLOG: .RAD50 /ERRLOG/ ; ERROR LOGGER TASK .ENDC ; DF E$$DVC ! E$$NSI ! E$$PER .IF DF T$$KMG TKTN: .RAD50 /TKTN / ; TASK TERMINATION NOTIFICATION TASK .ENDC ; DF T$$KMG .IF DF D$$SHF SHF: .RAD50 /SHF.../ ; SHUFFLER .ENDC ; DF D$$SHF .IF DF AA$CPU ! AA$RSY ! AA$ALT SYS: .RAD50 /...MCR/ PRT: .RAD50 /PRT.../ .ENDC ; DF AA$CPU ! AA$RSY ! AA$ALT .IF DF AA$ALT AUXLOG: .RAD50 /ALT.../ .ENDC ; DF AA$ALT .IF DF AA$MEM .IF DF AA$CPU MEMNRM: .WORD 25.,4. ; ML.DV CONVERSION BLOCK FOR REPORTING ; OF MEMORY USE. MEMUSE: .WORD 0,0 ; REPORTING BUFFER FOR MEMORY USE .ENDC ; DF AA$CPU MEMBLK: .WORD 0 ; ML.DV ARGUMENT BLOCK FOR CALCULATING... .WORD <4*K$$TPS> ; ...MEMORY USAGE (NB. OFFSET B.CORE ENTERS ; THIS ROUTINE AS TWICE THE SIZE IN 32W ; BLOCKS, HENCE FACTOR OF 4). .ENDC ; DF AA$MEM .PAGE .SBTTL TASK CHARGING ROUTINE $TSKEP:: ; ENTRY POINT ; ; LOG CPU TIME USED AS EITHER BATCH OR INTERACTIVE ; .IF DF AA$USE ! AA$BAT MOV #INTTOT+2,R1 ; ASSUME TASK WAS INTERACTIVE .IF DF AA$BAT MOV B.UCB(R5),R0 ; GET TASK'S TI: UCB ADDRESS MOV U.DCB(R0),R0 ; THEN DCB ADDRESS CMP D.NAM(R0),BATDEV ; WAS IT IN THE BATCH SYSTEM? BNE 2$ ; IF NE NO MOV #BATTOT+2,R1 ; YES 2$: ; REF. LABEL .ENDC ; DF AA$BAT ADD B.CPU+2(R5),(R1) ; UPDATE CORRECT TOTAL CPU USED FIELD ADC -(R1) ; ADD B.CPU(R5),(R1) ; .ENDC ; DF AA$USE ! AA$BAT ; ; MEMORY USAGE ACCOUNTING ; .IF DF AA$MEM MOV #MEMBLK,R4 ; SET ADDRESS OF ML.DV ARGUMENT BLOCK MOV B.CORE(R5),(R4) ; INSERT 2*CORE IN 32W BLOCKS MOV R5,-(SP) ; SAVE CONTROL BLOCK ADDRESS TSTB B.CKP(R5) ; TASK CHECKPOINTABLE ALL THE TIME? BEQ 6$ ; IF EQ YES DECB B.CKP(R5) ; CHECKPOINTABLE PART OF THE TIME? BNE 4$ ; IF NE NO, NEVER WAS CHECKPOINTABLE ADD B.CPU+2(R5),B.ELPT+2(R5) ; ADD CPU TIME TO ELAPSED TIME ADC B.ELPT(R5) ; ADD B.CPU(R5),B.ELPT(R5) ; ASR B.ELPT(R5) ; FIND THE AVERAGE ROR B.ELPT+2(R5) ; 4$: ADD #,R5 ; ADJUST R5 TO GET ELAPSED TIME FIELD 6$: ADD #B.CPU,R5 ; POINT TO RELEVANT TIME CELL CALL ML.DV ; CALCULATE MEMORY USAGE MOV (SP)+,R5 ; RESTORE CONTROL BLOCK ADDRESS MOV R1,B.ELPT(R5) ; SAVE THE RESULTS MOV R2,B.ELPT+2(R5) ; .ENDC ; DF AA$MEM ; ; PRIORITY FACTOR HANDLING ; .IF DF AA$FPR & A$$PRI MOV R5,R0 ; POINT R0 TO NUMBER OF REQUESTS ADD #B.NREQ,R0 ; MOV R5,R1 ; POINT R1 TO PRIORITY SUM ADD #B.SPRI,R1 ; CALL DP.DIV ; CALCULATE MEAN PRIORITY MOV R2,B.SPRI(R5) ; AND SAVE THE RESULT .ENDC ; DF AA$FPR & A$$PRI ; ; LOCATE USER'S UAB ; MOV B.UCB(R5),R0 ; GET TASK'S TI: UCB ADDRESS CALL $LUAB ; LOCATE USER ACCOUNTING BLOCK BCC 40$ ; IF CC GOT IT CMP B.UCB(R5),$COPT ; IS THE DEVICE CO:? BNE 20$ ; IF NE NO MOV $SYUIC,R0 ; YES, GET SYSTEM UIC MOV R0,B.UIC(R5) ; AND PUT IT IN PACKET 10$: MOV $BKBUF,R1 ; GET ADDRESS OF USER BUFFERS ADD #,R1 ; SET TO POINT TO UIC'S CALL $LUAB1 ; LOOK FOR UIC BCS 20$ ; UIC NOT LOGGED ON, USE ALT... ADD #,R1 ; GOT IT, POINT TO START OF PACKET BR 60$ ; AND LOG AS NORMAL .IF DF AA$ALT 20$: IGNORE AUXLOG,80$ ; IGNORE ALT... .IF DF AA$USE IGNORE UPD,80$ ; IGNORE UPD... .ENDC ; DF AA$USE IGNORE BYE,80$ ; IGNORE ...BYE IGNORE DMO,80$ ; IGNORE ...DMO .IF DF AA$GRP IGNORE HEL,80$ ; IGNORE ...HEL .ENDC ; DF AA$GRP .IF DF E$$DVC ! E$$NSI ! E$$PER IGNORE ERRLOG,80$ ; IGNORE ERROR LOGGER .ENDC ; DF E$$DVC ! E$$NSI ! E$$PER .IF DF T$$KMG IGNORE TKTN,80$ ; IGNORE TKTN .ENDC ; DF T$$KMG .IF DF D$$SHF IGNORE SHF,80$ ; IGNORE THE SHUFFLER .ENDC ; DF D$$SHF IGNORE PRT,80$ ; IGNORE PRT... .IF DF AA$BAT MOV B.UCB(R5),R3 ; GET UCB ADDRESS OF THIS TASK'S TI: MOV U.DCB(R3),R1 ; PUT THE DCB ADDRESS IN R1 CMP D.NAM(R1),BATDEV ; WAS TASK RUNNING AT A VIRTUAL TERMINAL? .IF DF AA$BV3 BEQ 80$ ; IF EQ YES, FORGET IT .IFF BNE 21$ ; IF NE NO, USE ALT... TSTB U.UNIT(R3) ; WAS IT SPECIFICALLY UNIT ZERO? BEQ 80$ ; IF EQ YES, FORGET IT (ONLY ...PRI ON VT0:) 21$: ; REF. LABEL .ENDC ; DF AA$BV3 .ENDC ; DF AA$BAT MOV #AUXLOG,R3 ; GET AUXILIARY LOGGING TASK NAME CALL $SRSTD ; LOOK IN THE STD FOR IT BCS 80$ ; ERROR - CAN'T LOG TASK MOV R5,R1 ; COPY PACKET ADDRESS CALL $SWSTK,90$ ; SWITCH TO SYSTEM STACK CALLR $EXRQF ;; QUEUE PACKET AND START ALT... ;; THEN RETURN TO CALLER .IFF 20$: BR 80$ ; USER NOT LOGGED ON SO FORGET IT .ENDC ; DF AA$ALT 40$: ; REF. LABEL .IF DF AA$ENA BIT #AC.DIS,L$OPT(R1) ; CHARGE REDIRECTION DISABLED? BNE 60$ ; IF NE YES, CHARGE IT RIGHT AWAY .ENDC ; DF AA$ENA .IF DF AA$GRP 50$: CMPB B.UIC+1(R5),L$UIC+1(R5) ; GROUP CODES MATCH? BEQ 60$ ; IF EQ YES .IFF 50$: CMP B.UIC(R5),L$UIC(R1) ; IS IT THE RIGHT LOGON UIC? BEQ 60$ ; IF EQ YES, LOG IT CMP B.UIC(R5),#402 ; IS IT [1,2]? BEQ 60$ ; IF EQ YES, ALLOW THIS ONE THROUGH CMP B.UIC(R5),#401 ; NO, BUT IS IT [1,1]? BEQ 60$ ; IF EQ YES, ALLOW IT THROUGH .ENDC ; DF AA$GRP MOV B.UIC(R5),R0 ; NO, SET TO SEARCH FOR UIC BR 10$ ; DO IT 60$: ; REF. LABEL .IF DF AA$CPU BIT #AC.RPT,L$OPT(R1) ; CPU REPORTING REQUIRED? BEQ 70$ ; IF EQ NO CALL CPUMSG ; YES, DO IT .ENDC ; DF AA$CPU 70$: INC L$NTSK(R1) ; UPDATE NUMBER OF TASKS RUN ADD B.CPU+2(R5),L$CPU+2(R1) ; ADD CPU TIME TO USER'S TOTAL ADC L$CPU(R1) ; ADD B.CPU(R5),L$CPU(R1) ; .IF DF AA$MEM ADD B.ELPT+2(R5),L$CORE+2(R1) ; ADD MEMORY USAGE ADC L$CORE(R1) ; ADD B.ELPT(R5),L$CORE(R1) ; .ENDC ; DF AA$MEM .IF DF AA$QIO & AA$TCQ ADD B.QIO+2(R5),L$QIO+2(R1) ; ADD I/O REQUEST COUNT TO USER'S TOTALS ADC L$QIO(R1) ; ADD B.QIO(R5),L$QIO(R1) ; .ENDC ; DF AA$QIO & AA$TCQ TST $CHGFL ; CPU CHARGING ENABLED? BNE 80$ ; IF NE NO, FORGET THIS TASK .IF DF AA$FPR MOV R1,-(SP) ; SAVE UAB ADDRESS CALL TE.FF ; CALCULATE EFFECTIVE CPU TIME (PRIO. ADJUSTED) MOV (SP)+,R4 ; RESTORE UAB ADDRESS ADD R2,L$TEFF+2(R4) ; UPDATE TOTAL FOR THIS SESSION ADC L$TEFF(R4) ; ADD R1,L$TEFF(R4) ; .IFF ADD B.CPU+2(R5),L$TEFF+2(R1) ; UPDATE CPU TIME TOTAL FOR THIS SESSION ADC L$TEFF(R1) ; ADD B.CPU(R5),L$TEFF(R1) ; .ENDC ; DF AA$FPR 80$: MOV #B.LGTH,R1 ; GET LENGTH OF PACKET TO DEALLOCATE CALLR $DEALL ; AND DO IT 90$: RETURN ; GET NEXT PACKET .PAGE .SBTTL NAME COMPARE ROUTINE .IF DF AA$ALT ! AA$CPU ! AA$RSY ! AA$SHF ;+ ; *** NAMCHK -- THIS ROUTINE CHECKS A TASK NAME SUPPLIED IN THE PACKET ; WITH THAT POINTED TO BY R2. ; ; INPUTS: ; R2 - ADDRESS OF 2 WORD BLOCK CONTAINING RADIX-50 NAME TO CHECK FOR ; R5 - ADDRESS OF DATA PACKET FROM NODE ; ; OUTPUTS: ; ALL REGISTERS ARE PRESERVED EXCEPT R2 ; CARRY SET - TASK NAMES DO NOT MATCH ; CARRY CLEAR - TASK NAMES MATCH ; ;- NAMCHK: CMP B.TNAM(R5),(R2)+ ; DO THE FIRST HALVES OF THE TASK NAMES MATCH? BNE 10$ ; IF NE NO CMP B.TNAM+2(R5),(R2) ; DO THE SECOND HALVES OF THE TASK NAMES MATCH? BNE 10$ ; IF NE NO CLC ; SET MATCH FOUND RETURN ; AND RETURN TO CALLER 10$: SEC ; SET NO MATCH FOUND RETURN ; .ENDC ; DF AA$ALT ! AA$CPU ! AA$RSY ! AA$SHF .PAGE .SBTTL REPORTING ROUTINE .IF DF AA$CPU ;+ ; *** CPUMSG - FORMAT AND SEND OUT CPU USAGE MESSAGE ; ; INPUTS: ; R1 -- ADDRESS OF ACCOUNTING SLOT ; R5 -- ADDRESS OF DATA PACKET ; ; THESE REGISTERS ARE PRESERVED. ALL OTHERS ARE CHANGED BY THE ROUTINE, ; UNLESS WE ARE REPORTING THE ...CPU COMMAND, IN WHICH CASE THERE IS ; AN IMMEDIATE RETURN ; ;- RETRN: RETURN ; CPUMSG: .IF DF AA$RSY IGNORE SYS,RETRN ; DON'T REPORT ...MCR .ENDC ; DF AA$RSY .IF DF AA$SHF IGNORE SHF,RETRN ; DON'T REPORT THE SHUFFLER .ENDC ; DF AA$SHF IGNORE PRT,RETRN ; IGNORE PRT... 10$: MOV R5,-(SP) ; SAVE R5 MOV R1,-(SP) ; AND R1 .IF DF AA$FRM GTIM$S #<$BUF+20> ; GET TIME PARAMETERS .IFTF MOV #$BUF,R0 ; GET BUFFER ADDRESS MOVB #CR,(R0)+ ; START WITH A CARRIAGE RETURN .IFT MOV #<$BUF+26>,R1 ; POINT TO TIME OF DAY MOV #AA$FRM,R2 ; SET TIME FORMAT CALL $TIM ; FORMAT THE TIME MOVB #SPA,(R0)+ ; ADD A SPACE .ENDC ; DF AA$FRM MOV B.TNAM(R5),R1 ; GET FIRST HALF OF TASK NAME CALL $C5TA ; CONVERT TO ASCII MOV B.TNAM+2(R5),R1 ; GET SECOND HALF OF TASK NAME BEQ 15$ ; IF EQ, IT WAS ALL SPACES CALL $C5TA ; CONVERT TO ASCII 15$: CMPB -(R0),#SPA ; LAST CHARACTER A SPACE? BEQ 15$ ; IF EQ YES, REMOVE IT AND LOOP INC R0 ; STEP PAST LAST CHARACTER MOVB #'(,(R0)+ ; INSERT OPENING BRACKET MOV B.EXST(R5),R1 ; GET TASK'S EXIT STATUS CALL OC.TAL ; CONVERT TO OCTAL (NO LEADING ZEROES) MOVSTR #CPUSTR ; INSERT "CPU=" TEXT MOV R5,R1 ; POINT TO BINARY CPU TIME ADD #B.CPU,R1 ; CALL FM.CPU ; FORMAT THE CPU TIME .IF DF AA$QIO & AA$TCQ MOVSTR #QIOSTR ; INSERT "I/O=" TEXT MOV R5,R1 ; POINT TO BINARY NUMBER OF QIO'S ADD #B.QIO,R1 ; CALL FM.QIO ; FORMAT THE I/O REQUEST COUNT .ENDC ; DF AA$QIO & AA$TCQ .IF DF AA$MEM MOV R5,-(SP) ; SAVE CONTROL BLOCK ADDRESS MOVSTR #MEMSTR ; INSERT "KW-SEC=" TEXT MOV R0,-(SP) ; SAVE BUFFER ADDRESS ADD #B.ELPT,R5 ; POINT TO MEMORY USE IN 64W-SEC UNITS MOV #MEMNRM,R4 ; GET ML.DV ARGUMENT BLOCK CALL ML.DV ; RENORMALISE RESULTS MOV #MEMUSE+2,R3 ; POINT TO THE RESULT BUFFER+2 MOV R2,(R3) ; SAVE THE ANSWER MOV R1,-(R3) ; MOV R3,R1 ; NOW LET R1 POINT TO THE RESULT MOV (SP)+,R0 ; RESTORE BUFFER ADDRESS CALL F2.DEC ; FORMAT WITH 2 DECIMAL PLACES MOV (SP)+,R5 ; RESTORE THE CONTROL BLOCK ADDRESS .ENDC ; DF AA$MEM .IF DF AA$DTM MOV (SP),R1 ; RESTORE PACKET POINTER CMP B.UCB(R5),L$UCB(R1) ; REQUEST FROM LOGON TERMINAL? BEQ 20$ ; IF EQ YES MOV B.UCB(R5),R3 ; NO, WE NEED THE UCB ADDRESS MOVB #SPA,(R0)+ ; PUT IN A SPACE CALL FM.DEV ; AND FORMAT THE DEVICE NAME 20$: ; REF. LABEL .ENDC ; DF AA$DTM SUB #$BUF,R0 ; CALCULATE STRING LENGTH MOV #$BUF,$QIO+Q.IOPL ; SET MESSAGE LENGTH IN DPB MOV R0,$QIO+Q.IOPL+2 ; AND MESSAGE LENGTH MOV (SP),R1 ; GET USER PACKET POINTER CALL $SWSTK,30$ ; SWITCH STACKS MOV $HEADR,R0 ;; GET OUR HEADER ADDRESS MOV L$UCB(R1),H.LUN+<*4>(R0) ;; SET LUN TO RIGHT TT: RETURN ;; 30$: CALL $PRINT ; SEND OUT THE MESSAGE CALL $ASGCO ; ASSIGN LUN BACK TO CO: 40$: MOV (SP)+,R1 ; RESTORE R1 MOV (SP)+,R5 ; RESTORE R5 .IF DF AA$QIO & AA$TCQ ADD #1,L$QIO+2(R1) ; COUNT THE QIO WE JUST DID... ADC L$QIO(R1) ; TO THIS USER'S TOTAL .ENDC ; DF AA$QIO & AA$TCQ 50$: RETURN ; .ENDC ; DF AA$CPU .END