Everhart, Glenn From: Andy Harper [Andy.Harper@kcl.ac.uk] Sent: Wednesday, September 02, 1998 8:54 AM To: Info-VAX@Mvb.Saic.Com Subject: RE: Can I change Error count on a disk? >I have searched the bookreader manuals and spoken to our systems contractors >for our corporate machines. None /neither were able to remember a way to >revert the error count on a disk to zero. I have never needed this before, >but would like to do it now, if possible without re-booting -- the only way >that we could think of. >Paddy O'Brien, >System Planning, >TransGrid, >PO Box A1000, Sydney South, >NSW 2000, Australia > >Tel: +61 2 9284-3063 >Fax: +61 2 9284-3148 >Email: paddy.o'brien@zzz.tg.nsw.gov.au > >Either "\'" or "\s" (to escape the apostrophe) seems to work for most people, >but that little whizz-bang apostrophe gives me little spam. Paddy, The enclosed file MAY do what you want. I've had it for years so it may need some work for current versions of VMS. Original author was Mark Oakley. Regards, Andy Harper Kings College London $! DCL TEXT ARCHIVE - Unpack using @filename as a command $! Name : ZDEC.SHAR $! Date : 26-AUG-1988 18:13:13.15 $! Creator: UDAA055 $! $ fail_list= "" $ say := write sys$output $ $! ----- []ZDEC.COM ----- $ call do_prelude [] ZDEC.COM 1012351633 $ create []ZDEC.COM $ deck/dollars=18:13:09.91 $ MACRO/LIST ZDEC $ LINK/MAP/FULL ZDEC+SYS$SYSTEM:SYS.STB/SEL $ EXIT 18:13:09.91 $ call do_postlude [] ZDEC.COM 1012351633 $! ----- []ZDEC.MAR ----- $ call do_prelude [] ZDEC.MAR 1213081465 $ create []ZDEC.MAR $ deck/dollars=18:13:09.91 .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. ; ;-- .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. ; ; 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 .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 ; ; 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 CALLS #3,G^LIB$TPARSE 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). ; ;-- .ENTRY ZERO_DEV,^M 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$: CLRW UCB$W_ERRCNT(R1) ;;; Zero out the error count. 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. ; ;-- .ENTRY ZERO_CPU,^M<> CLRL EXE$GL_MCHKERRS ; Zero out cpu errors. MOVL #SS$_NORMAL,R0 RET .ENTRY ZERO_MEM,^M<> CLRL EXE$GL_MEMERRS ; Zero out memory errors. MOVL #SS$_NORMAL,R0 RET .END ZDEC 18:13:09.91 $ call do_postlude [] ZDEC.MAR 1213081465 $ if fail_list .eqs. "" then $ goto unpack_complete $ say "--------------------------------------------------" $ say " The unpack failed with one or more checksum" $ say " errors in the following file(s):" $ say "" $ say " ",fail_list $ say "" $ say "--------------------------------------------------" $unpack_complete: $ say "Unpack is complete" $ exit $do_prelude:subroutine $ if f$parse(P1) .eqs. "" then $ - write sys$output "Creating Directory 'P1'" $ if f$parse(P1) .eqs. "" then $ create/dir 'P1' $ say "Extracting File ",P1,P2," [ Checksum=",P3,"]" $ endsubroutine $do_postlude:subroutine $ checksum 'p1''p2' $ ck=checksum$checksum $ if ck .nes. P3 then $- fail_list=fail_list+p1+p2 $ if ck .nes. P3 then $- say "[CHECKSUM FAILED! Got ",ck," expected ",P3,"]" $ endsubroutine