SSS TITLE 'DMKSSS (CP) VM/370 - RELEASE 6' 00001000 * 00002000 * MODULE NAME - 00003000 * 00004000 * DMKSSS 00005000 * 00006000 * FUNCTION - 00007000 * 00008000 * THIS IS THE COMMON MSS SERVICE ROUTINE. IT HANDLES 00009000 * MSS SERVICE REQUESTS FROM OTHER CONTROL PROGRAM 00010000 * MODULES. THIS ROUTINE RECEIVES CONTROL AT DIFFERENT 00011000 * ENTRY POINTS, DEPENDING ON THE TYPE OF SERVICE 00012000 * REQUESTED. THE SERVICE PROVIDED BY EACH ENTRY POINT 00013000 * IS DESCRIBED BY THE PROLOGUE TO THAT ENTRY POINT. 00014000 * 00015000 * ATTRIBUTES - 00016000 * 00017000 * REENTRANT, RESIDENT, ENTERED VIA A CALL OR BRANCH TO THE 00018000 * APPROPRIATE ENTRY POINT 00019000 * 00020000 * ENTRY POINTS - 00021000 * 00022000 * DMKSSSL1 - FROM DMKLOG: PROCESS A DED STATEMENT 00023000 * WITH THE 3330V PARAMETER 00024000 * 00025000 * DMKSSSL2 - FROM DMKLOG: PROCESS A DED STATEMENT 00026000 * WITH 'RADDR' AND 'VOLID' SPECIFIED, AND THE 00027000 * 'RADDR' IS A 3330V 00028000 * 00029000 * DMKSSSL3 - FROM DMKLOG: PROCESS A DED STATEMENT 00030000 * WITH A 'VOLID' BUT NO 'RADDR'. TRY TO FIND A 3330V 00031000 * WITH A VOLUME SERIAL OF 'VOLID' 00032000 * 00033000 * DMKSSSHV - FROM DMKHVC: PROCESS DIAGNOSE CODE 78 00034000 * 00035000 * DMKSSSUS - FROM DMKUSO: THE VIRTUAL MACHINE WHICH IS 00042000 * ACTING AS THE MSS COMMUNICATOR IS LOGGING OFF 00043000 * 00044000 * DMKSSSVA - FROM DMKVDA: ATTACHING A 3330V TO EITHER 00045000 * THE SYSTEM OR A VIRTUAL MACHINE 00046000 * 00047000 * DMKSSSLN - FROM DMKLNK: ATTEMPT TO MOUNT THE NEEDED 00048000 * 'VOLID' ON A 3330V 00049000 * 00050000 * DMKSSSDE - FROM DMKDEF: DEMOUNT AN MSS VOLUME FROM THE 00054000 * SPECIFIED 3330V 00055000 * 00056000 * DMKSSSRL - FROM DMKVDR: ISSUE A RELINQUISH REQUEST TO 00056100 * DESTAGE ANY CHANGED CYLINDERS OF THE VOLUME MOUNTED ON 00056200 * THE SPECIFIED VUA. 00056300 * 00056400 * ENTRY CONDITIONS - 00057000 * 00058000 * DEFINED FOR EACH ENTRY POINT IN THE PROLOGUE TO THAT 00059000 * ENTRY POINT 00060000 * 00061000 * EXIT CONDITIONS - 00062000 * 00063000 * EXIT IS THROUGH THE STANDARD RETURN TO THE CALLING 00064000 * MODULE. A RETURN CODE IS PASSED IN GPR 15 00065000 * 00066000 * GPR 15 = 0 MEANS FUNCTION COMPLETE, NO ERRORS 00067000 * GPR 15 = 4 MEANS AN MSS VOLUME MOUNT HAS BEEN 00068000 * SCHEDULED, BUT IS NOT YET COMPLETE. 00069000 * AN MSSCOM BLOCK HAS BEEN CREATED AND 00070000 * QUEUED PENDING MOUNT COMPLETE. A MESSAGE 00071000 * HAS BEEN SENT TO THE USER STATING THAT 00072000 * A MOUNT IS IN PROCESS 00073000 * GPR 15 = 8 MEANS A SERIOUS ERROR OCCURRED. THE 00074000 * REQUESTED FUNCTION WAS NOT PERFORMED 00075000 * AND NO FURTHER ACTION WILL BE TAKEN ON 00076000 * THE REQUEST 00077000 * 00078000 * OTHER EXIT CONDITIONS, UNIQUE TO A PARTICULAR SERVICE, 00079000 * ARE DEFINED IN THE PROLOGUE TO THAT ENTRY POINT 00080000 * 00081000 * CALLS TO OTHER ROUTINES - 00082000 * 00083000 * SEE THE PROLOGUE FOR A PARTICULAR ENTRY POINT 00084000 * 00085000 * EXTERNAL REFERENCES - 00086000 * 00087000 * NONE 00088000 * 00089000 * NOTE THAT DMKSSS CONTAINS TWO QUEUE ANCHORS WHICH ARE 00090000 * REFERENCED BY OTHER ROUTINES: 00091000 * 00092000 * DMKSSSMQ - THE ANCHOR FOR THE QUEUE OF MSSCOM BLOCKS 00093000 * WAITING FOR MSS MOUNTS 00094000 * 00095000 * DMKSSSRQ - THE ANCHOR FOR THE QUEUE OF MSSCOM BLOCKS 00096000 * WAITING TO BE PROCESSED BY THE MSS 00097000 * COMMUNICATOR VIRTUAL MACHINE 00098000 * 00099000 * TABLES/WORKAREAS - 00100000 * 00101000 * MSSCOM 00102000 * RDEVBLOK 00103000 * VDEVBLOK 00104000 * UDEVBLOK 00105000 * IOBLOK 00106000 * VMBLOK 00107000 * UDEVBLOK 00108000 * TRQBLOK 00109000 * CPEXBLOK 00110000 * SAVEAREA 00111000 * PSA 00112000 * 00113000 * REGISTER USAGE - 00114000 * 00115000 * GPR 11 = VMBLOK BASE 00116000 * GPR 12 = DMKSSS BASE 00117000 * GPR 13 = SAVEAREA BASE 00118000 * GPR 15 = RETURN CODE 00119000 * 00120000 * THE USAGE OF THE OTHER REGISTERS DEPENDS UPON THE ENTRY 00121000 * POINT. SEE THE PROLOGUE FOR THE SPECIFIC ENTRY 00122000 * 00123000 EJECT 00124000 COPY OPTIONS @V60B6B8 00125000 COPY LOCAL @V60B6B8 00126000 EJECT 00127000 DMKSSS CSECT @V60B6B8 00128000 DC CL8'DMKSSS' @V60B6B8 00129000 SPACE 3 00130000 USING PSA,R0 MAP FOR LOW CORE @V60B6B8 00131000 USING VMBLOK,R11 PRIME VM CONTROL BLOCK @V60B6B8 00132000 USING SAVEAREA,R13 REG SAVE AREA AND WORK AREA @V60B6B8 00133000 ENTRY DMKSSSMQ @V60B6B8 00135000 ENTRY DMKSSSVM @V60B6B8 00136000 EXTRN DMKSCNVU,DMKSCNVS,DMKSCNAU @V60B6B8 00137000 EXTRN DMKSCNRU @V60B6B8 00139000 EXTRN DMKSCNRD @VA09305 00139100 EXTRN DMKERMSG @V60B6B8 00140000 EXTRN DMKSTKCP @V60B6B8 00141000 EXTRN DMKCVTBH @V60B6B8 00142000 EXTRN DMKSTKIO 00143500 EJECT 00144000 * 00145000 * 00146000 * DMKSSSL1 ENTRY POINT 00147000 * 00148000 * 00149000 * ENTRY CONDITIONS - 00150000 * ENTRY IS VIA A CALL (SVC 8) FROM DMKLOG. AT ENTRY, THE 00151000 * PERTINENT REGISTERS ARE: 00152000 * GPR 9 = UDEVBLOK PTR 00153000 * GPR 11 = VMBLOK PTR 00154000 * GPR 12 = DMKSSSL1 ADDRESS 00155000 * GPR 13 = SAVEAREA PTR 00156000 * 00157000 * EXIT CONDITIONS - 00158000 * 00159000 * IF GPR 15 = 0, THEN A 3330V HAS BEEN ALLOCATED TO 00160000 * THE VIRTUAL MACHINE AND, IF THE VOLID PARAMETER 00161000 * WAS SPECIFIED, THE VOLUME IS MOUNTED. 00162000 * 00163000 * IF GPR 15 = 4, THEN A 3330V HAS BEEN ALLOCATED TO 00164000 * THE VIRTUAL MACHINE, BUT AN MSS MOUNT IS IN PROCESS 00165000 * FOR THE VOLID. 00166000 * 00167000 * IF GPR 15 = 8, THEN A 3330V WAS NOT ALLOCATED. 00168000 * 00169000 * CALLS TO EXTERNAL ROUTINES - 00170000 * 00171000 * DMKSCNRU - FIND THE RDEVBLOK FOR THE VUA 00172000 * DMKSCNVU - FIND THE VDEVBLOK FOR THE COMMUNICATOR 00173000 * DMKFREE - GET STORAGE FOR AN MSSCOM AND CPEXBLOK 00174000 * DMKERMSG - ISSUE MESSAGES TO THE USER 00175000 * DMKCVTBH - CONVERT BINARY DEV ADDR TO PRINTABLE HEX 00176000 * DMKDSPCH - DISPATCH THE NEXT ELIGIBLE USER 00177000 * 00178000 * OPERATION - 00179000 * 00180000 * 1) CALL DMKSCNRU TO FIND THE RDEVBLOK FOR THE 00181000 * REQUESTED REAL DEVICE. 00182000 * 00183000 * 2) IF THE REAL DEVICE IS AVAILABLE, BUT A DIFFERENT 00184000 * VOLUME IS MOUNTED ON IT, DEMOUNT THE VOLUME. 00185000 * 00186000 * 3) IF A 'VOLID' WAS SPECIFIED, ALL 3330V'S ARE CHECKED. 00187000 * IF THE VOLUME IS MOUNTED ON A DIFFERENT VUA, BUT 00188000 * AVAILABLE, IT IS DEMOUNTED. 00189000 * 00190000 * 4) AN MSSCOM IS BUILT AND QUEUED TO MOUNT THE 'VOLID'. 00191000 * 00192000 * 5) ONCE THE MOUNT REQUEST HAS BEEN QUEUED, EXIT 00193000 * TO THE DISPATCHER, PENDING DMKMSS PROCESSING THE MOUNT. 00194000 * 00195000 * 6) AFTER THE MOUNT REQUEST HAS BEEN ACCEPTED BY 00196000 * THE MSS, CONTROL IS GIVEN TO DMKSSSHV, WHICH IN TURN 00197000 * RETURNS TO THE DMKSSSL1 CALLER WITH A RETURN CODE 4. 00198000 * 00199000 SPACE 3 00200000 DMKSSSL1 RELOC @V60B6B8 00201000 USING UDEVBLOK,R9 SET BY DMKLOG @V60B6B8 00202000 L R15,LOGADDR RETURN ADDR AFTER VOLUME MNTED @V60B6B8 00203000 ST R15,SAVRETAD SAVE FOR MSSCOM BUILD ROUTINE @V60B6B8 00204000 SR R15,R15 CLEAR THE POTENTIAL RET CODE @V60B6B8 00205000 LH R1,UDEVLINK 'RADDR' PARM IF SUPPLIED @V60B6B8 00206000 LTR R1,R1 WAS IT SUPPLIED @V60B6B8 00207000 BNM CALLALLC THERE IS ONE GO GET BLK @VA11411 00208010 DISASTER EQU * UNCORRECTABLE ERROR @V60B6B8 00209000 LA R15,RCERROR RETURN CODE @V60B6B8 00210000 GOODEXIT EQU * RETURN TO THE CALLER @V60B6B8 00211000 LR R0,R15 PRESERVE RETURN CODE @V60B6B8 00212000 LM R1,R11,SAVER1 CALLER'S REGS @V60B6B8 00213000 SVC 12 AND INVOKE RETURN @V60B6B8 00214000 CALLALLC EQU * TRY TO ALLOCATE A VIRTUAL 3330V @V60B6B8 00215000 * 00216000 * AT THIS POINT GPR 1 CONTAINS THE RADDR SPECIFIED 00217000 * CALL DMKSCNRU TO FIND THE RDEVBLOK 00218000 * 00219000 CALL DMKSCNRU FIND THE RDEVBLOK FOR THE RADDR @V60B6B8 00220000 BNE EMSG072 INVALID RADDR @VMI2020 00221000 USING RDEVBLOK,R8 GPR 8 SET BY SCAN @V60B6B8 00222000 * 00223000 * THE RADDR IS VALID. NOW SEE IF IT IS A 3330V, 00224000 * TYPE VIRTUAL, AND AVAILABLE 00225000 * 00226000 CLI RDEVTYPC,CLASDASD IT MUST BE A DASD DEVICE @V60B6B8 00227000 BNE EMSG072 INVALID RADDR @VMI2020 00228000 CLI RDEVTYPE,TYP3330 IT MUST BE A 3330 DASD @V60B6B8 00229000 BNE EMSG072 INVALID RADDR @VMI2020 00230000 TM RDEVFTR,VIRTUAL IT MUST BE VIRTUAL, NOT SYSVIRT @V60B6B8 00231000 BZ EMSG072 INVALID RADDR @VMI2020 00232000 TM RDEVSTAT,RDEVDISA+RDEVDED IS IT OFFLINE OR @V60B6B8 00233000 * DEDICATED 00234000 BNZ EMSG072 NOT AVAILABLE @VMI2020 00235000 CLC RDEVSER,BLANKS IS A VOLUME MOUNTED? @VA11939 00236100 BE DOALLC NO, GO ALLOCATE @VA11939 00236600 * 00238000 * A VOLUME IS MOUNTED ON THE REAL DEVICE BUT IS NOT IN 00239000 * USE. CALL THE DEMOUNT SUBROUTINE IF THE MOUNTED 00240000 * VOLUME IS NOT THE ONE REQUIRED. 00241000 * 00242000 CLC UDEVVSER(6),RDEVSER IS THE REQUIRED VOLUME @V60B6B8 00243000 * MOUNTED 00244000 BE DOALLC YES, ALLOCATE THE RDEVICE @V60B6B8 00245000 ST R8,RDEVDEMT STORE RDEVBLOK FOR DEMOUNT @VA11436 00246010 BAL R14,DEMOUNTV GO TO DO DEMOUNT @VA11436 00246020 * 00250000 * THE RDEVICE IS NOW AVAILABLE TO THE REQUESTOR AND 00251000 * HAS BEEN VERIFIED AS THE CORRECT TYPE 00252000 * 00253000 DOALLC EQU * DEDICATE THE RDEVICE TO THE @V60B6B8 00254000 * CALLER 00255000 ST R11,RDEVUSER PUT USER VMBLOK ADDR IN RDEVBLOK @V60B6B8 00256000 MVC RDEVATT(2),UDEVADD ATTACHED VIRTUAL ADDR @V60B6B8 00257000 CLC UDEVVSER(6),BLANKS DID USER GIVE VOLSER @V60B6B8 00258000 BNE CHKMOUNT YES, SEE IF ALREADY MOUNTED @V60B6B8 00259000 SETRC0 EQU * MISSION ACCOMPLISHED @V60B6B8 00260000 SR R15,R15 SET R15 RET CODE = 0 @V60B6B8 00261000 B GOODEXIT AND RETURN @V60B6B8 00262000 * 00263000 * THE USER SPECIFIED A VOLID. IF IT IS ALREADY MOUNTED 00264000 * ON THE SPECIFIED DEVICE, RETURN 00265000 * 00266000 CHKMOUNT EQU * TEST FOR VOLUME MOUNTED @V60B6B8 00267000 CLC UDEVVSER(6),RDEVSER IS NEEDED VOLUME MOUNTED @V60B6B8 00268000 BE SETRC0 YES, WE ARE DONE @V60B6B8 00269000 * 00270000 * THERE IS NOW A REAL DEVICE ALLOCATED FOR THIS REQUEST. 00271000 * THE USER HAS REQUESTED A SPECIFIC VOLUME ON THE DEVICE. 00272000 * FIRST SCAN THE RDEVBLOKS TO SEE IF THE VOLUME IS MOUNTED 00273000 * ON ANOTHER DEVICE. 00274000 * 00275000 SCNVOL EQU * @V60B6B8 00276000 LA R0,VOLSERL @VMI2008 00277000 LA R1,UDEVVSER POINT TO VOLSER NEEDED @V60B6B8 00278000 LR R5,R8 SAVE CURRENT RDEVBLOK ADDR @V60B6B8 00279000 CALL DMKSCNVS LOOK FOR VOLSER MOUNTED @V60B6B8 00280000 BNZ BLDCOMMT NOT MOUNTED, PROCEED TO MOUNT @V60B6B8 00281000 LR R8,R1 RDEVBLOK FOUND BY SCNVS @VA09909 00282100 TM RDEVFTR,VIRTUAL+SYSVIRT IS IT A 3330V @V60B6B8 00285000 BZ EMSG076 NO, VOLUME CAN'T BE MSS @VMI2020 00286000 CHKSTAT EQU * NEEDED VOLUME MOUNTED ON WRONG @V60B6B8 00287000 * DEV 00288000 TM RDEVSTAT,RDEVDED IS DEV DEDICATED @V60B6B8 00289000 BO EMSG076 YES, VOLID INVALID @VMI2020 00290000 LA R0,ZERO SET UP FOR FOLLOWING COMP INST @V60B6B8 00291000 CH R0,RDEVLNKS ANYONE LINKED TO THE DEVICE @V60B6B8 00292000 BNE EMSG076 YES, WE CAN'T DEMOUNT @VMI2020 00294000 ST R8,RDEVDEMT SAVE RDEVBLOK PTR @VA09909 00295100 BAL R14,DEMOUNTV GO TO DO DEMOUNT @VA11436 00296010 * 00299000 * A REQUIRED VOLUME MUST BE MOUNTED. CALL SUBROUTINES 00300000 * TO BUILD THE CONTROL BLOCKS AND SCHEDULE THE MOUNT. 00301000 * 00302000 * IF ENTRY TO THIS ROUTINE IS FROM DMKSSSLN, UDEVADD WHICH 00302100 * IS R9 POINTS TO DMKLNK'S SAVEAREA SAVEWRK5 SO THAT THE YYY 00302200 * ADDRESS WILL BE PUT INTO WAIT UNTIL MOUNT IS COMPLETE. 00302300 * -- THAT IS, R9 WILL NOT REALLY POINT TO THE UDEVBLOK -- 00302400 BLDCOMMT EQU * PROCEED TO BUILD AN MSSCOM @V60B6B8 00303000 LA R3,UDEVVSER VOLSER NEEDED @V60B6B8 00304000 BLDCOMTA EQU * ENTRY FROM DMKSSSVA @V60B6B8 00305000 ST R3,VSERADDR SAVE IT FOR COMBLD @V60B6B8 00306000 ST R5,RDEVADDR SAVE RDEVBLOK ADDR @V60B6B8 00307000 BAL R14,COMBLD GO BUILD THE MSSCOM @VA11436 00308010 USING OSVSCOM,R10 ASSEMBLER ADDRESSABILITY @V60B6B8 00313000 MVI MSSFLAG1,MOUNT INDICATE MOUNT REQUEST @VA09302 00314000 LA R0,CPEXSIZE NO OF D-WORDS IN CPEXBLOK @V60B6B8 00315000 CALL DMKFREE GET DYNAMIC STORAGE @V60B6B8 00316000 ST R1,MSSTASK1 ESTABLISH PTR IN MSSCOM BLOCK @V60B6B8 00317000 USING CPEXBLOK,R1 ASSEMBLER ADDRESSABILITY @V60B6B8 00318000 MVC CPEXREGS(48),SAVEREGS SAVE CALLER REGISTERS @V60B6B8 00319000 ST R10,CPEXR3 SAVE MSSCOM ADDRESS @V60B6B8 00320000 MVC CPEXR12(8),SAVER12 CALLER REG 12 & 13 @V60B6B8 00321000 MVC CPEXADD(4),SAVRETAD SAVE RETURN ADDRESS @V60B6B8 00322000 MVC CPEXMISC(L2),UDEVADD SAVE VIRT DEV ADDR @V60B6B8 00323000 B SCHMSSC SCHEDULE AN MSSCOM @V60B6B8 00324000 DROP R10 @V60B6B8 00325000 DROP R1 @V60B6B8 00326000 EJECT 00327000 EMSG076 EQU * ISSUE ERROR MSG @VMI2020 00328000 * 00329000 * A REQUIRED VOLUME HAS BEEN FOUND IN USE FOR ANOTHER 00330000 * PURPOSE. FIRST ISSUE MSG DMKSSS076E, THEN DEALLOCATE 00331100 * THE RDEVICE WHICH HAD BEEN PREVIOUSLY FOUND AND 00332000 * RETURN WITH RETURN CODE 8 00333000 * 00334000 LA R0,N6 LENGTH OF VOLID @V60B6B8 00335000 ICM R0,14,DMKSSS+3 MODULE ID @V60B6B8 00336000 LA R1,UDEVVSER VOL SER FOR MSG INSERT @V60B6B8 00337000 L R2,OPTION76 MESSAGE WRITER OPTIONS @VMI2020 00338000 CALL DMKERMSG PUT OUT THE MESSAGE @V60B6B8 00339000 DROP R8 @VA09909 00339500 USING RDEVBLOK,R5 @V60B6B8 00340000 MVC RDEVSER(6),BLANKS CLEAN OUT VOLID @V60B6B8 00341000 MVC RDEVATT(2),ZEROES NO DEVICE ATTACHED @V60B6B8 00342000 MVI RDEVSTAT,CLEAR CLEAR DEVICE STATUS @V60B6B8 00343000 DROP R5 @V60B6B8 00344000 B DISASTER SET RETURN CODE AND EXIT @V60B6B8 00345000 EMSG072 EQU * PUT OUT ERROR MSG @VMI2020 00346000 L R2,OPTION72 MESSAGE WRITER OPTIONS @VMI2020 00347000 CALL DMKCVTBH CONVERT ADDR TO HEX @V60B6B8 00348000 ST R1,ADDRSAVE SAVE THE 3-DIGIT ADDR @V60B6B8 00349000 LA R1,ADDRSAVE+1 POINT TO IT FOR MESSAGE WRITER @V60B6B8 00350000 LA R0,L3 LENGTH OF MESSAGE INSERT @V60B6B8 00351000 ICM R0,14,DMKSSS+3 MODULE ID FOR WRITER @V60B6B8 00352000 CALL DMKERMSG @V60B6B8 00353000 B DISASTER EXIT WITH PERMANENT ERROR @V60B6B8 00354000 EJECT 00355000 * 00356000 * THE FOLLOWING SUBROUTINE WILL DEMOUNT A VOLUME. 00357000 * 00358000 * AT INPUT, RDEVDEMT CONTAINS THE ADDR OF THE 00359000 * RDEVBLOK FROM WHICH TO DEMOUNT, DEMNTRET 00360000 * CONTAINS THE RETURN ADDRESS OF THE CALLING 00361000 * ROUTINE. 00362000 * 00363000 * ON RETURN, GPR 15 WILL BE NON-ZERO IF AN ERROR OCCURS 00364000 * 00365000 DEMOUNTV DS 0H @VA11436 00366010 ST R14,DEMNTRET SAVE RETURN ADDRESS @VA11436 00366020 L R8,RDEVDEMT GET RDEVBLOK ADDR @V60B6B8 00367000 LA R0,RDEVSER-RDEVBLOK(R8) VOL SER ADDR @V60B6B8 00368000 ST R0,VSERADDR SAVE ADDR OF VOLID @V60B6B8 00369000 ST R8,RDEVADDR RDEVBLOK ADDR @V60B6B8 00370000 USING RDEVBLOK,R8 @VA11429 00370100 OI RDEVFLAG,RDEVSEL DEVICE SELECTED FOR DEMOUNT 00370200 BAL R14,COMBLD GO BUILD THE MSSCOM @VA11436 00371010 USING OSVSCOM,R10 @V60B6B8 00376000 MVI MSSFLAG1,DEMOUNT INDICATE DEMOUNT REQUEST @VA09302 00377000 OI MSSFLAG1,MSSSAVE INDICATE GODSPCH NOT TO RETURN @VA10862 00377100 * THE SAVE AREA 00377200 LA R0,CPEXSIZE SIZE OF A CPEXBLOK @V60B6B8 00378000 CALL DMKFREE GET DYNAMIC STORAGE @V60B6B8 00379000 ST R1,MSSTASK1 POINT MSSCOM TO THE CPEXBLOK @V60B6B8 00380000 USING CPEXBLOK,R1 @V60B6B8 00381000 MVC CPEXADD(4),DEMNTRET RETURN ADDR AFTER DEMOUNT @V60B6B8 00382000 STM R0,R15,CPEXREGS REGS TO DISPATCH AFTER DEMOUNT @V60B6B8 00383000 DROP R1 @V60B6B8 00388000 DROP R10 @V60B6B8 00389000 EJECT 00402000 * 00403000 * THE FOLLOWING ROUTINE PLACES AN MSSCOM BLOCK IN THE 00404000 * QUEUE FOR DMKMSS. A CPEXBLOK IS BUILT AND ANCHORED 00405000 * FROM MSSTASK2. THE PURPOSE OF THIS CPEXBLOK IS TO 00406000 * PASS CONTROL BACK TO THE CALLER OF DMKSSS WITH A 00407000 * RETURN CODE OF 4 AFTER THE MSS HAS ACCEPTED THE MOUNT 00408000 * REQUESTED BY THIS MSSCOM. 00409000 * 00410000 SCHMSSC EQU * QUEUE AN MSSCOM BLOCK @V60B6B8 00411000 L R10,VSERADDR MSSCOM BLOCK ADDR @V60B6B8 00412000 USING OSVSCOM,R10 @V60B6B8 00413000 LA R0,CPEXSIZE SIZE OF A CPEXBLOK @V60B6B8 00414000 CALL DMKFREE GET DYNAMIC STORAGE @V60B6B8 00415000 USING CPEXBLOK,R1 R1 SET BY DMKFREE @V60B6B8 00416000 MVC CPEXADD(4),SAVERETN EXIT ADDR AFTER MNT SCHED. @V60B6B8 00417000 MVC CPEXREGS(48),SAVEREGS OUR CALLER'S REGS @V60B6B8 00418000 MVC CPEXR12(8),SAVER12 CALLER'S REGS 12 & 13 @V60B6B8 00419000 ST R1,MSSTASK2 SAVE PTR IN MSSCOM @V60B6B8 00420000 DROP R1 @V60B6B8 00421000 * 00434000 * TEST TO SEE IF THERE IS A PREVIOUS Q ENTRY FOR 00435000 * THIS SAME VOLUME. IF SO, JUST CHAIN IN THE REQUEST 00436000 * AND WAIT FOR THE MOUNT 00437000 * 00438000 CHKDUP1 DS 0H @VA11344 00438500 L R1,DMKSSSMQ Q ANCHOR @V60B6B8 00439000 CHKDUP EQU * @V60B6B8 00440000 LTR R1,R1 TEST FOR END OF Q @V60B6B8 00441000 BZ SETRQENT END OF Q, THIS IS FIRST REQUEST @V60B6B8 00442000 CLC 0(6,R1),MSSSER IS VOLSER THE SAME @V60B6B8 00443000 BE SETCHAIN YES, MERELY CHAIN THE BLOCK @V60B6B8 00444000 L R1,MSSNEXT-OSVSCOM(R1) NEXT Q ENTRY @V60B6B8 00445000 B CHKDUP CHK FOR DUPLICATE VOLSER @V60B6B8 00446000 SETCHAIN EQU * PUT THIS ENTRY IN THE CHAIN @V60B6B8 00447000 * CHECK TO SEE IF THIS IS A VALID REQUEST 00448000 * FOR THE SAME VOLUME, OR AN ERROR 00449000 CLC MSSFLAG1-OSVSCOM(1,R1),MSSFLAG1 SAME REQ TYPE @VA09302 00450000 BNE CHKMORE NO - THEN CHK FOR RELINQUISH @VA11344 00451000 TM MSSFLAG1,RELINQSH BOTH RELINQUISH REQUESTS? @VA11344 00451200 BO NORLQSH YES - THEN THROW AWAY NEW REQUEST@VA11344 00451400 CHAINMOR DS 0H @VA11344 00451600 LR R3,R1 QUEUED MSSCOM ADDR @VMI2008 00452000 LH R1,MSSVUA-OSVSCOM(R1) RDEV IN QUEUED REQ @VMI2008 00453000 CALL DMKSCNRU FIND RDEVBLOK @VMI2008 00454000 TM RDEVFTR-RDEVBLOK(R8),SYSVIRT+VIRTUAL @VA11344 00455000 * THIS AN MSS VUA? @VA11344 00455500 BZ CONFLICT NO, CAN NOT ALLOW DUPLICATE @VMI2008 00456000 LH R1,MSSVUA RDEV THIS REQ @VMI2008 00457000 CALL DMKSCNRU FIND RDEVBLOK @VMI2008 00458000 TM RDEVFTR-RDEVBLOK(R8),SYSVIRT+VIRTUAL @VA11344 00459000 * THIS AN MSS VUA? @VA11344 00459600 BZ CONFLICT MUST ALSO BE SYSTEM DEVICE @VMI2008 00460200 CLC MSSVUA(2),MSSVUA-OSVSCOM(R3) SAME VUA? @VA11344 00460800 BE SAMEVUA YES - THEN DON'T TURN OFF RDEVSEL@VA11344 00461400 NI RDEVFLAG-RDEVBLOK(R8),FULL-RDEVSEL @VMI2008 00462000 SAMEVUA DS 0H @VA11344 00462300 MVC MSSVUA(2),MSSVUA-OSVSCOM(R3) SAME RDEV @VMI2008 00462600 LR R1,R3 ADDR QUEUED MSSCOM @VMI2008 00463000 MVC MSSFLAG2(1),MSSFLAG2-OSVSCOM(R1) @VA11135 00464100 MVC MSSNEXT(4),MSSNEXT-OSVSCOM(R1) PREVIOUS BLOCK @V60B6B8 00465000 * CHAIN 00466000 ST R10,MSSNEXT-OSVSCOM(R1) CHAIN IN THIS BLOCK @V60B6B8 00467000 B SETUP078 SET UP MSG 078 @VMI2020 00468000 CHKMORE DS 0H @VA11344 00468070 TM MSSFLAG1-OSVSCOM(R1),RELINQSH IS OLD REQUEST A @VA11344 00468140 * RELINQUISH REQUEST? 00468210 BNO CONFLICT NO - THEN STRANGE SEQUENCE OF @VA11344 00468280 * REQUESTS INDEED!! 00468350 B CHAINMOR ELSE CHAIN NEW REQ AFTER OLD @VA11344 00468420 NORLQSH DS 0H @VA11344 00468490 LR R1,R10 GET MSSCOM ADDR FOR FRET @VA11344 00468560 LA R0,MSSSIZE GET SIZE OF MSSCOM FOR FRET @VA11344 00468630 CALL DMKFRET GET RID OF DUPLICATE RELINQUISH @VA11344 00468700 * REQUEST 00468770 B SSSRLEND RETURN TO CALLER @VA11344 00468840 * 00469000 * TWO CONFLICTING REQUESTS HAVE BEEN MADE 00470000 * FOR THE SAME VOLUME. REJECT THE LATEST REQUEST 00471000 * 00472000 CONFLICT EQU * @VMI2008 00473000 LA R0,VOLSERL 6 BYTE VOL SER @VMI2008 00474000 ICM R0,14,DMKSSS+3 MODULE ID @VMI2008 00475000 LA R1,MSSSER VOL SER BEING REJECTED @VMI2008 00476000 L R2,OPTION75 MESSAGE WRITER OPTIONS @VMI2020 00477000 CALL DMKERMSG WRITE MSG TO USER @VMI2008 00478000 TROUBS DS 0H HERE FOR NO SERVER OR BAD DEVICE @VA11436 00478010 L R1,MSSTASK1 CPEXBLOK ADDR @VMI2008 00479000 LA R0,CPEXSIZE CPEXBLOK SIZE @VMI2008 00480000 LTR R1,R1 IS THERE AN EXBLOK @VMI2008 00481000 BZ NOTSK1 NO @VMI2008 00482000 CALL DMKFRET RETURN MEMORY TO SYSTEM @VMI2008 00483000 NOTSK1 EQU * @VMI2008 00484000 L R1,MSSTASK2 CPEXBLOK ADDR @VMI2008 00485000 LA R0,CPEXSIZE CPEXBLOK SIZE @VMI2008 00486000 LTR R1,R1 IS THERE AN EXBLOK @VMI2008 00487000 BZ NOTSK2 NO @VMI2008 00488000 CALL DMKFRET @VMI2008 00489000 NOTSK2 DS 0H @VA11436 00490010 ICM R1,15,DMKSSSMQ GET THE ANCHOR @VA11436 00490020 BZ DISASTER WE SHOULDNT FIND THIS ANYWAY @VA11436 00490030 CR R1,R10 WE THE FIRST ONE IN THE QUEUE @VA11436 00490040 BNE GETRID3 NO CHECK THE REST @VA11436 00490050 MVC DMKSSSMQ,MSSNEXT-OSVSCOM(R1) TAKE IT OUT @VA11436 00490060 B GETRID4 AND FRET IT @VA11436 00490070 GETRID2 DS 0H @VA11436 00490080 CR R1,R10 IS THIS THE ONE WE PROCESSIN @VA11436 00490090 BE GETRID YES GET RID OF IT @VA11436 00490100 GETRID3 DS 0H @VA11436 00490110 LR R0,R1 SAVE BACKWARD POINTER @VA11436 00490120 ICM R1,15,MSSNEXT-OSVSCOM(R1) GET THE NEXT ONE @VA11436 00490130 BZ DISASTER WE SHOULDNT FIND IT THIS WAY @VA11436 00490140 B GETRID2 GO SEE IF THIS IS THE ONE @VA11436 00490150 GETRID DS 0H @VA11436 00490160 MVC MSSNEXT-OSVSCOM(R0),MSSNEXT-OSVSCOM(R1) DECHAIN @VA11436 00490170 GETRID4 DS 0H 00490180 LR R1,R10 CURRENT MSSCOM ADDR @VMI2008 00491000 LA R0,MSSSIZE SIZE OF MSSCOM @VMI2008 00492000 CALL DMKFRET RETURN CORE @VMI2008 00493000 B DISASTER SET ERROR RET CODE, RETURN @VMI2008 00494000 SETUP078 EQU * @VMI2020 00495000 MVC MSSTASKD(4),MSSTASK2 SAVE CPEXBLOK PTR @VA09302 00496000 XC MSSTASK2(4),MSSTASK2 INDICATE NO EXBLOK @VMI2008 00497000 TM MSSFLAG2,MQENT @VA11135 00497100 BZ GODSPCH1 @VA11135 00497200 L R1,MSSTASKD CPEXBLOK PTR @VA11135 00497300 LA R0,CPEXSIZE SIZE OF THE BLOCK @VA11135 00497400 CALL DMKFRET RELEAS THE STORAGE @VA11135 00497500 XC MSSTASKD(4),MSSTASKD CLEAR THE PTR @VA11135 00497600 OI MSSFLAG2,MSGPROC INDICATE MSG WTR IN PROCESS @VA09302 00498000 LA R0,VOLSERL 6 BYTE VOL SER @VMI2008 00499000 ICM R0,14,DMKSSS+3 MODULE ID @VMI2021 00500000 LA R1,MSSSER VOL SER @VMI2008 00501000 L R2,OPTION78 MSG WRITER OPTIONS @VMI2020 00502000 CALL DMKERMSG WRITE MSG 088 @VMI2008 00503000 LA R0,RC4 RET CODE = MOUNT IN PROCESS @VMI2008 00504000 TSK1FIN EQU * @VMI2008 00505000 LR R1,R10 SET MSSCOM ADDR FOR CALLER @VMI2008 00506000 LM R2,R11,SAVER2 CALLER'S REGS @VMI2008 00507000 SVC 12 @VMI2008 00508000 SETRQENT EQU * @V60B6B8 00509000 OI MSSFLAG2,RQENT INDICATE WAITING FOR DMKMSS @VA09302 00510000 MVC MSSNEXT(4),DMKSSSMQ @VMI2003 00511000 ST R10,DMKSSSMQ @VMI2003 00512000 * NOW SEE IF THE COMMUN IS ACTIVE 00513000 LR R1,R10 NOW SET UP R1 AS THE START @VA11436 00514010 TESTENDA DS 0H @VA11436 00514020 TM MSSFLAG2-OSVSCOM(R1),INPROC THIS BLOK IN @VA09302 00518000 * PROCESS 00519000 BO GODSPCH YES, DON'T GENERATE ATTN @V60B6B8 00520000 ICM R1,15,MSSNEXT-OSVSCOM(R1) GET THE NEXT POINTER @VA11436 00521010 BNZ TESTENDA IF THERE IS ONE DO IT SOMEMORE @VA11436 00521020 * 00534000 * NOW GENERATE AN ATTENTION ON THE COMMUNICATION 00535000 * MACHINES COMMUNICATIONS DEVICE. 00536000 * 00537000 GENATTN DS 0H @VA11436 00538010 LR R3,R11 SAVE THIS GUYS VMBLOK @VA11436 00538020 ICM R11,15,COMMVMAD IS THIS SERVER STILL HERE @VA11436 00538030 BZ EMSG071 PERHAPS THE AP LOGGED HIM OFF @VA11436 00538040 L R1,COMMADDR COMMUNICATOR DEVICE ADDR @V60B6B8 00541000 CALL DMKSCNVU GET COMMUNICATORS VDEVBLOK @V60B6B8 00542000 BZ GOTCOMDV YES, FOUND IT @V60B6B8 00543000 LR R11,R3 RESET VMBLOK POINTER @V60B6B8 00544000 B EMSG071 PUT OUT ERROR MSG @VMI2020 00545000 GOTCOMDV EQU * GOT COMMUNICATIONS DEVICE @V60B6B8 00546000 USING VDEVBLOK,R8 GPR 8 SET BY DMKSCN @V60B6B8 00547000 OI VDEVINTS,ATTN SET ATTENTION PENDING @V60B6B8 00548000 OI VDEVSTAT,VDEVPEND SET INTERRUPT PENDING @V60B6B8 00549000 OI VMPEND,VMIOPND SET I/O PENDING IN VMBLOK @V60B6B8 00550000 LH R4,VDEVADD DEVICE ADDR @V60B6B8 00551000 L R5,INTMASKS INTERRUPT MASK ADDR @V60B6B8 00552000 AR R4,R4 DEV ADDR BY 2 - WIDTH OF MASK @V60B6B8 00553000 * TABLE 00554000 AR R4,R5 SLOT IN INT MASK TABLE @V60B6B8 00555000 OC VCUDVINT-VCUBLOK(2,R7),0(R4) PUT DEV INT IN CU @V60B6B8 00556000 LH R4,VCUADD-VCUBLOK(R7) CU ADDR @V60B6B8 00557000 SRL R4,3 DIVIDE BY 8 @VA10370 00558000 * ENTRY 00559000 AR R4,R5 SLOT IN MASK TABLE @V60B6B8 00560000 OC VCHCUINT-VCHBLOK(2,R6),0(R4) PUT CU INT IN CH @V60B6B8 00561000 LH R4,VCHADD-VCHBLOK(R6) CH ADDR @V60B6B8 00562000 SRL R4,7 DIVIDE BY 128 @VA10370 00563000 AR R4,R5 SLOT IN MASK TABLE @V60B6B8 00564000 OC VMIOINT(2),0(R4) PUT CH INT IN VMBLOK @V60B6B8 00565000 LR R1,R11 GET COMM VMBLOK @VA11573 00566100 LR R11,R3 GET CURRENT VMBLOK @VA11573 00566200 SWTCHVM @VA11573 00566300 TM MSSFLAG1,RELINQSH RELINQUISH REQUEST @VA13058 00566350 BZ RETSAVE NO, RETURN SAVEAREA IF NECESSARY @VA13058 00566400 LA R0,CPEXSIZE GET CPEXBLOK @VA13058 00566450 CALL DMKFREE ... @VA13058 00566500 USING CPEXBLOK,R1 ... @VA13058 00566550 XC CPEXBLOK(CPEXSIZE*8),CPEXBLOK CLEAR BLOCK @VA13058 00566600 ST R11,CPEXR11 ADDRESS OF COMMUNICATOR VMBLOK @VA13058 00566650 LA R2,GODSPCH1 DISPATCH COMMUNICATOR VMBLOK @VA13058 00566700 ST R2,CPEXADD CPEXBLOK RETURN ADDRESS @VA13058 00566750 CALL DMKSTKCP STACK CPEXBLOK @VA13058 00566800 B SSSRLEND EXIT TO CALLER @VA13058 00566850 DROP R1 DROP CPEXBLOK ADDRESSABILITY @VA13058 00566900 GODSPCH EQU * @V60B6B8 00567000 * 00568100 * IF THE ENTRY WAS FOR A DISMOUNT AND MOUNT, THE SAVE 00568500 * AREA WILL NOT BE RETURNED AT THIS TIME SINCE THE 00568900 * INFORMATION WILL BE NEEDED FOR THE MOUNT REQUEST. 00569300 * OTHERWISE WE WILL RETURN THE SAVE AREA SINCE WE ARE 00569700 * NOT RETURNING THROUGH THE STANDARD SVC LINKAGE. 00570100 * 00570500 TM MSSFLAG1,RELINQSH THIS A RELINQUISH REQUEST? @VA11344 00570600 BO SSSRLEND YES - THEN DON'T GO TO @VA11344 00570700 * DISPATCHER; RETURN TO CALLER 00570800 RETSAVE TM MSSFLAG1,MSSSAVE RETURN SAVE AREA NOW ? @VA13058 00570900 BNZ GODSPCH1 NO..EXIT WITHOUT RETURNING SAVE @VA10862 00571300 SR R0,R0 @V60B6B8 00572000 ST R0,SAVER12 CLEAR RTN PTR IN SAVEAREA @V60B6B8 00573000 SVC 16 CAUSE THE SAVEAREA TO BE RETURNED@V60B6B8 00574000 GODSPCH1 EQU * @VA10862 00574100 GOTO DMKDSPCH WAIT FOR MOUNT TO COMPLETE @V60B6B8 00575000 DROP R10 @V60B6B8 00576000 DROP R8 @V60B6B8 00577000 EMSG071 EQU * PRINT MSG 071, SET RC = 8, RETURN@VMI2020 00578000 L R2,OPTION71 MSG WRITER OPTIONS @VMI2020 00579000 SR R1,R1 NO VARIABLE DATA @V60B6B8 00580000 SR R0,R0 DATA LENGTH 0 @V60B6B8 00581000 ICM R0,14,DMKSSS+3 MODULE ID 'SSS' @V60B6B8 00582000 CALL DMKERMSG WRITE THE MESSAGE @V60B6B8 00583000 B TROUBS GO FRET BLOKS AND RETURN @VA11436 00584010 SPACE 00585010 COMBLD DS 0H @VA11436 00585020 ST R14,RETNADDR SAVE CALLERS RETURN ADDR @VA11436 00585030 LA R0,MSSSIZE NO OF D-WORDS IN AN MSSCOM @V60B6B8 00586000 CALL DMKFREE GET DYNAMIC STORAGE @V60B6B8 00587000 USING OSVSCOM,R1 ASSEMBLER ADDRESSABILITY @V60B6B8 00588000 XC OSVSCOM(MSSSIZE*8),OSVSCOM CLEAR THE STORAGE @V60B6B8 00589000 L R10,VSERADDR ADDR OF VOLSER @VA11253 00590100 MVC MSSSER(VOLSERL),0(R10) PUT VOLSER IN MSSCOM @VA11253 00590200 ST R1,VSERADDR SAVE MSSCOM ADDR FOR CALLER @V60B6B8 00592000 L R10,RDEVADDR RDEVBLOK ADDR SET BY CALLER @VA11253 00593100 SR R15,R15 @V60B6B8 00594000 LH R15,RDEVADD-RDEVBLOK(R10) DEVICE ADDR @VA11253 00595100 L R14,RDEVCUA-RDEVBLOK(R10) RCUBLOK ADDR @VA11253 00595200 LH R0,RCUADD-RCUBLOK(R14) CU ADDR @V60B6B8 00597000 OR R15,R0 CU-DEV ADDR @V60B6B8 00598000 TM RCUTYPE-RCUBLOK(R14),RCUSUB SUBORD. CU @V60B6B8 00599000 BZ GOTPRIME NO, THIS IS PRIME @V60B6B8 00600000 L R14,RCUPRIME-RCUBLOK(R14) PRIME RCUBLOK @V60B6B8 00601000 GOTPRIME EQU * GET CHANNEL ADDR @V60B6B8 00602000 L R14,RCUCHA-RCUBLOK(R14) CHBLOK ADDR @V60B6B8 00603000 LH R0,RCHADD-RCHBLOK(R14) CH ADDR @V60B6B8 00604000 OR R15,R0 CH-CU-DEV @V60B6B8 00605000 STH R15,MSSVUA INTO MSSCOM @V60B6B8 00606000 MVC MSSUSER(8),VMUSER USERID INTO MSSCOM @V60B6B8 00607000 LR R10,R1 SET UP R10 FOR THE CALLER @VA11436 00607010 SR R15,R15 @V60B6B8 00608000 L R14,RETNADDR RETURN ADDR SET BY CALLER @V60B6B8 00609000 BR R14 RETURN TO CALLER @V60B6B8 00610000 DROP R1 @V60B6B8 00611000 EJECT 00612000 * 00613000 * 00614000 * ENTRY POINT DMKSSSL2 00615000 * 00616000 * 00617000 * ENTRY CONDITIONS - 00618000 * 00619000 * GPR 9 = UDEVBLOK PTR 00620000 * GPR 11 = VMBLOK PTR 00621000 * GPR 12 = DMKSSSL2 ADDR 00622000 * GPR 13 = SAVEAREA PTR 00623000 * 00624000 * ENTRY IS VIA A CALL (SVC 8) FROM DMKLOG. 00625000 * 00626000 * EXIT CONDITIONS - 00627000 * 00628000 * DEFINED UNDER ENTRY POINT DMKSSSL1 00629000 * 00630000 * CALLS TO EXTERNAL ROUTINES - 00631000 * 00632000 * NONE 00633000 * 00634000 * OPERATION - 00635000 * 00636000 * 1) PICK UP THE REQUESTED REAL ADDRESS, GO TO LABEL 00637000 * CALLALLC IN DMKSSSL1. 00638000 * 00639000 DMKSSSL2 RELOC @V60B6B8 00640000 USING UDEVBLOK,R9 GPR 9 SET BY DMKLOG @V60B6B8 00641000 LH R1,UDEVLINK 'RADDR' SPECIFIED BY USER @V60B6B8 00642000 MVC SAVRETAD(4),LOGADDR SAVE DMKLOG RETURN ADDR @V60B6B8 00643000 B CALLALLC GO FIND RDEVBLOK @V60B6B8 00644000 EJECT 00645000 * 00646000 * 00647000 * ENTRY POINT DMKSSSL3 00648000 * 00649000 * 00650000 * ENTRY CONDITIONS - 00651000 * 00652000 * GPR 9 = UDEVBLOK PTR 00653000 * GPR 11 = VMBLOK PTR 00654000 * GPR 12 = DMKSSSL3 ADDR 00655000 * GPR 13 = SAVEAREA PTR 00656000 * 00657000 * ENTRY IS VIA CALL (SVC 8) FROM DMKLOG 00658000 * 00659000 * EXIT CONDITIONS - 00660000 * 00661000 * DEFINED UNDER ENTRY POINT DMKSSSL1 00662000 * 00663000 * CALLS TO EXTERNAL ROUTINES - 00664000 * 00665000 * NONE 00666000 * 00667000 * 00668000 * OPERATION - 00669000 * 00670000 * DMKLOG HAS FOUND A DEDICATE STATEMENT WHICH 00671000 * CONTAINS A 'VOLID' BUT NO 'RADDR'. 00672000 * 00673000 * 1) FIND AN AVAILABLE 3330V WITH A FEATURE 'SYSVIRT'. 00674000 * IF ONE CAN NOT BE FOUND, ISSUE MESSAGE 082E AND RETURN. 00675000 * 00676000 * 2) ENTER DMKSSSL1 ROUTINE AT LABEL SCNVOL TO SEE IF 00677000 * 'VOLID' IS MOUNTED. 00678000 * 00679000 DMKSSSL3 RELOC @V60B6B8 00680000 MVI VSERADDR,SYSVIRT INDICATE VIRTUAL 3330V NEEDED @V60B6B8 00681000 MVC SAVRETAD(4),LOGADDR SAVE DMKLOG RETURN ADDR @V60B6B8 00682000 LA R7,SSSL3RET LOAD OUR RETURN ADDRESS @VA10862 00683100 B FINDRDEV TRY TO ALLOCATE AN RDEVBLOK @V60B6B8 00685000 SSSL3RET EQU * RETURN FROM FINDRDEV @V60B6B8 00686000 LTR R15,R15 DID HE FIND ONE @V60B6B8 00687000 BNZ EMSG070 MESSAGE: NO DEVICES AVAIL. @VMI2020 00688000 L R5,VSERADDR @VMI2003 00689000 B BLDCOMMT NOW LOOK FOR VOLID @V60B6B8 00690000 EMSG070 EQU * WRITE MSG DMKSSS070E @VMI2020 00691000 SR R0,R0 MSG INSERT LENGTH 0 @VMI2008 00692000 SR R1,R1 NO MSG INSERT @VMI2008 00693000 ICM R0,14,DMKSSS+3 MODULE ID @VMI2008 00694000 L R2,OPTION70 MSG WRITER OPTIONS @VMI2020 00695000 CALL DMKERMSG PUT OUT MESSAGE @VMI2008 00696000 B DISASTER RET WITH R. C. 8 @VMI2008 00697000 EJECT 00698000 * 00699000 * THE FOLLOWING SUBROUTINE TRIES TO FIND AN AVAILABLE 00700000 * RDEVBLOK OF THE CORRECT TYPE. 00701000 * 00702000 * ON INPUT, VSERADDR = REQUEST TYPE (VIRTUAL OR 00703000 * SYSVIRT) AND RDEVADDR = RETURN ADDR. 00704000 * REG 7 CONTAINS RETURN ADDRESS 00704100 * 00705000 * ON EXIT, IF SUCCESSFUL, GPR 15 = 0 AND VSERADDR 00706000 * CONTAINS THE ALLOCATED RDEVBLOK ADDR. IF NOT 00707000 * SUCCESSFUL, GPR 15 = 8. 00708000 * 00709000 FINDRDEV EQU * FIND A REAL DEVICE @V60B6B8 00710000 L R5,ARIODV ADDR FIRST RDEVBLOK @V60B6B8 00711000 L R6,ARIODC ADDR OF COUNT OF BLOCKS @V60B6B8 00712000 LH R6,0(R6) ACTUAL COUNT OF BLOCKS @V60B6B8 00713000 MVC RETNADDR(4),ZEROES CLEAR FOR POSSIBLE USE LATER @V60B6B8 00714000 FRSTSCAN EQU * LOOK FOR TOTALLY FREE RDEVBLOK @V60B6B8 00715000 USING RDEVBLOK,R5 SET ASSEMBLER ADDRESSABILITY @V60B6B8 00716000 CLC RDEVTYPC(2),=AL1(CLASDASD,TYP3330) IS IT 3330 @V60B6B8 00717000 BNE BUMPCNT1 NO, GO BUMP INDEX COUNT @V60B6B8 00718000 MVC VSERADDR+1(1),RDEVFTR REAL DEV FEATURE @V60B6B8 00719000 NI VSERADDR+1,VIRTUAL+SYSVIRT TEST ONLY THESE BITS @V60B6B8 00720000 CLC VSERADDR+1(1),VSERADDR IS RDEV WHAT HE WANTS @V60B6B8 00721000 BNE BUMPCNT1 NO, GO BUMP THE COUNT @V60B6B8 00722000 TM RDEVSTAT,RDEVDISA+RDEVDED OFFLINE OR DEDICATED @V60B6B8 00723000 BNZ BUMPCNT1 CAN'T BE AVAILABLE @V60B6B8 00724000 TM RDEVFLAG,RDEVSYS+RDEVOWN+RDEVSEL BELONG TO @V60B6B8 00725000 * SYSTEM 00726000 BNZ BUMPCNT1 YES, CAN'T BE AVAILABLE @V60B6B8 00727000 CLI RDEVSER,X'40' IS A VOLUME MOUNTED @V60B6B8 00728000 BE GOTFREE FOUND A FREE RDEVBLOK @V60B6B8 00729000 ST R5,RETNADDR SAVE FOR POSSIBLE RE-ALLOCATION @V60B6B8 00730000 BUMPCNT1 EQU * BUMP TO NEXT RDEVBLOK @V60B6B8 00731000 LA R5,RDEVSIZE*8(R5) NEXT RDEVBLOK IN CHAIN @V60B6B8 00732000 BCT R6,FRSTSCAN GET IT IF THERE IS ONE @V60B6B8 00733000 L R5,RETNADDR DID WE SAVE AN ADDRESS @V60B6B8 00734000 LTR R5,R5 POSSIBLE RDEVBLOK @V60B6B8 00735000 BNZ REUSEVOL YES, WE CAN REUSE A BLOCK @V60B6B8 00736000 ERRNOBLK EQU * NO RDEVBLOK AVAILABLE @V60B6B8 00737000 LA R15,RCERROR SET RETURN CODE @V60B6B8 00738000 RDEVEXIT EQU * NOW RETURN @V60B6B8 00739000 BR R7 RETURN TO CALLER @VA10862 00740100 * 00742000 * WE HAVE AN RDEVBLOK ON WHICH A VOLUME IS MOUNTED BUT 00743000 * NOT IN USE. DEMOUNT THE VOLUME, THEN REUSE THE BLOCK 00744000 * 00745000 REUSEVOL EQU * GET CURRENT VOLUME DEMOUNTED @V60B6B8 00746000 ST R5,RDEVDEMT RDEVBLOK ADDR FOR DEMOUNT @V60B6B8 00747000 BAL R14,DEMOUNTV GO DO THE DEMOUNT @VA11436 00748010 * 00751000 * THE CURRENT RDEVBLOK CAN NOW BE USED 00752000 * 00753000 GOTFREE EQU * WE HAVE A TOTALLY FREE RDEVBLOK @V60B6B8 00754000 ST R5,RETNADDR SAVE RDEVBLOK ADDR @V60B6B8 00755000 TM RDEVFTR,VIRTUAL IS THIS A VIRTUAL RDEV @V60B6B8 00756000 BO ALLCVIRT YES @V60B6B8 00757000 B ALLCRET GO SET UP RETURN @V60B6B8 00758000 ALLCVIRT EQU * ALLOC VIRTUAL @V60B6B8 00759000 ST R11,RDEVUSER POINT TO USER'S VMBLOK @V60B6B8 00760000 MVC RDEVATT(2),UDEVADD SET VIRT DEV ADDR @V60B6B8 00761000 ALLCRET EQU * READY TO RETURN @V60B6B8 00762000 ST R5,VSERADDR SAVE RDEVBLOK ADDR @V60B6B8 00763000 OI RDEVFLAG,RDEVSEL DEVICE IS SELECTED @V60B6B8 00764000 MVC RDEVSER(6),BLANKS CLEAR THE VOL SER @V60B6B8 00765000 SR R15,R15 SET GOOD RETURN CODE @V60B6B8 00766000 B RDEVEXIT AND RETURN @V60B6B8 00767000 DROP R5 @VMI2008 00768000 EJECT 00769000 RCERROR EQU 8 UNCORRECTABLE ERROR RET CODE @V60B6B8 00770000 CLEAR EQU X'00' USED TO CLEAR A FLAG BYTE @V60B6B8 00771000 EJECT 00772000 * 00773000 * 00774000 * ENTRY POINT DMKSSSHV 00775000 * 00776000 * 00777000 * ENTRY CONDITIONS - 00778000 * 00779000 * ENTRY IS FROM DMKHVC VIA A CALL (SVC 8). A VIRTUAL 00780000 * MACHINE HAS ISSUED A DIAGNOSE INSTRUCTION WITH 00781000 * A REQUEST CODE OF X'78'. 00782000 * 00783000 * GPR 5 = ADDR OF VALUE CONTAINED IN 'R1'-SET BY DMKHVC 00784000 * GPR 6 = ADDR OF VALUE CONTAINED IN 'R2'-SET BY DMKHVC 00785000 * GPR 11 = USER'S VMBLOK ADDR 00786000 * GPR 12 = ADDR OF DMKSSSHV 00787000 * GPR 13 = ADDR OF SAVEAREA 00788000 * 00789000 * EXIT CONDITIONS - 00790000 * 00791000 * CC0 - OK 00792010 * CC1 - RC4 - SUBFUNCTION CODE IS < 0 OR > 16 00792020 * - RC8 - SUBFUNCTION CODE IS NOT A MULTIPLE OF FOUR 00792030 * - RC12 - ADDR EXCEPTION BRINGING IN BUFFER PAGE 00792040 * - RC16 - ISSUER IS NOT THE USER WHO DID SUBFUNCTION 0 00792050 * 00793000 * CALLS TO EXTERNAL ROUTINES - 00794000 * 00795000 * DMKPTRAN - GET THE CALLER'S BUFFER 00796000 * DMKFRET - RETURN STORAGE FOR CONTROL BLOCKS 00797000 * DMKERMSG - WRITE A MESSAGE TO THE USER 00798000 * DMKSTKCP - STACK A CPEXBLOK AFTER MSS PROCESSING 00799000 * 00800000 * OPERATION - 00801000 * 00802000 * SEE EACH SUBROUTINE FOR THE INDIVIDUAL SUBFUNCTION CODES 00803000 * 00804000 DMKSSSHV RELOC CALL FROM DMKHVC @V60B6B8 00805000 * 00806000 * THE DIAGNOSE CODE 78 SUB-FUNCTION CODE IS IN THE 00807000 * USER'S GPR SPECIFIED AS GPR2 IN THE DIAGNOSE 00808000 * INSTRUCTION. DMKHVC HAS POINTED OUR GPR 6 00809000 * TO THE DATA CONTAINED IN THE VIRTUAL MACHINE'S 00810000 * GPR 2. THE VALID SUB-FUNCTIONS ARE: 00811000 * 00812000 * 0 - USER IS THE COMMUNICATOR VIRT MACHINE. 00813000 * 00814000 * 4 - USER IS READY TO PROCESS AN MSSCOM 00815000 * 00816000 * 8 - USER HAS PROCESSED THE MSSCOM WITH NO ERROR 00817000 * 00818000 * 12 - USER HAS PROCESSED THE MSSCOM WITH AN ERROR 00819000 * 00820000 * 16 - COMMUNICATOR IS NO LONGER AVAILABLE 00821000 * 00822000 * GET THE SUB-FUNCTION CODE AND USE IT AS AN INDEX INTO 00823000 * A BRANCH TABLE TO THE CORRECT PROCESSING ROUTINE. 00824000 * 00825000 TM 3(R6),X'03' CODE A MULTIPLE OF FOUR? @VA11367 00825010 BZ MULTFOUR YES - OK @VA11367 00825020 LA R15,RC8 GET APPROP RC @VA11367 00825030 B BADINPUT GIVE CC1 @VA11367 00825040 MULTFOUR DS 0H CONTINUE @VA11367 00825050 L R7,0(R6) GET SUB-FUNCTION CODE @V60B6B8 00826000 LTR R7,R7 TEST THE VALUE PASSED @V60B6B8 00827000 BM BADSFID SFID CAN'T BE MINUS @V60B6B8 00828000 LA R1,HIGHSFID HIGHEST VALID CODE @V60B6B8 00829000 CR R7,R1 IS CURRENT OK @V60B6B8 00830000 BH BADSFID NO, TOO HIGH @V60B6B8 00831000 B HVCSUB(R7) GO TO PROPER SUBROUTINE @V60B6B8 00832000 HVCSUB EQU * BRANCH TABLE @V60B6B8 00833000 B HVC00ENT CODE 0 @V60B6B8 00834000 B HVC04ENT CODE 4 @V60B6B8 00835000 B HVC08ENT CODE 8 @V60B6B8 00836000 B HVC08ENT CODE 12 - PROCESS AS 08 @V60B6B8 00837000 B HVC16ENT CODE 16 @V60B6B8 00838000 BADSFID EQU * @V60B6B8 00839000 LA R15,RC4 SET RETURN CODE @V60B6B8 00840000 BADINPUT DS 0H @VA11367 00840010 ST R15,VMGPRS+60 SET RC FOR VIRT MACH @V60B6B8 00841000 OI VMPSW+2,X'10' SET COND CODE 1 @V60B6B8 00842000 B HVCEXIT AND DISPATCH VIRT MACH @V60B6B8 00843000 BADADDR DS 0H @VA11434 00843010 LA R15,RC12 INDICATE BAD BUFFER ADDR @VA11434 00843020 B BADINPUT GO SET UP FOR RETURN CC1 @VA11434 00843030 VALIDCHK EQU * @V60B6B8 00844000 L R0,COMMVMAD COMM VIRT MACH VMBLOK @V60B6B8 00845000 CR R0,R11 IS CURRENT USER LEGAL @V60B6B8 00846000 BER R1 IF SAME USER RETURN @VA11367 00847010 LA R15,RC16 INDICATE PROPER RC @VA11367 00847020 B BADINPUT AND RETURN WITH CC1 TO PHONNIE @VA11367 00847030 EJECT 00849000 * 00850000 * ENTRY SUB-FUNCTION OF ZERO 00851000 * 00852000 * VIRTUAL MACHINE GPR1 CONTAINS THE VIRT ADDRESS TO 00853000 * BE USED FOR MSS COMMUNICATIONS 00854000 * 00855000 * OPERATION - 00856000 * 00857000 * 1) SAVE THE REQUIRED POINTERS TO THE COMMUNICATION 00858000 * VIRTUAL MACHINE IN THE DMKSSS ANCHORS 00859000 * 00860000 HVC00ENT EQU * INITIALIZE FOR MSS COMMUNICATIONS@V60B6B8 00861000 SR R0,R0 CLEAR REG 0 @VA11435 00862010 CL R0,COMMVMAD IS THERE A COMM VMBLOK POINTER? @VA11435 00862020 BNZ BADSFID ALREADY HAVE ONE @V60B6B8 00864000 MVC COMMADDR(4),0(R5) GPR 5 SET BY DMKHVC @V60B6B8 00865000 ST R11,COMMVMAD SAVE COMMUNICATOR VMBLOK ADDR @V60B6B8 00866000 MVC COMMNAME(8),VMUSER SAVE VIRT MACH NAME @V60B6B8 00867000 OI PSAMSS,MSSPRES MSS NOW ACTIVE @V60B6B8 00868000 HVCEXIT EQU * RETURN TO DMKHVC @V60B6B8 00869000 SR R15,R15 CLEAR RETURN CODE @V60B6B8 00870000 EXIT AND RETURN @V60B6B8 00871000 EJECT 00872000 * 00873000 * SUB-FUNCTION CODE WAS 4. THE CALLER'S GPR1 POINTS 00874000 * TO A VIRTUAL MACHINE BUFFER INTO WHICH TO PLACE 00875000 * AN MSSCOM BLOCK, OR A FLAG INDICATING NO MSS WORK 00876000 * IS WAITING. 00877000 * 00878000 * OPERATION - 00879000 * 00880000 * 1) GET THE CALLER'S BUFFER ADDRESS, CALL DMKPTRAN 00881000 * IF NECESSARY TO GET THE USER BUFFER, AND PLACE THE 00882000 * NEXT MSSCOM IN THE USER BUFFER. 00883000 * 00884000 HVC04ENT EQU * SUB-FUNCTION CODE 4 @V60B6B8 00885000 BAL R1,VALIDCHK IS USER VALID @V60B6B8 00886000 L R1,0(R5) VIRT ADDR OF BUFFER @V60B6B8 00887000 LR R7,R11 SAVE CALLER'S VMBLOK @V60B6B8 00888000 L R11,COMMVMAD COMM VMBLOK @V60B6B8 00889000 TRANS 2,1,OPT=(BRING,DEFER),ADEX=BADADDR @VA11434 00890010 LR R11,R7 RESET BASE VMBLOK PTR @V60B6B8 00891000 ADDROK1 EQU * REAL BUFFER ADDR IN GPR 2 @V60B6B8 00892000 L R3,DMKSSSMQ Q OF WAITING MSSCOM BLOCKS @V60B6B8 00893000 LTR R3,R3 IS THERE A Q @V60B6B8 00894000 BZ QMT NO @V60B6B8 00895000 TSTRQENT EQU * @V60B6B8 00896000 TM MSSFLAG2-OSVSCOM(R3),RQENT IS THIS REQ WAITING @VA09302 00897000 BO GIVEIT YES, USE IT @V60B6B8 00898000 L R3,MSSNEXT-OSVSCOM(R3) NEXT ENTRY @V60B6B8 00899000 LTR R3,R3 IS THERE ONE @V60B6B8 00900000 BZ QMT NO @V60B6B8 00901000 B TSTRQENT TEST THE NEXT ONE @V60B6B8 00902000 GIVEIT EQU * @V60B6B8 00903000 NI MSSFLAG2-OSVSCOM(R3),X'FF'-RQENT @VA09302 00904000 OI MSSFLAG2-OSVSCOM(R3),INPROC @VA09302 00904100 MVC 0(MSSSIZE*8,R2),0(R3) PUT MSSCOM BLOCK IN USER @V60B6B8 00906000 * MACHINE 00907000 B HVCEXIT @V60B6B8 00908000 QMT EQU * THE DMKSSSRQ IS EMPTY @V60B6B8 00909000 XC 0(MSSSIZE*8,R2),0(R2) CLEAR CALLER'S FLAGS @V60B6B8 00910000 B HVCEXIT @V60B6B8 00911000 EJECT 00912000 * 00913000 * THE ENTRY SUB-FUNCTION CODE WAS 08 OR 12. THE 00914000 * CALLER'S GPR 1 POINTS TO AN MSSCOM FOR WHICH THE 00915000 * MSS HAS COMPLETED. 00916000 * 00917000 * OPERATION - 00918000 * 00919000 * 1) GET THE CALLER'S BUFFER ADDRESS, CALL DMKPTRAN IF 00920000 * NECESSARY, AND GET THE COMPLETED MSSCOM. 00921000 * 00922000 * 2) IF THERE WAS AN ERROR, THE ORIGINAL REQUESTOR 00923000 * IS GIVEN CONTROL WITH RC = 8. 00924000 * 00925000 * 3) IF THE REQUEST IS FOR A MOUNT, THE BLOCK IS 00926000 * QUEUED FROM DMKSSSMQ. 00927000 * 00928000 * 4) CONTROL IS RETURNED TO THE ORIGINAL REQUESTOR. 00929000 * 00930000 HVC08ENT EQU * GET THE MSSCOM @V60B6B8 00931000 BAL R1,VALIDCHK @V60B6B8 00932000 LR R7,R11 SAVE CALLER'S VMBLOK BASE @V60B6B8 00933000 L R11,COMMVMAD COMMUN VMBLOK ADDR @V60B6B8 00934000 L R1,0(R5) VIRT MACH ADDR OF MSSCOM @V60B6B8 00935000 TRANS 2,1,OPT=(BRING,DEFER),ADEX=BADADDR @VA11434 00936010 LR R11,R7 RESTORE GOOD VMBLOK BASE @V60B6B8 00937000 ADDROK2 EQU * REAL ADDR OF MSSCOM NOW IN GPR 2 @V60B6B8 00938000 USING OSVSCOM,R2 TELL THE ASSEMBLER @V60B6B8 00939000 TM MSSFLAG1,DEMOUNT WAS THIS A DEMOUNT @VA11429 00939100 BZ NOTDEMNT NO @VA11429 00939200 LH R1,MSSVUA GET REAL DEVICE ADDRESS @VA11429 00939300 CALL DMKSCNRU GET RDEVBLOK @VA11429 00939400 LTR R8,R8 IS THERE ONE @VA11429 00939500 BNP NOTDEMNT NO @VA11429 00939600 USING RDEVBLOK,R8 @VA11429 00939700 NI RDEVFLAG,X'FF'-RDEVSEL TURN OFF SELECTED FLAG @VA11429 00939800 TM MSSFLAG1,MSSERR WAS THERE AN MSS ERROR? @VA11344 00939820 BO NOTDEMNT YES - THEN DON'T RESET THE @VA11344 00939840 * 'MOUNTED-BY-CP' FLAG 00939860 NI RDEVFLAG,X'FF'-RDEVVMNT RESET 'MTD-BY-CP' FLAG @VA11344 00939880 NOTDEMNT EQU * @VA11429 00939900 TM MSSFLAG1,MSSERR WAS THERE AN MSS ERROR @VA09302 00940000 BZ MNTCOM GO SEE IF IT WAS A MOUNT MSSCOM @V60B6B8 00941000 L R1,DMKSSSMQ FIRST MSSCOM IN OUR Q @V60B6B8 00942000 LA R3,DMKSSSMQ POINT TO ANCHOR @V60B6B8 00943000 TESTQA EQU * @V60B6B8 00944000 LR R8,R2 SAVE MSSCOM ADDR FROM VS @VMI2008 00945000 CLC 0(8,R2),0(R1) IS THIS THE ONE WITH THE ERROR @V60B6B8 00946000 BE RESETMQR YES, NOW RESET BASE REG @V60B6B8 00947000 LA R3,MSSNEXT-OSVSCOM(R1) SAVE CHAINING PTR @V60B6B8 00948000 L R1,MSSNEXT-OSVSCOM(R1) NEXT BLOK OUR Q @V60B6B8 00949000 LTR R1,R1 IS THERE ONE @V60B6B8 00950000 BZ HVCEXIT NO, ERROR ON NON-EXISTANT @V60B6B8 00951000 B TESTQA CHECK REST OF Q @V60B6B8 00952000 RESETMQR EQU * POINT TO REAL BLOK, NOT COPY @V60B6B8 00953000 MVC 0(4,R3),MSSNEXT-OSVSCOM(R1) CHAIN NEXT TO @V60B6B8 00954000 * PREVIOUS 00955000 LR R2,R1 @V60B6B8 00956000 L R9,0(R3) NEXT MSSCOM BLOCK IN Q @VMI2008 00957000 L R1,MSSTASK1 ADDR OF EXBLOK FOR LNK, LOG, OR @V60B6B8 00958000 * VDA 00959000 TM MSSFLAG1,MSSSAVE SAVE AREA NEED TO BE RETURNED ?@VA10862 00959100 BZ NORETURN NO..THEN BYPASS THIS @VA10862 00959150 LR R6,R13 SAVE R13 ACROSS CALL @VA10862 00959200 L R13,CPEXR13-CPEXBLOK(R1) LOAD SAVE AREA ADDRESS @VA10862 00959250 * FROM DISMOUNT 00959300 SR R0,R0 ZERO REG 0 @VA10862 00959350 ST R0,CPEXR13-CPEXBLOK(R1) REFLECT IN CPEXR13 @VA10862 00959400 ST R0,SAVER12 KEEP FROM UNLOCKING PAGE @VA10862 00959450 SVC 16 AND RETURN IT @VA10862 00959500 LR R13,R6 RESTORE SAVE AREA POINTER @VA10862 00959550 NORETURN EQU * @VA10862 00959600 LA R0,CPEXSIZE EXBLOK SIZE @V60B6B8 00960000 CALL DMKFRET RETURN BLOCK - NEVER BE @V60B6B8 00961000 * DISPATCHED 00962000 LA R0,8 LENGTH OF USERID @V60B6B8 00963000 LA R1,MSSUSER MSSCOM USER @V60B6B8 00964000 CALL DMKSCNAU SEE IF USER STILL AROUND @V60B6B8 00965000 BC 6,NOUSER1 VMBLOK IS NO LONGER @VA11270 00966010 LR R6,R2 SAVE MSSCOM ADDRESS FOR LATER @VMI0087 00967000 LR R7,R11 SAVE CURRENT VMBLOK @V60B6B8 00968000 LR R11,R1 USER TO RECEIVE MESSAGE @VMI0087 00969000 LH R1,MSSRC-OSVSCOM(R8) REASON CODE @VA11320 00970100 CALL DMKCVTBH CONVERT BINARY TO HEX @VA11320 00970200 SLR R0,R0 CLEAR FOR ERM @VA11320 00970300 ICM R0,14,DMKSSS+3 MODULE ID @V60B6B8 00971000 L R2,OPTION73 MSG WRITER OPTIONS @VMI2020 00973000 CALL DMKERMSG @V60B6B8 00974000 LR R11,R7 RESTORE PREVIOUS VMBLOK @V60B6B8 00975000 LR R2,R6 RESTORE MSSCOM ADDRESS @VMI0087 00976000 LA R15,RCERROR ERROR RETURN CODE @V60B6B8 00978000 L R1,MSSTASK2 CPEXBLOK ADDRESS @VMI0087 00979000 LTR R1,R1 IS THERE A VALID PTR @VMI2021 00980000 BNZ STORERC YES, THIS IS INITIAL REQ @VMI2021 00981000 L R1,MSSTASKD PTR IF DUP MOUNT REQ @VA09302 00982000 STORERC EQU * SET UP RET CODE FOR CALLER @VMI2021 00983000 ST R15,CPEXR0-CPEXBLOK(R1) SAVE RET CODE @VMI2021 00984000 CALL DMKSTKCP @V60B6B8 00985000 NOUSER2 DS 0H @VA11270 00985010 LR R1,R2 MSSCOM ADDRESS TO R1 @VMI0087 00986000 LA R0,MSSSIZE SIZE OF MSSCOM IN DBLWDS. @VMI0087 00987000 CALL DMKFRET RELEASE MSSCOM @VMI0087 00988000 LR R2,R8 VS'S MSSCOM ADDR @VMI2008 00989000 *FIND THE RDEV AND TURN OFF RDEVSEL FLAG... 00990000 USING RDEVBLOK,R8 TELL ASSEMBLER ... @VA09305 00990050 L R8,ARIODV FIRST RDEVBLOK @VA09305 00990100 L R15,ARIODC @VA11173 00990175 LH R0,0(,R15) @VA11173 00990225 CHKRDV EQU * @VA09305 00990250 CALL DMKSCNRD GET THE CUU OF THIS RDEV @VA09305 00990300 LH R15,MSSVUA GET VUA FOR MSSCOM IN ERROR @VA09305 00990350 CR R1,R15 SAME DEVICE ADDRESS? @VA09305 00990400 BZ FRERDV YES, GO FREE FOR FUTURE USE @VA09305 00990450 LA R8,RDEVSIZE*8(R8) POINT NEXT RDEV @VA09305 00990500 BCT R0,CHKRDV LOOK AT NEXT RDEV IF ONE @VA09305 00990550 B NORDV PROBLEM, CAN'T FIND IT-CONTINUE @VA09305 00990600 FRERDV EQU * FOUND A FREE ONE,TURN OFF FLAG @VA09305 00990650 NI RDEVFLAG,X'FF'-RDEVSEL TURN OFF RDEVSEL FLAG @VA09305 00990700 DROP R8 @VA09305 00990750 NORDV EQU * CONTINUE ON ... @VA09305 00990800 LR R1,R9 NEXT MSSCOM IN Q @VA09305 00990850 LTR R1,R1 IS THERE ANOTHER Q ENTRY @VMI2008 00991000 BZ HVCEXIT NO @VMI2008 00992000 B TESTQA SEEE IF WAITING FOR SAME VOL @VMI2008 00993000 SPACE 00993010 NOUSER1 DS 0H HERE IF THE USER HAS DEPARTED @VA11270 00993020 ICM R1,15,MSSTASK2 GET THE REMAINING CPEXBLOK @VA11270 00993030 BNZ NOUSER3 WAS IT HERE @VA11270 00993040 L R1,MSSTASKD OR WAS IT FOR A DUP @VA11270 00993050 NOUSER3 DS 0H GOTTA GET RID OF IT ANYWAY @VA11270 00993060 LA R0,CPEXSIZE GET THE 'HOW MUCH' BITS @VA11270 00993070 CALL DMKFRET AND UNLOAD IT @VA11270 00993080 B NOUSER2 NOW GO GET RID OF MSSCOM @VA11270 00993090 SPACE 00993100 MNTCOM EQU * @V60B6B8 00994000 TM MSSFLAG1,MOUNT WAS IT A MOUNT REQUEST @VA09302 00995000 BZ RETUSER NO, RETURN TO CALLER @V60B6B8 00996000 L R1,DMKSSSMQ CURRENT ENTRY IN MOUNT Q @V60B6B8 00997000 TESTQ EQU * @V60B6B8 00998000 CLC 0(8,R1),0(R2) IS THIS CORRECT ONE @V60B6B8 00999000 BE SETMQFLG YES @V60B6B8 01000000 L R1,MSSNEXT-OSVSCOM(R1) NEXT Q ENTRY @V60B6B8 01001000 LTR R1,R1 IS THERE ANOTHER @V60B6B8 01002000 BZ HVCEXIT NO, NOTHING TO DO @V60B6B8 01003000 B TESTQ CHECK THIS ONE @V60B6B8 01004000 SETMQFLG EQU * @V60B6B8 01005000 L R0,MSSTASK1-OSVSCOM(R1) CPEXBLOK PTR @V60B6B8 01006000 LTR R0,R0 IS THERE ONE @V60B6B8 01007000 BZ MNTDONE NO, MOUNT COMPLETED ALREADY @V60B6B8 01008000 NI MSSFLAG2-OSVSCOM(R1),X'FF'-RQENT-INPROC @VA09302 01009000 LR R3,R1 SAVE MSSCOM BLOCK ADDR @V60B6B8 01010000 L R4,MSSTASK2-OSVSCOM(R1) CPEXBLOK ADDR @V60B6B8 01011000 OI MSSFLAG2-OSVSCOM(R1),MQENT WAIT FOR MOUNT @VA09302 01012000 LTR R4,R4 MOUNT PEND MSG ALREADY ISSUED? @VA09306 01012100 BNZ MNTGO MOUNT HAS BEEN STARTED ON MSC @VA09306 01012200 * AND IT LOOKS GOOD...BUT MOUNT STILL INCOMPLETE. 01012300 L R4,MSSTASKD-OSVSCOM(R1) RETURN CPEXBLOK ADDR. @VA09302 01012400 LTR R4,R4 IS THERE ONE? @VA09306 01012700 BZ MSSNXT THIS SHOULD NEVER HAPPEN @VA09306 01012800 XC MSSTASKD-OSVSCOM(4,R1),MSSTASKD-OSVSCOM(R1) @VA11135 01013300 B MNTGO1 GO ISSUE MSG, RETURN @VA11135 01013450 MNTGO XC MSSTASK2-OSVSCOM(4,R1),MSSTASK2-OSVSCOM(R1) ... @VA09306 01013500 MNTGO1 EQU * @VA11135 01013550 LA R0,VOLSERL LENGTH OF VOLID @V60B6B8 01014000 ICM R0,14,DMKSSS+3 MODULE ID 'SSS' @V60B6B8 01015000 LA R1,MSSSER VOL SER FOR MSG INSERT @V60B6B8 01016000 L R2,OPTION78 MSG WRITER OPTIONS @VMI2020 01017000 L R11,CPEXR11-CPEXBLOK(R4) REQUESTOR'S VMBLOK BASE@V60B6B8 01018000 OI MSSFLAG2-OSVSCOM(R3),MSGPROC MSC PROC NOT @VA09302 01019000 * COMPLETE 01020000 CALL DMKERMSG PUT OUT THE MSG @V60B6B8 01021000 * 01022000 * STACK A CPEXBLOK FOR AN ASYNCHRONOUS RETURN 01023000 * 01024000 LA R15,RC4 RETURN CODE - MOUNT IN PROCESS @V60B6B8 01025000 ST R15,CPEXR0-CPEXBLOK(R4) SET UP FOR REQUESTOR @V60B6B8 01026000 ST R3,CPEXR1-CPEXBLOK(R4) SAVE MSSCOM ADDRESS @V60B6B8 01027000 LR R1,R4 CPEXBLOK ADDR @V60B6B8 01028000 CALL DMKSTKCP STACK THE CPEXBLOK @V60B6B8 01029000 MSSNXT LR R2,R3 CURRENT MSSCOM ADDRESS @VA09306 01030000 L R1,MSSNEXT-OSVSCOM(R3) CHAIN PTR @VMI2008 01031000 LTR R1,R1 IS THERE ONE @VMI2008 01032000 BZ HVCEXIT NO @VMI2008 01033000 B TESTQ SEE IF FOR SAME VOL @VMI2008 01034000 MNTDONE EQU * @V60B6B8 01035000 * 01036000 * IF THIS CODE IS ENTERED, THEN THE VOLUME MOUNT 01037000 * HAS COMPLETED ALREADY. THE UNSOLICITED DEVICE END HAS 01038000 * BEEN PROCESSED BY DMKDSB, AND THE REQUESTER'S ROUTINE 01039000 * HAS BEEN DISPATCHED. 01040000 * 01041000 LA R3,DMKSSSMQ QUEUE OF MSSCOM BLOCKS @V60B6B8 01042000 FINDCOMX EQU * @V60B6B8 01043000 L R4,0(R3) ADDR OF AN MSSCOM @V60B6B8 01044000 CR R4,R1 IS IT THE ONE WE ARE PROCESSING @V60B6B8 01045000 BE RESETMQA YES, REMOVE CURRENT ENTRY @V60B6B8 01046000 LA R3,MSSNEXT-OSVSCOM(R4) POINT TO NEXT CHAIN FIELD@V60B6B8 01047000 B FINDCOMX AND CHECK IT @V60B6B8 01048000 RESETMQA EQU * @V60B6B8 01049000 MVC 0(4,R3),MSSNEXT-OSVSCOM(R4) RECHAIN BLOCKS @V60B6B8 01050000 LA R0,MSSSIZE SIZE OF MSSCOM @V60B6B8 01051000 LR R1,R4 CURRENT MSSCOM ADDRESS @V60B6B8 01052000 CALL DMKFRET RETURN STORAGE TO SYSTEM @V60B6B8 01053000 L R1,0(R3) NEXT MSSCOM BLOCK @VMI2008 01054000 LTR R1,R1 IS THERE ONE @VMI2008 01055000 BZ HVCEXIT NO @VMI2008 01056000 B TESTQ @VMI2008 01057000 RETUSER EQU * @V60B6B8 01058000 L R1,DMKSSSMQ START OF OUR Q @V60B6B8 01059000 TSTDEMQ EQU * FIND OUR Q ENTRY @V60B6B8 01060000 CLC 0(8,R1),0(R2) IS THIS THE MATCHING ENTRY @V60B6B8 01061000 BE DEMTQENT YES, CONTINUE DEMOUNT @V60B6B8 01062000 L R1,MSSNEXT-OSVSCOM(R1) NEXT ENTRY @V60B6B8 01063000 LTR R1,R1 IS THERE ONE @V60B6B8 01064000 BZ HVCEXIT NO, THROW AWAY INTERRUPT @V60B6B8 01065000 B TSTDEMQ CHECK IT OUT @V60B6B8 01066000 DEMTQENT EQU * REMOVE ENTRY FROM Q @V60B6B8 01067000 LA R3,DMKSSSMQ R3 POINTS TO CHAIN FIELD @V60B6B8 01068000 L R4,0(R3) R4 POINTS TO AN ENTRY @V60B6B8 01069000 REMOVQ EQU * @V60B6B8 01070000 CR R4,R1 IS R4 THE ENTRY TO REMOVE @V60B6B8 01071000 BE REMOVEIT YES @V60B6B8 01072000 LA R3,MSSNEXT-OSVSCOM(R4) POINT TO CHAIN FIELD @V60B6B8 01073000 L R4,MSSNEXT-OSVSCOM(R4) AND GET NEXT ENTRY @V60B6B8 01074000 B REMOVQ TEST IT OUT @V60B6B8 01075000 REMOVEIT EQU * @V60B6B8 01076000 MVC 0(4,R3),MSSNEXT-OSVSCOM(R4) RECHAIN @V60B6B8 01077000 TM MSSFLAG1,RELINQSH THIS A RELINQUISH REQUEST? @VA11344 01077100 BNO NOTRLQSH NO - THEN DON'T FRET REQUEST BLOK@VA11344 01077200 LR R1,R4 ELSE GET MSSCOM ADDR FOR FRET @VA11344 01077300 LA R0,MSSSIZE SIZE OF MSSCOM FOR FRET @VA11344 01077400 CALL DMKFRET FRET THE RELINQUISH REQ AFTER @VA11344 01077500 * PROCESSING IT 01077600 B HVCEXIT NOW RETURN TO ISSUER OF DIAG '78'@VA11344 01077700 NOTRLQSH DS 0H @VA11344 01077800 L R1,MSSTASK1-OSVSCOM(R1) CPEXBLOK ADDR @V60B6B8 01078000 SR R0,R0 CLEAR FOR RET CODE @V60B6B8 01079000 ST R0,CPEXR0-CPEXBLOK(R1) SET RET CODE FOR DEMOUNT @V60B6B8 01080000 CALL DMKSTKCP STACK THE REQUEST @V60B6B8 01081000 EXIT RETURN TO DMKHVC @V60B6B8 01082000 EJECT 01091000 HVC16ENT EQU * @V60B6B8 01092000 * 01093000 * 01094000 * THE SUB-FUNCTION CODE WAS 16. THE MSS COMMUNICATOR 01095000 * PROGRAM (DMKMSS) WILL NO LONGER BE ACTIVE. PURGE ALL 01096000 * MSSCOM REQUESTS WHICH HAVE NOT YET BEEN PROCESSED BY 01097000 * THE MSC. 01098000 * 01099000 * OPERATION - 01100000 * 01101000 * 1) THE QUEUE OF MSSCOM BLOCKS IN DMKSSSRQ IS 01102000 * PROCESSED ONE AT A TIME. FOR EACH ONE, THE ORIGINAL 01103000 * REQUESTOR IS DISPATCHED WITH A RC = 8. 01104000 * 01105000 BAL R1,VALIDCHK @V60B6B8 01106000 L R4,DMKSSSMQ Q OF UNPROCESSED REQUESTS @V60B6B8 01107000 LTR R4,R4 ARE THERE ANY @V60B6B8 01108000 BNZ PURGCOM YES, GET ONE AT A TIME @V60B6B8 01109000 RESETNAM EQU * CLEAR VIRT MACH NAME @V60B6B8 01110000 XC COMMNAME(16),COMMNAME CLEAR NAME, VMBLOK, ADDR @V60B6B8 01111000 NI PSAMSS,X'FF'-MSSPRES MSS COMM NOT ACTIVE NOW @V60B6B8 01112000 EXIT RETURN TO DMKHVC @V60B6B8 01113000 PURGCOM EQU * PURGE THE DMKSSSRQ @V60B6B8 01114000 USING OSVSCOM,R4 @V60B6B8 01115000 TM MSSFLAG2,RQENT+INPROC WAITING FOR MSC @VA09302 01116000 BZ NOTINQ NO, NO CLEANUP @V60B6B8 01117000 ICM R3,15,MSSTASK2 PICK UP CPEXBLOK POINTER @VA11135 01118000 BNZ NOTSK3 DOES NOT EXIST @VA11135 01118100 L R3,MSSTASKD SO PICK UP DUPLICATE CPEXBLOK @VA11135 01118200 LTR R3,R3 ANYTHING THERE? @VA11344 01118225 BZ NOTINQ NO - THEN DON'T STACK CPEXBLOK @VA11344 01118250 NOTSK3 DS 0H @VA11135 01118300 USING CPEXBLOK,R3 @V60B6B8 01119000 LR R5,R11 SAVE OUR VMBLOK PTR @V60B6B8 01120000 L R11,CPEXR11 GET USER'S VMBLOK BASE @V60B6B8 01121000 L R2,OPTION72 MSG WRITER OPTIONS @VMI2020 01122000 SR R1,R1 NO MSG INSERT PTR @V60B6B8 01123000 SR R0,R0 NO MSG INSERT LENGTH @V60B6B8 01124000 ICM R0,14,DMKSSS+3 MODULE ID FOR MSG @V60B6B8 01125000 CALL DMKERMSG WRITE OUT THE MESSAGE @V60B6B8 01126000 LA R15,RCERROR RETURN CODE 8 @V60B6B8 01127000 ST R15,CPEXR0 SET FOR CALLER @V60B6B8 01128000 LR R1,R3 CPEXBLOK ADDR @V60B6B8 01129000 CALL DMKSTKCP STACK IT FOR THE DISPATCHER @V60B6B8 01130000 NOTINQ EQU * @V60B6B8 01131000 LH R1,MSSVUA @VA11709 01131100 CALL DMKSCNRU @VA11709 01131200 USING RDEVBLOK,R8 @VA11709 01131300 NI RDEVFLAG,X'FF'-RDEVSEL @VA11709 01131400 DROP R8 @VA11709 01131500 LR R1,R4 MSSCOM ADDR @V60B6B8 01132000 L R4,MSSNEXT NEXT MSSCOM IN CHAIN @V60B6B8 01133000 LA R0,MSSSIZE PICK UP THE SIZE @VA11444 01134010 CALL DMKFRET GIVE STORAGE BACK TO SYSTEM @V60B6B8 01135000 LTR R4,R4 IS THERE ANOTHER MSSCOM @V60B6B8 01136000 BNZ PURGCOM YES, GET RID OF IT @V60B6B8 01137000 ST R4,DMKSSSMQ RESET ANCHOR TO ZERO @VA11103 01137010 B RESETNAM CLEAR OUR ANCHORS, ETC. @V60B6B8 01138000 DROP R3 @V60B6B8 01139000 DROP R4 @V60B6B8 01140000 EJECT 01141000 * 01332000 * 01333000 * ENTRY POINT DMKSSSUS 01334000 * 01335000 * 01336000 * ENTRY CONDITIONS - 01337000 * 01338000 * DMKSSSUS IS ENTERED VIA A CALL FROM DMKUSO. 01339000 * AT ENTRY, THE PERTINENT REGISTERS ARE: 01340000 * GPR 12 = DMKSSSUS ADDRESS 01341000 * GPR 11 = VMBLOK ADDR 01342000 * 01343000 * EXIT CONDITIONS - 01344000 * 01345000 * STANDARD EXIT CONDITIONS 01346000 * 01347000 * CALLS TO EXTERNAL ROUTINES - 01348000 * 01349000 * NONE 01350000 * 01351000 * OPERATION - 01352000 * 01353000 * 1) CALL ROUTINE HVC16ENT TO PURGE ALL MSSCOM 01354000 * REQUESTS WHICH HAVE NOT YET BEEN PROCESSED BY THE MSC. 01355000 * 01356000 DMKSSSUS RELOC @V60B6B8 01357000 B HVC16ENT GO PURGE THE QUEUE @V60B6B8 01358000 EJECT 01359000 * 01360000 * 01361000 * DMKSSSLN ENTRY POINT 01362000 * 01363000 * 01364000 * ENTRY CONDITIONS - 01365000 * 01366000 * ENTRY IS VIA A CALL (SVC 8) FROM DMKLNK. DMKLNK HAS 01367000 * ATTEMPTED TO FIND A SYSTEM VOLUME, BUT THE CORRECT 01368000 * ONE IS NOT CURRENTLY MOUNTED. REGISTERS AT ENTRY: 01369000 * GPR 12 = DMKSSSLN ADDRESS 01370000 * GPR 11 = USER'S VMBLOK ADDRESS 01371000 * GPR 4 = UDEVBLOK ADDRESS 01372000 * GPR 6 = YYY ADDRESS (LINKED 'AS' ADDRESS) 01372100 * 01373000 * EXIT CONDITIONS - 01374000 * 01375000 * GPR 15 = 0 MEANS VOLUME NOW MOUNTED 01376000 * GPR 15 = 4 MEANS MSS PROCESSING VOLUME MOUNT 01377000 * GPR 15 = 8 MEANS MSS ERROR, VOLUME CAN NOT BE MOUNTED 01378000 * 01379000 * CALLS TO EXTERNAL ROUTINES - 01380000 * 01381000 * DMKERMSG - WRITE A MESSAGE TO THE USER 01382000 * 01383000 * OPERATION - 01384000 * 01385000 * 1) GO TO SUBROUTINE FINDRDEV TO FIND AN AVAILABLE 01386000 * SYSVIRT RDEVBLOK. IF NOT FOUND, ISSUE MESSAGE 01387000 * DMKSSS080E AND RETURN WITH RETURN CODE 8. 01388000 * 01389000 * 2) WHEN AN RDEVBLOK IS ALLOCATED, GO TO ROUTINE 01390000 * BLDCOMMT TO BUILD AND QUEUE AN MSSCOM FOR THE 01391000 * VOLUME MOUNT. IF AN MSS ERROR IS DETECTED, 01392000 * CONTROL IS RETURNED TO DMKLNK WITH A RETURN 01393000 * CODE 8. IF THE MSS ACCEPTS THE MOUNT, RETURN 01394000 * IS TO DMKLNK WITH RETURN CODE 4. 01395000 * 01396000 DMKSSSLN RELOC @V60B6B8 01397000 MVI VSERADDR,SYSVIRT INDICATE WE NEED SYSVIRT DEVICE@V60B6B8 01398000 LA R7,SSSLNDEV LOAD OUR RETURN ADDRESS @VA10862 01399000 ST R6,SAVEWRK9 SAVE YYY ADDRESS @VA11254 01399100 B FINDRDEV TRY TO FIND AN RDEVBLOK TO USE @V60B6B8 01401000 SSSLNDEV EQU * RETURN FROM FINDRDEV @V60B6B8 01402000 LTR R15,R15 DID WE GET AN RDEVICE @V60B6B8 01403000 BZ RDEVLNOK YES @V60B6B8 01404000 L R2,OPTION70 MSG WRITER OPTIONS @VMI2020 01405000 SR R1,R1 NO MSG INSERTS @V60B6B8 01406000 SR R0,R0 NO INSERT LENGTH @V60B6B8 01407000 ICM R0,14,DMKSSS+3 MODULE ID @V60B6B8 01408000 CALL DMKERMSG WRITE MSG TO USER @V60B6B8 01409000 LA R0,RCERROR SET UP EXTERNAL RETURN CODE @V60B6B8 01410000 RETLINK EQU * RETURN TO DMKLNK @V60B6B8 01411000 LM R1,R11,SAVER1 CALLER'S REGS @V60B6B8 01412000 SVC 12 INVOKE STANDARD EXIT SVC @V60B6B8 01413000 RDEVLNOK EQU * FOUND AN RDEVBLOK @V60B6B8 01414000 L R5,VSERADDR GET RDEVBLOK ADDR FROM FINDRDEV @V60B6B8 01415000 LR R9,R4 SET UDEVBLOK BASE @V60B6B8 01416000 LA R3,UDEVVSER VOLSER NEEDED @VA11254 01416100 LA R9,SAVEWRK9+2 PUT YYY ADDRESS INTO R9 @VA11254 01416200 MVC SAVRETAD(4),LNKMTRET ADDR IN DMKLNK AFTER @V60B6B8 01417000 * MOUNT DONE 01418000 B BLDCOMTA @VA11254 01419100 EJECT 01420000 * 01528000 * 01529000 * DMKSSSDE ENTRY POINT 01530000 * 01531000 * 01532000 * ENTRY CONDITIONS - 01533000 * 01534000 * ENTRY IS VIA CALL (SVC 8) FROM DMKDEF OR DMKCPS. IF FROM 01535100 * DMKDEF, THE PURPOSE IS TO DEMOUNT AN MSS VOLUME WHICH IS 01535600 * MOUNTED, BUT NOT IN USE. THE REAL DEVICE IS GOING TO BE 01536100 * REDEFINED SO THE VOLUME MUST BE DEMOUNTED. IF FROM DMKCPS, 01536600 * THE PURPOSE IS TO DEMOUNT AN MSS VOLUME WHICH HAS BEEN 01537100 * VARIED OFFLINE. ON ENTRY THE PERTINENT REGISTERS ARE: 01537600 * GPR 12 = DMKSSSDE ADDR 01540000 * GPR 11 = VMBLOK ADDR 01541000 * GPR 8 = RDEVBLOK ADDR 01542000 * 01543000 * EXIT CONDITIONS - 01544000 * 01545000 * IF THE VOLUME CAN NOT BE DEMOUNTED FOR ANY REASON, SUCH 01546000 * AS MSS NOT AVAILABLE OR MSC ERROR, THEN A MESSAGE IS 01547000 * WRITTEN TO THE USER AND A RETURN CODE OF 8 IS PLACED 01548000 * IN GPR 15. 01549000 * 01550000 * CALLS TO EXTERNAL ROUTINES - 01551000 * 01552000 * DMKFREE - GET STORAGE FOR A CPEXBLOK 01553000 * DMKFRET - RETURN A CPEXBLOK 01554000 * 01555000 * OPERATION - 01556000 * 01557000 * 1) THE REQUIRED INFORMATION IS OBTAINED FROM THE 01558000 * RDEVBLOK AND SUBROUTINE COMBLD IS CALLED TO BUILD 01559000 * AN MSSCOM BLOCK FOR THE DEMOUNT. 01560000 * 01561000 * 2) A CPEXBLOK IS BUILT SO THAT OUR REGISTERS CAN BE 01562000 * SAVED, AND SUBROUTINE SCHMSSC IS CALLED TO SCHEDULE 01563000 * THE MSSCOM FOR DMKMSS. IF THERE ARE ANY ERRORS, A 01564000 * MESSAGE IS WRITTEN BY SCHMSSC AND CONTROL IS RETURNED 01565000 * TO CALLER. 01566100 * 01567000 * 3) AFTER THE DEMOUNT HAS BEEN PROCESSED BY THE MSC, 01568000 * CONTROL IS GIVEN, BY DMKSSSHV, TO LABEL DEFDMT, SINCE 01569000 * THAT ADDRESS WAS PLACED IN THE CPEXBLOK WHEN BUILT. 01570000 * THE CODE AT DEFDMT THEN RETURNS TO DMKDEF. IF THE MSC 01571000 * DETECTED AN ERROR DURING DEMOUNT, THEN DMKSSSHV WROTE 01572000 * AN ERROR MESSAGE BEFORE RETURNING TO DEFDMT. 01573000 * 01574000 DMKSSSDE RELOC ENTRY FROM DMKDEF OR DMKCPS @VA10877 01575100 USING RDEVBLOK,R8 SET BY CALLER @VA10877 01576100 DROP R9 @V60B6B8 01577000 MVC SAVRETAD(4),SAVERETN SAVE CALLER'S RTN ADDR @V60B6B8 01578000 LA R1,RDEVSER VOLUME SER NO. @V60B6B8 01579000 ST R1,VSERADDR SAVE ADDR FOR COMBLD @V60B6B8 01580000 ST R8,RDEVADDR SAVE RDEVBLOK ADDR FOR COMBLD @V60B6B8 01581000 OI RDEVFLAG,RDEVSEL @VA11429 01581100 BAL R14,COMBLD GO BUILT THE MSSCOM @VA11436 01582010 USING OSVSCOM,R10 TELL ASSEMBLER @V60B6B8 01587000 MVI MSSFLAG1,DEMOUNT INDICATE DEMOUNT REQUEST @VA09302 01588000 * 01589000 * NOW BUILD A CPEXBLOK SO WE CAN SAVE OUR REGS ACROSS THE 01590000 * SUBSEQUENT ASYNCHRONOUS DEMOUNT BY THE MSC. 01591000 * 01592000 LA R0,CPEXSIZE NO OF D-WORDS IN CPEXBLOK @V60B6B8 01593000 CALL DMKFREE GET DYNAMIC STORAGE @V60B6B8 01594000 USING CPEXBLOK,R1 R1 SET BY DMKFREE @V60B6B8 01595000 ST R1,MSSTASK1 SAVE ADDR IN MSSCOM @V60B6B8 01596000 LA R2,DEFDMT RETURN POINT ADDR @V60B6B8 01597000 ST R2,RDEVADDR SAVE FOR SCHMSSC ALSO @V60B6B8 01598000 MVC CPEXADD(4),SAVRETAD @V60B6B8 01599000 MVC CPEXREGS(48),SAVEREGS @V60B6B8 01600000 MVC CPEXR12(8),SAVER12 @V60B6B8 01601000 B SCHMSSC PUT THE MSSCOM IN THE Q @V60B6B8 01602000 DEFDMT EQU * RETURN FROM SCHMSSC OR DEMOUNT @V60B6B8 01603000 GOTO DMKDSPCH WAIT FOR MSC TO PROCESS DEMOUNT @V60B6B8 01604000 DEMTDONE EQU * @V60B6B8 01605000 EXIT RETURN TO CALLER - GPR 15 @VA10877 01606100 * CONTAINS THE RETURN CODE SET 01607000 * BY DMKSSSHV OR SCHMSSC 01608000 EJECT 01609000 * 01610000 * 01611000 * DMKSSSVA ENTRY POINT 01612000 * 01613000 * 01614000 * ENTRY CONDITIONS - 01615000 * 01616000 * ENTRY IS FROM DMDVDA VIA A CALL (SVC 8). AN MSS REAL 01617000 * DEVICE IS BEING ATTACHED WITH THE VOLID PARAMETER. 01618000 * ATTEMPT TO MOUNT THE VOLID ON THE DEVICE. AT ENTRY, 01619000 * THE PERTINENT REGISTERS ARE: 01620000 * GPR 12 = DMKSSSVA ADDR 01621000 * GPR 11 = VMBLOK ADDR 01622000 * GPR 8 = RDEVBLOK ADDR 01623000 * GPR 13 = ADDR OF DMKSSS SAVEAREA 01624000 * THE VOLID TO BE MOUNTED IS LOCATED AT FIELD ADDRSAVE 01625000 * IN THE DMKVDA SAVE AREA. 01626000 * 01627000 * EXIT CONDITIONS - 01628000 * 01629000 * THE RETURN CODE IN GPR 15 INDICATES THE EXIT CONDITIONS. 01630000 * GPR 15 = 0, THE VOLUME IS MOUNTED 01631000 * GPR 15 = 4, THE MSS IS MOUNTING THE VOLUME 01632000 * GPR 15 = 8, SERIOUS ERROR, THE VOLUME CAN NOT BE MOUNTED 01633000 * 01634000 * CALLS TO EXTERNAL ROUTINES - 01635000 * 01636000 * DMKERMSG - WRITE A MESSAGE TO THE USER 01637000 * DMKSSSDE - DEMOUNT A VIRTUAL VOLUME 01638000 * 01639000 * OPERATION - 01640000 * 01641000 * 1) GET THE VOLID PARAMETER AS PASSED BY DMKVDA. ENSURE 01642000 * THAT THE VOLUME IS NOT IN USE ON SOME OTHER DEVICE AND 01643000 * THAT THIS REAL DEVICE IS AVAILABLE. 01644000 * 01645000 * 2) IF THE VOLUME IS MOUNTED ON ANOTHER DEVICE, BUT 01646000 * NOT IN USE, CAUSE IT TO BE DEMOUNTED. IF THERE IS 01647000 * A VOLUME MOUNTED ON THIS DEVICE, BUT THE DEVICE IS 01648000 * OTHERWISE AVAILABLE, DEMOUNT THE VOLUME. 01649000 * 01650000 * 3) REQUEST A VOLUME MOUNT FROM THE MSC FOR THIS VOLUME. 01651000 * WHEN THE MSC HAS ACCEPTED THE MOUNT REQUEST, RETURN TO 01652000 * DMKVDA WITH A RETURN CODE OF 4. 01653000 * 01654000 * 01655000 DMKSSSVA RELOC ENTRY FROM DMKVDA @V60B6B8 01656000 USING RDEVBLOK,R8 SET BY DMKVDA @V60B6B8 01657000 MVC SAVRETAD(4),VDAS1RET RETURN ADDR AFTER MOUNT @V60B6B8 01658000 VDABRENT EQU * BRANCH ENTRY FROM DMKSSSAS @V60B6B8 01659000 TM RDEVSTAT,RDEVDISA+RDEVDED OFFLINE OR ALREADY @V60B6B8 01660000 * DEDICATED 01661000 BNZ MSG438 YES,NOT AVAILABLE @VA11320 01662100 TM RDEVFLAG,RDEVSEL SELECTED FOR MOUNT @VMI2011 01663000 BZ VDAGO1 NO, AVAILABLE @VMI2011 01664000 MSG438 EQU * MSS DEVICE AVAILABLE @VA11320 01665100 L R2,OPT438 MSG WRITER OPTIONS @VA11320 01665500 SR R1,R1 NO MSG INSERT @V60B6B8 01667000 SR R0,R0 NO INSERT LENGTH @V60B6B8 01668000 ICM R0,14,DMKSSS+3 MODULE ID @V60B6B8 01669000 CALL DMKERMSG WRITE THE MESSAGE @V60B6B8 01670000 VDAERROR LA R0,RCERROR ERROR RETURN CODE @V60B6B8 01671000 VDAEXIT EQU * RETURN TO VDA @V60B6B8 01672000 LM R1,R11,SAVER1 CALLER'S REGS @V60B6B8 01673000 SVC 12 STANDARD SVC RETURN @V60B6B8 01674000 VDAGO1 EQU * CONTINUE CHECKING @V60B6B8 01675000 LH R0,RDEVLNKS NO OF USERS LINKED @V60B6B8 01676000 LTR R0,R0 ARE THERE ANY @V60B6B8 01677000 BNZ VDAERROR YES, WE CAN'T USE @V60B6B8 01678000 * 01679000 * THE RDEVICE IS AVAILABLE, SEE IF THE VOLUME IS ALREADY 01680000 * MOUNTED, HERE OR ELSEWHERE 01681000 * 01682000 CLC RDEVSER(6),0(R7) IS VOLUME MOUNTED THIS DEVICE @V60B6B8 01683000 BNE TSTRDEVA NO, CHECK THE REST @V60B6B8 01684000 SR R0,R0 CLEAR THE RETURN CODE @V60B6B8 01685000 B VDAEXIT AND EXIT - VOLUME ALREADY THERE @V60B6B8 01686000 TSTRDEVA EQU * CHECK ALL RDEVS @V60B6B8 01687000 CLC RDEVSER,BLANKS IS A VOLUME MOUNTED? @VA11939 01688100 BNE MUSTDEMT YES, MUST DEMOUNT IT @VA11939 01688600 LA R0,VOLSERL @VMI2008 01690000 LR R1,R7 POINTER TO VOLSER @V60B6B8 01691000 L R5,ARIODV FIRST REAL DEVICE BLOCK @VMI2012 01692000 L R1,ARIODC COUNT OF RDEVBLOKS @VMI2012 01693000 LH R1,0(R1) ACTUAL COUNT @VMI2012 01694000 DROP R8 @VMI2012 01695000 USING RDEVBLOK,R5 @VMI2012 01696000 FINDVSER EQU * LOOK FOR THIS VOLSER @VMI2012 01697000 CLC RDEVSER(6),0(R7) MOUNTED THIS DEVICE @VMI2012 01698000 BE CHKSTVDA YES, CHECK DEVICE STATUS @VMI2012 01699000 BUMPDEV EQU * BUMP TO NEXT DEVICE @VMI2012 01700000 LA R5,RDEVSIZE*8(R5) NEXT BLOCK @VMI2012 01701000 BCT R1,FINDVSER CHECK THE VOLSER @VMI2012 01702000 B VDAMNTA VOLUME NOT MOUNTED @VMI2012 01703000 CHKSTVDA EQU * @VMI2012 01704000 CLC RDEVTYPC(2),=AL1(CLASDASD,TYP3330) @VMI2012 01705000 BNE BUMPDEV NOT A 3330 VOLUME @VMI2012 01706000 TM RDEVFTR,VIRTUAL+SYSVIRT IS IT A 3330V @VMI2012 01707000 BZ BUMPDEV NO, NOT A DUPLICATE @VMI2012 01708000 TM RDEVSTAT,RDEVDISA+RDEVDED DED OR OFFLINE @VMI2012 01709000 BNZ MSG438 CAN NOT DEMOUNT @VA11320 01710500 TM RDEVFLAG,RDEVOWN+RDEVSYS+RDEVSEL @VMI2012 01711000 BNZ MSG438 CP OWNED,SYSTEM OR SELECTED @VA11320 01712100 SR R0,R0 CLEAR @VMI2012 01713000 CH R0,RDEVLNKS ANY MINI-DISKS ALLOCATED @VMI2012 01714000 BNE MSG438 YES,CANNOT DEMOUNT @VA11320 01715100 DROP R5 @VMI2012 01716000 USING RDEVBLOK,R8 @VMI2012 01717000 B VDASER @V60B6B8 01718000 MUSTDEMT EQU * MUST DEMOUNT A VOLUME @V60B6B8 01719000 LR R5,R8 RDEVBLOK ADDR INTO PROPER REG @V60B6B8 01720000 B VDASER AND GO SET UP @V60B6B8 01721000 * 01722000 * THE VOLUME IS NOT MOUNTED AND THE RDEVBLOK IS 01723000 * AVAILABLE. MOUNT THE VOLUME. 01724000 * 01725000 VDAMNTA EQU * SET UP FOR VOLUME MOUNT @V60B6B8 01726000 OI RDEVFLAG,RDEVSEL DEVICE SELECTED FOR MOUNT @VMI2011 01727000 LR R5,R8 SET UP RDEVBLOK PTR @V60B6B8 01728000 LR R3,R7 VOLSER PTR @V60B6B8 01729000 B BLDCOMTA GO GET VOLUME MOUNTED @V60B6B8 01730000 VDASER EQU * SET UP FOR VOLUME DEMOUNT @V60B6B8 01731000 LR R4,R8 SAVE INPUT RDEVBLOK ADDR @V60B6B8 01732000 LR R8,R5 RDEVBLOK FOR DEMOUNT @V60B6B8 01733000 CALL DMKSSSDE DEMOUNT THE VOLUME @V60B6B8 01734000 LR R8,R4 RESET INPUT RDEVBLOK ADDR @V60B6B8 01735000 LTR R0,R0 WAS THERE A DEMOUNT ERROR @V60B6B8 01736000 BNZ VDAERROR YES, SET RETURN CODE, EXIT @V60B6B8 01737000 B VDAMNTA GO GET OUR VOLUME MOUNTED @V60B6B8 01738000 EJECT 01739000 * 01740000 * 01741000 * DMKSSSAS ENTRY POINT 01742000 * 01743000 * 01744000 * ENTRY CONDITIONS - 01745000 * 01746000 * ENTRY IS FROM DMKVDA VIA A CALL (SVC 8). WE ARE 01747000 * TRYING TO ATTACH A 3330V TO THE SYSTEM WITH A VOLID. 01748000 * UPON ENTRY, THE PERTINENT REGISTERS ARE: 01749000 * 01750000 * GPR 12 = DMKSSSAS ENTRY ADDR 01751000 * GPR 11 = VMBLOK BASE 01752000 * GPR 8 = RDEVBLOK ADDR 01753000 * GPR 0 = ADDR OF VOLID 01754000 * 01755000 * EXIT CONDITIONS - 01756000 * 01757000 * IF SUCCESSFUL, THE REAL DEVICE HAS BEEN ATTACHED 01758000 * TO THE SYSTEM AND THE REQUESTED VOLUME HAS BEEN 01759000 * MOUNTED. THE RETURN CODES ARE: 01760000 * 01761000 * GPR 15 = 0, SUCCESS 01762000 * GPR 15 = 4, MSS VOLUME MOUNT IN PROCESS 01763000 * GPR 15 = 8, SERIOUS ERROR, ATTACH CAN NOT PROCEED 01764000 * 01765000 * CALLS TO EXTERNAL ROUTINES - 01766000 * 01767000 * DMKCVTBH - CONVERT BINARY RADDR TO PRINTABLE HEX 01768000 * DMKERMSG - WRITE A MESSAGE TO THE USER 01769000 * 01770000 * OPERATION - 01771000 * 01772000 * 1) TEST TO MAKE SURE THAT THE RDEVBLOK IS THE 01773000 * CORRECT TYPE. IF IT IS, ENTER DMKSSSVA TO ACCOMPLISH 01774000 * THE REQUIRED VOLUME CHECKING AND MOUNTING. 01775000 * 01776000 DMKSSSAS RELOC ENTRY POINT @V60B6B8 01777000 USING RDEVBLOK,R8 SET BY DMKVDA @V60B6B8 01778000 LR R7,R0 ADDR OF VOLID @V60B6B8 01779000 ST R7,VSERADDR SAVE VOL SER ADDR @V60B6B8 01780000 TM RDEVFTR,SYSVIRT CORRECT DEVICE FEATURE @V60B6B8 01781000 BO GOSSSVA YES, GO ENTER DMKSSSVA @V60B6B8 01782000 LA R1,RDEVADD DEVICE ADDRESSG 082E @V60B6B8 01783000 CALL DMKCVTBH GET FORMAT FOR MESSAGE @V60B6B8 01784000 L R2,OPTION72 MSG WRITER OPTIONS @VMI2020 01785000 SR R0,R0 INDICATE INSERT IN GPR 1 @V60B6B8 01786000 ICM R0,14,DMKSSS+3 MOD ID FOR MSG @V60B6B8 01787000 CALL DMKERMSG WRITE OUT MESSAGE @V60B6B8 01788000 LA R15,RCERROR ERROR CODE 8 @V60B6B8 01789000 EXIT RETURN TO DMKVDA @V60B6B8 01790000 GOSSSVA EQU * SET UP PARMS @V60B6B8 01791000 MVC SAVRETAD(4),VDAS2RET RETURN POINT AFTER MOUNT @V60B6B8 01792000 B VDABRENT ENTER DMKSSSVA @V60B6B8 01793000 EJECT 01794000 * 01795000 * 01796000 * DMKSSSEN ENTRY POINT 01797000 * 01798000 * 01799000 * ENTRY CONDITIONS - 01800000 * 01801000 * ENTRY IS FROM THE DISPATCHER (DMKDSP). 01802000 * 01803000 * DMKDSB HAS JUST PROCESSED AN UNSOLICITED DEVICE 01804000 * END INTERRUPT ON A 3330V. THE ADDRESS OF A CPEXBLOK 01805000 * WAS OBTAINED FROM THE MSSCOM WHICH REPRESENTED THE 01806000 * MOUNT REQUEST FOR THE VOLUME JUST MOUNTED. THE 01807000 * ADDRESS OF DMKSSSEN HAD BEEN PLACED IN FIELD CPEXADD 01808000 * OF THE CPEXBLOK. THE PERTINENT REGISTERS ARE: 01809000 * 01810000 * GPR 15 = ADDRESS OF DMKSSSEN 01811000 * GPR 2 = ADDRESS OF THE CPEXBLOK WHICH REPRESENTS THE 01812000 * TASK WHICH REQUIRED THE MOUNT. 01813000 * 01814000 * OPERATION - 01815000 * 01816000 * GENERATE A LINK TO THE ADDRESS WITHIN THE REQUESTING 01817000 * MODULE, THEN GO TO THE DISPATCHER 01818000 * 01819000 ENTRY DMKSSSEN @V60B6B8 01820000 DMKSSSEN EQU * @V60B6B8 01821000 USING *,R15 R15 SET BY DMKDSP @V60B6B8 01822000 SL R15,=A(DMKSSSEN-DMKSSS) BACK TO COMMON BASE @V60B6B8 01823000 LR R12,R15 INTO CORRECT REG @V60B6B8 01824000 DROP R15 @V60B6B8 01825000 USING DMKSSS,R12 @V60B6B8 01826000 USING CPEXBLOK,R2 R2 SET UP THROUGH DMKDSP @V60B6B8 01827000 * 01828000 * CHECK TO SEE IF THE USER IS STILL ACTIVE 01829000 * 01830000 DROP R10 @V60B6B8 01831000 USING OSVSCOM,R6 @V60B6B8 01832000 TSTUSRAC EQU * SEE IF USER IS STILL ACTIVE @V60B6B8 01833000 LA R0,8 LENGTH OF USERID @V60B6B8 01834000 LA R1,MSSUSER USERID FFROM INITIAL REQUEST @V60B6B8 01835000 CALL DMKSCNAU SEE IF STILL ACTIVE @V60B6B8 01836000 BC 4,GAVEUP NOT STILL LOGGED ON @V60B6B8 01837000 * 01838000 * CHECK TO SEE IF THIS DEVICE END CAME IN BEFORE NORMAL 01839000 * DEVICE END FOR THE MSC. IF SO, RETURN TO THE ORIGINAL 01840000 * CALLLER (LNK, LOG, VDA) AS IT THE VOLUME HAD 01841000 * ALWAYS BEEN MOUNTED. 01842000 * 01843000 L R1,MSSTASK2 RETURN ADDR IF MSC COMPLETES @V60B6B8 01844000 LTR R1,R1 IS THERE ONE @V60B6B8 01845000 BNZ DISPTSK2 MSC HAS NOT RETURNED @VA11135 01846100 L R1,MSSTASKD CHECK FOR DUPLICATE MOUNTS @VA11135 01846200 LTR R1,R1 MSSTASKD SET BY THE CMS SCHMSSC @VA11135 01846300 * ROUTINE FOR DUPLICATE MOUNTS 01846400 BZ DSPTASK1 NOT DUPLICATE, MSC COMPLETED @VA11135 01846500 DISPTSK2 EQU * STACK CPEXBLOK FROM MSSTASK2 @VA11135 01846600 LR R5,R6 SAVE MSSCOM ADDR @V60B6B8 01847000 LA R0,CPEXSIZE CPEXBLOK SIZE @V60B6B8 01848000 L R1,MSSTASK1 RETURN CPEXBLOK WE DON'T NEED @V60B6B8 01849000 CALL DMKFRET @V60B6B8 01850000 XC MSSTASK1(4),MSSTASK1 INDICATE WE'VE BEEN @V60B6B8 01851000 * THROUGH HERE 01852000 L R1,MSSTASK2 CALLER'S NORMAL RETURN PTR @V60B6B8 01853000 XC MSSTASK2(4),MSSTASK2 @VA11574 01853050 LTR R1,R1 IS THERE AN MSSTASK2T @VA11135 01853100 BNZ USETASK2 YES, STACK IT @VA11135 01853200 L R1,MSSTASKD THIS IS A DUP MOUNT @VA11135 01853300 XC MSSTASKD(4),MSSTASKD @VA11574 01853350 USETASK2 EQU * @VA11135 01853400 SR R0,R0 CLEAR CONDITION CODE @V60B6B8 01854000 ST R0,CPEXR0-CPEXBLOK(R1) @V60B6B8 01855000 CALL DMKSTKCP GO BACK EVENTUALLY @V60B6B8 01856000 B MORSTK1 SEE IF ANYONE ELSE IS WAITING @V60B6B8 01857000 DSPTASK1 EQU * @V60B6B8 01858000 * 01859000 * MSC HAS RETURNED PREVIOUSLY. UNCHAIN THIS MSSCOM, 01860000 * THEN GO BACK TO THE ASYNCHRONOUS ENTRY POINT 01861000 * IDENTIFIED IN MSSTASK1 01862000 * 01863000 L R1,MSSTASKD POSSIBLE CPEXBLOK PTR @VA09302 01864000 LTR R1,R1 WAS THIS A DUP MOUNT REQ @VMI2021 01865000 BZ NOEXBLOK NO, MSC RET ON THIS REQ @VMI2021 01866000 LA R0,CPEXSIZE SIZE OF CPEXBLOK @VMI2021 01867000 CALL DMKFRET FRET BLOK FOR DUP REQ @VMI2021 01868000 NOEXBLOK EQU * @VMI2021 01869000 TM MSSFLAG2,MSGPROC @VA09302 01870000 BZ DSPTASK2 @VMI2003 01871000 NI MSSFLAG2,FULL-MSGPROC @VA09302 01872000 B RETDSPCH @VMI2003 01873000 DSPTASK2 EQU * @VMI2003 01874000 LA R3,DMKSSSMQ QUEUE START @V60B6B8 01875000 FINDCOMZ EQU * @V60B6B8 01876000 L R5,0(R3) ADDR OF AN MSSCOM @V60B6B8 01877000 LTR R5,R5 VALIDITY CHECK @V60B6B8 01878000 BZ RETDSPCH @V60B6B8 01879000 CR R5,R6 IS IT THE ONE @V60B6B8 01880000 BE RESETMQB YES, UNCHAIN IT @V60B6B8 01881000 LA R3,MSSNEXT-OSVSCOM(R5) NEXT CHAIN PTR @V60B6B8 01882000 B FINDCOMZ AND CHECK IT @V60B6B8 01883000 RESETMQB EQU * @V60B6B8 01884000 MVC 0(4,R3),MSSNEXT-OSVSCOM(R5) RESET CHAIN POINTERS@V60B6B8 01885000 L R5,MSSNEXT CHAIN PTR @V60B6B8 01886000 NEXTCHK EQU * @VMI2008 01887000 LTR R5,R5 IS THERE ONE @V60B6B8 01888000 BZ NOSTACK NO, DON'T NEED CNTRL BACK @V60B6B8 01889000 CLC MSSSER,0(R5) @VMI2008 01890000 BE STACKUS @VMI2008 01891000 L R5,MSSNEXT-OSVSCOM(R5) @VMI2008 01892000 B NEXTCHK @VMI2008 01893000 STACKUS EQU * @VMI2008 01894000 LR R6,R5 @VMI2008 01895000 LR R3,R2 @VMI2008 01896000 L R2,MSSTASK1 @VMI2008 01897000 LA R0,CPEXSIZE CPEXBLOK SIZE @V60B6B8 01898000 CALL DMKFREE GET AN EXBLOK @V60B6B8 01899000 STM R0,R15,CPEXREGS-CPEXBLOK(R1) OUR REGS @V60B6B8 01900000 LA R15,MORSTACK OUR ENTRY ADDRESS @V60B6B8 01901000 ST R15,CPEXADD-CPEXBLOK(R1) SAVE IT @V60B6B8 01902000 CALL DMKSTKCP @V60B6B8 01903000 LR R2,R3 @VMI2008 01904000 NOSTACK EQU * @V60B6B8 01905000 L R15,CPEXADD ENTRY POINT IN LOG, LNK, OR VDA @V60B6B8 01906000 LM R0,R11,CPEXREGS THAT ROUTINES REGS @V60B6B8 01907000 SVC 8 LINK TO THAT ROUTINE @V60B6B8 01908000 GOTO DMKDSPCH ALL DONE THIS REQUEST @V60B6B8 01909000 GAVEUP EQU * @V60B6B8 01910000 L R2,MSSTASK1 RESET R2 FOR MULTI-VOLUMES @VA09304 01910100 LA R0,CPEXSIZE ALWAYS AN MSSTAK1 @VA09304 01910125 LR R1,R2 CPEXBLOK ADDR MSSTASK1 @VA09304 01910150 CALL DMKFRET FREE MSSTASK1 @VA09304 01910175 L R2,MSSTASK2 @VA09304 01910200 LTR R2,R2 IS THERE TASK2 CPEXBLOK? @VA09304 01910225 BZ NO2 NO, DON'T TRY TO FREE IT @VA09304 01910250 LA R0,CPEXSIZE @VA09304 01910275 LR R1,R2 CPEXBLOK ADDR. MSSTASK2 @VA09304 01910300 CALL DMKFRET FREE MSSTASK2 @VA09304 01910325 NO2 EQU * @VA09304 01910350 L R2,MSSTASKD @VA09304 01910375 LTR R2,R2 IS THERE TASKD CPEXBLOK? @VA09304 01910400 BZ NOTD NO,DON'T TRY TO FREE IT @VA09304 01910425 LA R0,CPEXSIZE @VA09304 01910450 LR R1,R2 CPEXBLOK ADDR. MSSTASKD @VA09304 01910475 CALL DMKFRET FREE MSSTASKD @VA09304 01910500 *REG 6 NOW POINTS TO THE MSSCOM FOR WHICH THE USER HAS LOGGED 01910525 *OFF AND HIS VOLUME IS MOUNTED. TAKE THIS ONE OFF OF THE QUEUE 01910550 *AND FRET ITS STORAGE. 01910575 NOTD EQU * @VA09304 01910600 L R1,DMKSSSMQ MSSCOM Q ANCHOR @VA09304 01910625 LA R2,DMKSSSMQ POINTER ADDRESS TO NEXT BLOK @VA09304 01910650 LTR R1,R1 SHOULDN'T EVER BE ZERO @VA09304 01910675 BZ RETDSPCH GET OUT IF IT IS @VA09304 01910700 CHKCOM EQU * @VA09304 01910725 CR R6,R1 IS THIS ONE DMKDSB FOUND? @VA09304 01910750 BE DQIT YES,TAKE IT OFF OF THE QUEUE @VA09304 01910775 LA R2,MSSNEXT-OSVSCOM(R1) UPDATE POINTERS @VA09304 01910800 * VMI2036 01910825 L R1,MSSNEXT-OSVSCOM(R1) UPDATE POINTERS @VA09304 01910850 LTR R1,R1 SHOULDN'T EVER BE ZERO @VA09304 01910875 BZ RETDSPCH GET OUT IF IT IS @VA09304 01910900 B CHKCOM LOOK AT THIS ONE ... @VA09304 01910925 DQIT EQU * REMOVE IT FROM THE QUEUE @VA09304 01910950 L R5,MSSNEXT GET POINTER TO NEXT MSSCOM @VA09304 01910975 ST R5,0(,R2) TAKE CURRENT BLOK OUT OF QUEUE @VA09304 01911000 *NOW ITS OUT OF THE QUEUE ... FRET THE STORAGE 01911025 SR R3,R3 CLEAR R3 INDICATING SAME SER. @VA09304 01911050 CLC MSSSER(6),MSSSER-OSVSCOM(R5) SAME VOL? @VA09304 01911075 BE SAMESER YES, LEAVE R3 FLAG = ZERO @VA09304 01911100 LA R3,1 SET FLAG INDICATING NOT = @VA09304 01911125 SAMESER LR R1,R6 ADDR. OF DE-QUEUED MSSCOM @VA09304 01911150 LA R0,MSSSIZE SIZE OF THE MSSCOM @VA09304 01911175 CALL DMKFRET FREE THE STORAGE @VA09304 01911200 LTR R5,R5 IS THERE ANOTHER Q ENTRY? @VA09304 01911225 BZ RETDSPCH NO, RETURN TO DISPATCH @VA09304 01911250 L R2,MSSTASK1-OSVSCOM(R5) UPDATE CPEX POINTER @VA09304 01911275 LTR R3,R3 LOOK AT THE R3 FLAG @VA09304 01911300 BZ ONEMORE VOLSER =, LOOK AT THE NEXT ONE @VA09304 01911325 B MORSTK1 VOLSER NOT =, LOOK AT NEXT ENTRY @VA09304 01911350 MORSTACK EQU * CHECK THE MSSCOM Q @V60B6B8 01917000 DROP R12 @VA11135 01917100 USING *,R15 @VA11135 01917150 SL R15,=A(MORSTACK-DMKSSS) E.P. ADDRESS @VA11135 01917200 LR R12,R15 SET ADDRESSABILITY @VA11135 01917250 DROP R15 @VA11135 01917300 USING DMKSSS,R12 @VA11135 01917350 INTSTK EQU * @VA11135 01917400 * 01918000 * TEST FOR MORE MOUNT REQUESTS FOR THIS VOLUME 01919000 * 01920000 CLC MSSSER(6),MSSSER-OSVSCOM(R5) SAME VOLUME? @VA09304 01921000 * VMI2036 01921100 BE ONEMORE YES, GET HIM STARTED @V60B6B8 01922000 B MORSTK1 AND CHECK THE VOLID @V60B6B8 01923000 ONEMORE EQU * @V60B6B8 01924000 LR R6,R5 RESET MSSCOM ADDR @V60B6B8 01925000 B TSTUSRAC SEE IF USER STILL ACTIVE @V60B6B8 01926000 MORSTK1 EQU * @V60B6B8 01927000 L R5,MSSNEXT-OSVSCOM(R5) CHAIN PTR @V60B6B8 01928000 LTR R5,R5 IS THERE ONE @V60B6B8 01929000 BNZ INTSTK YES, CHECK VOLSER. @VA11135 01930000 GOTO DMKDSPCH @V60B6B8 01931000 RETDSPCH EQU * RETURN TO THE DISPATCHER @V60B6B8 01932000 GOTO DMKDSPCH @V60B6B8 01933000 DROP R6 @V60B6B8 01934000 EJECT 01935000 * 01935020 * DMKSSSRL ENTRY POINT 01935040 * 01935060 * ENTRY CONDITIONS - 01935080 * ENTRY IS FROM DMKVDR, WHICH IS IN THE PROCESS OF DETACHING 01935100 * A VUA FROM A VIRTUAL MACHINE. ANY CHANGED CYLINDERS OF THE 01935120 * VOLUME MOUNTED ON THAT VUA NEED TO BE WRITTEN BACK ONTO THE 01935140 * CARTRIDGES CONTAINING THAT VOLUME. SET UP A RELINQUISH 01935160 * REQUEST MSSCOM BLOK TO DO SO. THE PERTINENT REGISTERS ARE: 01935180 * 01935200 * GPR 2 = RDEVBLOK ADDRESS FOR THIS VUA 01935220 * 01935240 * OPERATION - 01935260 * 1. SAVE RDEVBLOK ADDRESS AND VOLSER ADDRESS FOR COMBLD 01935280 * ROUTINE. BAL TO COMBLD TO BUILD A SKELETON MSSCOM. 01935300 * 01935320 * 2. FLAG MSSCOM AS A RELINQUISH REQUEST. 01935340 * 01935360 * 3. BRANCH TO CHKDUP1 TO PUT THE MSSCOM ON THE MSS 01935380 * REQUEST QUEUE (DMKSSSMQ). 01935400 * 01935420 * 4. RETURN TO DMKVDR AFTER QUEUEING THE RELINQUISH REQUEST. 01935440 * 01935460 DMKSSSRL RELOC , @VA11344 01935480 ST R2,RDEVADDR SAVE RDEVBLOK ADDR FOR COMBLD RTN@VA11344 01935500 LA R2,RDEVSER-RDEVBLOK(R2) POINT TO START OF VOLSER@VA11344 01935520 ST R2,VSERADDR SAVE ADDR OF VOLSER FOR COMBLD @VA11344 01935540 BAL R14,COMBLD GO BUILD SKELETON OF MSSCOM @VA11344 01935560 SPACE 1 01935580 USING OSVSCOM,R10 01935600 SPACE 1 01935620 OI MSSFLAG1,RELINQSH SAY THIS IS A RELINQUISH REQ@VA11344 01935640 B CHKDUP1 STACK MSSCOM ON QUEUE @VA11344 01935660 DROP R10 01935680 SSSRLEND DS 0H @VA11344 01935700 EXIT @VA11344 01935720 EJECT 01935740 LOGADDR DC V(DMKLOHSS) RETURN ADDR FOR L1, L2, L3 @VA09593 01936100 INTMASKS DC V(DMKVIOMK) DEV, CU, AND CH INTERRUPT MASKS @V60B6B8 01937000 SCHRTAD DC V(DMKSCHRT) ROUTINE TO DEQ TIMER BLOCKS @V60B6B8 01938000 LNKMTRET DC V(DMKLNKSS) RETURN ADDRESS FOR LN @V60B6B8 01939000 VDAS1RET DC V(DMKVDAS1) RETURN ADDRESS FOR VA @V60B6B8 01940000 VDAS2RET DC V(DMKVDAS2) RETURN ADDRESS FOR AS @V60B6B8 01941000 DMKSSSMQ DC F'0' ANCHOR FOR MOUNTS IN PROCESS @V60B6B8 01942000 DS 0F MESSAGES ON FULL WORD BOUNDARY @V60B6B8 01943000 * 01944000 * THE FOLLOWING CONSTANTS DEFINE THE ERROR MESSAGE 01945000 * OPTIONS. THE MESSAGES HAVE THE FORMAT DMKSSS070 TO 01946000 * DMKSSS078. 01947000 * 01948000 OPTION70 DC X'80C50046' DMKSSS070E @VMI2020 01949000 OPTION71 DC X'80C50047' DMKSSS071E @VMI2020 01950000 OPTION72 DC X'80C50048' DMKSSS072E @VMI2020 01951000 OPTION73 DC X'80C50049' DMKSSS073E @VMI2020 01952000 OPT438 DC X'80C501B6' DMKSSS438E @VA11320 01952100 OPTION75 DC X'80C5004B' DMKSSS075E @VMI2020 01954000 OPTION76 DC X'80C5004C' DMKSSS076E @VMI2020 01955000 OPTION78 DC X'80C9004E' DMKSSS078I @VMI2020 01956000 DAS3330 DC AL1(CLASDASD,TYP3330) MASK FOR RDEVBLOK COMPARE @V60B6B8 01957000 COMMNAME DC D'0' COMMUNICATOR VIRT MACH NAME @V60B6B8 01958000 DMKSSSVM EQU COMMNAME PROPER NAMING FOR EXT REF @V60B6B8 01959000 COMMADDR DC F'0' COMMUNICATION VIRT ADDR @V60B6B8 01960000 COMMVMAD DC F'0' COMMUNICATOR VMBLOK ADDR @V60B6B8 01961000 ZERO EQU 0 @V60B6B8 01967000 L2 EQU 2 LENGTH OF 2 @V60B6B8 01968000 L3 EQU 3 LENGTH OF 3 @V60B6B8 01969000 RC4 EQU 4 RETURN CODE 4 @V60B6B8 01970000 RC8 EQU 8 RETURN CODE 8 @VA11367 01970010 RC12 EQU 12 RETURN CODE 12 @VA11367 01970020 RC16 EQU 16 RETURN CODE 16 @VA11367 01970030 N6 EQU 6 LENGTH OF 'VOLID' PARAMETER @V60B6B8 01972000 FULL EQU X'FF' MASK FOR TURNING OFF FLAGS @V60B6B8 01973000 VOLSERL EQU 6 LENGTH OF VOLSER @V60B6B8 01974000 HIGHSFID EQU 16 HIGHEST VALID DIAGNOSE SFID @V60B6B8 01975000 COPY SAVE @V60B6B8 01980000 RDEVDEMT EQU SAVEWRK1 @V60B6B8 01981000 DEMNTRET EQU SAVEWRK2 @V60B6B8 01982000 VSERADDR EQU SAVEWRK3 @V60B6B8 01983000 RDEVADDR EQU SAVEWRK4 @V60B6B8 01984000 RETNADDR EQU SAVEWRK5 @V60B6B8 01985000 ADDRSAVE EQU SAVEWRK6 @V60B6B8 01986000 IOSRETAD EQU SAVEWRK7 @V60B6B8 01987000 SAVRETAD EQU SAVEWRK8 @V60B6B8 01988000 EJECT 01989000 OSVSCOM MSSCOM @V60B6B8 01990000 EJECT 01991000 PSA @V60B6B8 01992000 COPY EQU @V60B6B8 01993000 COPY VMBLOK @V60B6B8 01994000 COPY TIMER @V60B6B8 01995000 COPY IOBLOKS @V60B6B8 01996000 COPY UDIRECT @V60B6B8 01997000 COPY DEVTYPES @V60B6B8 01998000 COPY RBLOKS @V60B6B8 01999000 COPY VBLOKS @V60B6B8 02000000 END DMKSSS 02001000