.Title Install-Idle-Monitor ; ; This loads code into system space and patches into the ; terminal port/class interface to update UCB$L_ABSTIM whenever ; a character is sent or received. This allows us to keep ; track of 'idletime' on non-TIMED devices. ; .library /SYS$LIBRARY:LIB/ $CXBDEF $DDTDEF $DPTDEF $DYNDEF $TTYUCBDEF $TTYVECDEF $UCBDEF .Entry Install_Idle_Monitor,^m<> $CMKRNL_S $$Install_Idle_Monitor Ret .Entry $$Install_Idle_Monitor,^m ; ; See if we have an RTA0 device installed. ; Clrl R7 ; Assume no RTDRIVER DDT to patch Jsb G^Sch$IOLockR ; Lock the I/O database MovAQ RT_DEVICE,R1 Jsb G^IOC$SearchDev ; Search for RTA0 Blbc R0,1$ Movl UCB$L_DDT(R1),R7 1$: ; ; Allocate a buffer to hold the code the be loaded into ; nonpaged pool ; MovL #CodeLen+12,R1 ; Skip 12 bytes for pool header TstL R7 BEql 2$ AddW2 DDT$W_FDTSIZE(R7),R1 ; Room for old FDT AddW2 #3*4,R1 ; Room for the new FDT entry 2$: Jsb G^Exe$AllocBuf Blbs R0,10$ Pushl R0 Brb Done 10$: ; ; Copy the code into the pool ; MovAB 12(R2),R6 ; Address of start of code MovC3 #CodeLen,W^Code,(R6) ; Copy code into pool ; ; Link the code into the class interface to TTDRIVER. ; MovL G^TTY$GL_DPT,R1 ; Get TTDRIVER DPT MovZWL DPT$W_VECTOR(R1),R0 ; Offset to CLASS VECTOR AddL2 R0,R1 ; Address of CLASS VECTOR MovL CLASS_GETNXT(R1),B^V1_Jump-Code(R6) MovL CLASS_PUTNXT(R1),B^V2_Jump-Code(R6) MovAB B^V1-Code(R6),CLASS_GETNXT(R1) MovAB B^V2-Code(R6),CLASS_PUTNXT(R1) ; ; Build a new FDT routine for RTTDRIVER. ; Tstl R7 Beql 20$ Addl3 S^#Patched_RT_FDT-Code,R6,R0; Pointer to start of new FDT Movl DDT$L_FDT(R7),R1 ; Pointer to start of old FDT MovQ (R1)+,(R0)+ ; Copy the supported I/O mask MovQ (R1)+,(R0)+ ; Copy the buffered I/O mask MovQ -16(R1),(R0)+ ; Copy the supported into the new entry MovAB B^RTT_Fix-Code(R6),(R0)+ ; New FDT code address MovZWL DDT$W_FDTSIZE(R7),R2 SubL2 #16,R2 ; Calculate size of remaining FDT MovC3 R2,(R1),(R0) ; Move it MovAL B^Patched_RT_FDT-Code(R6),DDT$L_FDT(R7) AddW2 #12,DDT$W_FDTSIZE(R7) ; Update the pointers to the new FDT 20$: ; ; Exit ; Pushl #SS$_NORMAL Done: Movl G^CTL$GL_PCB,R4 Jsb G^SCH$IoUnLock PopL R0 Ret RT_DEVICE: .Ascid /_RTA0:/ ; ; This code sits in between the port/class interface for each ; terminal and updates the "DUETIM" field when each I/O occurs ; It *Must* be PIC. ; Code: V1: BBC #TTY$V_PC_NOTIME,UCB$W_TT_PRTCTL(R5),10$ MovL @#EXE$GL_ABSTIM,UCB$L_DUETIM(R5) 10$: Jmp @I^#00000000 V1_Jump = .-4 V2: BBC #TTY$V_PC_NOTIME,UCB$W_TT_PRTCTL(R5),10$ MovL @#EXE$GL_ABSTIM,UCB$L_DUETIM(R5) 10$: Jmp @I^#00000000 V2_Jump = .-4 Rtt_Fix:MovL @#EXE$GL_ABSTIM,UCB$L_DUETIM(R5) Rsb CodeLen = .-Code Patched_RT_FDT: .End Install_Idle_Monitor