.TITLE VDDRV - VD: DRIVER .IDENT /Y03.01/ .SBTTL VDDRV - TITLE PAGE ;**- ; Module name: VDDRV - VIRTUAL DISK DRIVER ; ; Version Y03.01 Last edit: 20-NOV-80 14:19 ; Status: Released for test ; ; AUTHOR: R.W. STAMERJOHN MAPC 15-MAR-79 ; ; Revision history: ; ; Version X02.00 02-JAN-80 09:24 - 05-JUN-80 16:28 ; Modified by: K.J. CROSS ; CHECK VOLUME LABEL OF HOST DISK ; ; Version X03.00 05-JUN-80 16:28 - 09-JUN-80 10:14 ; Modified by: K.J. CROSS ; CHECK FOR DISMOUNTED HOST DISK AND ABORT REQUEST IF ; TRANSACTION COUNT ON VD: IS ZERO (I.E. NO FILES OPEN). ; ; Version X03.01 09-JUN-80 10:14 - 20-NOV-80 14:19 ; Modified by: K.J. CROSS ; DON'T ALLOW ANY ACCESS TO VD: IF HOST IS DISMOUNTED ; ; Version Y03.01 20-NOV-80 14:19 - 20-NOV-80 14:19 ; Modified by: KJC ; ;**- ; ; ************************************************************************ ; * ; THIS PROGRAM IS PROVIDED ON AN "AS IS" BASIS ONLY. * ; * ; FULL PERMISSION AND CONSENT IS HEREBY GIVEN TO DECUS AND TO THE DECUS * ; SPECIAL INTEREST GROUPS TO REPRODUCE, DISTRIBUTE, AND PUBLISH AND * ; PERMIT OTHERS TO REPRODUCE IN WHOLE OR IN PART, IN ANY FORM AND * ; WITHOUT RESTRICTION, THIS PROGRAM AND ANY INFORMATION RELATING THERETO * ; * ; ************************************************************************ ; .SBTTL VDDRV - DECLARATIONS ; ; MACRO LIBRARY CALLS: ; .MCALL PKTDF$ ;DEFINE PACKET SYMBOLICS PKTDF$ .MCALL SCBDF$ ;DEFINE SCB SYMBOLICS SCBDF$ .MCALL UCBDF$ ;DEFINE UCB SYMBOLICS UCBDF$ .MCALL F11DF$ ;DEFINE FILES-11 SYMBOLICS F11DF$ .SBTTL VDDRV - LOCAL DATA ; ; LOCAL DATA: ; ; DEVICE DISPATCH TABLE ; $VDTBL:: ;REF. LABEL .WORD VDINI ;DEVICE INITIATOR .WORD VDCAN ;CANCEL I/O .WORD VDTMO ;DEVICE TIMEOUT .WORD VDPWF ;POWER RECOVERY .SBTTL VDDRV * DRIVER CODE ; ; THIS DRIVER MEARLY RELOCATES THE LOGICAL BLOCK TO THE REAL LOGICAL ; BLOCK WITHIN THE DISK. THE MCR TASK AVD IS USED TO SETUP THE UCB ; FOR THIS OPERATION. ; VDINI: CALL $GTPKT ;GET PACKET BCS VDXIT ; IF CS - NO PACKET ; ; BLOCK CHECK FOR VIRTUAL DISK. ; CALL $BLKCK ;BLOCK CHECK PARAMETERS ; ; PARAMETERS OK, CHECK IF ACCESS ALLOWED. ; MOV U.NXT(R5),R0 ;GET EXTENSION BLOCK ADDRESS CMPB #IO.RLB/400,I.FCN+1(R3) ;CHECK FOR LEGAL FUNCTION BLO 2000$ ; IF LO - BAD FUNCTION BEQ 1000$ ;SKIP WRITE CHECK BIT #XF.RON,X.FLG(R0) ;IS WRITE ACCESS ALLOWED? BNE 2010$ ; IF NE - NO, ERROR ; ; CHECK TO MAKE SURE THE HOST DISK IS STILL MOUNTED. ; ABORT THE OPERATION IF IT ISN'T. ; CHECK THE VOLUME LABEL OF THE HOST DISK TO MAKE SURE IT HASN'T ; CHANGED SINCE THE VIRTUAL DISK WAS ALLOCATED. ; 1000$: .IF GE V$$RSN-32 ;RSX-11M VERSION 3.2 OR LATER MOV R1,-(SP) ;SAVE R1 MOV X.UCB(R0),R2 ;GET HOST'S UCB ADDRESS BITB #US.MNT!US.MDM,U.STS(R2) ;IS HOST STILL MOUNTED? BNE 2005$ ;IF NE, NO - NO ACCESS ALLOWED 1005$: MOV U.VCB(R2),R2 ;GET HOST'S VCB ADDRESS ADD #V.LABL,R2 ;POINT TO HOST'S VOLUME LABEL ADD #X.LABL,R0 ;POINT TO SAVED HOST'S VOLUME LABEL MOV #6,R1 ;SET COUNTER FOR VOLUME LABEL 1010$: CMP (R0)+,(R2)+ ;DOES VOLUME LABEL MATCH? BNE 2005$ ;IF NE, NO - SET PRIVILEGE VIOLATION SOB R1,1010$ ;CHECK THE WHOLE LABEL 1020$: MOV (SP)+,R1 ;RESTORE R1 MOV U.NXT(R5),R0 ;GET EXTENSION BLOCK ADDRESS AGAIN .IFTF ;GE V$$RSN-32 ADD X.OFF+2(R0),(R1) ;ADD IN LOW OFFSET ADC -(R1) ; IN DOUBLE PRECISION ADD X.OFF+0(R0),(R1) ;ADD IN HIGH OFFSET ; ; MARK THIS DRIVER NOT BUSY AND QUEUE PACKET TO NEXT DEVICE. ; BICB #US.BSY,U.STS(R5) ;CLEAR UCB BUSY CLRB S.STS(R4) ;CLEAR SCB BUSY MOV R3,R1 ;COPY PACKET ADDRESS MOV X.UCB(R0),R5 ;GET NEXT UCB CLR I.LNK(R1) ;CLEAR LINK WORD MOV R5,I.UCB(R1) ;SET NEW UCB CALLR $DRQRQ ;QUEUE TO REAL DRIVER ; ; RETURN ERRORS TO USER. ; 2000$: MOV #IE.IFC&377,R0 ;SET ERROR CODE BR 2020$ ; CONTINUE .IFT ;GE V$$RSN-32 - RSX-11M V3.2 OR LATER 2005$: TST (SP)+ ;CLEAN UP THE STACK MOV #IE.PRI&377,R0 ;SET PRIVILEGE VIOLATION ERROR CODE BR 2020$ ; CONTINUE .ENDC ;GE V$$RSN 2010$: MOV #IE.WLK&377,R0 ;SET ERROR CODE 2020$: CALLR $IOALT ;RETURN PACKET TO USER ; ; POWER FAIL SETS UCB OFFLINE. ALL OTHER DRIVER ENTRIES ARE NO-OP'S. ; VDPWF: BISB #US.OFL,U.ST2(R5) ;MARK DRIVE OFFLINE VDCAN: ;NO-OP VDTMO: ;NO-OP VDXIT: RETURN ;RETURN TO CALLER .END