.TITLE ZDEC Zero Device Error Count .IDENT /1.0/ ;++ ; ; Title: ; ZDEC.MAR - Zero-out device error count. ; ; Version: ; 1-001 ; ; Facility: ; System Management Tools. ; ; Abstract: ; This program zeros-out the device error count stored in the ; UCB for a particular device. This is useful when you wish ; reset this value without booting the machine. ; ; Calling sequence: ; ; $ ZDEC := $mydev:[mydir]ZDEC ; $ ZDEC [/OVERRIDE] device ; ; Environment: ; CMKRNL privilege required, I/O data base is locked, program ; executed at elevated IPL. ; ; Author: ; Mark Oakley DuPont Experimental Station 12-Nov-1984 ; This program is based upon the VARY program written by ; Gary Grebus of Battelle Columbus Labs. ; ; Modifications: ; ; 17-Nov-1984 Mark Oakley Added /OVERRIDE to handle allocated devices. ; ; 25-Nov-1985 Mark Oakley Modified to correctly secure physical terminal ; name that is associated with a virutal terminal. ; ; 23-May-1986 Mark Oakley Modified to zero-out CPU and memory errors. ; ; 14-Jul-1988 Ted Nieland Modified to work under VMS 5.0. ; ; 16-Nov-1992 Matt Madison Port to OpenVMS Alpha AXP V1.0. ; ;-- .SBTTL Symbols, Macros, Data .IF DF,EVAX .LIBRARY /ALPHA$LIBRARY:LIB.MLB/ .IFF .LIBRARY /SYS$LIBRARY:LIB.MLB/ .ENDC $TPADEF ; Symbols for LIB$TPARSE. $SSDEF ; Symbols for return status. $UCBDEF ; Symbols for device ucb. $STSDEF ; Symbols for returned status. $DVIDEF ; Symbols for $GETDVI service. $DCDEF ; Symbols for device type. ; ; Macro to handle return codes. ; .MACRO ON_ERR THERE,?HERE BLBS R0,HERE BRW THERE HERE: .ENDM ON_ERR .PSECT ZDEC_DATA,RD,WRT,NOEXE,LONG,SHR,PIC CMD_BUF: ; Buffer to hold command line. .BLKB 80 CMD_BUF_SIZ = . - CMD_BUF CMD_BUF_DESC: ; Descriptor to command line. .LONG CMD_BUF_SIZ .ADDRESS CMD_BUF PROMPT: .ASCID /Device: / PARSE_BLK: ; Parse block for LIB$TPARSE. .LONG TPA$K_COUNT0 .LONG TPA$M_ABBREV ; Permit unambiguous abbreviations. .BLKB TPA$K_LENGTH0-8 OVERRIDE: ; Zero out allocated devices, if set. .LONG 0 LOG_DEV_DESC: ; Descriptor for device on command line. .BLKQ 1 CPU_STG: ; Used to compare against command line parm. .ASCII /CPU/ MEM_STG: ; Used to compare against command line parm. .ASCII /MEMORY/ DEV_BUF: ; Buffer to hold device name. .BLKB 40 DEV_BUF_SIZ = . - DEV_BUF DEV_BUF_DESC: ; Descriptor pointing to device name. .LONG DEV_BUF_SIZ .ADDRESS DEV_BUF PID: ; Owner of device (if any). .BLKL 1 DEV_ITEM_LIST: ; Device list for $GETDVI. .WORD DEV_BUF_SIZ ; Make sure we a have a physical device name. .WORD DVI$_DEVNAM .ADDRESS DEV_BUF .ADDRESS DEV_BUF_DESC .WORD 4 ; See if someone has this device allocated. .WORD DVI$_PID .ADDRESS PID .LONG 0 .WORD 4 .WORD DVI$_DEVCLASS ; Check for a terminal. .ADDRESS DEV_CLASS .LONG 0 .LONG 0 ; End if item list. TT_ITEM_LIST: ; Item list if we have a terminal. .WORD DEV_BUF_SIZ ; Make sure we a have a physical device name. .WORD DVI$_TT_PHYDEVNAM .ADDRESS DEV_BUF .ADDRESS DEV_BUF_DESC .LONG 0 DEV_CLASS: .LONG 1 K_ARG: ; Argument list for kernel-mode routine. .LONG 1 ; Just one argument. .ADDRESS DEV_BUF_DESC ; Pass descriptor for device name. .SBTTL State Table .PSECT ZDEC_STATES,RD,NOWRT,EXE,LONG,SHR,PIC $INIT_STATE STATE_TABLE,KEY_TABLE $STATE START $TRAN '/',QUAL $TRAN TPA$_SYMBOL,DEV,,,LOG_DEV_DESC $TRAN TPA$_EOS,TPA$_EXIT $STATE DEV $TRAN TPA$_EOS,TPA$_EXIT $TRAN '/',QUAL $TRAN ':',COLON $STATE COLON $TRAN '/',QUAL $TRAN TPA$_EOS,TPA$_EXIT $STATE QUAL $TRAN 'OVERRIDE',,,1,OVERRIDE $TRAN 'NOOVERRIDE',,CLR_OV $STATE $TRAN TPA$_SYMBOL,DEV,,,LOG_DEV_DESC $TRAN TPA$_EOS,TPA$_EXIT $END_STATE .IF DF,EVAX CLR_OV:: .CALL_ENTRY .IFF .ENTRY CLR_OV,^M<> .ENDC CLRL OVERRIDE MOVL #SS$_NORMAL,R0 RET .SBTTL Main program .PSECT ZDEC_CODE,RD,NOWRT,EXE,LONG,SHR,PIC .IF DF,EVAX ZDEC:: .CALL_ENTRY PRESERVE= .IFF .ENTRY ZDEC,^M .ENDC ; ; Get the command line. ; PUSHAL CMD_BUF_DESC ; Return length. PUSHAL PROMPT ; Prompt for device name. PUSHAL CMD_BUF_DESC ; Place to hold line. CALLS #3,G^LIB$GET_FOREIGN ON_ERR EXIT PUSHAL CMD_BUF_DESC ; Upper case the input. PUSHAL CMD_BUF_DESC CALLS #2,G^STR$UPCASE ON_ERR EXIT MOVL CMD_BUF_DESC,- ; Set length of string to parse. PARSE_BLK+TPA$L_STRINGCNT MOVL CMD_BUF_DESC+4,- ; Set address of string to parse. PARSE_BLK+TPA$L_STRINGPTR PUSHAL KEY_TABLE ; Parse the command line for PUSHAL STATE_TABLE ; qualifier and device. PUSHAL PARSE_BLK .IF DF,EVAX CALLS #3,G^LIB$TABLE_PARSE .IFF CALLS #3,G^LIB$TPARSE .ENDC ON_ERR EXIT ; ; First, check if we are zeroing-out the cpu or memory. ; MOVQ LOG_DEV_DESC,R6 CMPC3 R6,(R7),CPU_STG ; Is it the cpu? BNEQ 20$ BRW DO_CPU 20$: CMPC3 R6,(R7),MEM_STG ; Is it the memory? BNEQ 40$ BRW DO_MEM 40$: ; ; Get the physical device name, and see if this device has an owner. ; $GETDVI_S - DEVNAM=LOG_DEV_DESC,- ; Command line has device name. ITMLST=DEV_ITEM_LIST ON_ERR EXIT CMPL #DC$_TERM,DEV_CLASS ; Did we get a terminal? BNEQ 50$ $GETDVI_S - ; Yes, make sure we get the DEVNAM=LOG_DEV_DESC,- ; physical device name. ITMLST=TT_ITEM_LIST ON_ERR EXIT 50$: TSTL PID BEQL 60$ TSTL OVERRIDE ; Device is allocated, see if we BGTR 60$ ; should proceed. MOVL #SS$_DEVALLOC,R0 ; Device is allocated, exit with BRW EXIT ; error. 60$: DO_DEV: $CMKRNL_S - ; Enter k-mode to zero device error ROUTIN=ZERO_DEV,- ; count. ARGLST=K_ARG ON_ERR EXIT BRW EXIT DO_CPU: $CMKRNL_S - ; Enter k-mode to zero cpu error count. ROUTIN=ZERO_CPU ON_ERR EXIT BRW EXIT DO_MEM: $CMKRNL_S - ; Enter k-mode to zero memory error ROUTIN=ZERO_MEM ; count. ON_ERR EXIT BRW EXIT EXIT: RET .SBTTL ZERO_DEV Routine ;++ ; ; Functional Description: ; This routine zeros out the error count in the UCB for ; a specified device. ; ; Calling Sequence: ; $CMKRNL_S ROUTIN=ZERO_DEV,ARGLST=K_ARG ; ; where K_ARG is an argument list. This list contains ; the number of arguments passes (always 1), followed ; by the address of a descriptor pointing to the name ; of a device. ; ; Formal Parameters: ; Descriptor for name of a device. ; ; Implicit Inputs: ; I/O database. ; ; Implicit Outputs: ; Device error count is set to zero. ; ; Completion Status: ; Returned in R0. ; ; Side Effects: ; I/O database is locked (routine runs in kernel mode at elevated ; IPL). ; ;-- .IF DF,EVAX ZERO_DEV:: .CALL_ENTRY HOME_ARGS=TRUE,MAX_ARGS=1,PRESERVE= .IFF .ENTRY ZERO_DEV,^M .ENDC MOVL G^CTL$GL_PCB,R4 ;; Our PCB address is input to SCH ;; routines. JSB G^SCH$IOLOCKW ;; Lock the I/O database. MOVL 4(AP),R1 ;;; Address of device name descriptor. JSB G^IOC$SEARCHDEV ;;; Get UCB address for device into R1. ON_ERR ZERO_DEV_EXIT TSTL UCB$L_PID(R1) ;;; Make sure device did not become BEQL 80$ ;;; allocated. TSTL OVERRIDE ;;; Device is allocated, see if we BGTR 80$ ;;; should proceed. MOVL #SS$_DEVALLOC,R0 BRW ZERO_DEV_EXIT 80$: .IF DF,EVAX CLRL UCB$L_ERRCNT(R1) .IFF CLRW UCB$W_ERRCNT(R1) ;;; Zero out the error count. .ENDC MOVL #SS$_NORMAL,R0 ZERO_DEV_EXIT: PUSHL R0 ;;; Remember status. JSB G^SCH$IOUNLOCK ;;; Unlock I/O database (drop IPL). POPL R0 RET .SBTTL ZERO_CPU, ZERO_MEM Routines ;++ ; ; Functional Description: ; Routines to zero-out error-count location for cpu and memory. ; ; Calling Sequence: ; $CMKRNL_S ROUTIN=ZERO_CPU ; $CMKRNL_S ROUTIN=ZERO_MEM ; ; Input Parameters: ; None. ; ; Output Parameters: ; None. ; ; Implicit Inputs: ; Global sysmbols, EXE$GL_MCHKERRS for cpu errors, and ; EXE$GL_MEMERRS for memory errors. ; ; Implicit Outputs: ; None. ; ; Procedures called: ; None. ; ; Completion Status: ; Returned in R0, always successful. ; ; Side Effects: ; None. ; ;-- .IF DF,EVAX ZERO_CPU:: .CALL_ENTRY .IFF .ENTRY ZERO_CPU,^M<> .ENDC CLRL EXE$GL_MCHKERRS ; Zero out cpu errors. MOVL #SS$_NORMAL,R0 RET .IF DF,EVAX ZERO_MEM:: .CALL_ENTRY .IFF .ENTRY ZERO_MEM,^M<> .ENDC CLRL EXE$GL_MEMERRS ; Zero out memory errors. MOVL #SS$_NORMAL,R0 RET .END ZDEC