.TITLE ACL .IDENT /V7.05/ ;******************************************************************* ; ; ACL.TSK ; ; TABULATE ACCOUNTING LIST ; SYNTAX: ; ; >ACL ; ; VERSION: V7 NOVEMBER 1981 ; ; STEVE THOMPSON ; SCHOOL OF CHEMICAL ENGINEERING ; OLIN HALL ; CORNELL UNIVERSITY ; ITHACA NY 14853 ; ; REVISION HISTORY ; ---------------- ; ; SMT814 12-APR-82 LOWER CASE MESSAGES FOR RSX-11M V4.0 ; ; SMT815 12-APR-82 MADE PRIORITY LINKING A STANDARD FEATURE ; ; SMT821 23-APR-82 CHANGED ENTRY POINT NAMES OF ACCOUNTING ; SUPPORT ROUTINES (SEE MODIFY.TXT) ; ; SMT828 27-JUL-82 REPLACED "$FMTDV" BY "FM.DEV" ; ; SMT831 18-AUG-82 ADD ONE DECIMAL PLACE TO THE "APRI" ; FIELD. ; ; SMT851 22-JUL-83 ADDED RSX-11M V4.1 SUPPORT ; ;******************************************************************* .MCALL EXIT$S,DIR$,QIOW$,GMCR$ .MCALL EXST$ ACCDF$ ; DEFINE ACCOUNTING OFFSETS BITDF$ ; DEFINE ACCOUNTING BITS MAXENT = 40. ; MAXIMUM NUMBER OF ENTRIES IN BUFFER CR=15 ; CARRIAGE RETURN LF=12 ; LINEFEED HT=11 ; HORIZONTAL TAB SPA=40 ; SPACE LUN=1 ; TI: I/O LUN EFN=1 ; EVENT FLAG FOR I/O ; ; MACROS ; .MACRO ACLDF$,L,B .ASECT .=0 A.LPRI:'L' .BLKB 1 ; LINKING PRIORITY FIELD A.CPRI:'L' .BLKB 1 ; TASK'S CURRENT PRIORITY A.TNAM:'L' .BLKW 2 ; TASK NAME IN RADIX-50 A.UCB:'L' .BLKW 1 ; UCB ADDRESS OF OWNER TASK A.LUIC:'L' .BLKW 1 ; LOGON UIC OF OWNER TASK'S TI: A.CPU:'L' .BLKW 2 ; CPU TIME .IF DF AA$QIO & AA$TCQ A.QIO:'L' .BLKW 2 ; QIO REQUEST COUNT .ENDC ; DF AA$QIO & AA$TCQ .IF DF AA$FPR .IF DF A$$PRI A.NREQ:'L' .BLKW 2 ; NUMBER OF REQUESTS A.SPRI:'L' .BLKW 2 ; PRIORITY SUM .IFF A.SPRI:'L' .BLKW 1 ; TASK PRIORITY .ENDC ; DF A$$PRI .ENDC ; DF AA$FPR A.LGTH='B'. ; CONTROL BLOCK LENGTH .PSECT .MACRO ACLDF$,X,Y .ENDM .ENDM .MACRO PRINT MSG,MSGSZ MOV MSG,DPBOUT+Q.IOPL .IF B MSGSZ MOV MSG'SZ,DPBOUT+Q.IOPL+2 .IFF MOV MSGSZ,DPBOUT+Q.IOPL+2 .ENDC DIR$ #DPBOUT .ENDM ACLDF$ ; DEFINE INTERNAL CONTROL BLOCK OFFSETS .PAGE ; ; ERROR MESSAGES ; .NLIST BEX .IIF DF AA$V40 ! AA$V41, .ENABL LC ERR1: .ASCII /ACL -- Logging task not installed/ ERR1SZ=.-ERR1 ERR2: .ASCII /ACL -- Logging task not active/ ERR2SZ=.-ERR2 ERR3: .ASCII /ACL -- Memory allocation failure/ ERR3SZ=.-ERR3 ERR4: .ASCII /ACL -- Accounting node is not active/ ERR4SZ=.-ERR4 ERR5: .ASCII /ACL -- Accounting list is empty/ ERR5SZ=.-ERR5 ; ; TEXT MESSAGES ; .ENABL LC HEAD1: .ASCII /Tsknam Term / ; TABLE HEADING, LINE #1 LUIC: .ASCII / Logon UIC/ FWLUIC=.-LUIC CPRI: .ASCII / CPRI/ FWCPRI=.-CPRI LPRI: .ASCII / LPRI/ FWLPRI=.-LPRI .IF DF AA$FPR APRI: .ASCII / APRI/ FWAPRI=.-APRI .IF DF A$$PRI CSWT: .ASCII / Context Sw/ FWCSWT=.-CSWT .ENDC ; DF A$$PRI .ENDC ; DF AA$FPR CPU: .ASCII / CPU Time/ FWCPU=.-CPU .IF DF AA$QIO & AA$TCQ QIO: .ASCII " I/O Count" FWQIO=.-QIO .ENDC ; DF AA$QIO & AA$TCQ HEAD1S=.-HEAD1 HEAD2: .ASCII /------ ---- / ; TABLE HEADING, LINE #2 .ASCII / ----- ---/ .ASCII / ----/ .ASCII / ----/ .IF DF AA$FPR .ASCII / ----/ .IF DF A$$PRI .ASCII / ------- --/ .ENDC ; DF A$$PRI .ENDC ; DF AA$FPR .ASCII / --- ----/ .IF DF AA$QIO & AA$TCQ .ASCII " --- -----" .ENDC ; DF AA$QIO & AA$TCQ HEAD2S=.-HEAD2 NODTXT: .ASCIZ /Address of accounting node is / LSTTXT: .ASCIZ /Address of accounting listhead is / POOL: .ASCIZ "Total pool use by code/list = " WORDS: .ASCIZ / words/ NONE: .ASCIZ / -none- / ; ; LOCAL DATA STORAGE ; .EVEN ACLBUF: .BLKB ; INTERNAL ACCOUNTING LIST BUFFER ; (MUST START ON WORD BOUNDARY) LOGNAM: .RAD50 /LOG.../ ; NAME OF LOGGING TASK LOGPTR: .WORD 0 ; TCB ADDRESS OF TASK LOG... PKTADR: .WORD 0 ; DSR PACKET ADDRESS NUMENT: .WORD MAXENT ; NUMBER OF ENTRIES IN LIST NADDR: .BLKW 1 ; ADDRESS OF ACCOUNTING NODE NSIZE: .BLKW 1 ; SIZE OF ACCOUNTING NODE ACLHDR: .BLKW 1 ; ACCOUNTING LIST LISTHEAD ADDRESS GMCR: GMCR$ ; GET COMMAND LINE DPB OUTBUF=GMCR+2 ; OUTPUT BUFFER .BLKB <132.-80.> ; (132 BYTES LONG) DPBOUT: QIOW$ IO.WVB,LUN,EFN,,,, ; OUTPUT DPB DPBATT: QIOW$ IO.ATT,LUN,EFN ; ATTACH TI: DPB DPBDET: QIOW$ IO.DET,LUN,EFN ; DETACH TI: DPB EXST: EXST$ EX$SUC .PAGE $ACLEP: ; XFER ADDRESS DIR$ #GMCR ; ZAP ANY COMMAND LINE THERE MAY BE ; ; VERIFY THAT LOGGING TASK IS INSTALLED AND ACTIVE ; 42$: MOV #LOGNAM,R3 ; GET NAME OF LOGGING TASK CALL $SRSTD ; LOOK FOR IT IN THE STD BCC 45$ ; OK PRINT #ERR1 ; ERROR, IT WASN'T THERE 44$: MOV #EX$SEV,EXST+E.XSTS ; SET SEVERE EXIT STATUS JMP EXIT ; THAT'S IT 45$: BIT #TS.EXE,T.STAT(R0) ; IS THE LOGGING TASK ACTIVE? BEQ 50$ ; IF EQ YES PRINT #ERR2 ; NO, ERROR BR 44$ ; EXIT WITH SEVERE ERROR 50$: MOV R0,LOGPTR ; SAVE LOG...'S TCB ADDRESS ; ; SEND REQUEST TO ACCOUNTING SYSTEM ; CLR PKTADR ; ASSUME NO DSR PACKET CALL $SWSTK,60$ ; SWITCH TO SYSTEM STACK MOV #B.NLEN,R1 ;; GET LENGTH OF BUFFER TO ALLOCATE CALL $ALOCB ;; ALLOCATE IT BCS 55$ ;; ERROR MOV R0,PKTADR ;; SAVE PACKET ADDRESS MOV #,B.MASK(R0) ;; SET COMMAND IN PACKET MOV $TKTCB,B.NTCB(R0) ;; SEND OUR TCB ADDRESS MOV R0,R1 ;; COPY BLOCK ADDRESS TO R1 MOV LOGPTR,R0 ;; GET LOG...'S TCB ADDRESS CALL $EXRQF ;; QUEUE PACKET AND START LOG... CALLR $STPCT ;; STOP US UNTIL WE GET A REPLY 55$: RETURN ;; BACK TO TASK LEVEL 60$: MOV PKTADR,R5 ; WAS THERE AN ALLOCATION ERROR? BNE 70$ ; IF NE NO PRINT #ERR3 ; YES, SAY SO MOV #EX$SEV,EXST+E.XSTS ; SET SEVERE EXIT STATUS JMP EXIT ; EXIT 70$: ; REF. LABEL ; ; COPY ESSENTIAL DATA FROM PACKET AND DEALLOCATE IT. THE VALUES WE COPY HERE ; WILL NOT CHANGE BETWEEN NOW AND WHEN WE SCAN THE ACCOUNTING LIST. ; MOV B.NSIZ(R5),NSIZE ; SAVE SIZE OF ACCOUNTING NODE MOV B.NADD(R5),NADDR ; SAVE ADDRESS OF ACCOUNTING NODE MOV B.NAHD(R5),ACLHDR ; GET ACCOUNTING LIST LISTHEAD ADDRESS CALL $SWSTK,75$ ; SWITCH STACKS MOV R5,R0 ;; GET ADDRESS OF PACKET TO DEALLOCATE MOV #B.NLEN,R1 ;; AND ITS LENGTH CALLR $DEACB ;; FREE UP THE POOL AND RETURN TO USER STATE 75$: ; REF. LABEL ; ; MAKE SURE ACCOUNTING NODE WAS ACTIVE ; TST ACLHDR ; NODE ACTIVE? (DO WE KNOW WHERE THE LIST IS?) BNE 80$ ; IF NE YES PRINT #ERR4 ; SAY NODE NOT ACTIVE MOV #EX$SEV,EXST+E.XSTS ; SET SEVERE EXIT STATUS JMP EXIT ; EXIT 80$: ; REF. LABEL ; ; BUFFER ACCOUNTING LIST IN INTERNAL BUFFER. *NOTE* THE CODE HERE ASSUMES ; SOME OF THE VALUES OF THE OFFSETS DEFINED BY ACCDF$ (IN ACCPRE.MAC) AND ; BY ACLDF$ (ABOVE). ; CALL $SWSTK,100$ ; SWITCH STACKS MOV #ACLBUF,R0 ;; SET INTERNAL BUFFER ADDRESS MOV ACLHDR,R4 ;; SET ACCOUNTING LIST HEADER ADDRESS 90$: MOV (R4),R1 ;; GET ADDRESS OF NEXT ACCOUNTING PACKET BEQ 94$ ;; IF EQ, END OF LIST MOV R1,R4 ;; SET UP TO LOOP TST (R1)+ ;; SKIP LINK WORD IN POOL MOVB (R1)+,(R0)+ ;; SAVE LINKING PRIORITY (ALWAYS PRESENT) INC R1 ;; ROUND R1 TO WORD BOUNDARY MOV (R1)+,R2 ;; GET TASK'S TCB ADDRESS MOVB T.PRI(R2),(R0)+ ;; SAVE TASK'S CURRENT PRIORITY MOV T.NAM(R2),(R0)+ ;; SAVE TASK NAME (TASK MAY EXIT) MOV T.NAM+2(R2),(R0)+ ;; MOV (R1)+,(R0)+ ;; SAVE TI: UCB ADDRESS MOV (R1)+,(R0)+ ;; SAVE LOGON UIC .IF DF AA$MEM CMP (R1)+,(R1)+ ;; SKIP ELAPSED TIME (NOT YET FILLED IN) TST (R1)+ ;; SKIP CORE SIZE .ENDC ; DF AA$MEM CMP (R1)+,(R1)+ ;; SKIP START TIME MOV (R1)+,(R0)+ ;; SAVE CPU TIME MOV (R1)+,(R0)+ ;; .IF DF AA$QIO & AA$TCQ MOV (R1)+,(R0)+ ;; SAVE I/O COUNT MOV (R1)+,(R0)+ ;; .ENDC ; DF A$QIO & AA$TCQ .IF DF AA$FPR .IF DF A$$PRI MOV (R1)+,(R0)+ ;; SAVE NUMBER OF REQUESTS MOV (R1)+,(R0)+ ;; MOV (R1)+,(R0)+ ;; SAVE PRIORITY SUM MOV (R1)+,(R0)+ ;; .IFF MOV (R1)+,(R0)+ ;; SAVE TASK PRIORITY .ENDC ; DF A$$PRI .ENDC ; DF AA$FPR DEC NUMENT ;; CAN WE TAKE ANY MORE ENTRIES? BGT 90$ ;; IF GT YES, LOOP 94$: RETURN ;; NO, RETURN TO USER STATE 100$: TST NUMENT ; ANYTHING IN LIST? BNE 105$ ; IF NE YES PRINT #ERR5 ; ERROR, WE SHOULD BE IN THE LIST! MOV #EX$ERR,EXST+E.XSTS ; SET ERROR EXIT STATUS JMP EXIT ; AND EXIT 105$: NEG NUMENT ; CALCULATE NUMBER OF ENTRIES IN BUFFER ADD #MAXENT,NUMENT ; ; ; PRINT COMMENTARY ON SIZE AND LOCATION OF ACCOUNTING CODE ; DIR$ #DPBATT ; ATTACH TI: MOV #OUTBUF,R0 ; GET ADDRESS OF OUTPUT BUFFER MOVSTR #NODTXT ; INSERT "ADDRESS OF NODE" TEXT MOV NADDR,R1 ; GET ADDRESS OF NODE MOV SP,R2 ; SET TO INCLUDE LEADING ZEROES CALL $CBOMG ; FORMAT AS ASCII OCTAL SUB #OUTBUF,R0 ; CALCULATE MESSAGE LENGTH PRINT #OUTBUF,R0 ; AND WRITE IT TO TI: MOV #OUTBUF,R0 ; GET ADDRESS OF OUTPUT BUFFER MOVSTR #LSTTXT ; REPEAT ABOVE FOR LISTHEAD ADDRESS MOV ACLHDR,R1 ; MOV SP,R2 ; CALL $CBOMG ; SUB #OUTBUF,R0 ; PRINT #OUTBUF,R0 ; MOV #OUTBUF,R0 ; GET OUTPUT BUFFER ADDRESS MOVSTR #POOL ; INSERT "TOTAL POOL USE" TEXT MOV NSIZE,R1 ; GET SIZE OF ACCOUNTING CODE ADD #3,R1 ; ROUND UP TO NEXT TWO-WORD BOUNDARY BIC #3,R1 ; ASR R1 ; CONVERT TO WORDS CALL DE.CML ; FORMAT AS ASCII DECIMAL MOVB #'/,(R0)+ ; INSERT A SLASH MOV R0,-(SP) ; SAVE BUFFER POINTER MOV NUMENT,R0 ; GET # ENTRIES IN ACCOUNTING LIST MOV #B.LGTH,R1 ; AND LENGTH OF EACH ONE ADD #3,R1 ; (ROUNDED UP TO NEXT TWO-WORD BOUNDARY) BIC #3,R1 ; CALL $MUL ; CALCULATE POOL USED BY ACCOUNTING LIST ASR R1 ; CONVERT TO WORDS MOV (SP)+,R0 ; RESTORE BUFFER POINTER CALL DE.CML ; FORMAT LIST SIZE AS ASCII DECIMAL MOVSTR #WORDS ; FINISH MESSAGE SUB #OUTBUF,R0 ; CALCULATE MESSAGE LENGTH PRINT #OUTBUF,R0 ; AND WRITE IT TO TI: ; ; FORMAT AND PRINT INTERNAL VERSION OF LIST ; PRINT #HEAD1,#HEAD1S ; PRINT TABLE HEADING PRINT #HEAD2,#HEAD2S ; AND UNDERLINE IT MOV #ACLBUF,R5 ; SET ADDRESS OF FIRST ENTRY 110$: MOV R5,-(SP) ; SAVE INTERNAL BUFFER POINTER MOV #OUTBUF,R0 ; GET OUTPUT BUFFER ADDRESS MOV A.TNAM(R5),R1 ; CONVERT TASK NAME TO ASCII CALL $C5TA ; MOV A.TNAM+2(R5),R1 ; 2ND HALF CALL $C5TA ; MOVB #SPA,(R0) ; INSERT 2 SPACES MOVB (R0)+,(R0)+ ; MOV A.UCB(R5),R3 ; GET TI: DEVICE UCB ADDRESS CALL FM.DEV ; AND FORMAT DEVICE NAME MOVB #SPA,(R0) ; INSERT AT LEAST TWO SPACES TO BLANK OUT MOVB (R0)+,(R0) ; REST OF DEVICE NAME FIELD MOV #,R0 ; RESET PROPER BUFFER POSITION CMP A.UCB(R5),$COPT ; IS TI: OF TASK CO:? BNE 112$ ; IF NE NO 111$: MOVSTR #NONE ; YES, CO: IS NOT LOGGED IN BR 115$ ; 112$: MOV A.LUIC(R5),R1 ; GET TASK'S TI: LOGON UIC MOV #FWLUIC,R2 ; SET FIELD WIDTH MOV #FMTUIC,R3 ; SET ADDRESS OF CONVERSION ROUTINE CALL FM.FFW ; FORMAT LOGON UIC 115$: MOVB A.CPRI(R5),R1 ; GET TASK'S CURRENT PRIORITY BIC #177400,R1 ; ZAP ANY RUBBISH MOV #FWCPRI,R2 ; SET FIELD WIDTH MOV #DE.CML,R3 ; SET ADDRESS OF CONVERSION ROUTINE CALL FM.FFW ; FORMAT TASK'S CURRENT PRIORITY MOVB A.LPRI(R5),R1 ; GET TASK'S LINKING PRIORITY BIC #177400,R1 ; ZAP ANY RUBBISH MOV #FWLPRI,R2 ; SET FIELD WIDTH MOV #DE.CML,R3 ; SET ADDRESS OF CONVERSION ROUTINE CALL FM.FFW ; FORMAT TASK'S LINKING PRIORITY .IF DF AA$FPR .IF DF A$$PRI MOV R0,-(SP) ; SAVE BUFFER POINTER MOV #10.,R0 ; SET TO MULTIPLY PRIORITY SUM BY 10. MOV A.SPRI(R5),R2 ; LOAD PRIORITY SUM FOR $DMUL MOV A.SPRI+2(R5),R3 ; CALL $DMUL ; MULTIPLY BY 10. MOV R0,A.SPRI(R5) ; REPLACE ORIGINAL BY 10 TIMES IT MOV R1,A.SPRI+2(R5) ; MOV R5,R0 ; POINT R0 TO REQUEST COUNT ADD #A.NREQ,R0 ; MOV R5,R1 ; POINT R1 TO PRIORITY SUM ADD #A.SPRI,R1 ; CALL DP.DIV ; CALCULATE AVERAGE PRIORITY MOV R2,R1 ; TRANSFER RESULT TO R1 MOV (SP)+,R0 ; RESTORE BUFFER POSITION .IFF MOVB A.SPRI(R5),R1 ; GET TASK'S AVERAGE PRIORITY ASL R1 ; MULTIPLY BY 10. MOV R1,-(SP) ; ASL R1 ; ASL R1 ; ADD (SP)+,R1 ; .ENDC ; DF A$$PRI MOV #FWAPRI,R2 ; SET FIELD WIDTH MOV #APRIO,R3 ; SET ADDRESS OF CONVERSION ROUTINE CALL FM.FFW ; FORMAT TASK'S CURRENT PRIORITY .ENDC ; DF AA$FPR .IF DF AA$FPR & A$$PRI MOV R5,R1 ; POINT TO NUMBER OF REQUESTS ADD #A.NREQ,R1 ; MOV #FWCSWT,R2 ; SET FIELD WIDTH MOV #FM.QIO,R3 ; SET ADDRESS OF CONVERSION ROUTINE CALL FM.FFW ; FORMAT REQUEST COUNT .ENDC ; DF AA$FPR & A$$PRI MOV R5,R1 ; POINT TO CPU TIME ADD #A.CPU,R1 ; MOV #FWCPU,R2 ; SET FIELD WIDTH MOV #FM.CPU,R3 ; SET ADDRESS OF CONVERSION ROUTINE CALL FM.FFW ; FORMAT CPU TIME .IF DF AA$QIO & AA$TCQ MOV R5,R1 ; POINT TO I/O COUNT ADD #A.QIO,R1 ; MOV #FWQIO,R2 ; SET FIELD WIDTH MOV #FM.QIO,R3 ; SET ADDRESS OF CONVERSION ROUTINE CALL FM.FFW ; FORMAT I/O COUNT .ENDC ; DF AA$QIO & AA$TCQ SUB #OUTBUF,R0 ; CALCULATE MESSAGE LENGTH PRINT #OUTBUF,R0 ; AND PRINT THIS LINE MOV (SP)+,R5 ; RESTORE BUFFER POINTER ADD #A.LGTH,R5 ; POINT TO NEXT AREA IN BUFFER DEC NUMENT ; ANY ENTRIES LEFT? BEQ 199$ ; IF EQ NO, EXIT JMP 110$ ; ELSE LOOP 199$: DIR$ #DPBDET ; DETACH TI: EXIT: DIR$ #EXST ; EXIT WITH CORRECT STATUS EXIT$S ; JUST IN CASE ;+ ; *** APRIO CALLED BY FM.FFW TO FORMAT AVERAGE PRIORITY ; ; INPUTS: ; R0 BUFFER POINTER ; R1 AVERAGE PRIORITY * 10. ; ; OUTPUTS: ; R0 UPDATED ; R1,R2 USED ; ;- .IF DF AA$FPR APRIO: CALL DE.CML ; FORMAT AS ASCII DECIMAL MOVB -(R0),1(R0) ; MOVE OVER THE LAST DIGIT MOVB #'.,(R0)+ ; INSERT A DECIMAL POINT INC R0 ; STEP PAST LAST DIGIT RETURN ; AND RETURN TO FM.FFW .ENDC ; DF AA$FPR ;+ ; *** FMTUIC CALLED BY FM.FFW TO FORMAT LOGON UIC ; ; INPUTS: ; R0 BUFFER POINTER ; R1 BINARY LOGON UIC ; ; OUTPUTS: ; R0 UPDATED ; R1,R2 USED ; OTHER REGISTERS PRESERVED ;- FMTUIC: MOVB #'[,(R0)+ ; PUT IN LEADING SEPARATOR MOV R1,-(SP) ; SAVE UIC CLRB R1 ; ZERO OUT MEMBER CODE SWAB R1 ; PUT GROUP CODE WHERE WE NEED IT CALL OC.TAL ; CONVERT TO OCTAL MOVB #',,(R0)+ ; INSERT A COMMA MOV (SP)+,R1 ; RESTORE UIC BIC #177400,R1 ; CLEAR OUT THE GROUP CODE CALL OC.TAL ; CONVERT TO OCTAL MOVB #'],(R0)+ ; PUT IN TRAILING SEPARATOR RETURN ; AND BACK TO CALLER .END $ACLEP