From:	CSBVAX::MRGATE!@KL.SRI.Com,@eureka.clemson.edu:WARNOCK@prism.clemson.edu@SMTP 25-SEP-1987 10:08
To:	EVERHART
Subj:	RE: request for code to zero device error counters

Received: from RELAY.CS.NET by KL.SRI.COM with TCP; Thu 24 Sep 87 18:30:56-PDT
Received: from eureka.clemson.edu by RELAY.CS.NET id aa05772;
          24 Sep 87 21:15 EDT
Date: Thu, 24 Sep 87 21:07 EST
From: Todd Warnock <WARNOCK@prism.clemson.edu>
Subject: RE: request for code to zero device error counters
To: info-vax%kl.sri.COM@RELAY.CS.NET
X-VMS-To: INFO-VAX,WARNOCK     

>I remember a posting a few months ago about clearing the device error
>counters.
>Does anyone have a pice of code to do this.
>
>Randall W. Dean
>Resesarch/Systems Programmer
>Carnegie Mellon University
>Psychology Department
>Dean@A.Psy.Cmu.Edu
>RD0N+@Andrew.Cmu.Edu

Here's one way...

Todd Warnock
VAX Systems
Clemson University
Clemson, South Carolina 29634-2803

ARPA:	Warnock@Prism.Clemson.EDU
BITnet:	Warnock@Clemson

	.TITLE	ZDEC Zero Device Error Count
	.IDENT	/1.0/
;++
;
; Title:
;	ZDEC.MAR - Zero-out device error count.
;
; Version:
;	1-002
;
; Facility:
;	System Management Tools.
;
; Abstract:
;	This program zeros-out the device error count store in the
;	UCB for a particular device. This is useful when you wish 
;	reset this value without booting the machine. Note that the
;	error counts for memory and cpu are not handled.
;
;	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.
;
;  16-Feb-1986	Todd Warnock	Set CMKRNL priv for duration of image (assuming
;				user has CMKRNL or SETPRV)
;
;--

	.SBTTL	Symbols, Macros, Data

	.LIBRARY	/SYS$LIBRARY:LIB.MLB/

	$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.
	$PRVDEF		; Symbols for $SETPRV

	.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

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.


ENBFLG:
	.LONG	1 
PRVADR:
	.QUAD	PRV$M_CMKRNL 
PRMFLG:
	.LONG	0


	.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


	.ENTRY	CLR_OV,^M<>
	CLRL	OVERRIDE
	MOVL	#SS$_NORMAL,R0
	RET

	.SBTTL	Main program
	.PSECT	ZDEC_CODE,RD,NOWRT,EXE,LONG,SHR,PIC
	.ENTRY	ZDEC,^M<R2,R3,R4,R5,R6,R7,R8,R9>

; 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
	BLBS	R0,20$			; Error?
	BRW	EXIT
20$:
	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
	CALLS	#3,G^LIB$TPARSE
	BLBS	R0,30$			; Error?
	BRW	EXIT
30$:

; 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
	BLBS	R0,40$
	BRW	EXIT

40$:
	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
	BLBS	R0,50$
	BRW	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$:
	$SETPRV_S ENBFLG=ENBFLG,PRVADR=PRVADR,PRMFLG=PRMFLG 
	$CMKRNL_S -			; Enter k-mode to zero out count.
		ROUTIN=ZERO,-
		ARGLST=K_ARG
	BLBS	R0,80$
	BRW	EXIT
80$:

EXIT:
	RET

	.SBTTL	ZERO Routine
;++
;
; Functional Description:
;	This routine zeros out the error count in the UCB for
;	a specified device.
;
; Calling Sequence:
;	$CMKRNL_S ROUTIN=ZERO,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).
;
;--

	.ENTRY	ZERO,^M<R2,R4>

	MOVL	G^SCH$GL_CURPCB,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.
	BLBS	R0,60$
	BRW	ZERO_EXIT

60$:
	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_EXIT

80$:
	CLRW	UCB$W_ERRCNT(R1)	;;; Zero out the error count.
	MOVL	#SS$_NORMAL,R0

ZERO_EXIT:
	PUSHL	R0			;;; Remember status.
	JSB	G^SCH$IOUNLOCK		;;; Unlock I/O database (drop IPL).
	POPL	R0

	RET

	.END	ZDEC
