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