From 9ed7bf30350706edc9399ba823bf4e68a2a4b623 Mon Sep 17 00:00:00 2001 From: Eric Swenson Date: Sat, 3 Dec 2016 16:18:31 -0800 Subject: [PATCH] - Added support for METER - Also fixed build script after initializing COMSAT (KLH10 only) to kill COMSAT job. --- README.md | 1 + build/build.tcl | 4 + build/klh10/build.tcl | 1 + doc/_info_/meter.info | 89 ++++++ doc/info/meter.1 | 92 ++++++ src/syseng/meter.18 | 709 ++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 896 insertions(+) create mode 100644 doc/_info_/meter.info create mode 100644 doc/info/meter.1 create mode 100644 src/syseng/meter.18 diff --git a/README.md b/README.md index ee148480..0bf08cc2 100644 --- a/README.md +++ b/README.md @@ -111,6 +111,7 @@ from scratch. - REATTA, reattaches disowned jobs to terminal - TIMOON, displays the time and phase of the moon - SYSMSG, displays system messages + - METER, displays system metering information 6. A brand new host table is built from the host table source and installed into SYSBIN; HOSTS3 > using H3MAKE. diff --git a/build/build.tcl b/build/build.tcl index 55e93d76..4eb29fa2 100644 --- a/build/build.tcl +++ b/build/build.tcl @@ -644,6 +644,10 @@ expect ":KILL" respond "*" ":midas sys1;ts sysmsg_sysen1;sysmsg\r" expect ":KILL" +# meter +respond "*" ":midas sys1;ts meter_syseng;meter\r" +expect ":KILL" + # ndskdmp tape respond "*" ":link kshack;good ram,.;ram ram\r" diff --git a/build/klh10/build.tcl b/build/klh10/build.tcl index 91c39de9..a2ab6fd9 100644 --- a/build/klh10/build.tcl +++ b/build/klh10/build.tcl @@ -48,6 +48,7 @@ proc initialize_comsat {} { respond "*" ":load .mail.;comsat launch\r" respond "*" "debug/-1\r" type "mfinit\033g" + respond "*" ":kill\r" } source ../build.tcl diff --git a/doc/_info_/meter.info b/doc/_info_/meter.info new file mode 100644 index 00000000..150b72dc --- /dev/null +++ b/doc/_info_/meter.info @@ -0,0 +1,89 @@ +METER is a program to display a variety of system statistics. +It differs from PEEK in that it shows only system-wide +information, not per-job. It also gives a lot of statistics +that PEEK won't. + +On a display terminal (%TOERS and %TOMVU) METER will periodically +update its display, changing only those numbers that have +accidentally changed. On other terminals, it just types the +whole thing out over and over again. + +METER does not take any options. It stops when you hit space. +If it is invoked by :METERD it will display on the 340. + +If it is invoked by :SMETER, it will repeat slower. + +The first display shows figures which for the most part are averages +over the whole time that the system has been up. After that, all +figures are averaged over the last 15 seconds or so. + +The statistics displayed are explained below. All times are in seconds. +All numbers are [of course] decimal. "ATB" means average time between. + +% User Time - fraction of CPU time given to users. + +% Idle - fraction of CPU time not used. + +% Overhead - fraction of CPU time spent on system overhead - page + fault handling, TTY and Disk I/O, scheduling, etc. + +# Processes - the total number of processes (jobs, procedures) + on the system. + +% active last 15 seconds - fraction of processes which ran at least + for a moment sometime within the last 15 seconds. + +% Processes running - fraction of processes currently running + user programs. + +% Exec run - fraction of processes currently running in the system. + +% Blocked - fraction of processes currently waiting for something, + such as type in, a page to be swapped in, etc. + +% Stopped - fraction of processes currently unrunnable - usually + this is due to ^Z, er, ah, CALL. Swap-blocked processes + are also counted here. + +Disk ATB read - average time between disk reads for file accesses. + + write - average time between disk writes for file accesses. + + PgIn - average time between disk reads for swapping in pages. + + PgOut - average time between disk writes for swapping out pages. + +TTY ch/s in - characters per second input from TTY's. + +TTY ch/s out - characters per second output to TTY's. This does not + include TV's, and does not count cursor motion accurately. + Since ITS does not keep this meter, the METER program + estimates it by looking at the teletype buffers frequently. + +ATB Sched - average time between reschedulings. + +ATB PCLSR - average time between attempts to force a process into + user mode so it can be stopped or take an interrupt. + There may be several attempts for each successful + PCLSR. + +ATB swap out - average time between attempts to swap out a process. + +ATB page faults - average time between page faults. + + % in - fraction of page faults on pages already in core. + + % coming - fraction of page faults on pages already coming into + core due to a previous page fault. + + % out - fraction of page faults on pages not in core. These + are the "real" page faults. + + % going - fraction of page faults on pages on their way out of + core. The page will have to come right back in. + + The above four numbers usually don't add up to 100%. + The rest of the page faults are those which occurred + while a page-control lock was locked, and therefore + had to be taken over again after a delay. + \ No newline at end of file diff --git a/doc/info/meter.1 b/doc/info/meter.1 new file mode 100644 index 00000000..ed33e49a --- /dev/null +++ b/doc/info/meter.1 @@ -0,0 +1,92 @@ +-*-Text-*- + +File: METER Node: Top Up: (DIR) + +METER is a program to display a variety of system statistics. +It differs from PEEK in that it shows only system-wide +information, not per-job. It also gives a lot of statistics +that PEEK won't. + +On a display terminal (%TOERS and %TOMVU) METER will periodically +update its display, changing only those numbers that have +accidentally changed. On other terminals, it just types the +whole thing out over and over again. + +METER does not take any options. It stops when you hit space. +If it is invoked by :METERD it will display on the 340. + +If it is invoked by :SMETER, it will repeat slower. + +The first display shows figures which for the most part are averages +over the whole time that the system has been up. After that, all +figures are averaged over the last 15 seconds or so. + +The statistics displayed are explained below. All times are in seconds. +All numbers are [of course] decimal. "ATB" means average time between. + +% User Time - fraction of CPU time given to users. + +% Idle - fraction of CPU time not used. + +% Overhead - fraction of CPU time spent on system overhead - page + fault handling, TTY and Disk I/O, scheduling, etc. + +# Processes - the total number of processes (jobs, procedures) + on the system. + +% active last 15 seconds - fraction of processes which ran at least + for a moment sometime within the last 15 seconds. + +% Processes running - fraction of processes currently running + user programs. + +% Exec run - fraction of processes currently running in the system. + +% Blocked - fraction of processes currently waiting for something, + such as type in, a page to be swapped in, etc. + +% Stopped - fraction of processes currently unrunnable - usually + this is due to ^Z, er, ah, CALL. Swap-blocked processes + are also counted here. + +Disk ATB read - average time between disk reads for file accesses. + + write - average time between disk writes for file accesses. + + PgIn - average time between disk reads for swapping in pages. + + PgOut - average time between disk writes for swapping out pages. + +TTY ch/s in - characters per second input from TTY's. + +TTY ch/s out - characters per second output to TTY's. This does not + include TV's, and does not count cursor motion accurately. + Since ITS does not keep this meter, the METER program + estimates it by looking at the teletype buffers frequently. + +ATB Sched - average time between reschedulings. + +ATB PCLSR - average time between attempts to force a process into + user mode so it can be stopped or take an interrupt. + There may be several attempts for each successful + PCLSR. + +ATB swap out - average time between attempts to swap out a process. + +ATB page faults - average time between page faults. + + % in - fraction of page faults on pages already in core. + + % coming - fraction of page faults on pages already coming into + core due to a previous page fault. + + % out - fraction of page faults on pages not in core. These + are the "real" page faults. + + % going - fraction of page faults on pages on their way out of + core. The page will have to come right back in. + + The above four numbers usually don't add up to 100%. + The rest of the page faults are those which occurred + while a page-control lock was locked, and therefore + had to be taken over again after a delay. diff --git a/src/syseng/meter.18 b/src/syseng/meter.18 new file mode 100644 index 00000000..2d341c8b --- /dev/null +++ b/src/syseng/meter.18 @@ -0,0 +1,709 @@ +; -*-MIDAS-*- + TITLE METER - ITS SYSTEM METERING - DAM OCT. 19, 1974 + +.INSRT SYSENG;CALRET > + +TTYIF==1 ;CHAR TYPED INTERRUPT +BSCLK==10000 ;SLOW-CLOCK INTERRUPT (1/2 SEC) +OPTINT==4000 ;NEW STYLE INTERRUPTS + +;;; DEFINE MACROS SO THAT SYSTEM VARIABLES ACCESSED +;;; THROUGH ABS PAGES CAN BE REFERENCED IN A NATURAL WAY + +DEFINE CONC A,B +A!B!TERMIN + +DEFINE ABSREF SYMS +DEFINE ABSTAB +IRPW SYM,,[SYMS] +IFSE [SYM]----, IMMEDS: ;FROM HERE DOWN ARE NOT ADDRESSES +.ELSE [ SQUOZE 0,SYM + CONC ABSRF",\.IRPCNT,ABS + CONC [EXPUNGE ABSRF"]\.IRPCNT,ABS +] +TERMIN +TERMIN +IRPW SYM,,[SYMS] +IFSN [SYM]----, ABSRF. SYM,\.IRPCNT +TERMIN +TERMIN + +DEFINE ABSRF. SYM,CT +ABSRF"!CT!ABS==0 +IF1,[DEFINE SYM ?MOD +(MOD)[.,,ABSRF"!CT!ABS]TERMIN +] +IF2,[DEFINE SYM ?MOD +(MOD)TERMIN +] +TERMIN + +.BEGIN ABSRF ;PLACE TO KEEP NNNABS SYMBOLS +.END + +DEFINE INFORM A,B,C,D,E +PRINTX/A B C D E +/ +TERMIN + +;;; FORMAT OF DISPLAY + +FORMAT: ASCIZ\###% User Time,###% Idle,###% Overhead,###% Lost +### Processes,###% active last 15 seconds +###% Processes running,###% Exec run,###% Blocked,###% Stopped +ATB disk i/o ##.###: read ##.###, write ##.###, PgIn ##.###, PgOut ##.### +TTY #### ch/s in, #### ch/s out (estimated) +ATB Sched ##.###, ATB PCLSR ##.###, ATB swap out ##.### +ATB page faults ##.###:###% in,###% coming,###% out,###% going +\ + +ABSREF [TIME ;TIME COUNTER, 30'THS OF A SECOND + NULTM1 ;USECS USED BY NULL JOB + NULTM3 ;SECONDS PART OF THAT + USRTM1 ;USECS USED BY USERS OVER 4 + USRTIM ;SECONDS PART OF THAT + LOSTM1 ;4USECS LOST + LOSTIM ;SECONDS OF LOST TIME (ALL OTHERWISE RUNNABLE JOBS WAITING FOR PAGES) + NWXFR ;NUMBER OF NON-SWAP DISK WRITES + NRXFR ;NUMBER OF NON-SWAP DISK READS + NSWXFR ;NUMBER OF SWAP DISK WRITES + NSRXFR ;NUMBER OF SWAP DISK READS + NSKED ;NUMBER OF TIMES INTO SCHEDULER + NPCLSR ;NUMBER OF ATTEMPTS TO PCLSR + NSOUSR ;NUMBER OF ATTEMPTS TO SWAP OUT A USER + NSOPGS ;NUMBER OF SEARCHES FOR A PAGE TO SW OUT + NPGFLT ;NUMBER OF PAGE FAULTS + NRPI ;.. PAGE ALREADY IN + NRPCI ;.. PAGE COMING IN + NRPO ;.. PAGE OUT + NRPGO ;.. PAGE GOING OUT + TIIP ;TYI BUF IN PTR + TOOP ;TYO BUF OUT PTR + TOIP + USRHI ;HIGHEST LOC OF USER VARS + UPC ;010000,, IS USER MODE BIT + USTP ;USER STOP WORD + FLSINS ;USER BLOCK WORD + UNAME ;0 MEANS IDLE SET OF VARS + LUBTM ;TIME USER LAST UNBLOCKED +---- + TIBS ;TYI BYTES/BUFFER + TOBS ;TYO BYTES/BUFFER + LUBLK ;(CONST) LENGTH OF USER BLOCK +] + +%TOOVR==1000 ;TTY OVERSTRIKE CAPABILITY +%TOERS==40000 ;TTY SELECTIVE ERASE CAPABILITY +%TOMVU==400 ;TTY RANDOM MOTION CAPABILITY + ;;; DATA AREAS + +OTIME: 0 ;TIME PREVIOUSLY WOKE UP +OUSRTM: 0 ;OLD VALUE OF USRTM1 (WELL,... +ONULTM: 0 ;OLD VALUE OF NULTM1 SEE THE CODE +OLOSTM: 0 ;OLD VALUE OF LOSTM1 ...) +ONWXFR: 0 ;.. NWXFR +ONRXFR: 0 ;.. NRXFR +ONSWXF: 0 ;.. NSWXFR +ONSRXF: 0 ;.. NSRXFR +OXFR: 0 ;.. NXFR (WELL, NOT REALLY) +OTOOP: BLOCK 100 ;OLD TOOP VALUES FOR TTYS +TOCT: 0 ;COUNT OF CHARS OUTPUT ON TTYS +OTOCT: 0 ;OLD VALUE OF TOCT +OTIIP: BLOCK 100 ;OLD TIIP VALUE FOR TTYS +TICT: 0 ;COUNT OF CHARS INPUT ON TTYS +OTICT: 0 ;OLD VALUE OF .. +ONSKED: 0 ;OLD VALUE OF NSKED +ONPCLSR:0 ;.. NPCLSR +ONSOUSR:0 ;.. NSOUSR +ONPGFLT:0 ;.. NPGFLT +ONRPI: 0 ;.. NRPI +ONRPCI: 0 ;.. NRPCI +ONRPO: 0 ;.. NRPO +ONRPGO: 0 ;.. NRPGO + + +TTYOPT: 0 ;TTYOPT WORD GETS PUT HERE + +MEMHOL: ASCIZ\WARNING: THERE IS A HOLE IN LOW MEMORY +\ + +NO340: ASCIZ\CAN'T GET 340 +\ + +BLETCH: ASCIZ\ +WRONG SYSTEM VERSION - REPURIFY +\ + +TYIC==2 ;TTY INPUT CHANNEL +TYOC==1 ;TTY OUTPUT CHANNEL +TYO=<.IOT TYOC,> ;INSTRUCTION TO OUTPUT A CHAR + ;;; ROUTINE TO OUTPUT A NUMBER IN FORMAT (CALL IN SAME ORDER +;;; AS THEY APPEAR IN STRING ABOVE) + +PUTNUM: PROCEDURE N + + REGISTER W,W1,TTOPT,CH,NOSUP + REGISTER NDIGS ;NUMBER OF DIGITS + REGISTER NZDIGS ;.. NON ZERO SUPPRESSED + + MOVE TTOPT, TTYOPT + +; SCAN DOWN TO NEXT FIELD + + MOVEI W, 7 ;LEFT MARGIN CONST MINUS 1 +NXTFLD: ILDB CH, FORMPT + JUMPE CH, [.VALUE] ;TOO MANY NUMBERS FOR FORMAT + CAIN CH, "# + JRST GOTFLD ;NUMBER SIGN BEGINS FIELD + TLNN TTOPT, %TOERS + TYO CH + CAIN CH, 15 + MOVEM W, HPOS ;CARRIAGE RETURN + CAIN CH, 12 + AOSA VPOS ;LINE FEED + AOS HPOS ;PRINTING CH - INCR HPOS + JRST NXTFLD + +; GOT BEGINNING OF FIELD, NOW ANALYZE IT --> NDIGS, NZDIGS + +GOTFLD: IF [TLNN TTOPT,%TOERS][ + TYO [^P] ;SET POSITION + TYO ["V] + TYO VPOS + TYO [^P] + TYO ["H] + TYO HPOS + ] + SETZB NDIGS, NZDIGS +GOTFL0: CAIN CH, ". ;PERIOD STOPS ZERO SUPPRESS + SOJA NDIGS, GOTFL1 + CAIE CH, "# ;NUMBER INDICATES A DIGIT + JRST GOTFLX + SKIPE NZDIGS ;IF THIS NOT ZERO SUPPRESSED +GOTFL1: ADDI NZDIGS, 1 ; THEN COUNT NZSUP DIGS + AOS HPOS + MOVE W1, FORMPT + ILDB CH, FORMPT ;CHECK NEXT CHAR + AOJA NDIGS, GOTFL0 + +GOTFLX: MOVEM W1, FORMPT ;DON'T COUNT TERMINATING CHAR + SKIPN NZDIGS ;ENSURE AT LEAST 1 DIGIT + MOVEI NZDIGS, 1 + SETZM NOSUP ;flag turned on after first nonzero digit + +; NOW DO NUMBER CONVERSION (UNLESS SAME AS BEFORE) + + MOVE W, N + AOS NUMPT + IF [TLNE TTOPT,%TOERS ;SUPPRESS IF NUMBER SAME & DISPLAY + CAME W, @NUMPT][ + RETURN ;SAME AS BEFORE + ] + MOVEM W, @NUMPT + +NUMLP: IDIV W, TENPOW(NDIGS) ;GET A DIGIT IN W, REM IN W1 + JUMPN NOSUP, .+5 + JUMPN W, .+3 ;SEE IF SHOULD BLANK OUT + CAMLE NDIGS, NZDIGS ;.. + SKIPA W, [-20] ;YES + SETOM NOSUP ;have digit don't blank zeroes any more + ADDI W, "0 ;MAKE ASCII CHAR + IF [ TLNE TTOPT, %TOERS + TLNN TTOPT, %TOOVR ][;IF NECESSARY, ERASE PREV CHAR + TYO [^P] + TYO ["K] + ] + TYO W + IF [CAIE NDIGS,1 ;IF NECESSARY, SKIP OVER PERIOD + CAME NDIGS, NZDIGS][ + IF [ TLNE TTOPT, %TOERS + TLNN TTOPT, %TOOVR ][ + TYO [^P] + TYO ["F] ] + ELSE [ TYO [".] ] + ] + MOVE W, W1 ;PICK UP REMAINDER + SOJG NDIGS, NUMLP ;DO ANOTHER DIGIT + +PTNMXX: RETURN + +HPOS: 0 ;HORIZONTAL POSITION +VPOS: 0 ;VERTICAL POSITION +FORMPT: 0 ;B.P. TO FORMAT STRING +NUMPT: 0 ;PTR TO NUMBUF +NUMBUF: REPEAT 30., -1 ;USED TO AVOID REDISPLAYING IF UNCHANGED + +TENPOW: -1 ? 1 ? 10. ? 100. ? 1000. ? 10000. ? 100000. + 1000000. ? 10000000. ? 100000000. + + +;;; ENTRY PUTNUM"RESET GETS SET FOR ANOTHER SET OF FIGURES + +RESET: ENTRY + + MOVE TT, [440700,,FORMAT] ;INIT VARS + MOVEM TT, FORMPT + MOVEI TT, 10 ;TOP OF PAGE LOGICALLY + MOVEM TT, HPOS + MOVEM TT, VPOS + IF [SKIPE TT, TTYOPT][ + TYO [^L]] ;340 + ELSE [ TYO [^P] ;AND PHYSICALLY + IF [TLNN TT, %TOERS][ + TYO ["T]] ;OVER WRITE + ELSE [ TYO ["C] ] ;NEW THING ENTIRELY + ] + MOVEI TT, NUMBUF-1 ;INIT NUMPT + MOVEM TT, NUMPT + RETURN + +;;; PUTNUM"FINISH FINISHES IT OFF + +FINISH: ENTRY + + MOVE TT, TTYOPT + TLNE TT, %TOERS ;PRINTING TTY'S ONLY + RETURN +FINIS0: ILDB CH, FORMPT + JUMPE CH, .RETN. + TYO CH + JRST FINIS0 + +.END + ;;; Routine to meter TTYs, called frequently + +CHKTTY: PROCEDURE + + REGISTER I ;TTY NUMBER + REGISTER A,B,FROB,C ;TEMPS + + MOVEI I, TOOP ;COMPUTE # TTYS + SUBI I, TOIP ;.. +NEXTTY: SOJLE I, LASTTY ;JUMP IF NO MORE TTYS + + ; COUNT CHARACTERS OUTPUT + + MOVE A, TOOP(I) + LDB B, [360600,,A] ;POS FIELD + SUBI B, 44 + LDB C, [300600,,A] ;SIZE FIELD + IDIV B, C ;B := - NUM OF CHARS (BITS) + MOVE C, CHPRWD(C) ; CONVERT CHAR SIZE TO CHARS PER WORD + IMULI C, (A) ;C := NUM OF CHARS (WORDS) + SUB C, B ;C := NUM OF CHARS + MOVE A, C + EXCH C, OTOOP(I) ;COMPARE AGAINST OLD READING + SUB A, C ;TAKE DIFFERENCE + SKIPGE A ;SKIP IF NO BUFFER WRAP AROUND + ADDI A, TOBS ;WRAP AROUND ADD BUFFER SIZE + ADDM A, TOCT ;ACCUM TOTAL CHARS OUTPUT + + ;COUNT CHARACTERS INPUT + + MOVE A, TIIP(I) + LDB B, [360600,,A] ;POS FIELD + SUBI B, 44 + LDB C, [300600,,A] ;SIZE FIELD + IDIV B, C ;B := - NUM OF CHARS (BITS) + MOVE C, CHPRWD(C) ; CONVERT CHAR SIZE TO CHARS PER WORD + IMULI C, (A) ;C := NUM OF CHARS (WORDS) + SUB C, B ;C := NUM OF CHARS + MOVE A, C + EXCH C, OTIIP(I) ;COMPARE AGAINST OLD READING + SUB A, C ;TAKE DIFFERENCE + SKIPGE A ;SKIP IF NO BUFFER WRAP AROUND + ADDI A, TIBS ;WRAP AROUND ADD BUFFER SIZE + ADDM A, TICT ;ACCUM TOTAL CHARS OUTPUT + + JRST NEXTTY ;GO DO ANOTHER TTY + +LASTTY: RETURN + +CHPRWD: 36. ;CHARS PER WORD, INDEXED BY CHAR SIZE + REPEAT 35., 36./<1+.RPCNT> + + .END + ;;; MAIN PROGRAM + +PROGRAM METER + + REGISTER A,B,C,MS + + .SUSET [.RJNAME,,A] ;SEE IF SHOULD USE 340 + SETZM DIXONSLOSS + IF [ CAME A,['SMETER] ][ SETOM DIXONSLOSS ] + IF [ CAME A,['METERD] ][ ;YES, SET UP + .OPEN TYOC, [.UAO,,'DIS] + JRST [ CALL TYPE,NO340 + JRST KILL + ] + SETZM TTYOPT ;ABSOLUTELY NO FEATURES + .VALUE [ASCIZ/:PROCED /] + ] + ELSE [ ;NORMALLY USE TTY + .OPEN TYIC, [.UAI,,'TTY] ;JUST SO CAN GET INTERRUPTS + .VALUE + .OPEN TYOC, [20+.UAO,,'TTY] + .VALUE + .CALL CNSGET,[#TYOC][A,A,A,A,TTYOPT] + .VALUE + ] + + CALL RITUAL ;ASSURANCE OF PURITY + + MOVE A, [-11.,,INTLST] ;set up interrupts + MOVEM A, 42 + .SUSET [.ROPTION,,A] + TLO A, OPTINT + .SUSET [.SOPTION,,A] + .SUSET [.SMASK,,[TTYIF+BSCLK]] + + IF [SKIPE TTYOPT][TYO [^L]] + ELSE [ TYO [^P] ;DISPLAY FIXED STUFF + TYO ["C] + ] + MOVE TT, TTYOPT + IF [ TLNN TT, %TOERS ][ CALL TYPE,FORMAT ] + +; MACRO TO PICK UP A VAR, UPDATE OLD COPY, PUT DIFFERENCE IN T + +DEFINE DERIV REG,VAR + MOVE REG, VAR + MOVE TT, REG + EXCH TT, O!VAR + SUB REG, TT +TERMIN + +; MACRO TO CONVERT NUMBER IN REG TO % OF VAR, LEAVE IN REG + +DEFINE PERCENT REG,VAR + IMULI REG, 100. + IDIV REG, VAR +TERMIN + + +;;; MAIN DISPLAY LOOP + + LOCAL ELAPSED ;ELAPSED TIME SINCE LAST CYCLE + ; IN MILLISECONDS + + +LOOP: CALL PUTNUM"RESET ;GET SET FOR DISPLAY CYCLE + + DERIV T,TIME ;COMPUTE TIME SINCE LAST CYCLE + IMULI T, 33. ;CONVERT 30THS TO MILLISECONDS + MOVEM T, ELAPSED ;.. + +; DERIV T,USRTM1 ;PUT % USER TIME IN A + MOVE T, USRTIM ;ALLOWING FOR VARIOUS FROBS + IMULI T, 1000. ;CONVERT TO MILLISECONDS + MOVE T0, USRTM1 ;AND GET CURRENT STUFF + IDIVI T0, 250. ;ALSO IN MILLISECONDS + ADD T, T0 + MOVE TT, T + EXCH TT, OUSRTM1 + SUB T, TT ;END FAKE DERIV EXPANSION + PERCENT T, ELAPSED + MOVE A, T +; DERIV T,NULTM1 ;PUT % NULL TIME IN B + MOVE T0, NULTM1 ;AGAIN ALLOWING FOR FROBS + IDIVI T0, 250. ;AND CONVERTING TO MILLISEC + MOVE T, NULTM3 + IMULI T, 1000. + ADD T, T0 + MOVE TT, T + EXCH TT, ONULTM + SUB T, TT ;END FAKE EXPANSION + PERCENT T, ELAPSED + MOVE B, T +; DERIV T,LOSTM1 ;PUT % LOST TIME IN B + MOVE T0, LOSTM1 ;AGAIN ALLOWING FOR FROBS + IDIVI T0, 250. ;AND CONVERTING TO MILLISEC + MOVE T, LOSTIM + IMULI T, 1000. + ADD T, T0 + MOVE TT, T + EXCH TT, OLOSTM + SUB T, TT ;END FAKE EXPANSION + PERCENT T, ELAPSED + MOVE C, T + CALL PUTNUM,A + CALL PUTNUM,B + MOVNS B ;COMPUTE OVERHEAD + ADDI B, 100. + SUB B, A + CALL PUTNUM,B + CALL PUTNUM,C + +; AT LAST, THAT CRUFT IS OVER WITH! +; SCAN USERS + + REGISTER U ;USER INDEX + IRP Z,,[TOTU,ACTU,RUNU,ERUNU,BLOCKU,STOPU] + LOCAL Z ;BUCKETS + SETZM Z + TERMIN + + SETZM U +;CAN'T USE UNTIL MACRO WITH ABSREF MACROS.....WAAAH - ??? + +ULOOP: ;LOOP THROUGH ALL USERS + SKIPN UNAME(U) + JRST ULOOP0 + AOS TOTU + MOVE T, LUBTM(U) ;SEE IF RECENTLY ACTIVE + ADDI T, 15.*30. + CAML T, TIME + AOS ACTU ;YES + + SKIPN USTP(U) + JRST .+3 + AOS STOPU ;STOPPED + JRST ULOOP0 + + SKIPN FLSINS(U) + JRST .+3 + AOS BLOCKU ;BLOCKED + JRST ULOOP0 + + MOVE T, UPC(U) + TLNE T, 010000 + JRST .+3 + AOS ERUNU ;RUNNING IN EXEC MODE + JRST ULOOP0 + + AOS RUNU + +ULOOP0: ADDI U, LUBLK + CAMGE U, USRHI + JRST ULOOP + + CALL PUTNUM,TOTU + IRP Z,,[ACTU, RUNU, ERUNU, BLOCKU, STOPU] + MOVE A, Z + PERCENT A, TOTU + CALL PUTNUM,A + TERMIN + +; DISK STATISTICS + + MOVE MS, ELAPSED ;SET UP FOR IDIVM'S + + MOVE A,NRXFR + ADD A,NWXFR + ADD A,NSRXFR + ADD A,NSWXFR + MOVE TT, A + EXCH TT, OXFR + SUB A, TT + IDIVM MS, A + CALL PUTNUM,A + + DERIV A,NRXFR + IDIVM MS, A + CALL PUTNUM,A + DERIV A,NWXFR + IDIVM MS, A + CALL PUTNUM,A + DERIV A,NSRXFR + IDIVM MS, A + CALL PUTNUM,A + DERIV A,NSWXFR + IDIVM MS, A + CALL PUTNUM,A + +; TTY STATISTICS + + DERIV A,TICT ;TTY CHARS/SECOND + IMULI A, 1000. + IDIV A, ELAPSED + CALL PUTNUM,A + DERIV A,TOCT + IMULI A, 1000. + IDIV A, ELAPSED + CALL PUTNUM,A + +; RANDOM SCHED ATB'S - MILLISECONDS + + DERIV A,NSKED + IDIVM MS, A + CALL PUTNUM,A + DERIV A,NPCLSR + IDIVM MS, A + CALL PUTNUM,A + DERIV A,NSOUSR + IDIVM MS, A + CALL PUTNUM,A + +; PAGE FAULT DATA + + DERIV A,NPGFLT ;ATB P F + MOVE C, A ;TOTAL PF SAVED FOR BELOW + IDIVM MS, A + CALL PUTNUM,A + IRP PF,,[NRPI,NRPCI,NRPO,NRPGO] + DERIV A,PF + IMULI A, 100. ;PERCENT OF THIS TYPE + IDIV A, C ;RELATIVE TO TOTAL + CALL PUTNUM,A + TERMIN + + CALL PUTNUM"FINISH + + IF [ SKIPE TT, TTYOPT ;IF DISPLAY BUT NOT 340 + TLNN TT, %TOERS ][ + TYO [^P] + TYO ["Z] + TYO [^P] ;leave line for :KILL message + TYO ["U] + TYO [^P] ;leave line for :KILL message + TYO ["U] + TYO [^P] ;leave line for **MORE** OR RATHER TO AVOID IT. + TYO ["U] + ] + SKIPE TTYOPT ;DON'T LISTEN IF 340 + .LISTEN A, + IF [ SKIPN DIXONSLOSS ][ MOVEI A,60.*60. ] ;WHOLE MINUTE + ELSE [ MOVEI A, 150. ] ;SLEEP 5 SEC + .SLEEP A, + SKIPE A,TTYOPT ;DON'T LISTEN IF 340 + .LISTEN A, + JUMPE A, LOOP + +KILL: .BREAK 16, 040000 + +DIXONSLOSS: 0 ;FLAG FOR SLOW REPEAT (FOR GARY DIXON) + +;;; Interrupt Handlers + +INTLST: P + TTYIF ? 0 ;CHARACTER TYPED + TTYIF ? 0 ? KILL ; STOP JOB + + BSCLK ? 0 ;1/2 SEC INT CHECK TTYS + BSCLK ? 0 ? .+1 + + PUSH P, T + PUSH P, TT + PUSH P, T0 + PUSH P, T1 + PUSH P, .PF. + CALL CHKTTY + POP P, .PF. + POP P, T1 + POP P, T0 + POP P, TT + POP P, T + .CALL DISMIS,[P] + + +.END + ;;; ROUTINE TO TYPE A CONSTANT STRING + +TYPE: PROCEDURE STRING + + REGISTER PT,CH + + MOVEI PT, STRING ;SET UP B.P. TO STRING + TLOA PT, 440700 ;.. +LOOP: TYO CH + ILDB CH, PT ;GET NEXT CHAR + JUMPN CH, LOOP ;AND IF NOT DONE, TYPE IT + RETURN +.END + ;;; PURIFICATION RITUAL + +OITSVRS:0 ;ITS VERSION PURIFIED FOR +OUSRSTG:0 ;EXTRA Check + +RITUAL: PROCEDURE + + .RSYSID TT, + MOVE T, [SQUOZE 0,USRSTG] ;SEE IF SYSTEM CHANGED + .EVAL T, + JFCL + CAMN TT, OITSVRS + CAME T, OUSRSTG + JRST NOGOOD + RETURN + +NOGOOD: CALL PURIFY ;WRONG SYS VERSION OR NOT PURE + RETURN ;YET SO REPURIFY + +.END + +ABSTB1: ABSTAB +ABSTB2: + +PURIFY: PROCEDURE + + REGISTER I,L,V,LIM + + .VALUE [ASCIZ\:New system version; must repurify. +Take paws off keys and wait. + + p\] + MOVEI LIM, IMMEDS-ABSTB1 ;LIMIT ON REMAPPABLENESS + MOVSI I, /2 ;SCAN ABSTAB +EVLOOP: MOVE V, ABSTB1(I) ;GET SYMBOL + .EVAL V, ;EVALUATE IT + .VALUE ;NOT THERE??? + CAIG LIM, (I) ;SKIP FOLLOWING CODE + JRST EVLP00 ; IF IMMEDIATE SYMBOL + CAIGE V, REMAPT ;REMAP LOW CORE + SUBI V, REMAPT ;INTO HIGH CORE +EVLP00: ADDI I, 1 + MOVE TT, ABSTB1(I) ;FOLLOW PATCH LIST +PLOOP: JUMPE TT,EVLPNX ;JUMP IF END OF LIST + MOVE L,TT + HLRZ TT,(L) ;LOC TO PATCH + HRRM V,(TT) ;PATCH IT + HRRZ TT,(L) ;LINK TO NEXT + JRST PLOOP ;AND TRY AGAIN + +EVLPNX:AOBJN I, EVLOOP ;NEXT SYMBOL + +; HAVING PATCHED, SET UP PAGE TABLE +; FOR NOW, WE DON'T ACTUALLY PURIFY ANY PAGES... + + .RSYSID V, ;REMEMBER ITS VERSION + MOVEM V, OITSVRS + MOVE V, [SQUOZE 0,USRSTG] ;AND A KLUDGEY MACHINE CHECK + .EVAL V, + .VALUE + MOVEM V, OUSRSTG + + SETZM V + MOVEI TT, REMAPT_-10. ;GET ABS PAGES + HRLI TT, _-10. ;FROM 0 TO 400000 + MOVE T, TT +GETMOR: .CALL CORBLK,[#210000,#-1,TT,#400000,T] + JRST .+2 ;ERROR RETURN + JRST GOTIT + .SUSET [.RBCHN,,V] ;FIND OUT WHAT LOST + .CALL STATUS,V,V ;GET ERROR CODE + .VALUE + LDB V, [270600,,V] ;.. + CAIE V, 32 ;CAN'T GET THAT ACCESS + .VALUE ;NO - UNCLEAR + ADD TT, [40,,40] ;YES - BITING MD10'S HAVE A 32K HOLE! + MOVE T, TT + JUMPL TT, GETMOR + +GOTIT: JUMPE V,GOTIT1 + CALL TYPE,MEMHOL +GOTIT1: MOVEI TT, <1000000-REMAPT>_-10. ;DO REMAPPAGE + HRLI TT, - + SETZ T, + .CALL CORBLK,[#210000,#-1,TT,#400000,T] + .VALUE + .VALUE [ASCIZ\:PDUMP SYS1;TS METER +P\] + RETURN +.END PURIFY + +CONSTANTS + +REMAPT=<.+1777>&776000 ;FIRST NON USED PAGE + +END METER