VMC TITLE 'DMKVMC (CP) VM/370 - RELEASE 6' 00001000
ISEQ 73,80 @V387045 00002000
DMKVMC CSECT @V387045 00003000
MODID DC CL8'DMKVMC' MODULE IDENTIFIER @V387045 00004000
SPACE 00005000
*.::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::* 00006000
* 00007000
* MODULE NAME - 00008000
* 00009000
* DMKVMC 00010000
* 00011000
* DESCRIPTIVE NAME - 00012000
* 00013000
* VIRTUAL MACHINE COMMUNICATION FACILITY SUPPORT MODULE 00014000
* 00015000
* COPYRIGHT - NONE 00016000
* 00017000
* CHANGE ACTIVITY - NOT APPLICABLE 00018000
* 00019000
* CONTENTS: 00020000
* 00021000
* DMKVMCFC - PROCESS USER DIAGNOSE X'0068' REQUEST. 00022000
* DMKVMCEX - REFLECT USER EXTERNAL INTERRUPT DATA. 00023000
* DMKVMCUA - UNAUTHORIZE VMCF USER DURING SYSTEM RESET 00024000
* (THIS ENTRY POINT IS DESCRIBED IN SUBROUTINE DESCRIPTION 00025000
* VMCUAUTH) 00026000
* 00027000
*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::* 00028000
* 00029000
* SUBROUTINE NAME - 00030000
* 00031000
* DMKVMCFC 00032000
* 00033000
* FUNCTION - 00034000
* 00035000
* TO PROVIDE A VIRTUAL MACHINE -> VIRTUAL MACHINE 00036000
* COMMUNICATION FACILITY THROUGH CP DIAGNOSE CODE 00037000
* X'0068'. 00038000
* 00039000
* ATTRIBUTES - 00040000
* 00041000
* REENTRANT, PAGEABLE, CALLED VIA SVC FROM DMKHVC 00042000
* 00043000
* ENTRY CONDITIONS - 00044000
* 00045000
* GPR 13 = SAVEAREA ADDRESS 00046000
* GPR 12 = ADDRESS OF DMKVMCFC 00047000
* GPR 11 = ADDRESS OF VMBLOK 00048000
* GPR 2 = LENGTH OF VMCPARM (VMCPLEN) 00049000
* GPR 1 = VIRTUAL ADDRESS OF VMCPARM 00050000
* 00051000
* EXIT CONDITIONS - 00052000
* 00053000
* GPR 14-15 = DESTROYED (VOLATILE) 00054000
* GPR 13 = SAVEAREA 00055000
* GPR 12 = DESTROYED (VOLATILE) 00056000
* GPR 3-11 = RESTORED 00057000
* GPR 2 = RETURN CODE PASSED BACK TO DMKHVC 00058000
* GPR 0-1 = RESTORED 00059000
* 00060000
* CALLS TO OTHER ROUTINES - 00061000
* 00062000
* DMKFREE - GET STORAGE FOR VMCBLOKS - XINTBLOK - CPEXBLOK 00063000
* DMKFRET - FRET VMCBLOK - XINTBLOK STORAGE 00064000
* DMKSCNAU - LOCATE SOURCE / SINK VMBLOKS 00065000
* DMKPTRAN - FETCH USER BUFFERS AND VMCPARM 00066000
* DMKPSASC - CHECK STORAGE PROTECTION 00067000
* DMKPSAFC - CHECK FETCH PROTECTION 00068000
* DMKPSASP - CHECK STORAGE PROTECTION 00069000
* DMKSTKCP - STACK WAKE - UP CPEXBLOKS 00070000
* DMKPTRUL - UNLOCK SOURCE PAGES (DATA TRANSFER) 00071000
* 00072000
* SUBFUNCTION ROUTINES: 00073000
* 00074000
* VMCAUTH - AUTHORIZE 00075000
* VMCUAUTH - UNAUTHORIZE + DMKVMCUA ENTRY POINT 00076000
* VMCSEND - SEND 00077000
* VMCSENDR - SEND/RECV 00078000
* VMCSENDX - SENDX 00079000
* VMCRECV - RECEIVE 00080000
* VMCCNCL - CANCEL 00081000
* VMCREPLY - REPLY 00082000
* VMCQIES - QUIESCE 00083000
* VMCRESUM - RESUME 00084000
* VMCIDENT - IDENTIFY 00085000
* VMCREJEC - REJECT 00086000
* 00087000
* INTERNAL SUBROUTINES: 00088000
* 00089000
* VMCBUILD - INITIALIZE AND ENQ VMCBLOK 00090000
* VMCENQ - ENQ VMCBLOK ON SOURCE/SINK VMCBLOK CHAIN 00091000
* VMCDEQ - DEQ VMCBLOK FROM VMCBLOK CHAIN 00092000
* VMCICHK - INITIAL VALIDITY CHECK OF SINK USER STATUS 00093000
* VMCSCANS - LOCATE VMCBLOK ON SINK VMCBLOK CHAIN 00094000
* VMCSCANR - LOCATE VMCBLOK FOR ACTIVE USER (SOURCE/SINK) 00095000
* VMCWAKUP - WAKE UP SOURCE/SINK USER 00096000
* VMCHECK - VALIDITY CHECK VIRTUAL BUFFER ADDRESSES 00097000
* VMCFRET - FRET VMCBLOK STORAGE 00098000
* VMCSUSER - LOCATE SOURCE USER VMBLOK ADDRESS 00099000
* VMCXFER - DATA TRANSFER SUBROUTINE 00100000
* VMCEXIT - NORMAL EXIT FOR DMKVMCFC ENTRY 00101000
* 00102000
* EXTERNAL REFERENCES - 00103000
* 00104000
* NONE 00105000
* 00106000
* TABLES / WORK AREAS - 00107000
* 00108000
* VMBLOK, VMCBLOK, VMCPARM, XINTBLOK, CPEXBLOK, SAVEAREA 00109000
* ECBLOK 00110000
* 00111000
* MACROS - 00112000
* 00113000
* CALL - USED TO CALL OTHER CP MODULES 00114000
* EXIT - USED TO EXIT FROM DMKVMC 00115000
* TRANS - USED TO FETCH VIRTUAL PAGES 00116000
* PSA - USED TO REFERENCE THE PREFIX STORAGE AREA 00117000
* RELOC - USED TO DEFINE ENTRY POINTS WITHIN DMKVMC 00118000
* 00119000
* REGISTER USAGE - 00120000
* 00121000
* GPR 13 = SAVEAREA REGISTER 00122000
* GPR 12 = BASE REGISTER FOR DMKVMC 00123000
* GPR 11 = VMBLOK ADDRESSABILITY 00124000
* GPR 10 = INTERNAL LINK REGISTER 00125000
* GPR 9 = ADDRESS OF VMCPARM 00126000
* GPR 8 = ADDRESS OF VMCBLOK 00127000
* GPR 7 = ADDRESS OF ALTERNATE VMCBLOK 00128000
* GPR 3 = ADDRESS OF ALTERNATE USER VMBLOK 00129000
* GPR 2 = RETURN CODE REGISTER 00130000
* 00131000
* GPR 0-1, 4-6, 14-15 = WORK REGISTERS 00132000
* 00133000
* NOTES - 00134000
* 00135000
* THIS MODULE CONTAINS THE FOLLOWING VMC DIAGNOSE 00136000
* X'0068' SUB-FUNCTIONS: 00137000
* 00138000
* SUB-FUNCTION CODE (HEX) 00139000
* 00140000
* AUTHORIZE 0 00141000
* UNAUTHORIZE 1 00142000
* SEND 2 00143000
* SEND/RECV 3 00144000
* SENDX 4 00145000
* RECEIVE 5 00146000
* CANCEL 6 00147000
* REPLY 7 00148000
* QUIESCE 8 00149000
* RESUME 9 00150000
* IDENTIFY A 00151000
* REJECT B 00152000
* 00153000
* OPERATION - 00154000
* 00155000
* 00156000
* DMKVMCFC IS CALLED BY DMKHVC WHEN A USER EXECUTES A 00157000
* DIAGNOSE INSTRUCTION WITH A FUNCTION CODE = X'0068'. 00158000
* THE R1 REGISTER AT ENTRY TO DMKVMCFC CONTAINS THE 00159000
* VIRTUAL ADDRESS OF THE USERS PARAMETER LIST VMCPARM. 00160000
* 00161000
EJECT 00162000
* 00163000
* 0 1 2 3 4 5 6 7 8 00164000
* 00165000
* 0 +-----------------------------------------------+ 00166000
* | V*1 | V*2 | VMCPFUNC | VMCPMID | 00167000
* 8 |-----------------------------------------------| 00168000
* | VMCPUSER | 00169000
* 10 |-----------------------------------------------| 00170000
* | VMCPVADA | VMCPLENA | 00171000
* 18 |-----------------------------------------------| 00172000
* | VMCPVADB | VMCPLENB | 00173000
* 20 |-----------------------------------------------| 00174000
* | VMCPUSE | 00175000
* 28 +-----------------------------------------------+ 00176000
* 00177000
* DMKVMCFC OBTAINS FREE STORAGE FOR A VMCBLOK VIA A CALL 00178000
* TO DMKFREE AND COPIES THE USER PARMLIST VMCPARM TO THE 00179000
* VMCBLOK. DMKVMCFC THEN EXTRACTS THE SUBFUNCTION CODE 00180000
* (VMCPFUNC) AND VERIFIES THAT IT IS VALID. (WITHIN RANGE 00181000
* X'0000' TO X'000B') IF THE SUBFUNCTION CODE IS NOT 00182000
* VALID THEN THE STORAGE ACQUIRED FOR THE VMCBLOK IS 00183000
* RELEASED VIA A CALL TO MODULE DMKFRET AND AN EXIT IS 00184000
* MADE TO DMKHVC WITH THE APPROPRIATE RETURN CODE SET IN 00185000
* GPR 2. IF THE SUBFUNCTION CODE IS VALID AND FOR 00186000
* AUTHORIZE A BRANCH IS EXECUTED DIRECTLY TO THE 00187000
* AUTHORIZE SUBROUTINE. IF THE SUB- FUNCTION IS FOR 00188000
* OTHER THAN AUTHORIZE A CHECK IS MADE TO INSURE THAT THE 00189000
* USER IS AUTHORIZED FOR VM COMMUNICATION. IF CP IS THE 00190000
* SENDER OF THE VMCF DATA, THEN NO AUTHORIZE IS REQUIRED 00190100
* FOR CP BUT THE RECEIVER OF THE DATA MUST BE AUTHORIZED. 00190200
* (THE FOLLOWING BIT, VMBCAUTH, IN THE BYTE, VMCXSTAT, 00190300
* OF THE USER'S VMBLOK MUST BE SET 'ON'.) IF THE USER 00191000
* IS NOT AUTHORIZED FOR VM COMMUNICATION RETURN IS MADE 00192000
* TO DMKHVC WITH APPROPRIATE RETURN CODE SET IN GPR 2, 00193000
* OTHERWISE A BRANCH IS MADE DIRECTLY TO THE SUBFUNCTION 00194000
* ROUTINE VIA A BRANCH TABLE. 00195000
* 00196000
* VMCAUTH - AUTHORIZE SUBROUTINE - 00197000
* 00198000
* 1. VALIDITY CHECK USERS EXTERNAL INTERRUPT BUFFER 00199000
* LENGTH VMCPLENA. (MUST NOT BE LESS THAN VMCMLEN) 00200000
* 2. VERIFY THAT USERS EXTERNAL INTERRUPT BUFFER IS 00201000
* DOUBLEWORD ALIGNED. 00202000
* 3. VALIDITY CHECK USER EXTERNAL INTERRUPT BUFFER 00203000
* ADDRESS VIA SUBROUTINE 'VMCHECK'. 00204000
* 4. FETCH USERS EXTERNAL INTERRUPT BUFFER VIA THE 00205000
* 'TRANS' MACRO AND TEST FOR STORE PROTECTION 00206000
* VIOLATIONS VIA MODULE DMKPSASP. 00207000
* 5. INITIALIZE MASTER VMCBLOK AND CHAIN TO VMBLOK 00208000
* ANCHOR VMCPNT. 00209000
* 6. EXIT TO DMKHVC. 00210000
* 00211000
* VMCUAUTH - UNAUTHORIZE SUBROUTINE - 00212000
* 00213000
* 1. UNHOOK VMCBLOK CHAIN FROM VMBLOK AND FRET MASTER 00214000
* VMCBLOK VIA SUBROUTINE VMCFRET. 00215000
* 2. IF MORE VMCBLOKS EXIST CHECK FOR FINAL RESPONSE 00216000
* EXTERNAL INTERRUPT (BIT VMCRESP). IF VMCBLOK IS 00217000
* FOR A FINAL RESPONSE FRET THE BLOCK VIA SUBROUTINE 00218000
* VMCFRET. 00219000
* 3. IF VMCBLOK IS NOT A FINAL RESPONSE VMCBLOK LOCATE 00220000
* SOURCE USERS VMBLOK VIA A CALL TO MODULE 00221000
* DMKSCNAU. 00222000
* 4. ENQUEUE THE VMCBLOK ON THE SOURCE USERS VMCBLOK 00223000
* CHAIN VIA SUBROUTINE VMCENQ. 00224000
* 5. WAKE UP SOURCE USER VIA SUBROUTINE VMCWAKUP. 00225000
* 6. IF MORE VMCBLOKS EXIST ITERATE LOOP (2). 00226000
* 7. SCAN USERS XINTBLOK CHAIN FOR A PENDING VMCF 00227000
* EXTERNAL INTERRUPT AND IF ONE EXISTS DEQUEUE IT 00228000
* FROM THE CHAIN AND RETURN IT TO FREE STORAGE VIA A 00229000
* CALL TO MODULE DMKFREE. 00230000
* 8. EXIT BACK TO MODULE DMKCFP OR DMKHVC VIA THE EXIT 00231000
* MACRO. 00232000
* 00233000
* NOTE - WHEN VMCBLOKS ARE ENQUEUED ON THE SOURCE VMCBLOK 00234000
* CHAIN THE BIT VMCRESP IS SET TO INDICATE FINAL RESPONSE 00235000
* AND A DATA TRANSFER RETURN CODE IS SET INDICATING USER 00236000
* NOT AVAILABLE. 00237000
* 00238000
* VMCSEND - SEND SUBROUTINE - 00239000
* 00240000
* 1. CHECK OUT SINK USER STATUS VIA SUBROUTINE 00241000
* VMCICHK. 00242000
* 2. VALIDITY CHECK USERS SEND BUFFER ADDRESS VIA 00243000
* SUBROUTINE VMCHECK. 00244000
* 3. SCAN FOR DUPLICATE MESSAGE VIA SUBROUTINE 00245000
* VMCSCANS(R). 00246000
* 4. INITIALIZE VMCBLOK AND ENQUEUE ON SINK VMCBLOK 00247000
* CHAIN VIA SUBROUTINE VMCBUILD. 00248000
* 5. WAKE UP SINK USER VIA SUBROUTINE VMCWAKUP. 00249000
* 6. EXIT TO DMKHVC WITH APPROPRIATE RETURN CODE SET IN 00250000
* GPR 2. 00251000
* 00252000
* VMCSENDR - SEND/RECV SUBROUTINE - 00253000
* 00254000
* 1. VALIDITY CHECK SINK USER STATUS VIA SUBROUTINE 00255000
* VMCICHK. 00256000
* 2. VALIDITY CHECK SEND AND REPLY BUFFER ADDRESSES VIA 00257000
* SUBROUTINE VMCHECK. 00258000
* 3. SCAN FOR DUPLICATE MESSAGE VIA SUBROUTINE 00259000
* VMCSCANS(R). 00260000
* 4. INITIALIZE AND ENQUEUE VMCBLOK ON SINK USER 00261000
* VMCBLOK CHAIN VIA SUBROUTINE VMCBUILD. 00262000
* 5. WAKE UP SINK USER VIA SUBROUTINE VMCWAKUP. 00263000
* 6. EXIT TO DMKHVC WITH APPROPRIATE RETURN CODE SET IN 00264000
* GPR 2. 00265000
* 00266000
* VMCSENDX - SENDX SUBROUTINE - 00267000
* 00268000
* 1. VALIDITY CHECK SINK USER STATUS VIA SUBROUTINE 00269000
* VMCICHK. 00270000
* 2. VALIDITY CHECK SEND BUFFER ADDRESS VIA SUBROUTINE 00271000
* VMCHECK. 00272000
* 3. VERIFY THAT SEND DATA WILL FIT IN SINK USER 00273000
* EXTERNAL INTERRUPT BUFFER. 00274000
* 4. SCAN FOR DUPLICATE MESSAGE VIA SUBROUTINE 00275000
* VMCSCANS(R). 00276000
* 5. INITIALIZE AND ENQUEUE VMCBLOK ON SINK VMCBLOK 00277000
* CHAIN VIA SUBROUTINE VMCBUILD. 00278000
* 6. WAKE UP SINK USER VIA SUBROUTINE VMCWAKUP. 00279000
* 7. EXIT TO DMKHVC WITH APPROPRIATE RETURN CODE SET IN 00280000
* GPR 2. 00281000
* 00282000
* VMCRECV - RECEIVE SUBROUTINE - 00283000
* 00284000
* 1. LOCATE SUBJECT VMCBLOK VIA SUBROUTINE VMCSCANR 00285000
* (VMCPMID+ VMCPUSER). 00286000
* 2. CHECK FOR PROTOCOL VIAOLATION AND SYNCHRONIZATION 00287000
* ERRORS. (VMCCRECP - RECEIVE ALREADY EXECUTED) 00288000
* 3. VALIDITY CHECK USER RECEIVE BUFFER ADDRESS VIA 00289000
* SUBROUTINE VMCHECK. 00290000
* 4. MOVE DATA FROM SOURCE SEND BUFFER TO SINK RECEIVE 00291000
* BUFFER VIA SUBROUTINE VMCXFER. 00292000
* 5. IF SUBFUNCTION WAS SEND/RECV EXIT BACK TO DMKHVC 00293000
* (WAIT FOR REPLY). 00294000
* 6. IF SUBFUNCTION WAS NOT SEND/RECV (SEND) DEQUEUE 00295000
* VMCBLOK FROM SINK VMCBLOK CHAIN VIA SUBROUTINE 00296000
* VMCDEQ AND ENQUEUE VMCBLOK ON SOURCE VMCBLOK CHAIN 00297000
* VIA SUBROUTINE VMCENQ. 00298000
* 7. SET FINAL RESPONSE EXTERNAL INTERRUPT IN VMCBLOK 00299000
* (VMCCXINT+ VMCRESP) AND COPY USER DOUBLEWORD. 00300000
* 8. WAKE UP SOURCE USER VIA SUBROUTINE VMCWAKUP. 00301000
* 9. SET APPROPRIATE RETURN CODE IN GPR 2 AND EXIT TO 00302000
* MODULE DMKHVC. 00303000
* 00304000
* VMCCNCL - CANCEL SUBROUTINE - 00305000
* 00306000
* 1. VERIFY THAT SINK USER IS LOGGED ON VIA A CALL TO 00307000
* MODULE DMKSCNAU AND IF LOGGED ON VERIFY THAT THE SINK 00308000
* USER IS AUTHORIZED FOR VM COMMUNICATION. 00309000
* 2. CHECK FOR TOO LATE CONDITION AND PROTOCOL 00310000
* VIOLATIONS. 00311000
* 3. SCAN FOR SUBJECT VMCBLOK ON SINK USER CHAIN VIA 00312000
* SUBROUTINE VMCSCANS. 00313000
* 4. DEQUEUE SUBJECT VMCBLOK FOR SINK USER VMCBLOK 00314000
* CHAIN AND FRET THE BLOCK VIA SUBROUTINE VMCFRET. 00315000
* 5. SET APPROPRIATE RETURN CODE IF SINK HAS ALREADY 00316000
* EXECUTED A RECEIVE BUT NOT A REPLY. 00317000
* 6. DECREMENT MESSAGE COUNT IN MASTER VMCBLOK. 00318000
* 7. SET APPROPRIATE RETURN CODE IN GPR 2 AND RETURN TO 00319000
* MODULE DMKHVC VIA EXIT. 00320000
* 00321000
* VMCREPLY - REPLY SUBROUTINE - 00322000
* 00323000
* 1. SCAN FOR SUBJECT VMCBLOK VIA SUBROUTINE VMCSCANR. 00324000
* 2. VERIFY THAT ORIGINAL REQUEST WAS SEND/RECV. 00325000
* 3. CHECK FOR PROTOCOL VIOLATIONS AND SYNCHRONIZATION 00326000
* ERROR. 00327000
* 4. VALIDITY CHECK USERS REPLY DATA ADDRESS VIA 00328000
* SUBROUTINE VMCHECK. 00329000
* 5. MOVE REPLY DATA TO SOURCE REPLY BUFFER VIA 00330000
* SUBROUTINE VMCXFER. 00331000
* 6. DEQUEUE VMCBLOK FROM SINK VMCBLOK CHAIN VIA 00332000
* SUBROUTINE VMCDEQ. 00333000
* 7. COPY USER DOUBLEWORD AND SET FINAL RESPONSE 00334000
* EXTERNAL INTERRUPT IN VMCBLOK (VMCRESP). 00335000
* 8. ENQUEUE VMCBLOK ON SOURCE USER VMCBLOK CHAIN VIA 00336000
* SUBROUTINE VMCENQ. 00337000
* 9. WAKE UP SOURCE USER VIA SUBROUTINE VMCWAKUP. 00338000
* 10. EXIT TO MODULE DMKHVC WITH APPROPRIATE RETURN CODE 00339000
* SET IN GPR 2. 00340000
* 00341000
* NOTE - DATA TRANSFER RETURN CODE SET IN VMCEFLG OF 00342000
* VMCBLOK. 00343000
* 00344000
* VMCQIES - QUIESCE SUBROUTINE - 00345000
* 00346000
* 1. SET VMACQIES FLAG IN MASTER VMCBLOK AND EXIT TO 00347000
* DMKHVC WITH RC = 0. 00348000
* 00349000
* VMCRESUM - RESUME SUBROUTINE - 00350000
* 00351000
* 1. RESET VMACQIES FLAG IN MASTER VMCBLOK AND EXIT TO 00352000
* MODULE DMKHVC WITH RC = 0. 00353000
* 00354000
* VMCIDENT - IDENTIFY SUBROUTINE - 00355000
* 00356000
* 1. VALIDITY CHECK SINK USER STATUS VIA SUBROUTINE 00357000
* VMCICHK. 00358000
* 2. INITIALIZE AND ENQUEUE VMCBLOK ON SINK VMCBLOK 00359000
* CHAIN VIA SUBROUTINE VMCBUILD. 00360000
* 3. SET FINAL RESPONSE IN VMCBLOK. (VMCRESP) 00361000
* 4. WAKE UP SINK USER VIA SUBROUTINE VMCWAKUP. 00362000
* 5. EXIT TO MODULE DMKHVC WITH APPROPRIATE RETURN CODE 00363000
* SET IN GPR 2. 00364000
* 00365000
* VMCREJEC - REJECT SUBROUTINE - 00366000
* 00367000
* 1. LOCATE SUBJECT VMCBLOK VIA SUBROUTINE VMCSCANR. 00368000
* 2. CHECK FOR PROTOCOL VIOLATION OR SYNCHRONIZATION 00369000
* ERROR. 00370000
* 3. DEQUEUE SUBJECT VMCBLOK FROM SINK VMCBLOK CHAIN 00371000
* VIA SUBROUTINE VMCDEQ. 00372000
* 4. COPY USER DOUBLEWORD AND SET FINAL RESPONSE 00373000
* INTERRUPT AND REJECT FLAGS IN VMCBLOK 00374000
* (VMCRESP+VMCRJCT). 00375000
* 5. ENQUEUE VMCBLOK ON SOURCE VMCBLOK CHAIN VIA 00376000
* SUBROUTINE VMCENQ. 00377000
* 6. WAKE UP SOURCE USER VIA SUBROUTINE VMCWAKUP. 00378000
* 7. EXIT TO MODULE DMKHVC WITH APPROPRIATE RETURN CODE 00379000
* SET IN GPR 2. 00380000
* 00381000
* THE FOLLOWING ARE INTERNAL SUBROUTINES USED BY MODULE 00382000
* DMKVMC SUBFUNCTION ROUTINES: 00383000
* 00384000
* VMCBUILD - INITIALIZE VMCBLOK FOR SOURCE REQUEST AND 00385000
* ENQ ON SINK VMCBLOK CHAIN. 00386000
* 00387000
* 1. INITIALIZE VMCBLOK WITH SOURCE USERS CURRENT PSW 00388000
* KEY (VMCKEY). 00389000
* 2. CLEAR VMCEFLG TO ZERO. 00390000
* 3. CLEAR VMCSTAT TO ZERO (WAS VMCPFLG1). 00391000
* 4. UPDATE MESSAGE COUNT IN SOURCE MASTER VMCBLOK 00392000
* (VMCACNT). 00393000
* 5. BRANCH TO VMCENQ TO ENQUEUE VMCBLOK ON SINK USER 00394000
* VMCBLOK CHAIN. 00395000
* 00396000
* VMCENQ - ENQUEUE VMCBLOK ON SOURCE OR SINK VMCBLOK 00397000
* CHAIN. 00398000
* 00399000
* 1. IF THE VMCBLOK IS FOR A PRIORITY MESSAGE (VMCPRTY) 00400000
* INSERT THE BLOCK AFTER THE LAST EXISTING PRIORITY 00401000
* VMCBLOK, OTHERWISE, QUEUE THE BLOCK LAST ON THE 00402000
* CHAIN. 00403000
* 2. COPY USERID FIELD (VMUSER) TO VMCBLOK (VMCUSER). 00404000
* 3. SET VMCCXINT FLAG IN VMCBLOK. 00405000
* 4. RETURN TO CALLER. 00406000
* 00407000
* VMCDEQ - DEQUEUE SUBJECT VMCBLOK FROM VMCBLOK CHAIN 00408000
* (VMCPNT IN VMBLOK). 00409000
* 00410000
* 1. DEQUEUE VMCBLOK AND RETURN TO CALLER. 00411000
* 00412000
* VMCICHK - INITIAL VALIDITY CHECK OF SINK USER STATUS 00413000
* (VMCPUSER). 00414000
* 00415000
* 1. VERIFY THAT RECEVIER IS NOT CP 00415100
* 2. VERIFY THAT USER IS NOT EXCEEDING THE MESSAGE 00416000
* LIMIT. (VMCACNT IN MASTER VMCBLOK) 00417000
* 3. CHECK TO SEE THAT SINK USER IS LOGGED ON VIA A 00418000
* CALL TO MODULE DMKSCNAU. 00419000
* 4. INSURE THAT SINK USER IS AUTHORIZED FOR VM 00420000
* COMMUNICATION (VMBCAUTH IN VMCXSTAT OF VMBLOK). 00421000
* 5. INSURE THAT USER IS NOT AUTHORIZED SPECIFIC FOR 00422000
* SOME OTHER USER (VMCAAUTS FLAG IN MASTER 00423000
* VMCBLOK). 00424000
* 6. INSURE THAT SINK USER IS NOT QUIESCING STACKED 00425000
* COMMUNICATION MESSAGES (VMACQIES FLAG IN MASTER 00426000
* VMCBLOK). 00427000
* 7. IF MESSAGE IS A PRIORITY MESSAGE (VMCPRTY IN 00428000
* VMCSTAT OF VMCBLOK) VERIFY THAT SINK USER IS 00429000
* AUTHORIZED TO RECEIVE PRIORITY MESSAGES (VMCAPRTY 00430000
* IN VMCASTAT OF MASTER VMCBLOK). 00431000
* 8. SET APPROPRIATE RETURN CODE IN GPR 2 AND EXIT TO 00432000
* MODULE DMKHVC IF ANY ERRORS WERE DETECTED, 00433000
* OTHERWISE, RETURN TO CALLER. 00434000
* 00435000
* VMCSCANS - LOCATE VMCBLOK ON SINK VMCBLOK CHAIN. 00436000
* 00437000
* 1. SCAN SINK VMCBLOK CHAIN FOR SUBJECT VMCBLOK 00438000
* (VMUSER = VMCUSER - VMCPMID = VMCMID). 00439000
* 2. IF VMCBLOK IS FOUND SET CC = 0 AND RETURN TO 00440000
* CALLER, OTHERWISE, SET CC = 2 AND RETURN TO 00441000
* CALLER. 00442000
* 00443000
* VMCSCANR - LOCATE VMCBLOK FOR ACTIVE USER. 00444000
* 00445000
* 1. SCAN VMCBLOK CHAIN ON CURRENT VMBLOK FOR SUBJECT 00446000
* VMCBLOK (VMCPUSER = VMCUSER - VMCPMID = VMCMID). 00447000
* 2. IF VMCBLOK IS FOUND SET CC = 0 AND RETURN TO 00448000
* CALLER, OTHERWISE, SET CC = 2 AND RETURN TO 00449000
* CALLER. 00450000
* 00451000
* VMCWAKUP - WAKE UP SOURCE / SINK USER. 00452000
* 00453000
* 1. SCAN SUBJECT USERS XINTBLOK CHAIN FOR AN ALREADY 00454000
* EXISTING VMCF EXTERNAL INTERRUPT. IF ONE ALREADY 00455000
* EXISTS RETURN TO THE CALLER. 00456000
* 2. ACQUIRE FREE STORAGE FOR AN XINTBLOK VIA A CALL TO 00457000
* MODULE DMKFREE. 00458000
* 3. CHAIN XINTBLOK AT END OF SUBJECT USERS XINTBLOK 00459000
* CHAIN. 00460000
* 4. INITIALIZE XINTBLOK WITH MAXIMUM COLLATING VALUE 00461000
* (X'7FFFFFFF') AND THE VMCF CODE (X'4001') AND MASK 00462000
* (X'0001'). 00463000
* 5. CHECK TO SEE IF TARGET VIRTUAL MACHINE IS ENABLED 00464000
* FOR VMCF EXTERNAL INTERRUPTS (PSW BIT 7 + CR0 BIT 00465000
* 31) AND IF NOT RETURN TO CALLER. 00466000
* 6. IF TARGET VIRTUAL MACHINE IS ENABLED FOR VMCF 00467000
* EXTERNAL INTERRUPTS GET STORAGE FOR A WAKE-UP 00468000
* CPEXBLOK VIA A CALL TO MODULE DMKFREE. 00469000
* 7. INITIALIZE THE CPEXBLOK TO RETURN DIRECTLY TO THE 00470000
* DISPATCHER DMKDSPCH AND STACK THE BLOK VIA MODULE 00471000
* DMKSTKCP. 00472000
* 8. IF FINAL RESPONSE INTERRUPT IS FOR CP, THEN DON'T 00472100
* REFLECT THE INTERRUPT 00472200
* 9. RETURN TO CALLER. 00473000
* 00474000
* VMCHECK - VALIDITY CHECK VIRTUAL BUFFER ADDRESSES. 00475000
* 00476000
* 1. INSURE THAT CREG1 IS LOADED WITH THE CORRECT 00477000
* SEGMENT TABLE ORIGIN. 00478000
* 2. DO AN LRA ON THE STARTING VIRTUAL ADDRESS AND EXIT 00479000
* TO MODULE DMKHVC WITH APPROPRIATE RETURN CODE IF 00480000
* LRA FAILS. 00481000
* 3. IF STARTING ADDRESS IS OK ADD BUFFER LENGTH TO 00482000
* STARTING ADDRESS AND DO ANOTHER LRA. 00483000
* 4. IF LRA FAILS RETURN TO MODULE DMKHVC WITH 00484000
* APPROPRIATE RETURN CODE, OTHERWISE, RETURN TO 00485000
* CALLER. (BEGINNING AND ENDING BUFFER ADDRESSES 00486000
* OK) 00487000
* 00488000
* VMCFRET - RELEASE VMCBLOK STORAGE 00489000
* 00490000
* 1. FRET VMCBLOK VIA A CALL TO MODULE DMKFREE AND 00491000
* RETURN TO CALLER. 00492000
* 00493000
* VMCSUSER - VALIDATE SOURCE USER STATUS 00494000
* 00495000
* 1. LOCATE SOURCE USER VMBLOK ADDRESS VIA A CALL TO 00496000
* MODULE DMKSCNAU. 00497000
* 2. VERIFY THAT SOURCE USER IS STILL AUTHORIZED FOR 00498000
* VM COMMUNICATION. 00499000
* 3. IF SOURCE USER IS NOT LOGGED ON OR NOT AUTHORIZED 00500000
* FRET THE ACTIVE VMCBLOK VIA A CALL TO MODULE DMKFRET 00501000
* AND RETURN TO MODULE DMKHVC WITH APPROPRIATE RETURN 00502000
* CODE SET IN GPR 2, OTHERWISE, RETURN TO CALLER. 00503000
* 00504000
* VMCXFER - DATA TRANSFER SUBROUTINE 00505000
* 00506000
* INPUT = ADDRESS OF SEND AND RECEIVE VMCBLOKS. 00507000
* 00508000
* 1. DETERMINE CONTROLLING DATA TRANSFER COUNT (LOWEST 00509000
* COUNT WINS) AND SET VMCEFLG IF INCORRECT LENGTH 00510000
* CONDITION EXISTS. 00511000
* 2. IF COUNT IS ZERO RETURN TO CALLER. 00512000
* 3. LOCATE SENDER VMBLOK VIA A CALL TO MODULE 00513000
* DMKSCNAU. 00514000
* 4. FETCH SEND DATA AND LOCK THE PAGE IN STORAGE VIA A 00515000
* CALL TO MODULE DMKPTRAN (TRANS MACRO). 00516000
* 5. CHECK SEND BUFFER FOR FETCH PROTECTION VIOLATION 00517000
* VIA A CALL TO MODULE DMKPSAFC. 00518000
* 6. LOCATE RECEIVER VMBLOK VIA A CALL TO MODULE 00519000
* DMKSCNAU. 00520000
* 7. FETCH THE RECEIVE BUFFER VIA A CALL TO MODULE 00521000
* DMKPTRAN (TRANS MACRO). 00522000
* 8. CHECK FOR STORE PROTECTION VIOLATION WITHIN THE 00523000
* RECEIVE BUFFER VIA A CALL TO MODULE DMKPSASC. 00524000
* 9. COMPUTE LENGTH OF MOVE UP TO THE NEXT 2K BOUNDARY 00525000
* (SEND OR RECEIVE). 00526000
* 10. UPDATE SEND AND RECEIVE DATA COUNTS WITHIN THE 00527000
* SOURCE AND SINK VMCBLOK. 00528000
* 11. MOVE UP TO 2K OF DATA VIA THE MVCL INSTRUCTION. 00529000
* 12. IF TOTAL DATA TRANSFER COUNT IS EXHAUSTED UNLOCK 00530000
* SENDER PAGE AND RETURN TO THE CALLER. 00531000
* 13. IF ANY DATA REMAINS IN SENDER 2K BLOCK ITERATE 00532000
* LOOP (7). 00533000
* 14. UNLOCK SENDER PAGE VIA A CALL TO MODULE DMKPTRUL. 00534000
* 15. ITERATE LOOP (3). 00535000
* 00536000
* NOTE - IF ANY ERRORS ARE DETECTED DURING THE DATA 00537000
* TRANSFER OPERATION THE DATA TRANSFER RETURN CODE IS 00538000
* RETURNED TO THE CALLER. 00539000
* 00539100
* NOTE - NO SCANS FOR THE SYSTEM VMBLOK WILL BE MADE NOR 00539200
* WILL THE TRANS MACRO BE EXECUTED FOR THE SENDER OF VMCF 00539300
* DATA WHEN THE SENDER IS CP. 00539400
* 00540000
* VMCEXIT - NORMAL EXIT FROM DMKVMCFC ENTRY. 00541000
* 00542000
* 1. STORE RETURN CODE (R2) IN THE SAVEAREA FROM 00543000
* DMKHVC. (SAVER2) 00544000
* 2. IF FREE STORAGE WAS ACQUIRED FOR A VMCBLOK WHICH 00545000
* WAS NOT USED (USED ONLY TO BUFFER VMCPARM) FRET 00546000
* THE BLOCK VIA A CALL TO MODULE DMKFREE. 00547000
* 3. EXIT TO MODULE DMKHVC VIA THE EXIT MACRO. 00548000
* 00549000
* RESPONSES - 00550000
* 00551000
* NONE 00552000
* 00553000
* ERROR MESSAGES - 00554000
* 00555000
* NONE 00556000
* 00557000
* ABEND CODES - 00558000
* 00559000
* NONE 00560000
* 00561000
* RETURN CODES - 00562000
* 00563000
* REFER TO VMCBLOKS COPY (RETURN CODE EQUATES) 00564000
* 00565000
*.::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::* 00566000
COPY OPTIONS @V407510 00566100
EJECT 00567000
EXTRN DMKPSASC @V387045 00568000
EXTRN DMKPSAFC @V387045 00569000
EXTRN DMKPSASP @V387045 00570000
EXTRN DMKSTKCP @V387045 00571000
EXTRN DMKPTRPW @VA10373 00571100
EXTRN DMKPTRUL @V387045 00572000
EXTRN DMKSCNAU @V387045 00573000
EXTRN DMKSCHDL @VA06441 00573500
SPACE 00574000
USING SAVEAREA,R13 @V387045 00575000
USING VMBLOK,R11 @V387045 00576000
USING VMCPARM,R9 @V387045 00577000
USING VMCBLOK,R8 @V387045 00578000
USING PSA,0 @V387045 00579000
SPACE 00580000
*.::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::* 00581000
* 00582000
* DMKVMCFC - INTERPRET USER FUNCTION CODE 00583000
* 00584000
*.::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::* 00585000
DMKVMCFC RELOC @V387045 00586000
XC SAVEWRK1,SAVEWRK1 CLEAR SAVE AREA @V387045 00587000
LR R3,R2 PARMLIST LENGTH TO R3 @V387045 00588000
LR R4,R1 SAVE VIRTUAL ADDRESS IN R4 @V387045 00589000
LA R0,VMCBSIZE SIZE OF VMCBLOK (DOUBLEWORDS) @V387045 00590000
CALL DMKFREE GET STORAGE FOR PARMLIST BUFFER @V387045 00591000
LR R9,R1 SAVE ADDRESS IN R9 @V387045 00592000
XC VMCPARM(VMCBSIZE*8),VMCPARM CLEAR BUFFER @V387045 00593000
ST R9,SAVEWRK1 SAVE FOR LATER FRET @V387045 00594000
C R11,ASYSVM IS IT REQUEST FROM CP? @V60C2B8 00594100
BNE CPVMCF1 NO - VALIDATE ADDRESS @V60C2B8 00594200
ST R9,VMCPNT STORE VMCBLOK PTR IN CP VMBLOK 00594210
LR R2,R4 POINT REG 2 TO PARM LIST @V60C2B8 00594300
BCTR R3,0 SUBTRACT 1 FOR EXECUTE 00594310
EX R3,VMCFMOVE MOVE DATA DIRECTLY INTO CORE @V60C2B8 00594400
B CPVMCF2 CONTINUE NORMAL PROCESSING @V60C2B8 00594500
CPVMCF1 LR R1,R4 RESTORE VIRTUAL ADDRESS @V60C2B8 00595000
LR R6,R3 SAVE TOTAL LENGTH @V387045 00596000
LA R14,0(R3,R1) ENDING ADDRESS + 1 @V387045 00597000
BCTR R14,0 ENDING ADDRESS @V387045 00598000
L R15,XPAGNUM PAGE NUMBER MASK @V387045 00599000
NR R14,R15 ENDING PAGE ADDRESS @V387045 00600000
NR R15,R1 STARTING PAGE ADDRESS @V387045 00601000
CLR R14,R15 VMCPARM IN ONE PAGE ? @V387045 00602000
BE VMCFFTCH YES..CONTINUE... @V387045 00603000
SLR R14,R1 BYTES REMAINING IN FIRST PAGE @V387045 00604000
LR R6,R14 SAVE AS LENGTH MOVED @V387045 00605000
VMCFFTCH TRANS 2,1,OPT=(BRING+DEFER) FETCH PARMLIST @V387045 00606000
BNZ VMCRC15 EXIT IF PAGING ERROR @V387045 00607000
LR R0,R6 SAVE BYTES BEING MOVED @V387045 00608000
BCTR R6,0 LESS ONE FOR EXECUTE @V387045 00609000
EX R6,VMCFMOVE MOVE ALL OR PART OF VMCPARM @V387045 00610000
ALR R9,R0 ADJUST BUFFER ADDRESS @V387045 00611000
ALR R1,R0 AND VIRTUAL VMCPARM ADDRESS @V387045 00612000
SR R3,R0 AND TOTAL LENGTH OF VMCPARM @V387045 00613000
LR R6,R3 BYTES LEFT (MAYBE) @V387045 00614000
BP VMCFFTCH CONTINUE IF MORE TO DO.. @V387045 00615000
CPVMCF2 L R9,SAVEWRK1 RESTORE ADDRESS OF VMCPARM @V60C2B8 00616000
LH R1,VMCPFUNC DESIRED FUNCTION CODE @V387045 00617000
CL R1,=A(VMCFMAX) WITHIN VALID RANGE ? @V387045 00618000
BNL VMCRC2 NO..SET RC..EXIT @V387045 00619000
SLA R1,2(0) TIMES 4 FOR BRANCH TABLE @V387045 00620000
BZ VMCAUTH AUTHORIZE SUB FUNCTION.. @V387045 00621000
C R11,ASYSVM IS IT A REQUEST FROM CP? @V60C2B8 00621100
BE VMCFTBL YES - CP ALWAYS AUTHORIZED @V60C2B8 00621200
TM VMCXSTAT,VMBCAUTH USER AUTHORIZED ? @V387045 00622000
BZ VMCRC4 NO..SET CC AND EXIT... @V387045 00623000
SPACE 00624000
VMCFTBL B VMCFTBL(R1) GOTO SUBROUTINE @V387045 00625000
* B VMCAUTH FC = 0 AUTHORIZE 00626000
B VMCUAUTH FC = 1 UN-AUTHORIZE @V387045 00627000
B VMCSEND FC = 2 SEND @V387045 00628000
B VMCSENDR FC = 3 SEND/RECEIVE @V387045 00629000
B VMCSENDX FC = 4 SENDX @V387045 00630000
B VMCRECV FC = 5 RECEIVE @V387045 00631000
B VMCCNCL FC = 6 CANCEL @V387045 00632000
B VMCREPLY FC = 7 REPLY @V387045 00633000
B VMCQIES FC = 8 QUIESCE @V387045 00634000
B VMCRESUM FC = 9 RESUME @V387045 00635000
B VMCIDENT FC = 10 IDENTIFY @V387045 00636000
B VMCREJEC FC = 11 REJECT @V387045 00637000
VMCFMAX EQU (*-VMCFTBL)/4 MAXIMUM SUPPORTED FUNCTION CODE @V387045 00638000
VMCFMOVE MVC 0(*-*,R9),0(R2) EXECUTED MOVE @V387045 00639000
EJECT 00640000
*.::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::* 00641000
* 00642000
* AUTHORIZE - AUTHORIZE VM COMMUNICATIONS 00643000
* 00644000
*.::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::* 00645000
VMCAUTH EQU * AUTHORIZE @V387045 00646000
LM R1,R2,VMCPVADA VADDR + LENGTH @V387045 00647000
LR R3,R1 BUFFER ADDRESS TO R3 @V387045 00648000
N R3,F7 DOUBLE WORD ALIGNED ? @V387045 00649000
BNZ VMCRC1 NO..SET RC..EXIT.. @V387045 00650000
CL R2,=A(VMCMLEN) DATA LENGTH VALID ? @V387045 00651000
BL VMCRC1 NO..SET RC..EXIT.. @V387045 00652000
BAL R10,VMCHECK VALIDITY CHECK BUFFER ADDRESS @V387045 00653000
TRANS 2,1,OPT=(BRING+DEFER) FETCH USER BUFFER @V387045 00654000
BNZ VMCRC15 EXIT IF PAGING ERROR... @V387045 00655000
CALL DMKPSASP CHECK STORAGE KEYS @V387045 00656000
BNZ VMCRC6 STORE PROTECT VIOLATION @V387045 00657000
L R8,VMCPNT VMCBLOK CHAIN @V387045 00658000
LTR R8,R8 DO WE HAVE ANY ? @V387045 00659000
BNZ VMCAIUTH YES..CONTINUE... @V387045 00660000
XC SAVEWRK1,SAVEWRK1 CLEAR SAVED ADDRESS @V387045 00661000
LR R8,R9 CONVERT VMCPARM TO VMCBLOK @V387045 00662000
ST R8,VMCPNT CHAIN TO VMBLOK @V387045 00663000
STCK VMCTOD STORE TOD AT AUTH. @VA07113 00663500
VMCAIUTH EQU * @V387045 00664000
LM R0,R1,VMCPVADA BUFFER ADDRESS + LENGTH @V387045 00665000
STM R0,R1,VMCVADA TO VMCBLOK @V387045 00666000
IC R0,VMPSW+1 CURRENT KEY.. @V387045 00667000
STC R0,VMCKEY SAVE IN VMCBLOK @V387045 00668000
NI VMCASTAT,VMCAQIES LEAVE ONLY THIS... @V387045 00669000
TM VMCPFLG1,VMCPAUTS AUTHORIZE SPECIFIC ? @V387045 00670000
BZ VMCATUTH NO..CONTINUE... @V387045 00671000
MVC VMCUSER,VMCPUSER MOVE USERID TO VMCBLOK @V387045 00672000
OI VMCASTAT,VMCAAUTS INDICATE SPECIFIC @V387045 00673000
VMCATUTH EQU * @V387045 00674000
TM VMCPFLG1,VMCPSMSG WANTS TO RECV SP MSG? @V60C2B8 00674100
BZ VMCPRIOR NO..CONTINUE... @V60C2B8 00674200
OI VMSPMFLG,VMSPMON ALLOW USER TO RECV SPM'S @V60C2B8 00674300
VMCPRIOR TM VMCPFLG1,VMCPPRTY AUTHORIZE PRIORITY ? @V60C2B8 00675000
BZ *+8 NO..CONTINUE... @V387045 00676000
OI VMCASTAT,VMCAPRTY INDICATE PRIORITY @V387045 00677000
MVI VMCSTAT,X'00' CLEAR VMCBLOK STATUS @V387045 00678000
OI VMCXSTAT,VMBCAUTH USER NOW AUTHORIZED @V387045 00679000
B VMCRC0 TAKE NORMAL EXIT..RC = 0 @V387045 00680000
EJECT 00681000
*.::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::* 00682000
* 00683000
* UN-AUTHORIZE - UNAUTHORIZE VM COMMUNICATIONS 00684000
* 00685000
*.::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::* 00686000
DMKVMCUA RELOC @V387045 00687000
XC SAVEWRK1,SAVEWRK1 CLEAR PARMLIST POINTER @V387045 00688000
VMCUAUTH EQU * UN-AUTHORIZE @V387045 00689000
NI VMCXSTAT,X'FF'-VMBCAUTH RESET AUTHORIZATION @V387045 00690000
L R8,VMCPNT MASTER VMCBLOK ADDRESS @V387045 00691000
L R4,VMCFPNT NEXT VMCBLOK @V387045 00692000
SR R0,R0 CLEAR VMCBLOK @V387045 00693000
ST R0,VMCPNT ANCHOR @V387045 00694000
VMCUFRET EQU * @V387045 00695000
BAL R10,VMCFRET GET RID OF MASTER BLOK @V387045 00696000
VMCUNXT EQU * @V387045 00697000
LTR R8,R4 ANY MORE VMCBLOKS ? @V387045 00698000
BZ VMCUINT NO..CHECK FOR XINTBLOKS @V387045 00699000
L R4,VMCFPNT NEXT VMCBLOK @V387045 00700000
TM VMCSTAT,VMCRESP FINAL RESPONSE BLOK ? @V387045 00701000
BNZ VMCUFRET YES..GET RID OF BLOCK @V387045 00702000
CLC VMCUSER(8),SYSTEMID IS SOURCE CP? @VA11145 00702050
BNE VMCUFIND NO-FIND SOURCE @VA11145 00702100
CLC VMCFUNC,=AL2(VMCPSENX) IS IT SENDX? @VA11145 00702150
BNE VMCUFIND NO-CONTINUE NORMALLY @VA11145 00702200
TM VMCCSTAT,VMCCXINT WAITNIG FOR EXT INTERRUPT? @VA11145 00702250
BNO VMCUFIND NO-CONTINUE NORNALLY @VA11145 00702300
L R1,VMCVADA GET SOURCE SENDX DATA AREA @VA11145 00702350
LA R2,VMCPLEN GET LENGTH OF VMCPARM @VA11145 00702400
SR R1,R2 POINT TO THE START OF THE BOLCK @VA11145 00702450
L R2,VMCLENA-VMCBLOK(R1) GET THE DATA LENGTH @VA11145 00702500
LA R2,VMCPLEN+7(R2) GET BUFFER LENGTH FOR FRET @VA11145 00702550
LR R0,R2 MOVE LENGHT FOR FRET @VA11145 00702600
SRL R0,3 CONVERT TO DOUBLE WORDS @VA11145 00702650
CALL DMKFRET FRET THE MESSAGE BLOCK @VA11145 00702700
B VMCUFRET FRET THE VMCBLOCK @VA11145 00702750
VMCUFIND EQU * @VA11145 00702800
LA R0,L'VMCUSER LENGTH OF USERID @V387045 00703000
LA R1,VMCUSER ADDRESS OF USERID @V387045 00704000
CALL DMKSCNAU LOCATE SOURCE VMBLOK ADDRESS @V387045 00705000
BNZ VMCUFRET FRET BLOK IF LOGGED OFF @V387045 00706000
LR R3,R1 VMBLOK ADDRESS TO R3 @V387045 00707000
CLR R3,R11 WRAP CONNECTION ? @V387045 00708000
BE VMCUFRET YES..FRET THE BLOCK @V387045 00709000
TM VMCXSTAT-VMBLOK(R3),VMBCAUTH AUTHORIZED ? @V387045 00710000
BZ VMCUFRET NO..FRET THE BLOCK.. @V387045 00711000
OI VMCSTAT,VMCRESP SET FINAL RESPONSE @V387045 00712000
MVI VMCEFLG,VMC05 USER NOT AVAILABLE @V387045 00713000
BAL R10,VMCENQ ENQUEUE VMCBLOK ON SOURCE CHAIN @V387045 00714000
BAL R10,VMCWAKUP WAKE UP SOURCE USER @V387045 00715000
B VMCUNXT ITERATE LOOP... @V387045 00716000
VMCUINT EQU * @V387045 00717000
LA R1,VMPXINT XINT BLOK ANCHOR @V387045 00718000
VMCUXNXT EQU * @V387045 00719000
LR R2,R1 SAVE ANCHOR @V387045 00720000
L R1,XINTNEXT-XINTBLOK(,R2) NEXT BLOK @V387045 00721000
LTR R1,R1 IS THERE ONE ? @V387045 00722000
BZ VMCUTENT NO..EXIT NOW.. @V387045 00723000
CLC XINTCODE-XINTBLOK(L'XINTCODE,R1),=AL2(VMCXCODE) @V387045 00724000
BNE VMCUXNXT ITERATE LOOP IF NOT VMCF CODE @V387045 00725000
L R0,XINTNEXT-XINTBLOK(,R1) NEXT BLOK @V387045 00726000
ST R0,XINTNEXT-XINTBLOK(,R2) REMOVE FROM CHAIN @V387045 00727000
LA R0,XINTSIZE SIZE OF BLOCK (DOUBLEWORDS) @V387045 00728000
CALL DMKFRET FRET THE BLOCK @V387045 00729000
VMCUTENT EQU * @V387045 00730000
L R1,SAVEWRK1 ADDRESS OF PARMLIST @V387045 00731000
LTR R1,R1 DMKCFP ENTRY ? @V387045 00732000
BNZ VMCRC0 NO..EXIT TO DMKHVC @V387045 00733000
EXIT EXIT TO DMKCFP @V387045 00734000
EJECT 00735000
*.::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::* 00736000
* 00737000
* SEND - SEND MESSAGE (VMCPMID) TO USERID (VMCPUSER) 00738000
* 00739000
*.::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::* 00740000
VMCSEND EQU * SEND @V387045 00741000
BAL R10,VMCICHK CHECK MSG COUNT + TARGET USER @V387045 00742000
LM R1,R2,VMCPVADA BUFFER ADDRESS + LENGTH @V387045 00743000
BAL R10,VMCHECK VALIDITY CHECK ADDRESS @V387045 00744000
BAL R10,VMCSCANR AVOID POSSIBLE RACE @V387045 00745000
BZ VMCRC8 CONDITION.... @V387045 00746000
BAL R10,VMCSCANS SCAN FOR DUPLICATE MSG @V387045 00747000
BZ VMCRC8 DUPLICATE MSG @V387045 00748000
BAL R10,VMCBUILD INITIALIZE + ENQ VMCBLOK @V387045 00749000
BAL R10,VMCWAKUP WAKE UP SINK USER @V387045 00750000
B VMCRC0 EXIT TO DMKHVC @V387045 00751000
*.::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::* 00752000
* 00753000
* SEND/RECV - SEND MESSAGE (VMCPMID) TO USERID (VMCPUSER) 00754000
* AND WAIT FOR REPLY. 00755000
* 00756000
*.::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::* 00757000
VMCSENDR EQU * SEND / RECV @V387045 00758000
BAL R10,VMCICHK CHECK MSG COUNT + TARGET USER @V387045 00759000
LM R1,R2,VMCPVADA SEND DATA ADDRESS @V387045 00760000
BAL R10,VMCHECK VALIDITY CHECK ADDRESS @V387045 00761000
LM R1,R2,VMCPVADB REPLY BUFFER ADDRESS @V387045 00762000
BAL R10,VMCHECK VALIDITY CHECK ADDRESS @V387045 00763000
BAL R10,VMCSCANR SCAN FOR EXISTING MSG @V387045 00764000
BZ VMCRC8 DUPLICATE MESSAGE... @V387045 00765000
BAL R10,VMCSCANS SCAN FOR DUPLICATE MSG @V387045 00766000
BZ VMCRC8 DUPLICATE MSG @V387045 00767000
BAL R10,VMCBUILD INITIALIZE + ENQ VMCBLOK @V387045 00768000
BAL R10,VMCWAKUP WAKE UP SINK USER @V387045 00769000
B VMCRC0 EXIT TO DMKHVC.. @V387045 00770000
*.::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::* 00771000
* 00772000
* SENDX - SEND MESSAGE (VMCPMID) TO USERID (VMCPUSER) 00773000
* WITHIN HIS EXTERNAL INTERRUPT BUFFER. 00774000
* 00775000
*.::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::* 00776000
VMCSENDX EQU * @V387045 00777000
BAL R10,VMCICHK CHECK MSG LIMIT + SINK USER @V387045 00778000
LM R1,R2,VMCPVADA SEND DATA ADDRESS + LENGTH @V387045 00779000
BAL R10,VMCHECK VALIDITY CHECK SENDX DATA ADDRESS@V387045 00780000
LA R1,VMCMLEN(,R2) ADD MINIMUM HEADER LENGTH @V387045 00781000
CL R1,VMCLENA WILL IT FIT ? @V387045 00782000
BH VMCRC7 NO..SET RC..EXIT @V387045 00783000
BAL R10,VMCSCANR SCAN RECEIVE QUEUE FOR @V387045 00784000
BZ VMCRC8 DUPLICATE MESSAGE @V387045 00785000
BAL R10,VMCSCANS SCAN FOR DUPLICATE MSG @V387045 00786000
BZ VMCRC8 DUPLICATE MSG IS AN ERROR.. @V387045 00787000
BAL R10,VMCBUILD INITIALIZE + ENQ VMCBLOK @V387045 00788000
BAL R10,VMCWAKUP WAKE UP SINK USER @V387045 00789000
B VMCRC0 EXIT TO DMKHVC @V387045 00790000
EJECT 00791000
*.::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::* 00792000
* 00793000
* RECEIVE - RECEIVE MESSAGE (VMCPMID) FROM USERID 00794000
* (VMCPUSER). 00795000
* 00796000
*.::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::* 00797000
VMCRECV EQU * RECEIVE @V387045 00798000
BAL R10,VMCSCANR LOCATE SUBJECT VMCBLOK @V387045 00799000
BNZ VMCRC12 MESSAGE NOT FOUND @V387045 00800000
TM VMCSTAT,VMCRESP FINAL RESPONSE ? @V387045 00801000
BO VMCRC3 YES..PROTOCOL VIOLATION @V387045 00802000
TM VMCCSTAT,VMCCXINT XINT BLOK ? @V387045 00803000
BO VMCRC13 YES..SYNCHRONIZATION ERROR... @V387045 00804000
TM VMCCSTAT,VMCCRECP RECEIVE ALREADY EXECUTED ? @V387045 00805000
BO VMCRC3 YES..PROTOCOL VIOLATION @V387045 00806000
LM R1,R2,VMCPVADA BUFFER ADDRESS + LENGTH @V387045 00807000
BAL R10,VMCHECK VALIDITY CHECK BUFFER ADDRESS @V387045 00808000
OI VMCCSTAT,VMCCRECP INDICATE RECEIVE PROCESSED @V387045 00809000
MVC VMCUSER,VMUSER SWAP USERID TO SINK @V387045 00810000
LR R7,R8 SOURCE VMCBLOK ADDRESS TO R7 @V387045 00811000
LR R8,R9 SINK VMCBLOK ADDRESS TO R8 @V387045 00812000
IC R0,VMPSW+1 USERS CURRENT PSW KEY + @V387045 00813000
STC R0,VMCKEY SAVE IN VMCBLOK @V387045 00814000
SPACE 00815000
BAL R10,VMCXFER TRANSFER DATA (VM -> VM) @V387045 00816000
SPACE 00817000
LR R8,R7 SWAP BACK TO SOURCE VMCBLOK (R8) @V387045 00818000
MVC VMCUSER,VMCPUSER SWAP USERID BACK TO SOURCE @V387045 00819000
CLC VMCFUNC,=AL2(VMCPSENR) SEND/RECV ? @V387045 00820000
BE VMCREDAT YES..WAIT FOR REPLY... @V387045 00821000
BAL R10,VMCDEQ DEQUEUE VMCBLOK FROM SINK CHAIN @V387045 00822000
BAL R10,VMCSUSER CHECK OUT SOURCE STATUS @V387045 00823000
OI VMCSTAT,VMCRESP SET FINAL RESPONSE @V387045 00824000
MVC VMCUSE,VMCPUSE COPY USER DOUBLEWORD @V387045 00825000
BAL R10,VMCENQ ENQUEUE BLOK ON SOURCE VMCBLOK @V387045 00826000
* CHAIN 00827000
BAL R10,VMCWAKUP WAKE UP SOURCE USER @V387045 00828000
VMCREDAT EQU * @V387045 00829000
SLR R2,R2 CLEAR RETURN CODE REG @V387045 00830000
IC R2,VMCEFLG-VMCBLOK(,R9) SET RETURN CODE @V387045 00831000
B VMCEXIT EXIT @V387045 00832000
EJECT 00833000
*.::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::* 00834000
* 00835000
* CANCEL - CANCEL MESSAGE (VMCPMID) PREVIOUSLY SENT 00836000
* TO USER (VMCPUSER) 00837000
* 00838000
*.::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::* 00839000
VMCCNCL EQU * CANCEL @V387045 00840000
LA R0,L'VMCPUSER LENGTH OF USERID @V387045 00841000
LA R1,VMCPUSER ADDRESS OF USERID @V387045 00842000
CALL DMKSCNAU LOCATE SINK VMBLOK ADDRESS @V387045 00843000
BNZ VMCRC5 USER NOT AVAILABLE @V387045 00844000
LR R3,R1 VMBLOK ADDRESS TO R3 @V387045 00845000
TM VMCXSTAT-VMBLOK(R3),VMBCAUTH AUTHORIZED ? @V387045 00846000
BZ VMCRC5 NO..USER NOT AVAILABLE @V387045 00847000
BAL R10,VMCSCANR CHECK FOR TOO LATE CONDITION @V387045 00848000
BNZ VMCCNSS NOT THERE..LOCATE MESSAGE.. @V387045 00849000
TM VMCSTAT,VMCRESP FINAL RESPONSE ? @V387045 00850000
BO VMCRC14 YES..TOO LATE... @V387045 00851000
CLR R11,R3 WRAP CONNECTION ? @V387045 00852000
BNE VMCRC3 NO..PROTOCOL VIOLATION @V387045 00853000
VMCCNSS EQU * @V387045 00854000
BAL R10,VMCSCANS LOCATE SUBJECT VMCBLOK @V387045 00855000
BNZ VMCRC12 MESSAGE NOT FOUND.. @V387045 00856000
TM VMCCSTAT,VMCCBUSY IN PROCESS ? @V387045 00857000
BNZ VMCRC20 YES..SET RC FOR BUSY.. @V387045 00858000
SLR R4,R4 CLEAR RETURN CODE REGISTER @V387045 00859000
TM VMCCSTAT,VMCCRECP RECEIVE ALREADY EXECUTED ? @V387045 00860000
BZ *+8 NO..CONTINUE... @V387045 00861000
LA R4,VMC11 REPLY CANCELLED @V387045 00862000
L R1,VMCFPNT NEXT VMCBLOK @V387045 00863000
ST R1,VMCFPNT-VMCBLOK(,R2) DECHAIN ACTIVE VMCBLOK @V387045 00864000
BAL R10,VMCFRET AND RETURN IT TO FREE STORAGE @V387045 00865000
L R8,VMCPNT ACCESS MASTER VMCBLOK @V387045 00866000
L R1,VMCFPNT LOAD NEXT VMCBLOK @VA08623 00866100
CLC VMCTOD-VMCBLOK(8,R1),VMCTOD-VMCBLOK(R8) GOOD @VA08623 00866300
* TIME? 00866500
BL VMCCNST NO, DO NOT CHANGE MSG COUNT @VA08623 00866700
LH R1,VMCACNT ACTIVE MESSAGE COUNT @V387045 00867000
BCTR R1,0 LESS ONE @V387045 00868000
STH R1,VMCACNT REPLACE... @V387045 00869000
VMCCNST LR R2,R4 RETURN CODE TO REG 2 @VA08623 00870100
B VMCEXIT EXIT BACK TO DMKHVC.. @V387045 00871000
EJECT 00872000
*.::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::* 00873000
* 00874000
* REPLY - REPLY TO MESSAGE (VMCPMID) FROM USER (VMCPUSER). 00875000
* 00876000
*.::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::* 00877000
VMCREPLY EQU * REPLY @V387045 00878000
BAL R10,VMCSCANR LOCATE SUBJECT MESSAGE VMCBLOK @V387045 00879000
BNZ VMCRC12 MESSAGE NOT FOUND @V387045 00880000
CLC VMCFUNC,=AL2(VMCPSENR) SEND/RECV REQUEST ? @V387045 00881000
BNE VMCRC3 NO..PROTOCOL VIOLATION... @V387045 00882000
TM VMCSTAT,VMCRESP FINAL RESPONSE ? @V387045 00883000
BO VMCRC3 YES..PROTOCOL... @V387045 00884000
TM VMCCSTAT,VMCCXINT XINT BLOK ? @V387045 00885000
BO VMCRC13 YES..SYNCHRONIZATION ERROR.. @V387045 00886000
LM R1,R2,VMCPVADA BUFFER ADDRESS + LENGTH @V387045 00887000
BAL R10,VMCHECK VALIDITY CHECK ADDRESS @V387045 00888000
MVC VMCUSER,VMUSER SENDER USERID TO RECV VMCBLOK @V387045 00889000
LR R7,R9 SENDER VMCBLOK TO R7 @V387045 00890000
BAL R10,VMCRSWAP SWAP BUFFER ADDRESSES @V387045 00891000
SPACE 00892000
BAL R10,VMCXFER TRANSFER DATA (VM -> VM) @V387045 00893000
SPACE 00894000
BAL R10,VMCRSWAP SWAP BACK ADDRESSES @V387045 00895000
BAL R10,VMCDEQ DECHAIN BLOK FROM SINK VMBLOK @V387045 00896000
BAL R10,VMCSUSER SCAN FOR SOURCE VMBLOK @V387045 00897000
OI VMCSTAT,VMCRESP SET FINAL RESPONSE @V387045 00898000
MVC VMCUSE,VMCPUSE COPY USER DOUBLEWORD @V387045 00899000
BAL R10,VMCENQ ENQUEUE BLOK ON SOURCE VMCBLOK @V387045 00900000
* CHAIN 00901000
BAL R10,VMCWAKUP WAKE UP SOURCE USER @V387045 00902000
SLR R2,R2 CLEAR RETURN CODE REGISTER @V387045 00903000
IC R2,VMCEFLG-VMCBLOK(R7) SET RETURN CODE @V387045 00904000
B VMCEXIT EXIT... @V387045 00905000
VMCRSWAP EQU * @V387045 00906000
LM R0,R1,VMCVADA SWAP SEND @V387045 00907000
LM R2,R3,VMCVADB AND REPLY @V387045 00908000
STM R0,R1,VMCVADB BUFFER @V387045 00909000
STM R2,R3,VMCVADA ADDRESSES... @V387045 00910000
BR R10 RETURN @V387045 00911000
EJECT 00912000
*.::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::* 00913000
* 00914000
* QUIESCE - QUIESCE STACKED VMCF EXTERNAL INTERRUPTS 00915000
* 00916000
*.::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::* 00917000
VMCQIES EQU * QUIESCE @V387045 00918000
L R8,VMCPNT ADDRESS OF MASTER VMCBLOK @V387045 00919000
OI VMCASTAT,VMCAQIES SET QUIESCE FLAG @V387045 00920000
B VMCRC0 SET RC = 0...EXIT... @V387045 00921000
SPACE 00922000
*.::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::* 00923000
* 00924000
* RESUME - RESET ACTIVE 'QUIESCING' STATE 00925000
* 00926000
*.::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::* 00927000
VMCRESUM EQU * RESUME VM COMMUNICATIONS @V387045 00928000
L R8,VMCPNT ADDRESS OF MASTER VMCBLOK @V387045 00929000
NI VMCASTAT,X'FF'-VMCAQIES RESET QUIESCE FLAG @V387045 00930000
B VMCRC0 SET RC = 0..EXIT.. @V387045 00931000
*.::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::* 00932000
* 00933000
* IDENTIFY - IDENTIFY SELF TO OTHER USERS 00934000
* 00935000
*.::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::* 00936000
VMCIDENT EQU * IDENTIFY @V387045 00937000
BAL R10,VMCICHK CHECK MSG LIMIT + SINK USER @V387045 00938000
* STATUS 00939000
BAL R10,VMCBUILD INITIALIZE + ENQ VMCBLOK @V387045 00940000
OI VMCSTAT,VMCRESP SET FINAL RESPONSE @V387045 00941000
BAL R10,VMCWAKUP WAKE UP SINK USER @V387045 00942000
B VMCRC0 EXIT TO DMKHVC..RC = 0 @V387045 00943000
*.::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::* 00944000
* 00945000
* REJECT - REJECT MESSAGE (VMCPMID) SENT BY USERID 00946000
* (VMCPUSER) 00947000
* 00948000
*.::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::* 00949000
VMCREJEC EQU * REJECT @V387045 00950000
BAL R10,VMCSCANR LOCATE SUBJECT MESSAGE @V387045 00951000
BNZ VMCRC12 MESSAGE NOT FOUND @V387045 00952000
TM VMCSTAT,VMCRESP FINAL RESPONSE ? @V387045 00953000
BO VMCRC3 YES..PROTOCOL VIOLATION... @V387045 00954000
TM VMCCSTAT,VMCCXINT XINT BLOK ? @V387045 00955000
BO VMCRC13 YES..SYNCHRONIZATION ERROR.. @V387045 00956000
BAL R10,VMCDEQ DEQUEUE SUBJECT VMCBLOK @V387045 00957000
BAL R10,VMCSUSER SCAN FOR SOURCE VMBLOK ADDRESS @V387045 00958000
OI VMCSTAT,VMCRESP+VMCRJCT SET FINAL RESPONSE + @V387045 00959000
* REJECT 00960000
MVC VMCUSE,VMCPUSE COPY USER DOUBLEWORD @V387045 00961000
BAL R10,VMCENQ ENQUEUE ON SOURCE VMCBLOK CHAIN @V387045 00962000
BAL R10,VMCWAKUP WAKE UP SOURCE USER @V387045 00963000
B VMCRC0 EXIT WITH RC = 0 @V387045 00964000
EJECT 00965000
*.::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::* 00966000
* 00967000
* VMCBUILD - INITIALIZE + ENQUEUE SOURCE VMCBLOK 00968000
* 00969000
*.::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::* 00970000
VMCBUILD EQU * @V387045 00971000
XC SAVEWRK1,SAVEWRK1 CLEAR PARMLIST BUFFER ADDRESS @V387045 00972000
LR R8,R9 CONVERT PARMLIST BUFFER TO @V387045 00973000
* VMCBLOK 00974000
IC R0,VMPSW+1 USER PSW KEY @V387045 00975000
STC R0,VMCKEY MOVE TO VMCBLOK @V387045 00976000
TM VMCPFLG1,VMCPPRTY PRIORITY OPTION ? @V387045 00977000
MVI VMCSTAT,X'00' CLEAR USER STATUS BYTE @V387045 00978000
BZ *+8 CONTINUE... @V387045 00979000
OI VMCSTAT,VMCPRTY SET PRIORITY FLAG @V387045 00980000
MVI VMCEFLG,X'00' CLEAR VMCEFLG @V387045 00981000
L R1,VMCPNT MASTER VMCBLOK @V387045 00982000
C R11,ASYSVM IS VMCF SOURCE, 'CP'? 00982100
BE VMCENQ YES - DON'T UPDATE MESSAGE COUNT 00982200
LA R2,1 ADD ONE TO @V387045 00983000
AH R2,VMCACNT-VMCBLOK(,R1) MESSAGE @V387045 00984000
STH R2,VMCACNT-VMCBLOK(,R1) COUNT... @V387045 00985000
* B VMCENQ ENQ BLOK ON SINK USER VMCBLOK CHAIN 00986000
*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::* 00987000
* * 00988000
* VMCENQ - ENQUEUE VMCBLOK ON SOURCE/SINK VMCBLOK CHAIN 00989000
* * 00990000
*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::* 00991000
VMCENQ EQU * @V387045 00992000
L R1,VMCPNT-VMBLOK(,R3) ADDRESS OF MASTER BLOK @V387045 00993000
VMCECHN EQU * @V387045 00994000
LR R2,R1 SAVE ANCHOR IN R2 @V387045 00995000
L R1,VMCFPNT-VMCBLOK(,R2) NEXT BLOK @V387045 00996000
LTR R1,R1 DOES ONE EXIST ? @V387045 00997000
BZ VMCEAIN NO..CHAIN IN NEW BLOCK @V387045 00998000
TM VMCSTAT,VMCPRTY PRIORITY MESSAGE ? @V387045 00999000
BZ VMCECHN NO..SCAN TO END OF CHAIN @V387045 01000000
TM VMCSTAT-VMCBLOK(R1),VMCPRTY PRIORITY BLOCK ? @V387045 01001000
BNZ VMCECHN YES..KEEP LOOKING @V387045 01002000
VMCEAIN EQU * @V387045 01003000
L R1,VMCFPNT-VMCBLOK(,R2) NEXT POINTER @V387045 01004000
ST R8,VMCFPNT-VMCBLOK(,R2) PATCH IN NEW BLOCK @V387045 01005000
ST R1,VMCFPNT AND ADD REST OF CHAIN @V387045 01006000
MVC VMCUSER,VMUSER COPY USERID TO BLOCK @V387045 01007000
OI VMCCSTAT,VMCCXINT SET XINT PENDING... @V387045 01008000
STCK VMCTOD STORE TOD AT BUILD @VA07113 01008500
BR R10 RETURN TO CALLER @V387045 01009000
EJECT 01010000
*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::* 01011000
* * 01012000
* VMCDEQ - DEQUEUE VMCBLOK FROM CURRENT VMCBLOK CHAIN 01013000
* * 01014000
*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::* 01015000
VMCDEQ EQU * @V387045 01016000
L R1,VMCPNT ADDRESS OF MASTER VMCBLOK @V387045 01017000
VMCDNEXT EQU * @V387045 01018000
LR R2,R1 SAVE ANCHOR @V387045 01019000
L R1,VMCFPNT-VMCBLOK(,R2) NEXT BLOCK @V387045 01020000
CLR R1,R8 THIS THE BLOCK ? @V387045 01021000
BNE VMCDNEXT NO..KEEP LOOKING... @V387045 01022000
L R1,VMCFPNT ADDRESS OF NEXT BLOCK @V387045 01023000
ST R1,VMCFPNT-VMCBLOK(,R2) DELETE FROM CHAIN @V387045 01024000
BR R10 RETURN TO CALLER @V387045 01025000
*.::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::* 01026000
* 01027000
* VMCXFER - VM -> VM DATA TRANSFER SUBROUTINE 01028000
* 01029000
*.::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::* 01030000
VMCXFER EQU * @V387045 01031000
LM R5,R6,VMCVADA BUFFER ADDR + LENGTH (SINK) @V387045 01032000
LM R0,R1,VMCVADA-VMCBLOK(R7) SAME FOR SOURCE @V387045 01033000
CLR R1,R6 COMPARE SEND TO RECEIVE @V387045 01034000
BE VMCXCONT CONTINUE IF EQUAL @V387045 01035000
BNH VMCXSR1 SEND COUNT LOW..USE IT.. @V387045 01036000
MVI VMCEFLG,VMC16 SET INCORRECT LENGTH @V387045 01037000
MVI VMCEFLG-VMCBLOK(R7),VMC16 DITTO... @V387045 01038000
B VMCXCONT CONTINUE..R6 IS OK.. @V387045 01039000
VMCXSR1 EQU * @V387045 01040000
LR R6,R1 USE LOWEST COUNT @V387045 01041000
VMCXCONT EQU * @V387045 01042000
ST R5,SAVEWRK5 SAVE BUFFER ADDRESS (SINK) @V387045 01043000
ST R0,SAVEWRK6 AND BUFFER ADDRESS (SOURCE) @V387045 01044000
XC SAVEWRK7,SAVEWRK7 CLEAR WORK AREA @V387045 01045000
LTR R6,R6 DATA COUNT REASONABLE ? @V387045 01046000
BNPR R10 NO..RETURN TO CALLER @V387045 01047000
OI VMCCSTAT,VMCCBUSY SET PROCESS FLAG @V387045 01048000
OI VMCCSTAT-VMCBLOK(R7),VMCCBUSY DITTO... @V387045 01049000
VMCXLOOP EQU * @V60C2B8 01050000
L R4,SAVEWRK6 GET SOURCE BUFFER ADDRESS @V60C2B8 01050100
CLC VMCUSER(8),SYSTEMID IS SOURCE CP? @V60C2B8 01050200
BE VMCXLOPE YES - THEN ALL SET @V60C2B8 01050300
LA R0,L'VMCUSER LENGTH OF USERID @V60C2B8 01051000
LA R1,VMCUSER SOURCE USERID @V387045 01052000
CALL DMKSCNAU SEE IF STILL LOGGED ON @V387045 01053000
BNZ VMCEC5 NO..SET RETURN CODE..EXIT @V387045 01054000
TM VMCXSTAT-VMBLOK(R1),VMBCAUTH AUTHORIZED ? @V60C2B8 01055000
BZ VMCEC5 NO..EXIT NOW... @V387045 01056000
SWTCHVM SWITCH TO SOURCE VMBLOK @V407510 01057100
L R1,SAVEWRK6 SOURCE BUFFER ADDRESS @V387045 01060000
TRANS 4,1,OPT=(BRING+DEFER+LOCK),ADEX=VMCEC1 @V387045 01061000
BNZ VMCEC15 PAGING I/O ERROR @V387045 01062000
ST R4,SAVEWRK7 SAVE ADDRESS OF LOCKED PAGE @V387045 01063000
LR R2,R4 REAL ADDRESS TO R2 @V387045 01064000
IC R0,VMCKEY-VMCBLOK(R7) USER KEY @V387045 01065000
CALL DMKPSAFC CHECK FETCH PROTECTION @V387045 01066000
BNZ VMCEC6 EXIT OF VIOLATED.. @V387045 01067000
LA R0,L'VMCUSER LENGTH OF USERID @V387045 01068000
LA R1,VMCUSER-VMCBLOK(,R7) SINK USERID @V387045 01069000
CALL DMKSCNAU SEE IF STILL LOGGED ON @V387045 01070000
BNZ VMCEC5 IF NOT..EXIT.... @V387045 01071000
TM VMCXSTAT-VMBLOK(R1),VMBCAUTH AUTHORIZED ? @V387045 01072000
BZ VMCEC5 NO..EXIT NOW... @V387045 01073000
SWTCHVM SWITCH TO SINK VMBLOK @V407510 01074100
VMCXLOPE EQU * @V387045 01077000
L R1,SAVEWRK5 SINK BUFFER ADDRESS @V387045 01078000
TRANS 2,1,OPT=(BRING+DEFER),ADEX=VMCEC1A @V387045 01079000
BNZ VMCEC15A PAGING I/O ERROR @V387045 01080000
LA R0,X'7FF' 2K MASK @V387045 01081000
LR R3,R0 ALSO IN R3 @V387045 01082000
OR R0,R4 LAST BYTE OF SOURCE 2K BLOCK @V387045 01083000
SLR R0,R4 BYTES LEFT IN 2K BLOCK - 1 @V387045 01084000
OR R3,R2 LAST BYTE OF SINK 2K BLOCK @V387045 01085000
SLR R3,R2 BYTES LEFT IN 2K BLOCK - 1 @V387045 01086000
CLR R3,R0 DETERMINE CONTROLLING @V387045 01087000
BL *+6 TRANSFER @V387045 01088000
LR R3,R0 COUNT.... @V387045 01089000
AL R3,F1 ADJUST TO ACTUAL COUNT @V387045 01090000
CLR R3,R6 MORE THAN BYTES REMAINING ? @V387045 01091000
BL *+6 NO..USE THIS COUNT... @V387045 01092000
LR R3,R6 OTHERWISE USE FINAL COUNT.. @V387045 01093000
IC R0,VMCKEY PSW KEY OF RECEIVER @V387045 01094000
CALL DMKPSASC CHECK FOR STORE PROTECT VIOLATE @V387045 01095000
BNZ VMCEC6A TERMINATE IF KEY VIOLATION @V387045 01096000
LM R0,R1,SAVEWRK5 USER BUFFER ADDRESSES @V387045 01097000
ALR R0,R3 ADJUST WITH BYTES MOVED @V387045 01098000
ALR R1,R3 DITTO... @V387045 01099000
STM R0,R1,SAVEWRK5 REPLACE FOR NEXT PASS @V387045 01100000
L R0,VMCLENA ADJUST DATA COUNT @V387045 01101000
SLR R0,R3 FOR RECEIVING @V387045 01102000
ST R0,VMCLENA VIRTUAL MACHINE... @V387045 01103000
L R0,VMCLENA-VMCBLOK(,R7) ADJUST @V387045 01104000
SLR R0,R3 DATA COUNT FOR SENDER @V387045 01105000
ST R0,VMCLENA-VMCBLOK(,R7) VIRTUAL MACHINE.. @V387045 01106000
SLR R6,R3 COMPUTE BYTES REMAINING @V387045 01107000
LR R5,R3 MOVE LENGTH TO R5 @V387045 01108000
SPACE 01109000
*.::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::* 01110000
* * 01111000
MVCL R2,R4 TRANSFER UP TO 2K OF DATA @V387045 01112000
* * 01113000
*.::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::* 01114000
SPACE 01115000
BNZ VMCEC17 DESTRUCTIVE OVERLAP @V387045 01116000
LTR R6,R6 ANY DATA REMAINING ? @V387045 01117000
BNP VMCXEND NO..EXIT FORTHWITH @V387045 01118000
LA R1,X'7FF' 2K MASK @V387045 01119000
NR R1,R4 DATA LEFT IN SOURCE PAGE ? @V387045 01120000
BNZ VMCXLOPE IF SO..CONTINUE... @V387045 01121000
CLC VMCUSER(8),SYSTEMID IS SOURCE SYSTEM ? @V60C2B8 01121100
BE CPVMCF4 YES - SKIP UNLOCK @V60C2B8 01121200
LR R2,R4 REAL ADDRESS TO R2 @V387045 01122000
BCTR R2,0 LESS ONE @V387045 01123000
CALL DMKPTRUL UNLOCK SOURCE PAGE @V387045 01124000
CPVMCF4 XC SAVEWRK7,SAVEWRK7 CLEAR PAGE ADDRESS @V60C2B8 01125000
B VMCXLOOP NOW CONTINUE.... @V387045 01126000
VMCXEND EQU * @V387045 01127000
CLC VMCUSER(8),SYSTEMID IS SOURCE SYSTEM ? @V60C2B8 01127100
BE CPVMCF5 YES - SKIP UNLOCK @V60C2B8 01127200
L R2,SAVEWRK7 SOURCE LOCKED PAGE @V387045 01128000
LTR R2,R2 ANY PAGES LOCKED ? @V387045 01129000
BZ VMCXENDF NO..ALL FINISHED @V387045 01130000
CALL DMKPTRUL UNLOCK SOURCE PAGE @V387045 01131000
CPVMCF5 XC SAVEWRK7,SAVEWRK7 CLEAR ADDRESS @V60C2B8 01132000
VMCXENDF EQU * DATA TRANSFER COMPLETE @V387045 01133000
L R1,SAVER11 GET ORIGINAL VMBLOK @V407510 01134100
SWTCHVM SWITCH BACK TO CALLER @V407510 01134200
NI VMCCSTAT,X'FF'-VMCCBUSY RESET PROC FLAG @V387045 01138000
NI VMCCSTAT-VMCBLOK(R7),X'FF'-VMCCBUSY DITTO... @V387045 01139000
LTR R6,R6 SET CONDITION CODE IF ERRORS @V387045 01140000
BR R10 RETURN TO CALLER @V387045 01141000
EJECT 01142000
*.::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::* 01143000
* 01144000
* VMCWAKUP - POST PENDING EXT INTERRUPT TO TARGET VM 01145000
* 01146000
*.::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::* 01147000
VMCWAKUP EQU * @V387045 01148000
LA R1,VMPXINT-VMBLOK(,R3) XINTBLOK ANCHOR @V387045 01149000
VMCWNXT EQU * @V387045 01150000
LR R2,R1 XINTBLOK ADDRESS TO R2 @V387045 01151000
L R1,XINTNEXT-XINTBLOK(,R2) NEXT BLOK @V387045 01152000
LTR R1,R1 DOES IT EXIST ? @V387045 01153000
BZ VMCWAQR NO..GET NEW BLOK @V387045 01154000
USING XINTBLOK,R1 @V387045 01155000
CLC XINTCODE,=AL2(VMCXCODE) VMC INTERRUPT ? @V387045 01156000
BNE VMCWNXT NO..KEEP LOOKING.. @V387045 01157000
BR R10 RETURN..NOTHING TO DO HERE.. @V387045 01158000
VMCWAQR EQU * @V387045 01159000
LA R0,XINTSIZE SIZE OF XINTBLOK @V387045 01160000
CALL DMKFREE GET STORAGE FOR BLOK @V387045 01161000
XC XINTBLOK(XINTSIZE*8),XINTBLOK CLEAR @V387045 01162000
ST R1,XINTNEXT-XINTBLOK(,R2) PATCH IN CHAIN @V387045 01163000
L R2,=A(X'7FFFFFFF') MAX COLLATING VALUE @V387045 01164000
ST R2,XINTSORT TO XINTBLOK.. @V387045 01165000
L R2,=AL2(VMCXCODE,VMCXMASK) CODE+MASK @V387045 01166000
ST R2,XINTCODE SAVE IN XINTBLOK @V387045 01167000
L R2,VMVCR0-VMBLOK(,R3) CR0 (MAYBE) @V387045 01168000
TM VMPSTAT-VMBLOK(R3),VMV370R ECMODE OPTION ? @V387045 01169000
BZ *+8 NO..R2 IS OK.. @V387045 01170000
L R2,EXTCR0-ECBLOK(,R2) VIRTUAL CR0 @V387045 01171000
N R2,=A(VMCXMASK) ENABLED FOR VMC ? @V387045 01172000
BZR R10 NO..NOTHING MORE TO DO.. @V387045 01173000
DROP R1 @V387045 01174000
TM VMPSW-VMBLOK(R3),VMEXTPND PSW ENABLED ? @V387045 01175000
BZR R10 NO..WAIT UNTIL ENABLED... @V387045 01176000
LA R0,CPEXSIZE SIZE OF CPEXBLOK (DOUBLE-WORDS) @V387045 01177000
CALL DMKFREE GET STORAGE FOR CPEXBLOK @V387045 01178000
USING CPEXBLOK,R1 @V387045 01179000
XC CPEXBLOK(CPEXSIZE*8),CPEXBLOK CLEAR IT OUT @V387045 01180000
LA R2,VMCDSP RETURN AND LOCK @VA12989 01181200
ST R2,CPEXADD ADDRESS IN R2 @VA12989 01181250
STM R0,R15,CPEXREGS SAVE REGS @VA12989 01181300
CALL DMKPTRLK LOCK IN VMC @VA12989 01181350
ST R3,CPEXR11 AND TARGET VMBLOK ADDRESS @V387045 01184000
CALL DMKSTKCP STACK THE BLOK @V387045 01185000
BR R10 RETURN TO CALLER @V387045 01186000
VMCDSP DS 0H COME HERE ON STACKED CPEXBLOK @VA11766 01186100
CALL DMKPTRPW MAKE SURE HE'S NOT IN PAGEWAIT @VA11766 01186200
B VMCXGOTO GOTO DISPATCHER @VA12989 01186310
DROP R1 @V387045 01187000
EJECT 01188000
*.::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::* 01189000
* 01190000
* VMCHECK - VALIDITY CHECK USER BUFFER ADDRESSES 01191000
* 01192000
*.::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::* 01193000
VMCHECK EQU * VALIDITY CHECK ROUTINE @V387045 01194000
C R11,ASYSVM IS THIS VALIDITY CHECK FOR CP? @V60C2B8 01194100
BCR 8,R10 YES - SKIP VALIDITY CHECKING @V60C2B8 01194200
LCTL C1,C1,VMSEG ACCESS SEGMENT TABLE @V387045 01195000
LTR R2,R2 IS IT ZERO DATA LENGTH? @VA05890 01195100
BZR R10 YES - THEN ADDRESS IS OK. @VA05890 01195200
LRA R0,0(,R1) TEST FOR VALID ADDRESS @V387045 01196000
BC 8+2,VMCHECK1 NO SEG EXCEPTION BRANCH @VA08051 01197200
LR R0,R2 SAVE REG 2 ACROSS CALL @VA08051 01197250
CALL DMKPTRAN,PARM=DEFER LET PTRAN HANDLE IT @VA08051 01197300
BC 2,VMCRC1 ADDRESSING PROBLEM @VA08051 01197350
LR R2,R0 RESTOPE REG2 @VA08051 01197400
VMCHECK1 DS 0H @VA08051 01197450
LA R14,0(R2,R1) ADD LENGTH @V387045 01198000
BCTR R14,0 ADDRESS OF LAST BYTE @V387045 01199000
L R15,XPAGNUM PAGE NO. MASK @V387045 01200000
NR R14,R15 ENDING PAGE ADDRESS @V387045 01201000
LRA R0,0(,R14) ENDING ADDRESS VALID ? @V387045 01202000
BC 8+2,VMCHECK2 NO SEG EXCEPTION BRANCH @VA08051 01203200
LR R0,R2 SAVE REG 2 ACROSS CALL @VA08051 01203230
LR R7,R1 SAVE R1 @VA08051 01203260
LR R1,R14 GRT ENDING ADDRESS FOR DMKPTRAN @VA08051 01203290
CALL DMKPTRAN,PARM=DEFER LET PTRAN HANDLE IT @VA08051 01203320
BC 2,VMCRC1 ADDRESSING PROBLEM @VA08051 01203350
LR R2,R0 RESTORE REG2 @VA08051 01203380
LR R1,R7 RESTORE REG1 @VA08051 01203410
VMCHECK2 DS 0H @VA08051 01203440
BR R10 RETURN @V387045 01204000
*.::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::* 01205000
* 01206000
* VMCICHK - VALIDITY CHECK SINK VM STATUS 01207000
* 01208000
*.::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::* 01209000
VMCICHK EQU * @V387045 01210000
L R8,VMCPNT ADDRESS OF MASTER VMCBLOK @V387045 01211000
CLC VMCACNT,=AL2(VMCSMAX) EXCEEDING MSG LIMIT ? @V387045 01212000
BNL VMCRC10 YES..EXIT WITH RC SET @V387045 01213000
CLC VMCPUSER(8),SYSTEMID IS SINK THE SYSTEM? @V60C2B8 01213100
BE VMCRC9 YES - TELL USER 'CP QUIESCED' @V60C2B8 01213200
LA R0,L'VMCPUSER LENGTH OF USERID @V387045 01214000
LA R1,VMCPUSER ADDRESS OF USERID @V387045 01215000
CALL DMKSCNAU LOCATE SINK VMBLOK ADDRESS @V387045 01216000
BNZ VMCRC5 USER NOT AVAILABLE @V387045 01217000
LR R3,R1 SAVE VMBLOK ADDRESS IN R3 @V387045 01218000
TM VMCXSTAT-VMBLOK(R3),VMBCAUTH USER AUTHORIZED ? @V387045 01219000
BZ VMCRC5 NO..NOT AVAILABLE @V387045 01220000
L R8,VMCPNT-VMBLOK(R3) SINK MASTER VMCBLOK @V387045 01221000
TM VMCASTAT,VMCAQIES USER QUIESCING ? @V387045 01222000
BO VMCRC9 YES..SET RC..EXIT @V387045 01223000
TM VMCPFLG1,VMCPPRTY PRIORITY MESSAGE ? @V387045 01224000
BZ VMCINPRI NO..SKIP NEXT CHECK @V387045 01225000
TM VMCASTAT,VMCAPRTY AUTHORIZED FOR PRIORITY @V387045 01226000
* MESSAGES ? 01227000
BZ VMCRC18 NO..SET RC..EXIT.. @V387045 01228000
VMCINPRI EQU * @V387045 01229000
TM VMCASTAT,VMCAAUTS AUTHORIZED SPECIFIC ? @V387045 01230000
BZR R10 NO..RETURN TO CALLER @V387045 01231000
CLC VMCUSER,VMUSER THIS THE CORRECT USER ? @V387045 01232000
BNE VMCRC5 NO..USER NOT AVAILABLE. @V387045 01233000
BR R10 RETURN TO CALLER @V387045 01234000
EJECT 01235000
*.::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::* 01236000
* 01237000
* VMCSCANS - LOCATE VMCBLOK ON SINK USER VMCBLOK CHAIN 01238000
* 01239000
*.::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::* 01240000
VMCSCANS EQU * @V387045 01241000
L R8,VMCPNT-VMBLOK(,R3) SINK VMCBLOK ANCHOR @V387045 01242000
LA R1,VMUSER USERID WE'RE LOOKING FOR @V387045 01243000
B VMCSNEXT BRANCH TO SCAN ROUTINE @V387045 01244000
VMCSCANR EQU * @V387045 01245000
L R8,VMCPNT VMCBLOK ANCHOR @V387045 01246000
LA R1,VMCPUSER USERID WE'RE LOOKING FOR @V387045 01247000
VMCSNEXT EQU * @V387045 01248000
LR R2,R8 SAVE VMCBLOK ANCHOR @V387045 01249000
L R8,VMCFPNT NEXT VMCBLOK @V387045 01250000
LTR R8,R8 DOES IT EXIST ? @V387045 01251000
BZ VMCSCC2 NO..SET CC = 2 TO CALLER @V387045 01252000
CLC VMCUSER,0(R1) CORRECT USERID ? @V387045 01253000
BNE VMCSNEXT NO..KEEP LOOKING... @V387045 01254000
CLC VMCFUNC,=AL2(VMCPIDEN) IDENTIFY ? @V387045 01255000
BE VMCSNEXT YES..DOES NOT COUNT... @V387045 01256000
CLC VMCMID,VMCPMID CORRECT MESSAGE ID @V387045 01257000
BNE VMCSNEXT NO..KEEP LOOKING... @V387045 01258000
BR R10 RETURN TO CALLER (CC = 0) @V387045 01259000
VMCSCC2 EQU * @V387045 01260000
SLR R8,R8 CLEAR VMCBLOK REG..SET CC = 2 @V387045 01261000
BR R10 RETURN TO CALLER @V387045 01262000
*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::* 01263000
* * 01264000
* VMCSUSER - LOCATE OBJECT USER VMBLOK ADDRESS 01265000
* * 01266000
*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::* 01267000
VMCSUSER EQU * @V387045 01268000
LA R0,L'VMCPUSER LENGTH OF USERID @V387045 01269000
LA R1,VMCPUSER AND ITS ADDRESS... @V387045 01270000
CALL DMKSCNAU LOCATE VMBLOK ADDRESS @V387045 01271000
BNZ VMCSUFR USER LOGGED OFF... @V387045 01272000
LR R3,R1 SAVE IN R3 @V387045 01273000
TM VMCXSTAT-VMBLOK(R3),VMBCAUTH AUTHORIZED ? @V387045 01274000
BNZR R10 YES..RETURN TO CALLER.. @V387045 01275000
VMCSUFR EQU * @V387045 01276000
LR R1,R8 VMCBLOK ADDRESS TO R1 @V387045 01277000
LA R0,VMCBSIZE SIZE OF BLOCK (DOUBLEWORDS) @V387045 01278000
CALL DMKFRET RETURN TO FREE STORAGE @V387045 01279000
B VMCRC5 SET RC..USER NOT AVAILABLE... @V387045 01280000
EJECT 01281000
*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::* 01282000
* * 01283000
* VMCFRET - FRET VMCBLOK STORAGE 01284000
* * 01285000
*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::* 01286000
VMCFRET EQU * @V387045 01287000
LR R1,R8 VMCBLOK ADDRESS TO R1 @V387045 01288000
LA R0,VMCBSIZE SIZE OF BLOCK (DOUBLEWORDS) @V387045 01289000
CALL DMKFRET FRET THE BLOCK @V387045 01290000
BR R10 RETURN TO CALLER @V387045 01291000
EJECT 01292000
*.::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::* 01293000
* 01294000
* 01295000
* SUBROUTINE NAME - 01296000
* 01297000
* DMKVMCEX 01298000
* 01299000
* FUNCTION - 01300000
* 01301000
* TO REFLECT THE VMC EXTERNAL INTERRUPT MESSAGE HEADER 01302000
* AND OPTIONAL 'SENDX' DATA TO A VIRTUAL MACHINE. 01303000
* (VMCMHDR) 01304000
* 01305000
* ATTRIBUTES - 01306000
* 01307000
* REENTRANT, PAGEABLE, ENTERED VIA 'CALL' FROM DMKDSP 01308000
* 01309000
* ENTRY POINTS - 01310000
* 01311000
* DMKVMCEX 01312000
* 01313000
* ENTRY CONDITIONS - 01314000
* 01315000
* GPR 13 = SAVEAREA ADDRESS 01316000
* GPR 12 = ADDRESS OF DMKVMCEX 01317000
* GPR 11 = VMBLOK ADDRESS OF USER TO RECEIVE INTERRUPT 01318000
* GPR 6 = ADDRESS OF XINTBLOK 01319000
* GPR 5 = ANCHOR FOR UNCHAINING XINTBLOK 01320000
* GPR 14-15, 0-4, 7-10 = IRRELEVANT 01321000
* 01322000
* USER WAS MADE NON-DISPATCHIBLE PRIOR TO CALLING 01323000
* THIS SUB-ROUTINE. (VMRSTAT (VMEXWAIT)) 01324000
* 01325000
* EXIT CONDITIONS - 01326000
* 01327000
* NO ERRORS: 01328000
* 01329000
* GPR 14-15 = DESTROYED 01330000
* GPR 13 = SAVEAREA 01331000
* GPR 12 = DESTROYED 01332000
* GPR 0-11 = RESTORED 01333000
* 01334000
* CONTROL IS RETURNED TO THE DISPATCHER (DMKDSP) WHO WILL 01335000
* FINISH REFLECTING THE HARDWARE EXTERNAL INTERRUPT. 01336000
* (CODE X'4001') 01337000
* 01338000
* ERRORS: 01339000
* 01340000
* THE ACTIVE SAVEAREA IS RELEASED VIA SVC 16, THE XINTBLOK 01341000
* IS DEQUEUED AND FRETTED (IF NECESSARY) AND RETURN IS MADE 01342000
* TO THE DISPATCHER VIA A GOTO. (IGNORE INTERRUPT) 01343000
* 01344000
* CALLS TO OTHER ROUTINES - 01345000
* 01346000
* DMKSCNAU - TO LOCATE THE SOURCE USER VMBLOK 01347000
* DMKPTRAN - TO FETCH USERS EXTERNAL INTERRUPT BUFFER 01348000
* DMKPSASC - TO CHECK FOR STORE PROTECT VIOLATION 01349000
* DMKPTRUL - TO UNLOCK MODULE DMKVMC IF XINT ERROR 01350000
* DMKFRET - TO FRET XINTBLOK - VMCBLOK STORAGE 01351000
* DMKDSPCH - TO IGNORE CURRENT INTERRUPT 01352000
* DMKPSA - TO RELEASE THE SAVEAREA VIA SVC 16 01353000
* 01354000
* INTERNAL SUB-ROUTINES: 01355000
* 01356000
* VMCXFER - DATA TRANSFER SUB-ROUTINE 01357000
* VMCFRET - FRET VMCBLOK STORAGE (FINAL RESPONSE) 01358000
* VMCWAKUP - POST PENDING RESPONSE INTERRUPT TO SOURCE VM 01359000
* VMCDEQ - DEQUEUE VMCBLOK FROM VMCBLOK CHAIN 01360000
* VMCENQ - ENQUEUE VMCBLOK ON SOURCE VMCBLOK CHAIN 01361000
* 01362000
* EXTERNAL REFERENCES - 01363000
* 01364000
* NONE 01365000
* 01366000
* TABLES / WORK AREAS - 01367000
* 01368000
* VMCBLOK, VMCMHDR, XINTBLOK, VMBLOK, SAVEAREA 01369000
* 01370000
* MACROS - 01371000
* 01372000
* TRANS - FETCH USER PAGES 01373000
* RELOC - DEFINE DMKVMCEX ENTRY POINT 01374000
* CALL - USED TO CALL EXISTING CP MODULES 01375000
* EXIT - USED TO EXIT FROM DMKVMCEX 01376000
* PSA - USED TO REFERENCE PREFIX STORAGE AREA 01377000
* GOTO - USED TO RE-ENTER THE DISPATCHER 01378000
* 01379000
* REGISTER USAGE - 01380000
* 01381000
* GPR 13 = ADDRESS OF STANDARD SAVEAREA 01382000
* GPR 12 = BASE REGISTER FOR DMKVMCEX 01383000
* GPR 11 = ADDRESS OF VMBLOK 01384000
* GPR 10 = SUB-ROUTINE 'BAL' REGISTER 01385000
* GPR 8 = ADDRESS OF VMCBLOK 01386000
* GPR 7 = ADDRESS OF ALTERNATE VMCBLOK 01387000
* GPR 3 = ADDRESS OF ALTERNATE USER VMBLOK 01388000
* GPR 0-2, 4-6, 9, 14-15 = WORK REGISTERS 01389000
* 01390000
* NOTES - 01391000
* 01392000
* NONE 01393000
* 01394000
* OPERATION - 01395000
* 01396000
* DMKVMCEX IS CALLED BY THE DISPATCHER (DMKDSP) WHEN IT 01397000
* IS DETERMINED THAT A USER HAS A PENDING VMCF EXTERNAL 01398000
* INTERRUPT (CODE X'4001'). BEFORE CALLING DMKVMCEX THE 01399000
* USER IS MADE NON-DISPATCHIBLE (VMRSTAT = VMEXWAIT). 01400000
* DMKVMCEX WILL REFLECT THE STANDARD VMCF MESSAGE HEADER AND 01401000
* OPTIONAL SENDX DATA (IF REQUIRED). 01402000
* 01403000
* 0 1 2 3 4 5 6 7 8 01404000
* 01405000
* 0 +-----------------------------------------------+ 01406000
* | V*1 | V*2 | VMCMFUNC | VMCMMID | 01407000
* 8 |-----------------------------------------------| 01408000
* | VMCMUSER | 01409000
* 10 |-----------------------------------------------| 01410000
* | VMCMVADA | VMCMLENA | 01411000
* 18 |-----------------------------------------------| 01412000
* | VMCMVADB | VMCMLENB | 01413000
* 20 |-----------------------------------------------| 01414000
* | VMCMUSE | 01415000
* 28 |-----------------------------------------------| 01416000
* | | 01417000
* = VMCMBUF = 01418000
* | OPTIONAL MESSAGE BUFFER | 01419000
* | | 01420000
* XX +-----------------------------------------------+ 01421000
* 01422000
* 01423000
* 1. LOCATE FIRST EXTERNAL INTERRUPT VMCBLOK ON USERS 01424000
* VMCBLOK QUEUE. 01425000
* 2. RESET VMCCXINT FLAG IN VMCBLOK. 01426000
* 3. FETCH USERS EXTERNAL INTERRUPT BUFFER VIA THE 01427000
* 'TRANS' MACRO. 01428000
* 4. CHECK FOR STORE PROTECTION VIOLATION VIA A CALL 01429000
* TO MODULE DMKPSASC. 01430000
* 5. COPY MESSAGE HEADER (VMCMHDR) FROM VMCBLOK TO USERS 01431000
* EXTERNAL INTERRUPT BUFFER. 01432000
* 6. IF VMCBLOK IS FOR A FINAL RESPONSE EXTERNAL INTERRUPT 01433000
* DEQUEUE THE BLOCK FROM THE USERS VMBLOK VIA SUB- 01434000
* ROUTINE VMCDEQ, FRET THE BLOCK VIA SUBROUTINE 01435000
* VMCFRET AND RETURN TO THE DISPATCHER. 01436000
* 7. IF BLOCK IS NOT A FINAL RESPONSE AND NOT A SENDX 01437000
* REQUEST RETURN DIRECTLY TO THE DISPATCHER. 01438000
* 8. IF VMCBLOK IS FOR A SENDX REQUEST VERIFY THAT THE 01439000
* SENDX DATA WILL STILL FIT. 01440000
* 9. OBTAIN STORAGE FOR THE RECEIVER VMCBLOK VIA A CALL 01441000
* TO MODULE DMKFREE. 01442000
* 10. MOVE SENDX DATA TO USERS EXTERNAL INTERRUPT BUFFER 01443000
* VIA SUBROUTINE VMCXFER. 01444000
* 11. FRET THE THE RECEIVER VMCBLOK VIA A CALL TO MODULE 01445000
* DMKFRET. 01446000
* 12. DEQUEUE THE SUBJECT VMCBLOK FROM THE USERS VMCBLOK 01447000
* QUEUE VIA SUBROUTINE VMCDEQ. 01448000
* 13. ENQUEUE THE VMCBLOK ON THE SOURCE USERS VMCBLOK 01449000
* QUEUE VIA SUBROUTINE VMCENQ. 01450000
* 14. WAKE UP THE SOURCE USER VIA SUBROUTINE VMCWAKUP. 01451000
* 15. EXIT BACK TO DMKDSP WHO WILL FINISH REFLECTING THE 01452000
* HARDWARE EXTERNAL INTERRUPT CODE X'4001'. 01453000
* 01454000
* NOTE: IF THE VMCF EXTERNAL INTERRUPT IS FOR A FINAL 01455000
* RESPONSE AND NOT AN IDENTIFY REQUEST THE MESSAGE COUNT 01456000
* (VMCACNT) IN THE RECEIVERS MASTER VMCBLOK IS DECREMENTED. 01457000
* IF THE INTERRUPT IS FOR AN IDENTIFY REQUEST THE MESSAGE 01458000
* COUNT IS DECREMENTED IN THE MASTER VMCBLOK OF THE SOURCE 01459000
* USER. 01460000
* 01461000
* IF ANY ERRORS ARE DETECTED IN THE PROCESS OF REFLECTING 01462000
* THE EXTERNAL INTERRUPT HEADER OR SENDX DATA THE SOURCE 01463000
* IS NOTIFIED VIA A DATA TRANSFER RETURN CODE (WHEN 01464000
* APPLICABLE). 01465000
* 01466000
* RESPONSES - 01467000
* 01468000
* NONE 01469000
* 01470000
* ERROR MESSAGES - 01471000
* 01472000
* NONE 01473000
* 01474000
* ABEND CODES - 01475000
* 01476000
* NONE 01477000
* 01478000
* RETURN CODES - 01479000
* 01480000
* REFER TO VMCBLOKS COPY (RETURN CODE EQUATES) 01481000
* 01482000
*.::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::* 01483000
DMKVMCEX RELOC @V387045 01484000
L R8,VMCPNT MASTER VMCBLOK @V387045 01485000
LR R7,R8 SAVE IN R7 @V387045 01486000
VMCXTEX EQU * @V387045 01487000
L R8,VMCFPNT NEXT VMCBLOK @V387045 01488000
LTR R8,R8 DOES ONE EXIST ? @V387045 01489000
BZ VMCXINFT NO..EXIT FORTHWITH... @V387045 01490000
TM VMCCSTAT,VMCCXINT XINT BLOK ? @V387045 01491000
BZ VMCXTEX NO..KEEP LOOKING... @V387045 01492000
NI VMCCSTAT,X'FF'-VMCCXINT RESET FLAG @V387045 01493000
OI VMCCSTAT,VMCCBUSY SET BUSY FLAG @V387045 01494000
L R1,VMCVADA-VMCBLOK(,R7) ADDRESS OF XINT BUFFER @V387045 01495000
LA R6,VMCMLEN-1 LENGTH OF MINIMUM BUFFER -1 @V387045 01496000
LR R5,R8 ADDRESS OF XINT DATA TO R5 @V387045 01497000
LA R3,X'7FF' 2K MASK @V387045 01498000
OR R3,R1 LAST BYTE OF BUFFER IN 2K BLOCK @V387045 01499000
SLR R3,R1 BYTES TO 2K BOUND - 1 @V387045 01500000
VMCXFTCH C R11,ASYSVM INTERRUPT REFLECTION TO CP? @V60C2B8 01500100
BNE CPVMCF6 NO - PROCEED NORMALLY @V60C2B8 01500200
LR R2,R1 GET BUFFFER INTO REG 2 @V60C2B8 01500300
B CPVMCF7 SKIP TRANS MACRO @V60C2B8 01500400
CPVMCF6 TRANS 2,1,OPT=(BRING+DEFER) FETCH USER BUFFER @V387045 01501000
BNZ VMCXERR PAGING I/O ERROR @V387045 01502000
IC R0,VMCKEY-VMCBLOK(R7) USER KEY @V387045 01503000
CALL DMKPSASC CHECK FOR KEY VIOLATION @V387045 01504000
BNZ VMCXERR BRANCH IF STORE PROTECTION @V387045 01505000
CPVMCF7 CLR R6,R3 WILL REMAINDER FIT IN 2K BLOCK ? @V60C2B8 01506000
BNH VMCXVCX YES..DO LAST MOVE @V387045 01507000
EX R3,VMCXMOVE MOVE PART OF HEADER @V387045 01508000
LA R5,1(R3,R5) ADJUST DATA ADDRESS @V387045 01509000
LA R1,1(R3,R1) AND BUFFER ADDRESS @V387045 01510000
SLR R6,R3 COMPUTE REMAINING COUNT @V387045 01511000
BCTR R6,0 LESS ONE FOR EXECUTE @V387045 01512000
B VMCXFTCH FETCH USER BUFFER @V387045 01513000
VMCXVCX EQU * @V387045 01514000
EX R6,VMCXMOVE MOVE ALL OR PART OF VMCMHDR @V387045 01515000
NI VMCCSTAT,X'FF'-VMCCBUSY RESET BUSY FLAG @V387045 01516000
TM VMCSTAT,VMCRESP FINAL RESPONSE ? @V387045 01517000
BO VMCXFRET YES..GET RID OF BLOCK.. @V387045 01518000
CLC VMCFUNC,=AL2(VMCPSENX) SENDX REQUEST ? @V387045 01519000
BNE VMCXXIT NO..RETURN TO DISPATCHER @V387045 01520000
LA R0,VMCMLEN LENGTH OF MESSAGE HEADER @V387045 01521000
L R1,VMCLENA-VMCBLOK(,R7) LENGTH OF XINT BUFFER @V387045 01522000
SLR R1,R0 ADJUST WITH BYTES ALREADY MOVED @V387045 01523000
CL R1,VMCLENA WILL SENDX DATA STILL FIT ? @V387045 01524000
MVI VMCEFLG,VMC07 SET RETURN CODE @V387045 01525000
BL VMCXERRA NO..CONTINUE... @V387045 01526000
CALL DMKSCHDL ENSURE USER DOES NOT RUN @VA06441 01526500
MVI VMCEFLG,X'00' CLEAR RETURN CODE @V387045 01527000
LA R0,VMCBSIZE SIZE OF VMCBLOK @V387045 01528000
CALL DMKFREE GET STORAGE FOR VMCBLOK @V387045 01529000
LR R4,R1 SAVE IN R4 @V387045 01530000
MVC 0(VMCBSIZE*8,R4),0(R7) COPY BLOCK @V387045 01531000
LM R1,R2,VMCVADA-VMCBLOK(R4) BUFFER ADDRESS + @V387045 01532000
* LENGTH 01533000
LA R0,VMCMLEN LENGTH OF HEADER @V387045 01534000
ALR R1,R0 ADJUST ADDRESS @V387045 01535000
SLR R2,R0 AND LENGTH @V387045 01536000
STM R1,R2,VMCVADA-VMCBLOK(R4) REPLACE @V387045 01537000
MVC VMCUSER-VMCBLOK(L'VMCUSER,R4),VMCUSER USERID @V387045 01538000
MVC VMCUSER,VMUSER SINK USERID @V387045 01539000
LR R7,R8 SENDER VMCBLOK TO R7 @V387045 01540000
LR R8,R4 RECEIVER VMCBLOK TO R8 @V387045 01541000
SPACE 01542000
BAL R10,VMCXFER TRANSFER DATA (VM -> VM) @V387045 01543000
SPACE 01544000
MVC VMCUSER-VMCBLOK(L'VMCUSER,R7),VMCUSER USERID @V387045 01545000
LA R0,VMCBSIZE SIZE OF VMCBLOK (DOUBLEWORDS) @V387045 01546000
LR R1,R8 VMCBLOK ADDRESS TO R1 @V387045 01547000
CALL DMKFRET FRET THE BLOCK @V387045 01548000
LR R8,R7 SWAP BACK TO SOURCE VMCBLOK @V387045 01549000
CLI VMCEFLG,X'00' ANY ERRORS ? @V387045 01550000
BNE VMCXERRA YES..QUIT RIGHT NOW... @V387045 01551000
VMCXESC EQU * @V387045 01552000
CLC VMCUSER(8),SYSTEMID IS SOURCE THE SYSTEM? @V60C2B8 01552100
BNE CPVMCF8 NO - GO FIND USER'S VMBLOK @V60C2B8 01552200
L R1,ASYSVM GET ADDRESS OF SYSTEM VMBLOK 01552300
LR R3,R1 SAVE VMBLOK ADDRESS IN REG3 01552400
B CPVMCFB GO DEQUE BLOCK FROM SINK CHAIN 01552500
CPVMCF8 LA R0,L'VMCUSER LENGTH OF USERID @V387045 01553000
LA R1,VMCUSER AND ITS ADDRESS @V387045 01554000
CALL DMKSCNAU LOCATE SOURCE VMBLOK ADDRESS @V387045 01555000
BNZ VMCXXFRT FRET BLOCK AND EXIT IF LOGGED OFF@V387045 01556000
LR R3,R1 SAVE VMBLOK ADDRESS IN R3 @V60C2B8 01557000
TM VMCXSTAT-VMBLOK(R3),VMBCAUTH AUTHORIZED ? @V387045 01558000
BZ VMCXXFRT NO..GET RID OF BLOCKS... @V387045 01559000
CPVMCFB BAL R10,VMCDEQ DEQUEUE BLOCK FROM SINK CHAIN @V387045 01560000
CLC VMCUSER(8),SYSTEMID DID CP ISSUE SENDX? @V60C2B8 01560010
BNE CPVMCFA NO - THEN CONTINUE NORMALLY @V60C2B8 01560020
L R1,VMCVADA GET SENDER'S SENDX DATA ADDR @V60C2B8 01560030
LA R2,VMCPLEN LEN OF VMCPARM (SENDX HEADER) @V60C2B8 01560040
SR R1,R2 SET POINTER TO BEG OF SENDX BUF @V60C2B8 01560050
L R2,VMCPLENA-VMCPARM(R1) SENDX DATA LENGTH @VA09656 01560061
LA R2,VMCPLEN+7(R2) SENDX HEADER+DATA+7 FOR FRET @V60C2B8 01560070
LR R0,R2 MOVE LENGTH TO R0 FOR FRET @V60C2B8 01560080
SRL R0,3 CONVERT LEN TO DOUBLE WORDS @V60C2B8 01560090
CALL DMKFRET FRET SENDER'S VMCPARM LIST @V60C2B8 01560100
BAL R10,VMCFRET FRET CP'S VMCBLOCK @V60C2B8 01560110
B VMCXXIT EXIT TO DISPATCHER @V60C2B8 01560120
CPVMCFA NI VMCCSTAT,X'FF'-VMCCBUSY RESET BUSY FLAG.. @V60C2B8 01561000
OI VMCSTAT,VMCRESP SET FINAL RESPONSE @V387045 01562000
BAL R10,VMCENQ ENQ BLOCK ON SOURCE CHAIN @V387045 01563000
BAL R10,VMCWAKUP WAKE UP SOURCE USER @V387045 01564000
B VMCXXIT EXIT TO THE DISPATCHER @V387045 01565000
VMCXERR EQU * @V387045 01566000
MVI VMCEFLG,VMC19 SET DATA TRANSFER ERROR @V387045 01567000
VMCXERRA EQU * @V387045 01568000
LR R1,R8 VMCBLOK TO R1 @V387045 01569000
VMCXSINT EQU * @V387045 01570000
L R1,VMCFPNT-VMCBLOK(,R1) NEXT BLOK ? @V387045 01571000
LTR R1,R1 DOES ONE EXIST ? @V387045 01572000
BZ VMCXINFT NO..GET RID OF XINTBLOK @V387045 01573000
TM VMCCSTAT,VMCCXINT XINT BLOK ? @V387045 01574000
BZ VMCXSINT NO..KEEP LOOKING... @V387045 01575000
B VMCXRLSV JUST GET RID OF SAVEAREA... @V387045 01576000
VMCXINFT EQU * @V387045 01577000
L R2,SAVER5 XINTBLOK ANCHOR @V387045 01578000
L R1,SAVER6 ADDRESS OF XINTBLOK @V387045 01579000
L R0,XINTNEXT-XINTBLOK(,R1) UNHOOK THIS @V387045 01580000
ST R0,XINTNEXT-XINTBLOK(,R2) BLOK..ALWAYS LAST.. @V387045 01581000
LA R0,XINTSIZE SIZE OF BLOCK (DOUBLEWORDS) @V387045 01582000
CALL DMKFRET FRET THE BLOCK @V387045 01583000
VMCXRLSV EQU * @V387045 01584000
SVC 16 RELEASE ACTIVE SAVEAREA @V387045 01585000
SLR R13,R13 CLEAR R13..JUST IN CASE... @V387045 01586000
LTR R8,R8 DO WE HAVE A VMCBLOK ? @V387045 01587000
BZ VMCXXIT NO..EXIT NOW... @V387045 01588000
TM VMCSTAT,VMCRESP RESPONSE INTERRUPT ? @V387045 01589000
BZ VMCXESC NO..SEND IT BACK TO SOURCE.. @V387045 01590000
VMCXFRET EQU * @V387045 01591000
L R1,VMCPNT MASTER VMCBLOK @V387045 01592000
CLC VMCFUNC,=AL2(VMCPIDEN) IDENTIFY ? @V387045 01593000
BNE VMCXDCNT NO..DECREMENT MESSAGE COUNT.. @V387045 01594000
LA R0,L'VMCUSER LENGTH OF USERID @V387045 01595000
LA R1,VMCUSER AND ITS ADDRESS @V387045 01596000
CALL DMKSCNAU LOCATE SOURCE VMBLOK ADDRESS @V387045 01597000
BNZ VMCXXFRT NOT THERE..JUST FRET THE BLOCK @V387045 01598000
TM VMCXSTAT-VMBLOK(R1),VMBCAUTH AUTHORIZED ? @V387045 01599000
BZ VMCXXFRT NO..FRET THE BLOCK.. @V387045 01600000
L R1,VMCPNT-VMBLOK(,R1) MASTER BLOCK @V387045 01601000
VMCXDCNT EQU * @V387045 01602000
CLC VMCTOD-VMCBLOK(8,8),VMCTOD-VMCBLOK(1) TIME GOOD?@VA07113 01602300
BL VMCXXFRT NO,DON'T DECREMENT MSG CTR @VA07113 01602600
LH R2,VMCACNT-VMCBLOK(,R1) MESSAGE COUNT @V387045 01603000
BCTR R2,0 LESS ONE @V387045 01604000
STH R2,VMCACNT-VMCBLOK(,R1) REPLACE... @V387045 01605000
VMCXXFRT EQU * @V387045 01606000
BAL R10,VMCDEQ DEQUEUE VMCBLOK FROM VMCBLOK @V387045 01607000
* CHAIN 01608000
BAL R10,VMCFRET FRET THE BLOCK @V387045 01609000
VMCXXIT EQU * @V387045 01610000
NI VMRSTAT,X'FF'-VMEXWAIT USER CAN NOW RUN @V387045 01611000
CALL DMKSCHDL TELL THE BOSS WE'RE RUNNABLE @VA06441 01611500
LTR R13,R13 SAVEAREA GONE ? @V387045 01612000
BZ VMCXGOTO YES..RETURN TO DISPATCHER @V387045 01613000
CPVMCF9 EXIT @V60C2B8 01614000
VMCXGOTO EQU * @V387045 01615000
LR R2,R12 COMPUTE THE DISP INTO @VA08834 01615100
SRL R2,12 THE SYSTEM CORE TABLE @VA08834 01615200
SLL R2,4 FOR THIS PAGE FRAME @VA08834 01615300
AL R2,ACORETBL ADD ADDRESS OF CORE TABLE @VA08834 01615400
TM CORFLAG-CORTABLE(R2),CORCP IS PAGE RESIDENT ? @VA08834 01615500
BO VMCXGONE YES, THEN LEAVE @VA08834 01615600
LR R2,R12 BASE ADDRESS TO R2 @V387045 01616000
CALL DMKPTRUL UNLOCK MY PAGE SINCE PSA WON'T @V387045 01617000
VMCXGONE DS 0H @VA08834 01617500
GOTO DMKDSPCH RETURN TO DISPATCHER @V387045 01618000
VMCXMOVE MVC 0(*-*,R2),0(R5) EXECUTED MOVE FOR VMCMHDR @V387045 01619000
EJECT 01620000
*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::* 01621000
* * 01622000
* VM COMMUNICATION RETURN CODES 01623000
* * 01624000
*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::* 01625000
VMCRC1 LA R2,VMC01 INVALID VIRTUAL ADDRESS @V387045 01626000
B VMCEXIT EXIT @V387045 01627000
VMCRC2 LA R2,VMC02 INVALID SUBFUNCTION CODE @V387045 01628000
B VMCEXIT EXIT @V387045 01629000
VMCRC3 LA R2,VMC03 PROTOCOL VIOLATION @V387045 01630000
B VMCEXIT EXIT @V387045 01631000
VMCRC4 LA R2,VMC04 USER NOT AUTHORIZED (SOURCE) @V387045 01632000
B VMCEXIT EXIT @V387045 01633000
VMCRC5 LA R2,VMC05 USER NOT AVAILABLE @V387045 01634000
B VMCEXIT EXIT @V387045 01635000
VMCRC6 LA R2,VMC06 PROTECTION VIOLATION @V387045 01636000
B VMCEXIT EXIT @V387045 01637000
VMCRC7 LA R2,VMC07 SENDX DATA TOO LARGE @V387045 01638000
B VMCEXIT EXIT @V387045 01639000
VMCRC8 LA R2,VMC08 DUPLICATE MESSAGE @V387045 01640000
B VMCEXIT EXIT @V387045 01641000
VMCRC9 LA R2,VMC09 TARGET VM QUIESCING @V387045 01642000
B VMCEXIT EXIT @V387045 01643000
VMCRC10 LA R2,VMC10 MESSAGE LIMIT EXCEEDED @V387045 01644000
B VMCEXIT EXIT @V387045 01645000
VMCRC11 LA R2,VMC11 CANCEL - RECEIVE PROCESSED @V387045 01646000
B VMCEXIT EXIT @V387045 01647000
VMCRC12 LA R2,VMC12 MESSAGE NOT FOUND @V387045 01648000
B VMCEXIT EXIT @V387045 01649000
VMCRC13 LA R2,VMC13 SYNCHRONIZATION ERROR @V387045 01650000
B VMCEXIT EXIT @V387045 01651000
VMCRC14 LA R2,VMC14 CANCEL BUT TOO LATE @V387045 01652000
B VMCEXIT EXIT @V387045 01653000
VMCRC15 LA R2,VMC15 PAGING I/O ERROR @V387045 01654000
B VMCEXIT EXIT @V387045 01655000
VMCRC16 LA R2,VMC16 INCORRECT LENGTH @V387045 01656000
B VMCEXIT EXIT @V387045 01657000
VMCRC17 LA R2,VMC17 DESTRUCTIVE OVERLAP @V387045 01658000
B VMCEXIT EXIT @V387045 01659000
VMCRC18 LA R2,VMC18 USER NOT AUTHORIZED PRIORITY @V387045 01660000
B VMCEXIT EXIT @V387045 01661000
VMCRC19 LA R2,VMC19 DATA TRANSFER ERROR @V387045 01662000
B VMCEXIT EXIT @V387045 01663000
VMCRC20 LA R2,VMC20 CANCEL - VMCBLOK BUSY @V387045 01664000
B VMCEXIT EXIT @V387045 01665000
SPACE 01666000
VMCEC1 MVI VMCEFLG-VMCBLOK(R7),VMC01 INVALID ADDRESS @V387045 01667000
MVI VMCEFLG,VMC19 DATA TRANSFER ERROR @V387045 01668000
B VMCXEND EXIT @V387045 01669000
VMCEC1A MVI VMCEFLG,VMC01 INVALID ADDRESS @V387045 01670000
MVI VMCEFLG-VMCBLOK(R7),VMC19 DATA XFER ERROR @V387045 01671000
B VMCXEND EXIT @V387045 01672000
VMCEC5 MVI VMCEFLG-VMCBLOK(R7),VMC05 NOT AVAILABLE @V387045 01673000
MVI VMCEFLG,VMC05 USER NOT AVAILABLE @V387045 01674000
B VMCXEND EXIT @V387045 01675000
VMCEC6 MVI VMCEFLG-VMCBLOK(R7),VMC06 PROTECTION ERROR @V387045 01676000
MVI VMCEFLG,VMC19 DATA TRANSFER ERROR @V387045 01677000
B VMCXEND EXIT @V387045 01678000
VMCEC6A MVI VMCEFLG,VMC06 PROTECTION ERROR @V387045 01679000
MVI VMCEFLG-VMCBLOK(R7),VMC19 DATA TRANSFER ERROR @V387045 01680000
B VMCXEND EXIT @V387045 01681000
VMCEC15 MVI VMCEFLG-VMCBLOK(R7),VMC15 PAGING ERROR @V387045 01682000
MVI VMCEFLG,VMC19 DATA TRANSFER ERROR @V387045 01683000
B VMCXEND EXIT @V387045 01684000
VMCEC15A MVI VMCEFLG,VMC15 PAGING I/O ERROR @V387045 01685000
MVI VMCEFLG-VMCBLOK(R7),VMC19 DATA TRANSFER ERROR @V387045 01686000
B VMCXEND EXIT @V387045 01687000
VMCEC17 MVI VMCEFLG,VMC17 DESTRUCTIVE OVERLAP @V387045 01688000
MVI VMCEFLG-VMCBLOK(R7),VMC17 DESTRUCTIVE OVERLAP @V387045 01689000
B VMCXEND EXIT @V387045 01690000
SPACE 01691000
VMCRC0 SR R2,R2 NORMAL RETURN - NO ERRORS @V387045 01692000
VMCEXIT EQU * @V387045 01693000
ST R2,SAVER2 PASS BACK RETURN CODE TO DMKHVC @V387045 01694000
L R1,SAVEWRK1 ADDRESS OF VMCPARM BUFFER @V387045 01695000
LTR R1,R1 DID WE GET IT ? @V387045 01696000
BZ VMCFEXIT NO..EXIT NOW @V387045 01697000
LA R0,VMCBSIZE SIZE OF VMCBLOK (DOUBLEWORDS) @V387045 01698000
CALL DMKFRET FRET VMCPARM BUFFER @V387045 01699000
VMCFEXIT EQU * @V387045 01700000
EXIT @V387045 01701000
SPACE 01702000
SYSTEMID DC CL8'SYSTEM ' LOGONID OF THE SYSTEM @V60C2B8 01702100
SPACE 01702200
LTORG @V387045 01703000
EJECT 01704000
COPY VMCBLOKS @V387045 01705000
COPY CORE @VA08834 01705500
COPY VMBLOK @V387045 01706000
COPY EQU @V387045 01707000
COPY XINTBLOK @V387045 01708000
COPY SAVE @V387045 01709000
PSA @V387045 01710000
END DMKVMC 01711000