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