PRV TITLE 'DMKPRV (CP) VM/370 - RELEASE 6' 00001000 ISEQ 73,80 00002000 COPY OPTIONS 00003000 COPY LOCAL 00004000 *. 00005000 * MODULE NAME - 00006000 * 00007000 * DMKPRV 00008000 * 00009000 * CONTENTS - 00010000 * 00011000 * DMKPRVLG - 00012000 *. 00013000 SPACE 4 00014000 DMKPRV START 00015000 ENTRY DMKPRVLG @V202232 00016000 SPACE 00017000 ENTRY DMKPRVNC NO. OF CALLS TO DMKPRVLG @V2B2638 00018000 ENTRY DMKPRVEK INST COUNT FOR X'08' SSK @V2B2638 00019000 ENTRY DMKPRVIK INST COUNT FOR X'09' ISK @V2B2638 00020000 ENTRY DMKPRVMS INST COUNT FOR X'80' SSM @V2B2638 00021000 ENTRY DMKPRVLP INST COUNT FOR X'82' LPSW @V2B2638 00022000 ENTRY DMKPRVDI INST COUNT FOR X'83' DIAG @V2B2638 00023000 ENTRY DMKPRVMN INST COUNT FOR X'AC' STNSM @V2B2638 00024000 ENTRY DMKPRVMO INST COUNT FOR X'AD' STOSM @V2B2638 00025000 ENTRY DMKPRVLR INST COUNT FOR X'B1' LRA @V2B2638 00026000 ENTRY DMKPRVCP INST COUNT FOR X'B202' STIDP @V2B2638 00027000 ENTRY DMKPRVCH INST COUNT FOR X'B203' STIDC @V2B2638 00028000 ENTRY DMKPRVTE INST COUNT FOR X'B204' SCK @V2B2638 00029000 ENTRY DMKPRVCE INST COUNT FOR X'B206' SCKC @V2B2638 00030000 ENTRY DMKPRVCT INST COUNT FOR X'B207' STCKC @V2B2638 00031000 ENTRY DMKPRVPE INST COUNT FOR X'B208' SPT @V2B2638 00032000 ENTRY DMKPRVPT INST COUNT FOR X'B209' STPT @V2B2638 00033000 ENTRY DMKPRVEP INST COUNT FOR X'B20A' SPKA @V2B2638 00034000 ENTRY DMKPRVIP INST COUNT FOR X'B20B' IPK @V2B2638 00035000 ENTRY DMKPRVPB INST COUNT FOR X'B20D' PTLB @V2B2638 00036000 ENTRY DMKPRVRR INST COUNT FOR X'B213' RRB @V2B2638 00037000 ENTRY DMKPRVTC INST COUNT FOR X'B6' STCTL @V2B2638 00038000 ENTRY DMKPRVLC INST COUNT FOR X'B7' LCTL @V2B2638 00039000 ENTRY DMKPRVCS INST COUNT FOR X'BA' CS @V2B2638 00040000 ENTRY DMKPRVCD INST COUNT FOR X'BB' CDS @V2B2638 00041000 ENTRY DMKPRVMA ADDRESS OF EXPANDED VMA LIST @V3M4026 00042000 ENTRY DMKPRVVP COUNT FOR SPT'S BY EVMA @V3M4026 00043000 ENTRY DMKPRVVC COUNT FOR SCKC'S BY EVMA @V3M4026 00044000 ENTRY DMKPRVVL COUNT FOR LPSW'S BY EVMA @V3M4026 00045000 ENTRY DMKPRVVS COUNT FOR SIO/SIOF'S BY EVMA @V3M4026 00046000 ENTRY DMKPRVVM COUNT FOR SSM/STXSM'S BY EVMA @V3M4026 00047000 EXTRN DMKDSPA,DMKDSPB 00048000 EXTRN DMKVSIEX,DMKPRGSM @VA05037 00049000 EXTRN DMKHVCAL,DMKTMRTN 00050000 EXTRN DMKPERIL 00051000 AIF (NOT &TRACE(6)).NTR1 **AIF** 00052000 EXTRN DMKTRCPV,DMKTRCPB 00053000 .NTR1 ANOP 00054000 EXTRN DMKPSAFP CHECK FOR FETCH PROTECTION @V202232 00055000 EXTRN DMKPSASP CHECK FOR STORAGE PROTECTION @V202232 00056000 EXTRN DMKSCNVU RETURNS VCHBLOK,VCUBLOK,VDEVBLOK.@VMD0103 00057000 EXTRN DMKVATAB 00058000 EXTRN DMKVATRN,DMKVATLA 00059000 EXTRN DMKVATEX 00060000 EJECT 00061000 EXTRN DMKSTKDE TO STACK/DEFER @V407593 00062000 AIF (NOT &AP).DSPRU4 00063000 EXTRN DMKDSPRU DISP ON OTHER PROCESSOR @V407593 00064000 EXTRN DMKLOKSY GLOBAL SYSTEM LOCK @V407508 00065000 .DSPRU4 ANOP 00066000 *. 00067000 * SUBROUTINE NAME - 00068000 * 00069000 * DMKPRVLG - 00070000 * 00071000 * FUNCTION - 00072000 * 00073000 * TO PERFORM THE SIMULATION OF A PRIVILEGED OPERATION. 00074000 * 00075000 * ATTRIBUTES - 00076000 * 00077000 * REENTRANT, RESIDENT, ENTERED VIA GOTO FROM DMKPRGIN 00078000 * 00079000 * ENTRY POINTS - 00080000 * 00081000 * DMKPRVLG 00082000 * 00083000 * ENTRY CONDITIONS - 00084000 * 00085000 * GPR 12 = ADDRESS OF DMKPRVLG 00086000 * 00087000 * EXIT CONDITIONS - 00088000 * 00089000 * THE PRIVILEGED INSTRUCTION HAS BEEN SIMULATED; 00090000 * CONTROL RETURNS TO THE USER VIA DMKDSPCH OR DMKDSPA. 00091000 * 00092000 * CALLS TO OTHER ROUTINES - 00093000 * 00094000 * DMKPTRAN - TO HANDLE PAGING EXCEPTIONS 00095000 * DMKDSPCH - TO RE-DISPATCH VIRTUAL MACHINE WHEN POSSIBLE 00096000 * DMKDSPA - FOR IMMEDIATE RE-DISPATCH OF VIRTUAL MACHINE 00097000 * DMKDSPB - FOR VALIDATION OF A NEW VIRTUAL PSW AND 00098000 * SUBSEQUENT RE-DISPATCH OF THE VIRTUAL MACHINE 00099000 * DMKVSIEX - TO PROCESS VIRTUAL I/O INSTRUCTIONS 00100000 * DMKHVCAL - TO PROCESS HYPERVISOR CALL INSTRUCTION 00101000 * DMKTMRTN - TO PROCESS CLOCK AND TIMER INSTRUCTIONS 00102000 * DMKPRGSM - TO REFLECT A PROG. INT. TO VIRT-MACH 00103000 * DMKTRCPV - TO TRACE VIRTUAL PRIVILEGED INSTRUCTIONS 00104000 * DMKVATAB - TO INVALIDATE SHADOW PAGE TABLES 00105000 * DMKVATRN - TO TRANSLATE VIRTUAL-VIRTUAL ADDRESSES TO REAL 00106000 * DMKVATLA - TO TRANSLATE VIRTUAL-VIRTUAL ADDRESS TO VIRTUAL 00107000 * DMKVATEX - TO SIMULATE A RELOCATION INTERRUPT 00108000 * DMKPSAFP - TO CHECK FOR FETCH PROTECTION 00109000 * DMKPSASP - TO CHECK FOR STORAGE PROTECTION 00110000 * DMKSCNVU - FROM UNIT ADDR IT RETURNS VCHBLOK,VCUBLOK,VDEVBLOK. 00111000 * 00112000 * EXTERNAL REFERENCES - 00113000 * 00114000 * NONE 00115000 * 00116000 * TABLES / WORK AREAS - 00117000 * 00118000 * NONE 00119000 * 00120000 EJECT 00121000 * REGISTER USAGE - 00122000 * 00123000 * GPR 12 = BASE REGISTER 00124000 * GPR 13 = SECOND BASE REGISTER @VMD0133 00125000 * GPR 11 = VMBLOK ADDRESSABILITY 00126000 * GPR 10 = ECBLOK ADDRESSABILITY 00127000 * GPRS 8,9 INTERNAL LINK REGISTERS 00128000 * GPRS 0-7, 14-15 ARE WORK REGISTERS @VMD0133 00129000 * 00130000 * NOTES - 00131000 * 00132000 * FOR CERTAIN PRIVILEGED INSTRUCTIONS, THE VIRTUAL MACHINE MUST 00133000 * HAVE THE EC-MODE OPTION (THAT IS, VMV370R FLAGBIT IN VMPSTAT 00134000 * MUST = 1) - OTHERWISE AN OPERATION EXCEPTION IS REFLECTED. 00135000 * THESE INCLUDE: LRA, PTLB, RRB, STNSM, AND STOSM. 00136000 * 00137000 * 'RDD' AND 'WRD' ARE HANDLED AS INVALID OPERATIONS AND 00138000 * AN OPERATION EXCEPTION PROGRAM INTERRUPT IS SIMULATED. 00139000 * 00140000 * ALL SIMULATED PROGRAM INTERRUPTS ARE REFLECTED TO THE 00141000 * VIRTUAL MACHINE VIA GOTO TO DMKPRGSM, EXCEPT AS EXPLICITLY 00142000 * STATED IN THE SECTION BELOW. 00143000 * 00144000 * OPERATION - 00145000 * 00146000 * FOR ALL INSTRUCTIONS WHICH ARE SIMULATED, ISSUE A MONITOR 00147000 * CALL CLASS 5 CODE 0 TO COLLECT SIMULATION DATA (IF ACTIVELY 00148000 * ENABLED). 00149000 * 00150000 * IF THE INTERRUPTING INSTRUCTION IS A DIAGNOSE (X'83'), 00151000 * DMKHVCAL IS INVOKED TO PERFORM THE SIMULATION. 00152000 * 00153000 * IF THE INTERRUPT IS AN INVALID OPERATION CODE, THE 00154000 * PROGRAM INTERRUPT IS REFLECTED TO THE VIRTUAL MACHINE. 00155000 * 00156000 * IF THE PRIVILEGED OPERATION IS AN INPUT-OUTPUT REQUEST, 00157000 * DMKPRVLG INVOKES THE VIRTUAL MACHINE I/O EXECUTIVE 00158000 * PROGRAM, DMKVSIEX. 00159000 * 00160000 * IF THE VIRTUAL MACHINE HAS REQUESTED TRACING OF NON-I/O 00161000 * PRIVILEGED INSTRUCTIONS, DMKTRCPV IS CALLED TO PERFORM 00162000 * THE TRACING FUNCTION. 00163000 * 00164000 * IF THE PRIVILEGED INSTRUCTION IS ANY OF THE CLOCK 00165000 * OR TIMER INSTRUCTIONS (I.E. SCK, SCKC, STCKC, SPT, STPT), 00166000 * DMKTMRTN IS INVOKED TO PERFORM THE INSTRUCTION SIMULATION 00167000 * AND CLOCK-QUEUE MAINTENANCE. 00168000 * 00169000 * FOR UNRECOGNIZABLE PRIVILEGED OPERATIONS, DMKPRVLG WILL 00170000 * SIMULATE AN OPERATION EXCEPTION PROGRAM INTERRUPT. 00171000 * 00172000 EJECT 00173000 * IF THE PRIVILEGED OPERATION IS NONE OF THE ABOVE, SIMULATION 00174000 * PROCEEDS WITHIN DMKPRVLG, AS FOLLOWS: 00175000 * 00176000 * SSM - A CHECK IS MADE TO DETERMINE IF BIT 1 OF VIRTUAL 00177000 * CONTROL REGISTER ZERO (SSM SUPPRESSION FEATURE) IS SET 00178000 * TO ONE, AND IF SO A PROGRAM INTERRUPT CODE X'13' IS 00179000 * SIMULATED FOR THE VIRTUAL MACHINE. OTHERWISE, THE NEW 00180000 * SYSTEM MASK IS INSERTED IN THE VIRTUAL PSW. 00181000 * 00182000 * STNSM, STOSM - THE CURRENT VIRTUAL SYSTEM MASK IS STORED 00183000 * IN THE SPECIFIED VIRTUAL STORAGE LOCATION AND THEN ALTERED 00184000 * WITH THE IMMEDIATE BYTE OF THE INSTRUCTION. 00185000 * 00186000 * LPSW - THE ADDRESS SPECIFIED IS CHECKED FOR BOUNDARY ALIGNMENT 00187000 * AND A SPECIFICATION EXCEPTION IS REFLECTED IF INCORRECT. 00188000 * THE NEW PSW IS MOVED INTO THE VIRTUAL PSW. 00189000 * 00190000 * EXECUTE - THE INSTRUCTION POINTED TO BY THE INTERRUPTING 00191000 * INSTRUCTION IS SUBSTITUTED FOR THE EXECUTE INSTRUCTION, 00192000 * WITH THE SECOND BYTE OF THE NEW INSTRUCTION MODIFIED BY THE 00193000 * LOW-ORDER BYTE OF THE REGISTER SPECIFIED IN THE EXECUTE, 00194000 * UNLESS THE REGISTER SPECIFIED IS REGISTER ZERO. THE 00195000 * NEW INSTRUCTION IS DECODED FOR SIMULATION. 00196000 * 00197000 * STIDP - THE ADDRESS SPECIFIED IS CHECKED FOR BOUNDARY 00198000 * ALIGNMENT AND A SPECIFICATION EXCEPTION IS SIMULATED IF 00199000 * IT IS INCORRECT. A REAL 'STIDP' IS PERFORMED INTO THE 00200000 * SPECIFIED VIRTUAL STORAGE LOCATION AND THE CPU MODEL 00201000 * NUMBER FIELD IS MODIFIED BY X'F000' TO INDICATE THAT 00202000 * IT IS A VIRTUAL CPU. 00203000 * 00204000 * LCTL, STCTL OPERATE NORMALLY ON VIRTUAL CONTROL REGISTER 0 00205000 * AND ON BIT 2 (I/O EXTENDED LOGOUT MASK) OF CONTROL REGISTER 14 00206000 * FOR ALL VIRTUAL MACHINES. ANY REFERENCE TO THE OTHER 00207000 * CONTROL REGISTERS IS IGNORED UNLESS THE VIRTUAL MACHINE 00208000 * IS ALLOWED THE EXTENDED-CONTROL FEATURE. A FULL SET 00209000 * OF SIXTEEN CONTROL REGISTERS IS MAINTAINED FOR VIRTUAL 00210000 * EXTENDED-CONTROL MACHINES, SUCH THAT ANY OF THEM MAY BE 00211000 * LOADED AND STORED BY THE VIRTUAL MACHINE. CURRENTLY ONLY 00212000 * CONTROL REGISTERS 0, 1, 2, 3 ARE EXAMINED BY THE 00213000 * CONTROL PROGRAM. (BIT 2 OF C-REG 14 IS EXAMINED, BUT A 00214000 * SEPARATE COPY OF THAT BIT IS KEPT IN THE VMBLOK AND ONLY THAT 00215000 * COPY IS EXAMINED.) FLAGS ARE SET IN THE VMBLOK IF EITHER 00216000 * CONTROL REGISTER 0 OR 1 IS LOADED, TO PERMIT VIRTUAL 00217000 * ADDRESS TRANSLATION TABLE MAINTENANCE BY DMKVATAB. 00218000 * 00219000 * ISK - IF THE VIRTUAL PAGE REFERENCED IS IN REAL CORE, 00220000 * AN 'ISK' IS PERFORMED ON THE REAL STORAGE BLOCK, THE 00221000 * REAL KEY IS OR'ED WITH THE VIRTUAL KEY IN THE SWAP- 00222000 * TABLE ENTRY AND IS PLACED IN THE SPECIFIED REGISTER. 00223000 * IF THE VIRTUAL PAGE IS NOT IN CORE, THE KEY IS EXTRACTED 00224000 * FROM THE SWAP-TABLE ENTRY FOR THE PAGE AND RETURNED TO THE 00225000 * VIRTUAL MACHINE IN THE REGISTER SPECIFIED. 00226000 * FOR EXTENDED-CONTROL VIRTUAL MACHINES, A FULL SEVEN-BIT KEY 00227000 * IS RETURNED, OTHERWISE ONLY 5 BITS ARE RETURNED. 00228000 * 00229000 EJECT 00230000 * SSK - IF THE VIRTUAL PAGE IS IN REAL CORE, AN ISK IS 00231000 * PERFORMED ON THE REAL STORAGE BLOCK REFERENCED, THE REAL 00232000 * REFERENCE AND CHANGE BITS ARE STORED IN THE BACKUP BITS 00233000 * IN THE SWAP-TABLE ENTRY FOR THE VIRTUAL PAGE REFERENCED, 00234000 * THE NEW STORAGE KEY IS STORED IN THE SWAP-TABLE ENTRY 00235000 * WITH THE REFERENCE AND CHANGE BITS ZERO IF THE VIRTUAL 00236000 * MACHINE IS NOT ALLOWED THE EXTENDED-CONTROL FEATURE, OR 00237000 * UNCHANGED IF THE FEATURE IS ALLOWED, AND THE REAL STORAGE 00238000 * KEY IS SET WITH THE HIGH-ORDER FOUR BITS OF THE NEW KEY 00239000 * AND THE FETCH-PROTECT, REFERENCE, AND CHANGE BITS ZERO. 00240000 * IF THE VIRTUAL PAGE IS NOT IN REAL CORE, THE NEW KEY IS 00241000 * STORED IN THE SWAP-TABLE ENTRY FOR THAT PAGE. 00242000 * 00243000 * THE FOLLOWING INSTRUCTIONS ARE EXTENDED-CONTROL-MODE INSTRUCTIONS 00244000 * AND WILL CAUSE AN OPERATION EXCEPTION TO BE REFLECTED TO THE 00245000 * VIRTUAL MACHINE UNLESS THE MACHINE IS ALLOWED THE EXTENDED- 00246000 * CONTROL FEATURE. OPERATION OF THE INSTRUCTIONS IN BC-MODE 00247000 * MAY OR MAY NOT BE THE SAME AS IN EC-MODE, DEPENDING ON THE 00248000 * PARTICULAR INSTRUCTION. 00249000 * 00250000 * LRA - A CALL IS MADE TO DMKVATLA TO TRANSLATE THE THIRD- 00251000 * LEVEL ADDRESS INTO A SECOND-LEVEL ADDRESS, AND THE 00252000 * CONDITION CODE AND REGISTER VALUES ARE SET ACCORDING TO 00253000 * RETURN CODES FROM DMKVATLA. 00254000 * 00255000 * PTLB - THE VIRTUAL ADDRESS TRANSLATION SHADOW TABLES ARE 00256000 * MARKED INVALID VIA A CALL TO DMKVATAB. 00257000 * 00258000 * RRB - IF THE VIRTUAL PAGE IS NOT IN REAL CORE, THE VIRTUAL 00259000 * REFERENCE BIT IN THE SWAP-TABLE ENTRY IS SET ZERO AND THE 00260000 * CONDITION CODE SET TO INDICATE THE INITIAL STATUS OF THE 00261000 * VIRTUAL REFERENCE AND CHANGE BITS. IF THE VIRTUAL PAGE IS 00262000 * IN REAL CORE, AN ISK IS PERFORMED ON THE REAL STORAGE BLOCK, 00263000 * THE REAL REFERENCE AND CHANGE BITS ARE STORED IN THE BACKUP 00264000 * BITS OF THE SWAP-TABLE ENTRY AND THE CONDITION CODE 00265000 * IS SET TO INDICATE THE STATUS OF THE REAL REFERENCE AND 00266000 * CHANGE BITS OR'ED WITH THE VIRTUAL REFERENCE AND CHANGE 00267000 * BITS. THE REAL REFERENCE AND CHANGE BITS ARE RESET TO ZERO 00268000 * VIA AN SSK, AND THE VIRTUAL REFERENCE BIT IS RESET TO ZERO. 00269000 * 00270000 * THE FOLLOWING INSTRUCTIONS ARE SIMULATED. IPK AND SPKA ARE 00271000 * PRIVILEDGED INSTRUCTIONS WHILE CS AND CDS ARE 00272000 * NON-PRIVLEDGED INSTRUCTIONS. THE CS AND CDS 00273000 * INSTRUCTION SIMULATION TAKES PLACE ONLY ON THOSE 00274000 * CPU'S NOT EQUIPED WITH THE HARDWARE CONDITIONAL- 00275000 * SWAPPING FEATURE. 00276000 * 00277000 * SPKA - A BRANCH IS MADE TO ROUTINE 'INSTADR' TO OBTAIN BASE 00278000 * PLUS DISPLACEMENT. UPON RETURN THE NEW STORAGE KEY IS STORED 00279000 * IN THE VIRTUAL PSW AND EXIT IS MADE VIA "FASTER" FOR FAST 00280000 * REFLECT BACK TO THE DISPATCHER. 00281000 * 00282000 * IPK - THE STORAGE KEY IS EXTRACTED FROM THE VIRTUAL PSW AND 00283000 * STORED AS PER SPECIFICATIONS IN GENERAL PURPOSE REGISTER 2. 00284000 * 00285000 * CS AND CDS - THE FIRST AND THIRD OPERANDS ARE CHECK FOR PROPER 00286000 * REGISTER SPECIFICATION AND THE SECOND OPERAND IS CHECKED 00287000 * FOR PROPER BOUNDARY ALIGNMENT. A SPECIFICATION EXCEPTION IS 00288000 * REFLECTED IF INCORRECT. DEPENDING ON THE RESULTS OF THE 00289000 * COMPARE, EITHER FETCH PROTECTION OR STORAGE PROTECTION IS 00290000 * CHECKED FOR THE SECOND OPERAND. IF IT IS INCORRECT, A 00291000 * STORAGE PROTECTION CHECK IS REFLECTED TO THE VIRTUAL 00292000 * MACHINE. IF NO ERRORS ARE FOUND, THE SWAP TAKES PLACE 00293000 * BETWEEN THE OPERANDS, DEPENDING UPON THE COMPARE. 00294000 * 00295000 * THE NORMAL OPERATION OF THE INSTRUCTIONS SIMULATED, WHILE 00296000 * INCLUDED IN THE ABOVE INFORMATION, SHOULD BE VERIFIED 00297000 * BY REFERENCE TO THE SYSTEM/360 AND SYSTEM/370 PRINCIPLES 00298000 * OF OPERATION, FORMS GA22-6821 AND GA22-7000, RESPECTIVELY. 00299000 * 00300000 EJECT 00301000 * FOR ALL INSTRUCTIONS WHICH REFERENCE DATA AREAS IN VIRTUAL 00302000 * STORAGE (I.E. SSM, STNSM, STOSM, LPSW, EX, STIDP, STIDC, 00303000 * LCTL, STCTL, CS, CDS), THE ADDRESS GENERATED FROM THE 00304000 * INSTRUCTION IS EXAMINED FOR VALIDITY AND AN ADDRESSING 00305000 * EXCEPTION IS SIMULATED IF THE ADDRESS IS OUTSIDE OF VIRTUAL 00306000 * STORAGE. IF THE INSTRUCTION WAS EXECUTED BY AN ECMODE MACHINE 00307000 * RUNNING IN VIRTUAL TRANSLATE MODE, DMKVATRN IS CALLED TO 00308000 * TRANSLATE THE THIRD-LEVEL ADDRESS TO A FIRST-LEVEL ADDRESS. 00309000 * PAGE, SEGMENT, OR TRANSLATION EXCEPTIONS ARE REFLECTED 00310000 * TO THE VIRTUAL MACHINE IF THERE IS AN ERROR RETURN FROM 00311000 * DMKVATRN. IN THE SPECIFIC CASES OF 'ISK', 'SSK', AND 'RRB', 00312000 * SECOND-LEVEL ADDRESSES ARE REQUIRED EVEN IF THE INSTR- 00313000 * UCTION IS EXECUTED FROM THIRD-LEVEL STORAGE, SUCH THAT NO 00314000 * CALL TO DMKVATRN IS REQUIRED. 00315000 * 00316000 * VIRTUAL STORAGE PROTECTION KEYS ARE EXAMINED BY DMKPSASP 00317000 * FOR ANY INSTRUCTIONS WHICH MODIFY VIRTUAL STORAGE (I.E. 00318000 * STNSM, STOSM, STIDP, STIDC, STCTL, CS, CDS). A PROTECTION 00319000 * EXCEPTION IS SIMULATED FOR THE FIRTUAL MACHINE IF THE KEYS 00320000 * DISAGREE. 00321000 * 00322000 * SIMILARLY, FOR PRIV OPS FOR WHICH FETCH PROTECTION APPLIES, 00323000 * (VIZ. SSM, LCTL, CS, & CDS), DMKPSAFP IS CALLED TO CHECK 00324000 * THE VIRTUAL STORAGE KEY (INCLUDING THE FETCH PROTECT BIT); IF 00325000 * THE FETCH PROTECT BIT IS SET AND THE KEYS DISAGREE, A 00326000 * PROTECTION EXCEPTION IS SIMULATED. 00327000 * 00328000 * RE-DISPATCH OF THE VIRTUAL MACHINE WHEN INSTRUCTION SIMULATION 00329000 * IS COMPLETE IS PERFORMED VIA GOTO TO EITHER DMKDSPCH OR 00330000 * DMKDSPA ('FAST REFLECT'). ALL PRIVILEGED INSTRUCTIONS ARE 00331000 * 'ELIGIBLE' FOR FAST REFLECT UNDER THE FOLLOWING CONDITIONS: 00332000 * (1) DMKPTRAN HAS NOT BEEN CALLED DURING SIMULATION. 00333000 * (2) VIRTUAL C-REGS 0,1,2,3 HAVE NOT CHANGED (ECMODE ONLY) 00334000 * (3) PSW SYSTEM MASK, EC-MODE BIT, WAIT-STATE BIT HAVE 00335000 * NOT CHANGED. 00336000 * 00337000 *. 00338000 EJECT 00339000 *---------------------------------------------------------------------* 00340000 * * 00341000 * SIMULATE PRIVILEGED OPERATIONS FOR VIRTUAL MACHINES * 00342000 * * 00343000 *---------------------------------------------------------------------* 00344000 *. 00345000 *********************************************************************** 00346000 * 00347000 * 00348000 * EXPANDED VMA PARTIAL INSTRUCTION EMULATION FUNCTION: 00349000 * 00350000 * INVOKED BY THESE INSTRUCTIONS WHEN EXECUTED IN PROBLEM STATE 00351000 * WITH CONTROL REGISTER 6 BYTE 0 SET TO THE SPECIFIED VALUE: 00352000 * LPSW, SIO, SIOF, SSM - B'10XXXX1X' (X = 0 OR 1) 00353000 * SCKC, SPT, STNSM, STOSM - B'10X0XX1X' (X = 0 OR 1) 00354000 * AND THE APPROPRIATE INDIVIDUAL CONTROLS IN THE ASSIST 00355000 * CONTROL WORD (OFFSET X'14' INTO MICBLOK) SET TO 1: 00356000 * BIT 0 LPSW BIT 2 SCKC/SPT 00357000 * BIT 3 SIO/SIOF BIT 4 SSM/STNSM/STOSM 00358000 * 00359000 * REGISTER INPUT: 00360000 * CR 6 = BITS 0-7 ARE THE ASSIST FLAGS; BITS 8-28 ADDRESS 00361000 * THE MICBLOK (THE VIRTUAL MACHINE POINTER LIST) 00362000 * 00363000 * SYSTEM DATA AREAS REFERENCED (BY MODULE WHERE APPLICABLE): 00364000 * DMKPRV - 'DMKPRVMA' (EQUALS 'VMALIST') 00365000 * DMKPSA - 'AVMALIST', 'PRNPSW', CPCREGS, TIMER FIELDS, 00366000 * TRACING INFORMATION, 'CPSTATUS', 'PROPSW' 00367000 * MICBLOK, VCHBLOK, VCUBLOK, VDEVBLOK, VMBLOK 00368000 * 00369000 * 00370000 * EXIT TO 'DMKDSPB' OR 'DMKDSPCH' (IF LPSW, SSM, STNSM, STOSM) 00371000 * NOTE: THE CONTENT OF ANY UNSPECIFIED GPR IS UNPREDICTABLE 00372000 * REGISTER OUTPUT: 00373000 * CR 0 = VALUE FROM 'CPCREG0' 00374000 * CR 8 = VALUE FROM 'CPCREG8' 00375000 * GPR 11 = X'A8' LESS THAN 'MICVPSW' (ADDRESS OF VMBLOK) 00376000 * GPR 12 = ADDRESS OF 'DMKDSPB' OR 'DMKDSPCH' 00377000 * 00378000 * SEE DMKTMR FOR MORE INFORMATION ON THE EMULATION DONE FOR 00379000 * INSTRUCTIONS SCKC AND SPT, SEE DMKVSI FOR SIO AND SIOF... 00380000 * 00381000 *********************************************************************** 00382000 *. 00383000 SPACE 00384000 DMKPRVLG EQU * ENTRY FROM 'DMKPRGIN' %V3M4038 00385000 USING PSA,R0 %V3M4038 00386000 USING VMBLOK,R11 %V3M4038 00387000 USING *,R12,R13 %VMD0133 00388000 LA R13,4095(R12) ESTABLISH SECOND BASE REGISTER %VMD0133 00389000 LA R13,1(R13) %VMD0133 00390000 LCTL C0,C1,RUNCR0 RELOAD C-REGS 0 AND 1 FOR 'LRA' %V3M4038 00391000 COUNT DMKPRVNC MP-SAFE INCR. TO COUNTER %V407593 00392000 LA R6,1 INCREMENT VALUE FOR LATER %V3M4038 00393000 L R1,PROPSW+4 INSTERRUPTION ADDRESS %V3M4038 00394000 LA R1,0(R1) CLEAR HIGH ORDER BYTE %VA08621 00395100 LH R3,INTPR INTUPT CODE %VA08621 00395200 LH R4,INTPRL INSTRUCTIO LENGTH %VA08621 00395300 SR R1,R4 GET START OF INST %VA08621 00395400 LRA R2,0(0,R1) GET REAL ADDR OF INST %VA08621 00395500 LA R7,VMINST ADDR OF VMBLOK %VA08621 00395600 LR R5,R1 COPY ADDR %VA08621 00395700 N R5,F4095 GET PAGE DISPLACEMENT %VA08621 00395800 AR R5,R4 ADD INST LENGTH %VA08621 00395900 S R5,F4096 LESS ONE PAGE %VA08621 00396000 BP PRVSLO WHOOPS CROSSED A PAGE %VA08621 00396100 SR R4,R6 DECREMENT FOR EXEC %VA08621 00396200 EX R4,PRVMOV MOVE IN DATA %VA08621 00396300 B LOADCNTL DONE %VA08621 00396400 PRVMOV MVC 0(*-*,R7),0(R2) *EXECUTED* %VA08621 00396500 SPACE 1 00396600 PRVSLO EQU * %VA08621 00396700 SR R5,R4 FIND OUT HOW MUCH OF THIS %VA08621 00396800 LCR R5,R5 PAGE TO MOVE IN %VA08621 00396900 SR R5,R6 DECREMENTFOR MOVE %VA08621 00397000 EX R5,PRVMOV MOVE IN PART WAY %VA08621 00397100 AR R5,R6 BUMP LENGTH %VA08621 00397200 LR R8,R1 R1 TO R8 %VA08621 00397300 AR R1,R5 BUMP SOURCE POINTER %VA08621 00397400 AR R7,R5 BUMP SINK POINTER %VA08621 00397500 SR R5,R4 FIND OUT HOW MUCH %VA08621 00397600 LCR R5,R5 IS LEFT TO MOVE %VA08621 00397700 LRA R2,0(0,R1) IS 2ND PART IN STORAGE %VA08621 00397800 BZ PRVRCHK NO NEED FOR PTRAN %VA08621 00397900 LA R2,BRING+DEFER SET PARMS FOR PTR %VA08621 00398000 LCTL C0,C0,CPCREG0 GET CP CR0 %VA08621 00398100 BAL R14,LOCKET GET SYSTEM LOCK %VA08621 00398200 CALL DMKPTRAN %VA08621 00398300 BC 2,ADDREXCP NOT IN OUR BOX %VA08621 00398400 PRVRCHK SR R5,R6 DECR FOR EXEC %VA08621 00398500 LR R1,R8 R8 BACK TO R1 %VA08621 00398600 EX R5,PRVMOV MOVE IN DATA %VA08621 00398700 LOADCNTL EQU * %VA08621 00398800 LH R2,VMPRGIL GET FOR LATER TEST OF INST SIZE %VA08621 00398900 LCTL C0,C0,CPCREG0 SET NORMAL VM/370 ARCH. CONTROLS %V3M4038 00410000 LCTL C1,C1,VMSEG ...AND USE THE STANDARD SEGTABLE %V3M4038 00411000 TM VMTRCTL,X'FF' ANY TRACE REQUESTED? %V407593 00413000 BNZ TRACTIVE YES...LOCK IT OR STACKIT.. %V407593 00414000 TM VMESTAT,VMPERCM PER ACTIVE??? %V407593 00415000 BZ NOTRPER NO, SKIP THE LOCK/STACK %V407593 00416000 TRACTIVE BAL R14,LOCKET GO LOCK/STACK SYSTEM, AND @V407593 00417000 * RETURN HERE WITH LOCK HELD 00418000 NOTRPER BCT R3,GETINST NO BR. IF INTPR = 1 (OP. EXCPT.) %V4M0108 00419000 B OPSIM ELSE GOTO SIMULATE OP. EXCEPTION @V407593 00420000 SPACE 2 00421000 GETINST EQU * %V3M4038 00422000 CLI VMINST,X'9C' CHECK FOR I/O INSTRUCTION %V3M4038 00423000 BL INSTLOW NOPE %V3M4038 00424000 CLI VMINST,X'9F' ... %V3M4038 00425000 BH INSTHIH NOPE %V3M4038 00426000 MC MNCOSIM,MNCLINST CLASS INST, CODE SIMULATION %VA08858 00427000 GOTO DMKVSIEX OFF TO V-I/O EXECUTIVE %V3M4038 00428000 SPACE 3 00429000 * 00430000 * COMMON ROUTINE TO OBTAIN SYS-LOCK. ENTERED BY 00431000 * BAL R14,LOCKET 00432000 * 00433000 LOCKET EQU * TEST IF LOCK ALREADY HELD @V407593 00434000 AIF (NOT &AP).APCHK4 00435000 TM APSTAT1,APUOPER IS THIS AN AP SYSTEM? @V407508 00436000 BNOR R14 NO, RETURN TO CALLER @V407508 00437000 L R15,=A(DMKLOKSY+2) GET ADDRESS OF SYSTEM LOCK @V407508 00438000 CLC LPUADDR,0(R15) IS THE SYSTEM LOCK HELD? @V407508 00439000 BCR 8,R14 YES, LOCK HELD @V407593 00440000 LOCK OBTAIN,TYPE=SYS,SPIN=NO,SAVE @V407593 00441000 BCR 8,R14 GOT THE LOCK, RETURN TO CALLER @V407593 00442000 L R15,VMDFTPNT LOCK NOT OBTAINABLE,... @V407593 00443000 USING CPEXBLOK,R15 GET DEFERRED EXECUTION-BLOCK, @V407593 00444000 STM R0,R14,CPEXREGS SAVE CALLERS REGS @V407593 00445000 LA R14,LOCKRTN GET ADDR OF EXECUTION RETURN PT @V4M0130 00446000 ST R14,CPEXADD AND EXECUTION RETURN POINT @V407593 00447000 DROP R15 IS IN REG 14 @V407593 00448000 LR R1,R15 AND DEFER EXECUTION OF @V407593 00449000 CALL DMKSTKDE @V407593 00450000 GOTO DMKDSPRU @V407508 00451000 LOCKRTN DS 0H DEFERRED EXECUTION RETURN POINT @V4M0130 00452000 LCTL C1,C1,VMSEG RELOAD CONTROL REG 1 AFTER DEFER @V4M0130 00453000 .APCHK4 ANOP 00454000 BR R14 RETURN TO CALLER @V4M0130 00455000 SPACE 2 00456000 EJECT 00457000 *---------------------------------------------------------------------* 00458000 * 'FASTER' - FAST REFLECT VIA 'DMKDSPA' * 00459000 * 'PRIVRET' - NORMAL RETURN VIA 'DMKDSPCH' * 00460000 *---------------------------------------------------------------------* 00461000 FASTER EQU * 00462000 NI VMRSTAT,255-VMEXWAIT OUT OF INSTR WAIT. PER001 00462500 TM VMPEND,VMPERPND IS THERE A PENDING "PER" EVENT ? 00463000 BNZ PRIVRET DMKDSP WILL CHECK FOR PER PENDING. PER001 00464000 GOTO DMKDSPA FAST REFLECT 00472000 SPACE 00473000 PRIVRET EQU * 00474000 NI VMRSTAT,255-VMEXWAIT RESET INSTRUCTION WAIT %V408246 00475000 GOTO DMKDSPCH GO TO GROUND ZERO %V4M0156 00476000 EJECT 00477000 SPECEXCP EQU * SPECIFICATION EXCEPTION 00478000 LA R0,X'06' INTERRUPT CODE 00479000 B ERREFLCT 00480000 SPACE 00481000 OPEREXCP EQU * OPERATION EXCEPTION 00482000 LA R0,X'01' INTERRUPT CODE 00483000 B ERREFLCT 00484000 SPACE 00485000 PROTEXCP EQU * PROTECTION EXCEPTION 00486000 LA R0,X'04' INTERRUPT CODE 00487000 B ERREFLCT 00488000 SPACE 00489000 ADDREXCP EQU * REFLECT ADDRESSING EXCEPTION 00490000 LA R0,X'05' INTERRUPT CODE 00491000 SPACE 2 00492000 ERREFLCT EQU * REFLECT PROGRAM INTERRUPT 00493000 GOTO DMKPRGSM SIMULATE PROGRAM INTERRUPT 00504000 EJECT 00505000 *---------------------------------------------------------------------* 00506000 * DECODE PRIVILEGED INSTRUCTION FOR SIMULATION * 00507000 *---------------------------------------------------------------------* 00508000 SPACE 1 00509000 OPSIM CLI VMINST,X'BA' IS IT COMPARE AND SWAP ? @VA03148 00510000 BE PRCS YES, SIMULATE IT @VA03148 00511000 CLI VMINST,X'BB' IS IT COMPARE DOUBLE AND SWAP? @VA03148 00512000 BE PRCDS YES, SIMULATE IT @VA03148 00513000 CLI VMINST,X'44' IS IT EXECUTE MAYBE ? @V200198 00514000 BNE CHEKPROB GO CHECK PROBLEM STATE @VA03148 00515000 COUNT DMKPRVEX MP-SAFE INCR. TO COUNTER @V407593 00516000 LA R6,1 SET INCREMENT FOR INST COUNT @V2B2638 00518000 LA R1,1 INDEXING IS ALLOWED @VM08556 00519000 BAL R9,GETADDR GET INSTRUCTION ADDRESS @VM08556 00520000 LH R4,0(0,R2) GET FIRST HALFWORD @VM08556 00521000 IC R5,VMINST+1 CHECK MODIFIER @VM08556 00522000 SRL R5,2(0) REG. NUM. * 4 @VM08556 00523000 N R5,F60 CHECK FOR MODIFIER @VM08556 00524000 BZ SKMODIF ZERO - NO MODIFIER @VM08556 00525000 IC R5,VMGPRS+3(R5) EXTRACT THE MODIFIER BYTE @VA01985 00526000 OR R4,R5 MODIFY INSTRUCTION @VM08556 00527000 SKMODIF STH R4,VMINST STORE NEW INSTRUCTION @VM08556 00528000 CLI VMINST,X'BA' IS IT COMPARE AND SWAP? @VA08990 00528100 BE CONTOPCK YES, CONTINUE WITH CHECK @VA08990 00528200 CLI VMINST,X'BB' IS IT COMPARE DOUBLE AND SWAP? @VA08990 00528300 BE CONTOPCK YES, CONTINUE WITH CHECK @VA08990 00528400 CLI VMINST,X'B2' IS IT SPKA OR IPK? @VA08990 00528500 BNE OPEREXCP NONE OF THE ABOVE---OP CHECK @VA08990 00528600 CONTOPCK EQU * @VA08990 00528700 LA R3,2(0,R3) INDEX TO 2'ND HALF OF INST. @VM08556 00529000 BAL R8,ADTRANS GET ITS REAL ADDRESS @VM08556 00530000 LH R4,0(,R2) GET 2'ND HALF OF INST. @VM08556 00531000 STH R4,VMINST+2 SAVE IN VMBLOK @VM08556 00532000 SLR R2,R2 DON'T ALLOW TRACE OF INST. @VM08556 00533000 B OPSIM PROCESS NEW INST. @VM08556 00534000 CHEKPROB TM VMPSW+1,PROBMODE VIRTUAL PROBLEM STATE ? @VA03148 00535000 BO OPEREXCP YES, REFLECT OPERATION EXECPTION @VA03148 00536000 CLC =X'B20A',VMINST IS IT SPKA ? @VA03148 00537000 BE INSTHIH YES, HANDLE AS IF PRIV OP. @VA03148 00538000 CLC =X'B20B',VMINST IS IT IPK ? @VA03148 00539000 BE INSTHIH YES, SIMULATE AS IF PRIV OP. @VA03148 00540000 B OPEREXCP REFLECT OPERATION EXCEPTION @VA03148 00541000 SPACE 1 00542000 INSTLOW EQU * OPCODE LT X'9C' %V3M4038 00543000 AIF (NOT &TRACE(6)).NTR2 **AIF** 00544000 TM VMTRCTL,VMTRPRV+VMTRBRIN TRACING EITHER TYPE? %V3M4038 00545000 BZ OFFTRAKL NO %V3M4038 00546000 BAL R4,CHKTRA1 CALL TRACING SUPERVISOR (MAYBE) 00547000 OFFTRAKL EQU * COMPLETE DECODING %V3M4038 00548000 .NTR2 ANOP 00549000 CLI VMINST,X'44' IS IT EXECUTE? %V3M4038 00550000 BL PRSKEY NO - "ISK", "SSK" %V3M4038 00551000 BE PREXEC YES - "EX" %V3M4038 00552000 * R2 IS STILL CLEAN FOR 'IC' 00553000 * 00554000 * VERIFY THAT THE OP-CODE IS WITHIN THE RANGE OF THE INDEX TABLE 00555000 * 00556000 CLI VMINST,X'80' LOWER LIMIT OF TABLE %V3M4038 00557000 BL OPEREXCP IF LOWER, REFLECT OPER EXCEPTION %V3M4038 00558000 CLI VMINST,X'85' UPPER LIMIT %V3M4038 00559000 BH OPEREXCP IF HIGHER, OPERATION EXCEPTION %V3M4038 00560000 SPACE 00561000 MC 0,5 CLASS 5, CODE 0 INST. SIMULATION %V3M4038 00562000 IC R2,VMINST GET OP-CODE %V3M4038 00563000 IC R2,INDTAB-X'80'(R2) LOCATE PROPER COUNTER INDEX %V3M4038 00564000 LA R2,CNTTAB1(R2) ADDR, OF CNTR TO R2 %V407593 00565000 COUNT 0(R2) MP-SAFE INCR. TO COUNTER %V407593 00566000 SLR R2,R2 INSURE R2 IS STILL CLEAN %V407508 00567000 IC R2,VMINST RE-OBTAIN OP CODE %V3M4038 00568000 IC R2,DECODEL-X'80'(R2) DECODE '80'-GROUP %V3M4038 00569000 B BRACHLO(R2) GO TO SIMULATE ROUTINE %V3M4038 00570000 BRACHLO EQU * 00571000 B OPEREXCP 00572000 SSM B PRSSM "SSM" - X'80' %V3M4038 00573000 LPSW B PRLPSW "LPSW" - X'82' %V3M4038 00574000 WRD B OPEREXCP "WRD" - X'84' (NOT SUPPORTED) 00575000 RDD B OPEREXCP "RDD" - X'85' (NOT SUPPORTED) 00576000 DIAG BAL R14,LOCKET GO LOCK/STACK SYSTEM, AND @VA07545 00577000 * RETURN HERE WITH LOCK HELD. 00578000 * THIS SUBROUTINE IS A NO-OP IN UP 00579000 * MODE. 00580000 GOTO DMKHVCAL @VA07223 00581000 EJECT 00582000 INSTHIH EQU * OPCODE GT X'9F' %V3M4038 00583000 AIF (NOT &TRACE(6)).NTR3 **AIF** 00584000 TM VMTRCTL,VMTRPRV TRACING PRIVILEGED OPS. ? %V3M4038 00585000 BZ OFFTRAKH NO %V3M4038 00586000 BAL R4,CHKTRA2 CALL TRACING SUPERVISOR (PROBABLY) 00587000 OFFTRAKH EQU * COMPLETE DECODING %V3M4038 00588000 .NTR3 ANOP 00589000 * R2 STILL CLEAN FOR 'IC' 00590000 * 00591000 * VERIFY THAT THE OP-CODE IS WITHIN THE RANGE OF THE INDEX TABLE 00592000 * 00593000 CLI VMINST,X'AC' LOWER LIMIT OF TABLE %V3M4038 00594000 BL OPEREXCP IF LOWER, GIVE OPER EXCEPTION %V3M4038 00595000 CLI VMINST,X'B7' UPPER LIMIT %V3M4038 00596000 BH OPEREXCP IF HIGHER, OPERATION EXCEPTION %V3M4038 00597000 SPACE 00598000 PRVMCB MC MNCOSIM,MNCLINST CLASS INST, CODE SIMULATION %V3M4038 00599000 IC R2,VMINST PICK UP OP-CODE %V3M4038 00600000 IC R2,INDTAB-X'AC'(R2) LOCATE PROPER COUNTER INDEX %V3M4038 00601000 LA R2,CNTTAB2(R2) ADDR OF CNTR TO R2 %V407593 00602000 COUNT 0(R2) MP-SAFE INCR. TO COUNTER. %V407593 00603000 SLR R2,R2 INSURE R2 IS STILL CLEAN %V407508 00604000 IC R2,VMINST RE-OBTAIN THE OP CODE %V3M4038 00605000 IC R2,DECODEH-X'AC'(R2) %V3M4038 00606000 B BRANCHI(R2) GO TO SIMULATE ROUTINE %V3M4038 00607000 BRANCHI EQU * 00608000 B OPEREXCP 00609000 STNSM B PSTSSM "STNSM", "STOSM" %V3M4038 00610000 STCTL B PSTCTL "STCTL" - X'B6' 00611000 LCTL B PRLCTL "LCTL" - X'B7' 00612000 LRA B PRLRA "LRA" - X'B1' 00613000 SPACE 00614000 AIF (NOT &TRACE(6)).NTR4 **AIF** 00615000 EJECT 00616000 CHKTRA1 DS 0H DETERMINE WHETHER TO CALL DMKTRCPV: 00617000 * (R4 = RETURN-REGISTER) 00618000 TM VMTRCTL,VMTRPRV SPECIFICALLY "PRIV" TRACING WANTED ? 00619000 BO CHKTRA2 YES - GO TO IT. 00620000 CLI VMINST,X'82' JUST VMTRBRIN - IS THIS AN LPSW ? 00621000 BCR 7,R4 NOPE - FORGET IT. 00622000 L R15,VMTREXT YES - REFERENCE TRACE CONTROL BLOCK 00623000 USING TREXT,R15 ... 00624000 CLC TREXIN1(8),FFS INSTRUCTION TRACING ALREADY SET UP ? 00625000 BCR 7,R4 YES - NOT NECESSARY TO CALL TRACER. 00626000 CLI TREXNSI,00 LPSW OR EX-LPSW ALREADY HANDLED BY DMKTRC 00627000 BCR 7,R4 YES - NOT NECESSARY TO CALL TRACER. 00628000 DROP R15 00629000 CHKTRA2 DS 0H CALL TRACER (UNLESS ALREADY CALLED) ... 00630000 LTR R2,R2 IF R2=0, THIS WAS AN EXECUTED INSTRUCTION 00631000 BCR 8,R4 IF YES, DON'T CALL THE TRACER AGAIN. 00632000 CALL DMKTRCPV CALL TRACING SUPERVISOR 00633000 LCTL C1,C1,VMSEG RESTORE CR1 @VA03185 00634000 BR R4 AND RETURN TO OFFTRAKL OR OFFTRAKH. 00635000 .NTR4 ANOP 00636000 EJECT 00637000 BEETWOS EQU * 'B2XX' DECODING %V3M4038 00638000 CLI VMINST+1,X'13' DO WE HAVE A VALID MODIFIER? %V3M4038 00639000 BH OPEREXCP NO, BRANCH %V3M4038 00640000 IC R2,VMINST+1 PICK UP MODIFIER BYTE %V3M4038 00641000 IC R2,INDTAB(R2) PICK UP PROPER COUNTER INDEX %V3M4038 00642000 LA R2,DMKPRVB2(R2) ADDR OF CNTR TO R2 %V407593 00643000 COUNT 0(R2) MP-SAFE INCR. TO COUNTER %V407593 00644000 SLR R2,R2 INSURE R2 IS STILL CLEAN %V407508 00645000 IC R2,VMINST+1 RE-OBTAIN THE MODIFIER BYTE %V3M4038 00646000 IC R2,DECODB2(R2) %V3M4038 00647000 B BRACHB2(R2) GO TO PROCESS %V3M4038 00648000 BRACHB2 EQU * 00649000 B OPEREXCP 00650000 STIDP B PSTIDP STORE CPU ID 00651000 STIDC B PSTIDC STORE CHANNEL ID 00652000 PTLB B PRPTLB PURGE TLB 00653000 RRB B PRVRRB RESET REF. BIT 00654000 SPKA B PRSPKA SET PSW KEY FROM ADDRESS @V200198 00655000 IPK B PRVIPK INSERT PSW KEY INTO REG 2 @V200198 00656000 GOTOTMR GOTO DMKTMRTN %V3M4038 00657000 SPACE 3 00658000 DECODEL EQU * DECODE OPS X'80'-X'85' 00659000 DC AL1(SSM-BRACHLO) X'80' 00660000 DC AL1(0) X'81' 00661000 DC AL1(LPSW-BRACHLO) X'82' 00662000 DC AL1(DIAG-BRACHLO) X'83' 00663000 DC AL1(WRD-BRACHLO) X'84' 00664000 DC AL1(RDD-BRACHLO) X'85' 00665000 SPACE 2 00666000 DECODEH EQU * DECODE OPS X'AC'-X'B7' 00667000 DC 2AL1(STNSM-BRANCHI) X'AC',X'AD' 00668000 DC 3AL1(0) X'AE','AF','B0' 00669000 DC AL1(LRA-BRANCHI) X'B1' 00670000 DC AL1(BEETWOS-BRANCHI) X'B2XX' 00671000 DC 3AL1(0) X'B3','B4','B5' 00672000 DC AL1(STCTL-BRANCHI) X'B6' 00673000 DC AL1(LCTL-BRANCHI) X'B7' 00674000 SPACE 2 00675000 DECODB2 EQU * DECODE 'B2XX' INSTRUCTIONS 00676000 DC 2AL1(0) 'B200','B201' 00677000 DC AL1(STIDP-BRACHB2) 'B202' 00678000 DC AL1(STIDC-BRACHB2) 'B203' 00679000 DC AL1(GOTOTMR-BRACHB2) 'B204' @V2B2638 00680000 DC AL1(0) 'B205' (NON PRIVLEDGED) @V2B2638 00681000 DC 4AL1(GOTOTMR-BRACHB2) 'B206' - 'B209' @V2B2638 00682000 DC AL1(SPKA-BRACHB2) 'B20A' @V200198 00683000 DC AL1(IPK-BRACHB2) 'B20B' @V200198 00684000 DC AL1(0) NOT SUPPORTED @V200198 00685000 DC AL1(PTLB-BRACHB2) 'B20D' 00686000 DC 5AL1(0) 'B20E' THRU 'B212' 00687000 DC AL1(RRB-BRACHB2) 'B213' 00688000 DS 0H 00689000 EJECT 00690000 PREXEC EQU * EXECUTE INSTRUCTION 00691000 COUNT DMKPRVEX MP-SAFE INCR. TO COUNTER @V407593 00692000 LA R1,1 INDEXING ALLOWED 00693000 BAL R9,GETADDR GET INSTRUCTION ADDRESS 00694000 LH R4,0(0,R2) FIRST HALFWORD 00695000 IC R5,VMINST+1 CHECK MODIFIER 00696000 SRL R5,2(0) REG. NO. * 4 00697000 N R5,F60 00698000 BZ NOMODIF ZERO - NO MODIFIER 00699000 IC R5,VMGPRS+3(R5) MODIFIER BYTE 00700000 OR R4,R5 MODIFY INSTRUCTION 00701000 NOMODIF EQU * @VA13186 00702100 STH R4,VMINST SET IN VMBLOK @VA13186 00702200 LA R3,2(0,R3) INDEX TO 2ND HALF OF VIRT INST @VA13186 00702300 BAL R8,ADTRANS NOW GET ITS REAL ADDRESS @VA13186 00702400 LH R4,0(,R2) GET THE REAL STUFF.... @VA13186 00702500 STH R4,VMINST+2 AND STUFF IT AWAY @VA13186 00702600 * BEGINNING OF LOGIC TO SUPPORT 6 BYTE 'EXECUTED' INSTRUCTIONS 00702700 * THAT ARE PRIV OPS 00702800 TM VMINST,X'C0' * IS THIS A SIX BYTE INST? @VA13186 00702900 BNO SKIP3RD * NO...BRANCH @VA13186 00703000 LA R3,2(0,R3) INDEX TO 3'RD HALFWORD OF INST. @VA13186 00703100 BAL R8,ADTRANS GET ITS REAL ADDRESS @VA13186 00703200 LH R4,0(,R2) PICK UP 3RD HALFWORD OF INST. @VA13186 00703300 STH R4,VMINST+4 SAVE IN VMBLOK @VA13186 00703400 SKIP3RD DS 0H @VA13186 00703500 * END OF 6 BYTE INSTRUCTION SUPPORT 00703600 SLR R2,R2 TELL TRACE TO FORGET IT @VA13186 00703700 B GETINST NOW PROCESS THE STUFF @VA13186 00703800 SPACE 2 00710000 PRLPSW EQU * LOAD PSW INSTRUCTION %V3M4038 00711000 TM VMTRCTL,VMTRBRIN INSTRUCTION TRACING SET? %VA05533 00712000 BNO PRLPSW1 NO, SKIP FOLLOWING TEST %VA05533 00713000 L R15,VMTREXT GET ADDRESS OF TRACE BLOCK @VA05533 00714000 USING TREXT,R15 @VA05533 00715000 NI TREXFLAG,255-TREXNDSP RESET DISPATCH TRACE CALL @VA05533 00716000 DROP R15 @VA05533 00717000 PRLPSW1 SLR R1,R1 NO INDEXING %VA05533 00718000 BAL R8,INSTADR COMPUTE VIRTUAL ADDRESS %V3M4038 00719000 LA R4,7 MASK TO CHECK BOUNDARY ALIGNMENT %V3M4038 00720000 NR R4,R3 ON DBL-WD BOUNDARY? %V3M4038 00721000 BNZ SPECEXCP NOPE - INTERRUPT %V3M4038 00722000 BAL R8,ADTRANS GET REAL ADDRESS %V3M4038 00723000 CALL DMKPSAFP CHECK FOR FETCH PROTECTION %V3M4038 00724000 BNZ PROTEXCP OOPS - GENERATE PROTECTION CHECK %V3M4038 00725000 L R4,4(0,R2) ... %V3M4038 00726000 ST R4,VMPSW+4 ... %V3M4038 00727000 L R5,0(0,R2) FIRST HALF OF NEW PSW %V3M4038 00728000 LR R1,R5 SAVE 1ST WORD OF NEW PSW %V408246 00729000 X R1,VMPSW DIFF. BETWEEN NEW AND OLD PSW %V408246 00730000 ST R5,VMPSW STORE NEW PSW %V408246 00731000 TM VMPSW+1,EXTMODE EXTENDED MODE NEW PSW? %V408246 00732000 BO PRLPSWEC YES %V408246 00733000 N R1,=X'FF0A0000' NO (BC), ANY STATUS DIFFERANCES?%V408246 00734000 BZ PRLPSWA NONE, FAST DISPATCH %V408246 00735000 N R1,=X'000A0000' SERIOUS STATUS DIFFERANCES? %V408246 00736000 BZ PRLCKPND NO, CHECK ENABLED FOR PENDING %V408246 00737000 B VPSWCHK YES, -> DMKDSP FOR FURTHER CHECKS%V408246 00738000 * 00739000 PRLPSWEC DS 0H CHECK OUT EC-MODE PSW %V408246 00740000 CLI VMPSW+4,0 BITS 32-39 = 0? %V408246 00741000 BNE VPSWCHK NO, -> DMKDSP %V408246 00742000 N R1,=X'FF0AC0FF' ANY STATUS DIFFERENCES? %V408246 00743000 BZ PRLPSWA NONE, FAST DISPATCH %V408246 00744000 N R1,=X'FC0AC0FF' SERIOUS STATUS DIFFERANCES? %V408246 00745000 BNZ VPSWCHK SOME, -> DMKDSP %V408246 00746000 TM VMPSW,VMIOPND ENABLED FOR I/O? %V408246 00747000 BZ PRLEXT NO, CHECK FOR EXTERNAL %V408246 00748000 TM VMPEND,VMPGPND YES, PAGE FAULT PENDING? %V408246 00749000 BO VPSWCHK YES %V408246 00750000 L R5,FFS ASSUME ENABLED FOR ALL %V408246 00751000 PRLCKPND DS 0H CHECK PENDING %V408246 00752000 SR R2,R2 CLEAR %V408246 00753000 ICM R2,12,VMIOINT ANY PENDING I/O?? %V408246 00754000 BZ PRLEXT NO, NOTHING %V408246 00755000 NR R2,R5 ENABLED FOR PENDING? %V408246 00756000 BNZ VPSWCHK YES, -> DMKDSP (REFLECT) %V408246 00757000 PRLEXT DS 0H CHECK-OUT EXTERNAL PENDING %V408246 00758000 TM VMPSW,VMEXTPND ENABLED FOR EXTERNAL? %V408246 00759000 BZ PRLPSWA NO %V408246 00760000 ICM R2,B'1111',VMPXINT ANY PENDING? %V408246 00761000 BNZ VPSWCHK YES, REFLECT EXTERNAL INTERRUPT %V408246 00762000 PRLPSWA DS 0H %V3M4038 00763000 TM VMDSTAT,VMDSP+VMRUN+VMINQ PROPSW STILL VALID ? %V3M4038 00764000 BNO VPSWCHK NO - NO FAST REFLECT %V3M4038 00765000 TM PROPSW+1,PROBMODE IS MONITOR CODE ACTIVE %V3M4038 00766000 BZ VPSWCHK IF YES - BYPASS FAST DISPATCH %V3M4038 00767000 TM VMTRCTL,VMTRPRV+VMTRBRIN TRACING ACTIVE? %V408246 00768000 BNZ VPSWCHK YES, WILL HAVE TO WAIT FOR DSP %V408246 00769000 STCM R4,B'0111',PROPSW+5 VIRT. ADDR. IN NEW PSW %V408246 00770000 NI PROPSW+1,X'0F' RESET CURRENT PROTECT KEY %V4M0201 00771000 OC PROPSW+1(1),VMPSW+1 PUT IN NEW KEY %V4M0201 00772000 TM VMPSW+1,PROBMODE ENTERING PROBLEM STATE? %V408246 00773000 BZ FASTER NO %V408246 00774000 TM CPSTAT2,CPMICON ASSIST ENABLED? %V408246 00775000 BZ FASTER NO %V408246 00776000 ICM R2,B'0111',VMMADDR ASSIST ENABLED? %V408246 00777000 BZ FASTER NO %V408246 00778000 OI VMMCR6,VMMPROB TURN ON PROBLEM MODE %V408246 00779000 LCTL C6,C6,VMMICRO AND RELOAD ASSIST CREG %V408246 00780000 B FASTER %V3M4038 00781000 SPACE 2 00782000 VPSWCHK EQU * EXAMINE VIRTUAL PSW SETTINGS %V3M4038 00783000 * 00785000 * LOCKET IS A NOOP IN UP SYSTEM @VA07223 00786000 * 00787000 BAL R14,LOCKET GO LOCK/STACK SYSTEM, AND %V407593 00788000 * RETURN HERE WITH LOCK HELD %V407593 00789000 NI VMRSTAT,X'FF'-VMEXWAIT OUT OF INSTRUCTION WAIT @VA09498 00789500 GOTO DMKDSPB 'NEW PSW' ENTRY TO DISPATCH %V3M4038 00790000 EJECT 00791000 PRSSM EQU * SET SYSTEM MASK %V3M4038 00792000 TM VMPSTAT,VMV370R EC-MODE MACHINE? %V3M4038 00793000 BO CHKVCR0 YES %V3M4038 00794000 TM VMVCR0,X'40' IS BIT 1, CR0 = 1 ? %V3M4038 00795000 BZ SSMJOIN NO - NORMAL SSM %V3M4038 00796000 B SPECIAL1 SPECIAL INTERRUPT %V3M4038 00797000 CHKVCR0 EQU * %V3M4038 00798000 L R10,VMECEXT EXTENSION BLOCK %V3M4038 00799000 USING ECBLOK,R10 %V3M4038 00800000 TM EXTCR0,X'40' IS BIT 1, CR0 = 1? %V3M4038 00801000 BZ SSMJOIN NO - NORMAL SSM %V3M4038 00802000 DROP R10 00803000 SPECIAL1 EQU * GIVE SPECIAL PROGRAM INTERRUPT 00804000 LA R0,X'13' INTERRUPT FOR 'SSM' SUPPRESSION 00805000 B ERREFLCT ...BACK TO VM 00806000 PSTSSM EQU * STORE+AND, STORE+OR SYS MASK %V3M4038 00807000 TM VMPSTAT,VMV370R IS THIS AN EC-MODE MACHINE ? %V3M4038 00808000 BZ OPEREXCP NO - REFLECT OPERATION EXCEPTION %V3M4038 00809000 * (CF 370 PRINCIPLES OF OPERATION) 00810000 SSMJOIN EQU * STNSM | STOSM | SSM: %V3M4038 00811000 TM VMTRCTL,VMTRBRIN INSTRUCTION TRACING SET %VA05533 00812000 BNO SSMJOIN1 NO, SKIP FOLLOWING TEST %VA05533 00813000 L R15,VMTREXT GET ADDRESS OF TRACE BLOCK @VA05533 00814000 USING TREXT,R15 @VA05533 00815000 NI TREXFLAG,255-TREXNDSP RESET DISPATCH TRACE CALL @VA05533 00816000 DROP R15 @VA05533 00817000 SSMJOIN1 SLR R1,R1 NO INDEXING %VA05533 00818000 BAL R9,GETADDR GET REAL, VIRTUAL ADDRESS %V3M4038 00819000 IC R4,0(0,R2) GET DATA BYTE %V3M4038 00820000 CLI VMINST,X'80' SIMPLE SSM? %V3M4038 00821000 BE CHEKSSM YES, CHECK FOR FETCH PROTECTION %V3M4038 00822000 * NO - MUST BE STNSM OR STOSM: 00823000 CALL DMKPSASP CHECK STORAGE PROTECTION KEYS %V3M4038 00824000 BNZ PROTEXCP NO GOOD - ERROR %V3M4038 00825000 IC R4,VMPSW GET OLD SYSTEM MASK %V3M4038 00826000 IC R5,VMINST+1 IMMEDIATE BYTE FROM INST. %V3M4038 00827000 STC R4,0(0,R2) STORE SYSTEM MASK %V3M4038 00828000 TM VMESTAT,VMPERCM VIRTUAL OR CP PER ACTIVE ? %V3M4038 00829000 BZ PSTNPER NO - SKIP PER EVENT CHECKING %V3M4038 00830000 LA R1,PERSALT STORAGE ALTERATION EVENT 00831000 LA R2,1(0) FIELD LENGTH STORED 00832000 BAL R9,PERCHEK SEE IF RECORDABLE EVENT 00833000 PSTNPER EQU * MODIFY CURRENT SYSTEM MASK %V3M4038 00834000 CLI VMINST,X'AC' STORE + AND ? %V3M4038 00835000 BE PSTANDSM YES %V3M4038 00836000 OR R4,R5 STORE + OR SYS MASK %V3M4038 00837000 B SETMASK %V3M4038 00838000 PSTANDSM EQU * STORE + AND SYS MASK %V3M4038 00839000 NR R4,R5 ... %V3M4038 00840000 SETMASK EQU * SET SYSTEM MASK %V3M4038 00841000 EX R4,CLVMSK CHECK NEW WITH THE OLD %V3M4038 00842000 STC R4,VMPSW SAVE NEW MASK %V3M4038 00843000 BE FASTER EQUAL - FAST DISPATCH %V3M4038 00844000 TM VMPSTAT,VMV370R VIRTUAL EC MODE MACHINE ? %V3M4038 00845000 BNZ VPSWCHK YES - CHECK FULLY %V3M4038 00846000 CLI VMPSW,0 NEW MASK ENABLED FOR INTERRUPTS? %V3M4038 00847000 BE FASTER NO - UNABLE TO RELFECT ANYTHING %V3M4038 00848000 TM VMPSW,VMEXTPND ENABLED FOR EXT INTERRUPTS ? %V3M4038 00849000 BZ STSMIO NO..CONTINUE... %V3M4038 00850000 TM VMVCR0+3,X'E0' ENABLED IN CR0 ? %V3M4038 00851000 BZ STSMIO NO..CONTINUE... %V3M4038 00852000 L R1,VMPXINT CHECK FOR PENDING %V3M4038 00853000 LTR R1,R1 EXT INTERRUPTS... %V3M4038 00854000 BNZ VPSWCHK DISPATCH WILL DO THE REST.. %V3M4038 00855000 STSMIO EQU * %V3M4038 00856000 SLR R1,R1 CLEAR R1 %V3M4038 00857000 IC R1,VMIOINT INTERRUPT PENDING MASK %V3M4038 00858000 NR R1,R4 ENABLE FOR PENDING INTERRUPTS %V3M4038 00859000 BZ FASTER NOTHING - FAST RE-DISPATCH %V3M4038 00860000 B VPSWCHK EXAMINE NEW PSW %V3M4038 00861000 SPACE 00862000 CHEKSSM CALL DMKPSAFP SSM - CHECK FOR FETCH PROTECTION %V3M4038 00863000 BZ SETMASK OK - GO TO IT. %V3M4038 00864000 B PROTEXCP OOPS - GENERATE PROTECTION CHECK @V202232 00865000 CLVMSK CLI VMPSW,0 COMPARE OLD AND NEW PSW MASKS %V3M4038 00866000 EJECT 00867000 PRSKEY EQU * 'ISK' OR 'SSK' 00868000 *---------------------------------------------------------------------* 00869000 * REGISTER USAGE IN 'PRSKEY': * 00870000 * R1 = SEGMENT TABLE ADDRESS * 00871000 * R2 = REAL ADDRESS OF BLOCK (IF PAGE IN CORE) * 00872000 * R3 = ADDRESS IN VMBLOK OF R2 VALUE * 00873000 * R4 = REAL STORAGE KEY * 00874000 * R5 = R1 REGISTER NO. * 4 * 00875000 * R6 = VIRTUAL ADDRESS OF BLOCK * 00876000 * R7 = SWAP TABLE ENTRY ADDRESS * 00877000 * R8 = MASK FOR STORAGE KEY TO USER * 00878000 *---------------------------------------------------------------------* 00879000 PRVMCC MC MNCOSIM,MNCLINST CLASS INST, CODE SIMULATION @VM01017 00880000 LA R8,X'FE' DEFAULT "MASK" FOR ALL 7 BITS @VA01071 00881000 * OF THE KEY 00882000 CLI VMINST,X'09' IS IT ISK INSTR. 00883000 BNE NOTISK NO, MUST BE SSK 00884000 COUNT DMKPRVIK MP-SAFE INCR. TO COUNTER @V407593 00885000 TM VMESTAT,VMEXTCM IN EXTENDED CONTROL NOW ? @VA01071 00886000 BO R8MASKOK YES - R8 "MASK" OF X'FE' IS OK. @VA01071 00887000 B R8MASKF8 NO - GO SET "MASK" TO X'F8'. @VA01071 00888000 NOTISK COUNT DMKPRVEK MP-SAFE INCR. TO COUNTER @V407593 00889000 TM VMPSTAT,VMV370R DOES THIS GUY HAVE AN EC-MODE @VA01071 00890000 * MACHINE ? 00891000 BO R8MASKOK YES - R8 "MASK" OF X'FE' IS OK. @VA01071 00892000 R8MASKF8 LA R8,X'F8' SET FOR 5 BITS ONLY, FOR BC @VA01071 00893000 * MODE/MACHINE 00894000 R8MASKOK EQU * R8 "MASK" CORRECTLY SET; @VA01071 00895000 * CONTINUE: 00896000 BAL R9,REGSPEC GET REGISTER SPECIFICATIONS 00897000 LA R3,VMGPRS(R6) ADDR IN VMBLOK OF R2 FIELD 00898000 TM 3(R3),X'0F' CHECK ALIGNMENT 00899000 BNZ SPECEXCP NO GOOD 00900000 GETKEYAD L R6,0(,R3) GET VIRTUAL BLOCK ADDRESS @VA01071 00901000 LA R10,FASTER BRANCH VECTOR FOR BCR'S 00902000 LA R6,0(0,R6) 24-BITS ONLY, PLEASE 00903000 LRA R2,0(,R6) GET REAL PAGE ADDR. @V408246 00904000 BC 8+2,SEGOK PAGE AVAILABLE AND/OR PTE @V408246 00905000 BAL R14,LOCKET GO LOCK/STACK SYSTEM, AND @V407593 00906000 * RETURN HERE WITH LOCK HELD 00907000 LR R1,R6 GET ADDRESS @V408246 00908000 TRANS 2,1,OPT=(DEFER) @V408246 00909000 BC 2,ADDREXCP ADDR. EXCEPTION @V408246 00910000 CLI VMINST,X'B2' VIRT. RRB? @V408246 00911000 BNE *+8 NO @V408246 00912000 ST R6,0(,R3) YES, RESTORE TEMPSAVE @V408246 00913000 SEGOK DS 0H @V408246 00914000 SLR R7,R7 CLEAR @V408246 00915000 IC R7,1(,R3) VIRTUAL SEGMENT INDEX @V408246 00916000 SLL R7,2 SEGMENT TABLE ENTRY INDEX @V408246 00917000 AL R7,VMSEG ADD STO, GET STE @V408246 00918000 L R7,0(R7) GET PTE @V408246 00919000 LA R7,0(0,R7) 00920000 N R7,=X'00FFFFFE' TURN OFF INVALID BIT @V407566 00921000 S R7,F4 BACK UP... 00922000 L R7,0(0,R7) ...FOR SWAPTABLE POINTER 00923000 IC R4,2(0,R3) PAGE NUMBER * 16 00924000 N R4,F240 CLEAR JUNK 00925000 SRL R4,1(0) INDEX IN SWAPTABLE 00926000 LA R7,0(R4,R7) SWPTABLE ENTRY 00927000 USING SWPFLAG,R7 REFERENCE SWAP TABLE INFO. IN R7 @VA01071 00928000 SLR R4,R4 REAL KEY ASSUMED ZERO 00929000 SLR R1,R1 INDEX TO SWPKEYS 00930000 TM 2(R3),X'08' EVEN OR ODD HALF-PAGE? 00931000 BZ HALFONE EVEN 00932000 LA R1,1(0,0) ODD 00933000 HALFONE EQU * 00934000 LRA R2,0(0,R6) GET REAL ADDRESS 00935000 BNZ PGNOTRES PAGE NOT IN CORE 00936000 ISK R4,R2 GET REAL KEY 00937000 EJECT 00938000 PGNOTRES EQU * 00939000 CLI VMINST,9 ISK? 00940000 BNE PSETKEY NO 00941000 IC R9,SWPKEY1(R1) GET KEY FROM SWPTABLE @VA01071 00942000 OR R9,R4 ...PLUS REAL KEY 00943000 STC R9,SWPKEY1(R1) RESET IN SWPTABLE @VA01071 00944000 NR R9,R8 MASK FOR USER 00945000 STC R9,VMGPRS+3(R5) RETURN RESULT TO USER 00946000 TM VMESTAT,VMPERCM VIRTUAL OR CP PER ACTIVE ? 00947000 BCR 8,R10 NO -- FAST REFLECT 00948000 LR R4,R5 REGISTER INDEX IN R4 00949000 LA R1,PERGPRS GENERAL REGISTER ALTERATION EVENT 00950000 BAL R9,PERCHEK SEE IF RECORDABLE EVENT 00951000 B FASTER FAST DISPATCH 00952000 PSETKEY EQU * HANDLE 'SSK' OR 'RRB' ... @VA01071 00953000 N R4,F6 GET REAL REF, CHG BITS 00954000 LR R2,R4 INTO R2 FOR BACKUP-BIT SETTING 00955000 ALR R2,R2 @V213235 00956000 IC R9,SWPFLAG GET SWPFLAG BYTE @VA01071 00957000 OR R9,R2 ADD BACKUP BITS 00958000 STC R9,SWPFLAG ...RESET FLAG BYTE @VA01071 00959000 CLI VMINST,X'B2' IS IT AN RRB? 00960000 BE RESREFB YES - GO SET COND. CODE 00961000 TM SWPFLAG,SWPSHR SHARED PAGE @VA07028 00962000 BOR R10 YES, SSK = NO-OP ON SHARED PAGE @VA07028 00963000 IC R9,VMGPRS+3(R5) GET NEW KEY 00964000 NR R9,R8 MASK FOR USER 00965000 STC R9,SWPKEY1(R1) SET IN SWPTABLE ENTRY @VA01071 00966000 SETREAL EQU * SET REAL STORAGE KEY 00967000 TM VMPSTAT,VMREAL V=R USER ? @VA01071 00968000 BO *+8 YES - LEAVE ALL OF KEY "AS IS" @VA01071 00969000 N R9,=A(X'F8') MASK FOR REAL KEY (WITH @VA01071 00970000 * FETCH-PROT. BIT) 00971000 LRA R2,0(0,R6) SEE IF PAGE IN CORE 00972000 BCR 7,R10 PAGE NOT IN CORE 00973000 SSK R9,R2 SET REAL KEY 00974000 BR R10 FAST DISPATCH 00975000 EJECT 00976000 PRVRRB EQU * RESET REFERENCE BIT 00977000 SLR R1,R1 NO INDEXING 00978000 BAL R8,INSTADR GET VIRTUAL ADDRESS 00979000 ST R3,TEMPSAVE SAVE IT IN PSA 00980000 NI TEMPSAVE+3,X'F0' FORCE VALID ALIGNMENT FOR 'ISK' 00981000 LA R3,TEMPSAVE POINT TO IT FOR 'PRSKEY' 00982000 TM VMPSTAT,VMV370R IS THIS AN EC-MODE MACHINE ? @VA00780 00983000 BO GETKEYAD YES (WHEW) GET VIRTUAL BLOCK @VA01071 00984000 * ADDRESS ETC. 00985000 B OPEREXCP NO - REFLECT OPERATION EXCEPTION @VA00780 00986000 * (CF 370 PRINCIPLES OF OPERATION) @VA00780 00987000 SPACE 00988000 RESREFB EQU * BACK FROM MIDDLE OF 'SSK' 00989000 IC R9,SWPKEY1(R1) GET KEY FROM SWAP-TABLE @VA01071 00990000 OR R9,R4 ADD TO REAL REF, CHG BITS 00991000 STC R9,SWPKEY1(R1) UPDATE KEY IN SWAP-TABLE @VA01071 00992000 LA R4,6(0,0) MASK FOR REF, CHG BITS ONLY 00993000 NR R4,R9 GET VIRTUAL REF, CHG IN GR4 00994000 SLL R4,3(0) POSITION FOR CC SETTING IN PSW 00995000 LA R2,SWPKEY1(R1) ADDRESS OF VIRTUAL KEY IN @VA01071 00996000 * SWPTABLE 00997000 NI 0(R2),X'FF'-X'04' RESET REFERENCE BIT 00998000 NI VMPSW+2,X'CF' SET EC-MODE COND. CODE = 0, AND @VA00780 00999000 NI VMPSW+4,X'CF' SET BC-MODE COND. CODE = 0 01000000 LA R10,SETPSWCC CHANGE VECTOR TO SET COND. CODE 01001000 N R9,=A(X'FA') RETAIN ALL OF KEY EXCEPT @VA01071 01002000 * REFERENCE BIT 01003000 DROP R7 AND ... @VA01071 01004000 B SETREAL GO SET REAL STORAGE KEY 01005000 PRVIPK IC R0,VMPSW+1 GET KEY AND EMWP @V200198 01006000 N R0,F240 SET EMWP PORTION TO ZERO @V200198 01007000 STC R0,VMGPRS+R2*4+3 BITS 24-31 OF GPR2 @V200198 01008000 TM VMESTAT,VMPERCM IS PER ACTIVE? @V200198 01009000 BZ FASTER NOPE, REDISPATCH @V200198 01010000 LA R1,PERGPRS SET FOR GPR CHANGED @V200198 01011000 LA R4,R2*4 INDICATE REG2 WAS HIT @V200198 01012000 BAL R9,PERCHEK AND SO INDICATE TO VM @V200198 01013000 B FASTER NOW REDISPATCH @V200198 01014000 PRSPKA SR R1,R1 DON'T WANT INDEXING @V200198 01015000 BAL R8,INSTADR GET BASE PLUS DISPLACEMENT @V200198 01016000 IC R0,VMPSW+1 LOAD IN PSW PROTECT KEY & EMWP @V200198 01017000 N R0,F15 ZERO OUT PROTECTION KEY @V200198 01018000 N R3,F240 ZERO OUT ALL BUT BITS 24-27 @V200198 01019000 OR R0,R3 OR IN NEW KEY @V200198 01020000 STC R0,VMPSW+1 STORE NEW KEY & EMWP BACK @V200198 01021000 NI PROPSW+1,X'0F' RESET CURRENT STORAGE KEY @VM01081 01022000 OC PROPSW+1(1),VMPSW+1 SET USERS NEW STORAGE KEY @VM01081 01023000 B FASTER REDISPATCH VIRTUAL MACHINE @V200198 01024000 SPACE 2 01025000 REGSPEC EQU * COMPUTE REGISTER INDICES FOR R1,R3 01026000 L R4,F60 LOAD NECESSARY MASK INTO GR4 01027000 IC R5,VMINST+1 REGISTER SPECIFICATION BYTE 01028000 LR R6,R5 01029000 SRL R5,2(0) 'R1' 01030000 SLL R6,2(0) 'R2' 01031000 NR R5,R4 REDUCE REGISTER NUMBERS TO INDICES 01032000 NR R6,R4 ...INTO 'VMGPRS' FIELD IN VMBLOK 01033000 BR R9 01034000 EJECT 01035000 PRLCTL EQU * LCTL - LOAD CONTROL - X'B7' 01036000 SLR R1,R1 NO INDEXING 01037000 BAL R8,INSTADR COMPUTE VIRTUAL ADDRESS @VA03696 01038000 LA R1,3(0,0) TEST ADDRESS FOR ALIGNMENT 01039000 NR R1,R3 ...MUST BE A FULL-WORD BOUNDARY 01040000 BNZ SPECEXCP NOPE - GENERATE A PROGRAM INTERRUPT 01041000 BAL R8,ADTRANS GET REAL ADDRESS @VA03696 01042000 CALL DMKPSAFP CHECK FOR FETCH PROTECTION @V202232 01043000 BNZ PROTEXCP OOPS - GENERATE PROTECTION CHECK @V202232 01044000 BAL R9,REGSPEC GET REGISTER SPECIFICATIONS 01045000 * 'REGSPEC' WILL LEAVE THE MASK 'F60' IN GR4 01046000 SPACE 01047000 LOADECR EQU * LCTL FOR EC-MODE ALLOWED VIRTUAL MACH. 01048000 TM VMPSTAT,VMV370R ECMODE MACHINE ? @VM01024 01049000 BZ *+8 NO..ECBLOK DOES NOT EXIST... @VM01024 01050000 L R10,VMECEXT EXTENSION BLOCK 01051000 USING ECBLOK,R10 01052000 LA R9,FASTER AND SET R9 "SWITCH" 01053000 CLR R5,R6 SHOULD WE PRE-CHECK ADDRESSES ? 01054000 BE LOADCHK NOPE - JUST LOADING ONE CONTROL REGISTER 01055000 LOADCRS EQU * PRE-CHECK ADDRESS AVAILABILITY 01056000 LA R7,4(0,0) INCREMENT VALUE + INDEX TEST VALU@VMD0133 01057000 LOADMLT EQU * LOAD MULTIPLE CONTROL REGISTERS 01058000 BAL R8,ADTRANS TRANSLATE THE VIRTUAL ADDRESS 01059000 CALL DMKPSAFP CHECK FOR FETCH PROTECTION @V202232 01060000 BZ LOADCHK KEYS MATCH @VA02233 01061000 * ERROR FORCES US OUT OF LOOP. BUT FIRST DO STUFF WE'D 01062000 * NORMALLY DO AT END OF LOOP. 01063000 TM VMESTAT,VMINVSEG+VMNEWCR0 @VA02233 01064000 BZ PROTEXCP REFLECT PROTECTION EXC... @VA02233 01065000 BAL R14,LOCKET GO LOCK/STACK SYSTEM, AND @V407593 01066000 * RETURN HERE WITH LOCK HELD 01067000 CALL DMKVATAB @VA02233 01068000 B PROTEXCP REFLECT IT @VA02233 01069000 EJECT 01070000 LOADCHK EQU * TEST FOR C-REGS 0,1,2,14. @VMD0103 01071000 NR R5,R4 R4=F60, CHANGES CREG 16 TO CREG0.@VMD0103 01072000 LA R0,C14*L4 THIS IS WHAT INDEX WOULD BE FOR @VMD0103 01073000 * C-REG 14. 01074000 CR R5,R0 CURRENTLY WORKING ON C-REG 14? @VMD0103 01075000 BNE ENDC14 NO. @VMD0103 01076000 OI VMVCR14,VMIOLOG ASSUME IOLOG BIT WILL BE 1, @VMD0103 01077000 * AND TURN ON IN VMBLOK. 01078000 TM 0(R2),VMIOLOG TEST IOLOG BIT HE IS LOADING @VMD0103 01079000 * INTO C-REG 14. 01080000 BO ENDC14 BRANCH IF ASSUMPTION OF 1 BIT @VMD0103 01081000 * WAS CORRECT. 01082000 NI VMVCR14,X'FF'-VMIOLOG HES'S SETTING IOLOG BIT @VMD0103 01083000 * OFF. DO SAME IN VMBLOK. 01084000 ENDC14 EQU * @VMD0103 01085000 L R1,0(0,R2) LOAD THE C-REG... 01086000 LTR R5,R5 CREG0 ?? @VA12971 01086100 BNZ *+8 NO, BYPASS CREG0 RESET @VA12971 01086200 N R1,=XL4'FFF8FFFF' RESET BITS 13-15 IN BYTE 1 @VA12971 01086300 TM VMPSTAT,VMV370R ECMODE MACHINE ? @VM01024 01087000 BNZ LOADCHK0 YES..CONTINUE... @VM01024 01088000 LTR R5,R5 LOADING CREG0 ? @VM01024 01089000 BNZ LOADEND2 NO..NOTHING TO DO.. @VM01024 01090000 ST R1,VMVCR0 UPDATE CR0 @VM01024 01091000 B LOADEND2 AND CONTINUE... @VM01024 01092000 LOADCHK0 EQU * @VM01024 01093000 * 01094000 * 01095000 LA R15,8 TO TEST FOR CONTROL REG 0,1, OR 2@VMD0133 01096000 CLR R5,R15 CONTROL REGISTER 0 OR 1? @VMD0133 01097000 BNL LOADATA NOPE - AT LEAST CONTROL REG 2. 01098000 CL R1,EXTCR0(R5) DOES IT MATCH THE "OLD" CONTROL REG VALUE 01099000 BE LOADEND2 YES - GOOD SHOW - KEEP COOL. 01100000 AIF (NOT &TRACE(6)).NTR5 **AIF** 01101000 TM VMTRCTL,VMTRBRIN TRACING BRANCHES OR INSTRUCTIONS ? 01102000 BZ LOADCHK1 NOPE - NO PROBLEM. 01103000 CALL DMKTRCPB YES - PUT BACK OLD USER INSTRUCTIONS NOW 01104000 .NTR5 ANOP 01105000 LOADCHK1 LA R9,LCTLVAT SET R9 SWITCH TO CALL DMKVATAB 01106000 LTR R5,R5 NOW WAS THAT CONTROL REGISTER 0 OR 1 ? 01107000 BZ LOADCHKZ IT WAS 0. 01108000 OI VMESTAT,VMINVSEG SET FLAGBIT IF CONTROL REG 1 CHANGED 01109000 B LOADEND AND GO STORE NEW VALUE. 01110000 LOADCHKZ OI VMESTAT,VMNEWCR0 SET FLAGBIT IF CONTROL REG 0 CHANGED 01111000 B LOADEND AND GO STORE NEW VALUE. 01112000 * 01113000 LOADATA EQU * LOAD C-REG OTHER THAN ZERO OR ONE: 01114000 BH LOADEND TRF IF > CONTROL REG 2 (CC IS STILL SET) 01115000 * LOADING C-REG 2 (I/O MASKS) ... 01116000 TM VMPSW,X'02' IS USER PSW ENABLED FOR I/O ? 01117000 BZ LOADEND NO - NO PROBLEM INCURRED 01118000 LA R15,LCTLVAT SEE WHAT R9 SWITCH IS 01119000 CLR R9,R15 PERCHANCE = A(LCTLVAT) ? 01120000 BE LOADEND YES - LEAVE IT AT THAT. 01121000 LA R9,VPSWCHK NO - THEN SET IT TO A(VPSWCHK). 01122000 LOADEND ST R1,EXTCR0(R5) STORE NEW VALUE OF THE CONTROL REGISTER 01123000 LOADEND2 EQU * SEE IF WE'RE FINISHED YET: 01124000 CLR R5,R6 HAVE WE LOADED THE LAST REGISTER ? 01125000 BCR 8,R9 YES - GO TO FASTER / VPSWCHK / LCTLVAT 01126000 LOADNXT EQU * ADVANCE TO THE NEAREST RAILROAD... 01127000 ALR R3,R7 ...IF YOU PASS 'GO', @VMD0133 01128000 ALR R5,R7 ...COLLECT $200 @VMD0133 01129000 B LOADMLT ...AND CONTINUE ON AROUND 01130000 LCTLVAT EQU * PERFORM SHADOW-TABLE CLEAN-UP 01131000 BAL R14,LOCKET GO LOCK/STACK SYSTEM, AND @V407593 01132000 * RETURN HERE WITH LOCK HELD 01133000 CALL DMKVATAB MAINTENANCE ROUTINE 01134000 B VPSWCHK ENABLED STATUS HAS CHANGED 01135000 DROP R10 01136000 EJECT 01137000 PSTCTL EQU * STCTL - STORE CONTROL - X'B6' 01138000 BAL R9,REGSPEC GET REGISTER SPECIFICATIONS 01139000 SLR R1,R1 01140000 BAL R8,INSTADR COMPUTE VIRTUAL ADDRESS @VA03696 01141000 LA R1,3(0,0) MASK TO TEST FULL-WORD ALIGNMENT 01142000 NR R1,R3 ... 01143000 BNZ SPECEXCP OOPS - GENERATE A PROGRAM INTERRUPT 01144000 TM VMPSTAT,VMV370R ECMODE MACHINE? @VMD0103 01145000 BNZ STRECMOD YES - DIFFERENT ENTIRELY. @VMD0103 01146000 SR R0,R0 @VMD0103 01147000 BCTR R0,0 FLAG -1 ASSUMES C-REG 0 NOT TO @VMD0103 01148000 * BE STORED. 01149000 LR R1,R0 FLAG -1 ASSUMES C-REG 14 NOT TO @VMD0103 01150000 * BE STORED. 01151000 SR R3,R5 COMPUTE BASE OF DATA AREA, NEEDED@VMD0103 01152000 * BY STRNG ROUTINE. (BASE IS PLACE 01153000 * WHERE C-REG 0 WOULD GO IF RANGE 01154000 * OF REGISTERS WAS EXTENDED DOWN- 01155000 * WARD TO INCLUDE C-REG 0.) 01156000 CR R5,R6 COMPARE END POINTS OF REG RANGE. @VMD0103 01157000 BNH STRNOWRP DON'T HAVE WRAP FROM C-REG 15-0. @VMD0103 01158000 * THE C-REGS DO WRAP OVER THE 15-0 BOUNDARY. WE WILL 01159000 * TREAT IT AS TWO SUB-RANGES, ONE ON EACH SIDE OF THE 01160000 * BOUNDARY. 01161000 LR R4,R6 SAVE R6 (UPPER LIMIT OF RANGE)...@VMD0103 01162000 LA R6,C15*L4 AND SET DUMMIED UPPER LIMIT OF @VMD0103 01163000 * C-REG 15. 01164000 BAL R9,STRNG ALTERS FLAGS (R0,R1) IF C-REGS @VMD0103 01165000 * 0, 14 ARE IN THIS RANGE. 01166000 LR R6,R4 RE-ESTABLISH R6 (TRUE UPPER LIMT)@VMD0103 01167000 SR R5,R5 AND ESTABLISH DUMMIED LOWER LIMIT@VMD0103 01168000 * OF C-REG 0. 01169000 LA R3,16*L4(0,R3) RELOCATE THE DATA AREA BASE @VMD0103 01170000 * UPWARD TO THE C-REG 0 POSITION 01171000 * OF THE UPPER SUB-RANGE. (SEE 01172000 * STRNG ROUTINE'S INPUT DESCRIPT.) 01173000 STRNOWRP BAL R9,STRNG ALTERS FLAGS (R0,R1) IF CREGS 0, @VMD0103 01174000 * 14 ARE IN THIS RANGE. 01175000 * WE NOW ACT ON R0, R1 FLAGS AND STORE INDICATED C-REGS. 01176000 LR R6,R1 SAVE FLAG OF -1 OR ADDR FOR C14. @VMD0103 01177000 LTR R3,R0 PREPARE TO PROCESS C-REG 0. @VMD0103 01178000 BM STRNOT0 FORGET IT, C-REG 0 NOT IN RANGE. @VMD0103 01179000 BAL R9,STRVCHK GET REAL ADDR (OF R3) INTO R2, @VMD0103 01180000 * ALSO CHECK STORAGE PROTECTION. 01181000 L R1,VMVCR0 GET C-REG 0 FROM VMBLOK. @VMD0103 01182000 ST R1,0(0,R2) STORE INTO STCTL'S DATA AREA. @VMD0103 01183000 BAL R9,STRPERAA SEE IF VIRT. OR CP PER IS ACTIVE.@VMD0103 01184000 STRNOT0 EQU * @VMD0103 01185000 LTR R3,R6 PREPARE TO PROCESS C-REG 14. @VMD0103 01186000 BM FASTER FORGET IT, C-REG 14 NOT IN RANGE.@VMD0103 01187000 BAL R9,STRVCHK GET REAL ADDR (OF R3) INTO R2, @VMD0103 01188000 * ALSO CHECK STORAGE PROTECTION. 01189000 OI 0(R2),VMIOLOG ASSUME BIT TO BE STORE WILL BE 1.@VMD0103 01190000 TM VMVCR14,VMIOLOG SEE IF C14 IN VMBLOK HAS A 1. @VMD0103 01191000 BO STR14B OKAY, WE ASSUMED 1 CORRECTLY. @VMD0103 01192000 NI 0(R2),X'FF'-VMIOLOG GUESSED WRONG. CHANGE TO 0.@VMD0103 01193000 STR14B BAL R9,STRPERAA SEE IF VIRT. OR CP PER IS ACTIVE.@VMD0103 01194000 B FASTER ALL DONE. RE-DISPATCH. @VMD0103 01195000 SPACE 2 01196000 *********************************************************************** 01197000 * STRNG: A ROUTINE TO EXAMINE A NON-WRAPPING RANGE OF REGISTERS AND 01198000 * DECIDE WHETHER REGISTER 0 AND REGISTER 14 ARE IN THE RANGE. 01199000 *********************************************************************** 01200000 * INPUTS: R5, R6 CONTAIN STARTING AND ENDING REG NUMBERS TIMES 4. 01201000 * R0, R1 ARE FLAGS, INITIALIZED TO -1 OR TO AN ADDRESS. 01202000 * R3 SET TO ADDRESS OF BASE OF DATA AREA (BASE IS WHERE REG 0 01203000 * WOULD GET STORED, COMPUTED BY EXTENDING DATA AREA 01204000 * DOWNWARD IF REG 0 IS NOT IN THE RANGE). 01205000 * R9 HAS RETURN ADDRESS. 01206000 * OUTPUTS: R0 IS SET TO ADDRESS FOR STORING REG 0 IN DATA AREA IF 01207000 * REG 0 IS IN THE RANGE; OTHERWISE R0 IS UNCHANGED. 01208000 * R1 IS SET TO ADDRESS FOR STORING REG 14 IN DATA AREA 01209000 * IF REG 14 IS IN THE RANGE; OTHERWISE R1 IS UNCHANGED. 01210000 *********************************************************************** 01211000 STRNG LTR R5,R5 STARTING REG IS C-REG 0? @VMD0103 01212000 BNZ STRNG0Z NO, SO (WITHOUT WRAP) C-REG 0 @VMD0103 01213000 * CANNOT BE IN THE RANGE. 01214000 LR R0,R3 ADDR. FOR C-REG 0 IN DATA AREA. @VMD0103 01215000 STRNG0Z EQU * @VMD0103 01216000 CH R6,=Y(C14*L4) IS THE END REG EITHER 14 OR 15? @VMD0103 01217000 BLR R9 C-REG 14 IS NOT IN THE RANGE. @VMD0103 01218000 BE STRNG14 C-REG 14 IS IN THE RANGE. @VMD0103 01219000 * C-REG 14 MIGHT BE IN RANGE. POSSIBILITIES ARE X-15 AND 15-15. 01220000 CR R5,R6 RANGE IS X-15 OR 15-15. WHICH? @VMD0103 01221000 BER R9 RANGE IS 15-15. EXIT. @VMD0103 01222000 STRNG14 EQU * C-REG 14 IS IN THE RANGE. @VMD0103 01223000 LA R1,C14*L4(0,R3) ADDR FOR C-REG 14 IN DATA AREA. @VMD0103 01224000 BR R9 @VMD0103 01225000 SPACE 2 01226000 *********************************************************************** 01227000 * STRVCHK: GET REAL ADDR (0F R3) INTO R2, ALSO CHECK STORAGE PROTECTN. 01228000 *********************************************************************** 01229000 STRVCHK BAL R8,ADTRANS GET REAL ADDR (OF R3) INTO R2. @VMD0103 01230000 CALL DMKPSASP CHECK STORAGE PROTECTION KEY. @VMD0103 01231000 BZR R9 RETURN, NO PROTECTION PROBLEMS. @VMD0103 01232000 B PROTEXCP EXIT TO PROTECTION INTERRUPT. @VMD0103 01233000 SPACE 2 01234000 *********************************************************************** 01235000 * STRPERAA: PERFORM 'PERCHEK' CHECKING AFTER SOME INITIALIZATION. 01236000 *********************************************************************** 01237000 STRPERAA TM VMESTAT,VMPERCM VIRTUAL OR CP PER ACTIVE? @VMD0103 01238000 BZR R9 NO, RETURN. SKIP PER EVENT CHECK@VMD0103 01239000 LA R1,PERSALT STORAGE ALTERATION EVENT. @VMD0103 01240000 LA R2,L4 FIELD LENGTH STORED. @VMD0103 01241000 B PERCHEK GO TO PERCHEK ROUTINE TO SEE IF @VMD0103 01242000 * EVENT NEEDS RECORDING. RETURN IS 01243000 * TO ADDRESS ALREADY IN R9. 01244000 SPACE 2 01245000 STRECMOD L R10,VMECEXT EXTENSION BLOCK CONTAINS C-REGS. @VMD0103 01246000 USING ECBLOK,R10 @VMD0103 01247000 STRLOOPE BAL R8,ADTRANS GET REAL ADDR (OF R3) INTO R2. @VMD0103 01248000 CALL DMKPSASP CHECK STORAGE PROTECTION KEYS. @VMD0103 01249000 BNZ PROTEXCP NO MATCH - INTERRUPT. @VMD0103 01250000 L R1,EXTCR0(R5) PICK UP A C-REG. @VMD0103 01251000 ST R1,0(0,R2) STORE INTO VIRTUAL MEMORY. @VMD0103 01252000 BAL R9,STRPERAA SEE IF VIRT. OR CP PER IS ACTIVE.@VMD0103 01253000 STRNPERE EQU * @VMD0103 01254000 CR R5,R6 IS CURRENT C-REG THE LAST ONE? @VMD0103 01255000 BE FASTER YES - JUST RE-DISPATCH. @VMD0103 01256000 LA R5,L4(0,R5) NEXT C-REG. @VMD0103 01257000 NR R5,R4 R4=F60, WRAPS C-REG 16 TO C-REG 0@VMD0103 01258000 LA R3,L4(0,R3) NEXT VIRTUAL LOCATION. @VMD0103 01259000 B STRLOOPE @VMD0103 01260000 DROP R10 @VMD0103 01261000 EJECT 01262000 PRPTLB EQU * PURGE TABLE LOOK-ASIDE BUFFER 01263000 TM VMPSTAT,VMV370R IS THIS AN EC-MODE MACHINE ? @VA00780 01264000 BZ OPEREXCP NO - REFLECT OPERATION EXCEPTION @VA00780 01265000 * (CF 370 PRINCIPLES OF OPERATION) @VA00780 01266000 OI VMESTAT,VMINVPAG FLAG BAD SHADOW PAGE TABLES @V3M4026 01267000 BAL R14,LOCKET GO LOCK/STACK SYSTEM, AND @V407593 01268000 * RETURN HERE WITH LOCK HELD 01269000 CALL DMKVATAB INVALIDATE ALL SHADOW PAGE TABLES 01270000 NI APSTAT2,X'FF'-CPPTLBR & CLEAR PENDING FLAG @V4M0103 01271000 PTLB PURGE TLB @VA07615 01272000 B FASTER ...AND RE-DISPATCH VIRTUAL MACHINE 01273000 SPACE 2 01274000 PRLRA EQU * LOAD 'REAL' ADDRESS 01275000 LA R1,1(0) INDEXING IS ALLOWED 01276000 BAL R8,INSTADR GET VIRTUAL-VIRTUAL ADDRESS 01277000 TM VMPSTAT,VMV370R ALLOW TO USE 'LRA' INSTRUCTION 01278000 BZ OPEREXCP IF NOT - REFLECT OPERATION EXCEPTION 01279000 LR R5,R11 LOAD ADDRESS OF USER'S VMBLOK 01280000 BAL R14,LOCKET GO LOCK/STACK SYSTEM, AND @V407593 01281000 * RETURN HERE WITH LOCK HELD 01282000 TM VMESTAT,VMEXTCM IS VM IN EXTENDED MODE 01283000 BO VATLRAS YES - GET VIRTUAL-VIRTUAL ADDRESS 01284000 LA R5,2(,R5) NO - COND. CODE IS IN OTHER LOCATION 01285000 VATLRAS CALL DMKVATLA VIRTUAL-VIRTUAL TO VIRTUAL ADDRESS 01286000 NI VMPSW+2-VMBLOK(R5),X'CF' RESET CONDITION CODE = 0 01287000 IC R4,VMINST+1 GET REGISTER SPECIFICATION 01288000 SRL R4,2(0) 01289000 N R4,F60 REG. NO. * 4 01290000 ST R2,VMGPRS(R4) PASS BACK TRANSLATED ADDRESS 01291000 LTR R0,R0 WAS THE TRANSLATION O.K.? 01292000 BZ PRLRAPE YES - CHECK FOR PER EVENT 01293000 S R1,F15 CONVERT CODE FROM 16,17,18 TO 1,2,3 01294000 SLL R1,4(0) POSITION FOR SETTING COND. CODE BITS 01295000 IC R3,VMPSW+2-VMBLOK(,R5) CC, PROG MASK FROM PSW 01296000 OR R3,R1 'OR' IN NEW CONDITION CODE 01297000 STC R3,VMPSW+2-VMBLOK(,R5) AND SET IN VIRTUAL PSW 01298000 PRLRAPE EQU * CHECK FOR PER EVENT 01299000 TM VMESTAT,VMPERCM VIRTUAL OR CP PER ACTIVE ? 01300000 BZ FASTER NO - JUST RETURN 01301000 LA R1,PERGPRS GENERAL REGISTER ALTERATION 01302000 BAL R9,PERCHEK RECORD DATA IF NEEDED 01303000 B FASTER RETURN 01304000 EJECT 01305000 PSTIDP EQU * STORE CPU ID 01306000 SLR R1,R1 NO INDEXING 01307000 BAL R8,INSTADR COMPUTE VIRTUAL ADDRESS @VA03696 01308000 L R6,F7 CHECK ALGINMENT 01309000 NR R6,R3 MUST BE DBL-WD ALIGNED 01310000 BNZ SPECEXCP NO GOOD - INTERRUPT 01311000 BAL R8,ADTRANS GET REAL ADDRESS @VA03696 01312000 CALL DMKPSASP CHECK STORAGE PROTECTION KEYS @V202232 01313000 BNZ PROTEXCP NO GOOD - INTERRUPT 01314000 *------------------- 01316000 * ZAP CPU ID SO HE WON'T RECOGNIZE THE MODEL NUMBER 01317000 *------------------- 01318000 USING CPUID,R2 01319000 OI CPUVERSN,X'FF' SET VERSION CODE FOR VIRTUAL MACHINE 01320000 STH R6,CPUMCELL SET MCEL TO 0 - NO DATA WILL BE @V213135 01321000 * OVERRIDE CPU SERIAL IN CASE CPUID SET BY MEANS OF 01322000 * 'SET CPUID' COMMAND OR DIRECTORY 'OPTION' CONTROL STATEMENT 01323000 MVC CPUSER(3),VMCPUID OVERRIDE FROM VMBLOK @V407466 01324000 * STORED 01325000 DROP R2 @VA08195 01325100 TM APSTAT1,PROCIO IS THIS THE MAIN PROCESSOR @VA08195 01325200 BO MAINMODL YES-WE ARE ON THE MAIN PROCESSOR @VA08195 01325300 L R6,PREFIXB OTHER PROCESSOR ADDRESS @VA08195 01325400 MAINMODL EQU * @VA08195 01325500 USING CPUID,R2 @VA08195 01325600 MVC CPUMODEL,CPUMODEL-PSA(R6) MOVE IN CPU MODEL NUM.@VA08195 01325700 DROP R2 01326000 TM VMESTAT,VMPERCM VIRTUAL OR CP PER ACTIVE ? 01327000 BZ FASTER NO - JUST RETURN 01328000 LA R1,PERSALT STORAGE ALTERATION 01329000 LA R2,8(0) FIELD LENGTH STORED 01330000 BAL R9,PERCHEK SET PER PENDING IF REQUIRED 01331000 B FASTER ...AND RETURN 01332000 SPACE 2 01333000 PSTIDC EQU * STORE CHANNEL ID 01334000 SLR R1,R1 NO INDEXING 01335000 BAL R8,INSTADR GET CHANNEL ADDRESS 01336000 NI VMPSW+2,X'CF' SET COND. CODE ZERO - EC MODE 01337000 NI VMPSW+4,X'CF' SET CONDITION CODE ZERO - BC 01338000 LR R1,R3 UNIT ADDR INTO R1 FOR DMKSCNVU. @VMD0103 01339000 * NOTE: STIDC LOOKS ONLY AT THE CHANNEL ADDR., BUT WE 01340000 * WILL BEGIN WITH THE PARTICULAR SPECIFIED UNIT ANYWAY. 01341000 * IF SPECIFIED UNIT PORTION IS GARBAGE, WE FAIL AND WILL RESORT 01342000 * TO LOOKING FOR ANY UNIT ON THE CHANNEL. BY STARTING WITH 01343000 * THE PARTICULAR UNIT WE HAVE A BETTER CHANCE OF GIVING THE 01344000 * USER ACCURATE STIDC DATA IF HE HAS VIOLATED THE RULE ABOUT 01345000 * MAPPING ALL DEVICES ON A VIRTUAL CHANNEL TO REAL DEVICES ON 01346000 * A SINGLE TYPE OF REAL CHANNEL. 01347000 CALL DMKSCNVU IF CC=0, THEN R6=VCHBLOK, @VMD0103X01348000 R7=VCUBLOK, AND R8=VDEVBLOK. @VMD0103 01349000 * IF R6=-1, VCHBLOK WAS NOT FOUND. 01350000 BNZ STICHNL NO VIRT. DEVICE FOR THIS UNIT ADR@VMD0103 01351000 BAL R9,DVTYPCHK CHECK OUT THE VIRTUAL DEVICE. @VMD0103 01352000 * IF IT IS A TYPE THAT MAPS TO A REAL 01353000 * DEVICE, THEN DON'T RETURN HERE, BUT GO TO 01354000 * DEVFND INSTEAD. OTHERWISE, RETURN HERE. 01355000 STICHNL EQU * INITIAL UNIT ADDR DOES NOT MAP @VMD0103 01356000 * TO A REAL DEVICE. 01357000 LTR R6,R6 R6 (FROM DMKSCNVU) POINTS TO @VMD0103 01358000 * VCHBLOK? 01359000 BM PRIVCC3 CHANNEL NOT ACTIVE. SET CC=3. @VMD0103 01360000 USING VCHBLOK,R6 @VMD0103 01361000 LA R4,2 LOAD INCREMENT FOR LOOP. @VMD0103 01362000 LA R5,30 LOAD LOOP LIMIT. @VMD0103 01363000 SR R1,R1 CLEAR INDEX. @VMD0103 01364000 NXTCU LH R7,VCHCUTBL(R1) LOAD HFWD OFFSET TO VCUBLOK. @VMD0103 01365000 LTR R7,R7 IS THIS CONTROL UNIT ACTIVE? @VMD0103 01366000 BM CULOOP NO, INCREMENT INDEX, LOOP AGAIN. @VMD0103 01367000 A R7,VMCUSTRT OFFSET + START = CU ADDRESS. @VMD0103 01368000 USING VCUBLOK,R7 @VMD0103 01369000 SR R2,R2 CLEAR INDEX FOR TABLE OF DEVICE @VMD0103 01370000 * OFFSETS. 01371000 NXTDEV LH R8,VCUDVTBL(R2) LOAD HFWD OFFSET TO VDEVBLOK. @VMD0103 01372000 LTR R8,R8 IS CORRESPONDING DEVICE ACTIVE? @VMD0103 01373000 BM DEVLOOP NO, INCREMENT INDEX, LOOP AGAIN. @VMD0103 01374000 A R8,VMDVSTRT OFFSET + START = VDEVBLOK ADDR. @VMD0103 01375000 USING VDEVBLOK,R8 @VMD0103 01376000 BAL R9,DVTYPCHK CHECK OUT THE VIRTUAL DEVICE. IF @VMD0103 01377000 * IT IS A TYPE THAT MAPS TO A REAL DEVICE, 01378000 * THEN DON'T RETURN HERE, BUT GO TO DEVFND 01379000 * INSTEAD. OTHERWISE, RETURN HERE. 01380000 DROP R7,R8 @VMD0103 01381000 DEVLOOP BXLE R2,R4,NXTDEV TRY THE NEXT DEVICE. @VMD0103 01382000 CULOOP BXLE R1,R4,NXTCU TRY THE NEXT CTRL UNIT. @VMD0103 01383000 * FALLING THRU MEANS NO VIRTUAL DEVICE ON THE VIRTUAL CHANNEL 01384000 * MAPS TO A REAL DEVICE. SO SIMULATE STIDC USING DATA FROM 01385000 * THE VIRTUAL CHANNEL BLOCK RATHER THAN FROM A REAL CHANNEL 01386000 * BLOCK. 01387000 USEVIRT EQU * @V508690 01388000 SLR R5,R5 START TO SET UP CHANNEL ID WORD 01389000 TM VCHTYPE,VCHSEL SELECTOR CHANNEL ? 01390000 BO PSETIDC YES - ALL ZEROES WILL DO 01391000 ICM R5,B'1000',F16+3 TYPE '00010000' = BYTE MULTIPLEX 01392000 TM VCHTYPE,VCHBMX IS THIS A VIRTUAL BLOCK MULTIPLEXOR ? 01393000 BZ PSETIDC NO - AS EXPECTED 01394000 SLL R5,1(0) TYPE '00100000' = BLOCK MULTIPLEXOR 01395000 EJECT 01396000 PSETIDC EQU * GET USER'S PAGE ZERO, DO THE STORE 01397000 SLR R1,R1 01398000 BAL R8,TRANS21 "TRANS 2,1,OPT=(BRING,DEFER)" 01399000 ST R5,CHANID-PSA(0,R2) STORE CHANNEL ID 01400000 B FASTER ...AND RE-DISPATCH MACHINE 01401000 PRIVCC3 EQU * SET CONDITION CODE THREE 01402000 LA R4,X'30' CONDITION CODE THREE TO BE SET 01403000 SETPSWCC EQU * SET PSW CONDITION CODE 01404000 LA R1,VMPSW+2 POSITION IF IN EC MODE 01405000 TM VMESTAT,VMEXTCM IS HE ? 01406000 BO *+8 YES 01407000 LA R1,VMPSW+4 POSITION IF IN BC MODE 01408000 EX R4,SETPECC SET CONDITION CODE 01409000 B FASTER ...AND RE-DISPATCH 01410000 SETPECC OI 0(R1),*-* 01411000 SPACE 2 01412000 *********************************************************************** 01413000 * DVTYPCHK: SUBROUTINE CHECKS IF VIRTUAL DEVICE MAPS TO A REAL 01414000 * DEVICE AND IF NOT IT RETURNS. BUT IF IT DOES MAP, 01415000 * THEN IT NEVER RETURNS TO WHERE IT WAS CALLED FROM, BUT 01416000 * FALLS THRU TO DEVFND INSTEAD. 01417000 *********************************************************************** 01418000 USING VDEVBLOK,R8 @VMD0103 01419000 DVTYPCHK CLI VDEVTYPC,CLASDASD PERHAPS A DASD DEVICE? @VMD0103 01420000 BE DVTYPOKY YES. SEE IF IT MAPS. @VMD0103 01421000 TM VDEVSTAT,VDEVDED DEDICATED DEVICE? @VMD0103 01422000 BZR R9 NO. RETURN. @VMD0103 01423000 DVTYPOKY EQU * IT IS A TYPE THAT SHOULD MAP. @VMD0103 01424000 ICM R8,15,VDEVREAL GET RDEVBLOK ADDRESS. @VMD0103 01425000 DROP R8 @VMD0103 01426000 BZR R9 NO ADDRESS. STRANGE. RETURN. @VMD0103 01427000 SPACE 2 01428000 USING RDEVBLOK,R8 @VMD0103 01429000 DEVFND L R8,RDEVCUA GET ADDR OF CONTROL UNIT BLOK. @VMD0103 01430000 USING RCUBLOK,R8 @VMD0103 01431000 TM RCUTYPE,RCUSUB IS THIS A SUB-CONTROL UNIT? @VMD0103 01432000 BZ GETCH NO, MAIN CONTROL. NEXT LEVEL IS @VMD0103 01433000 * THE CHANNEL BLOK. 01434000 * IT IS A SUB-CONTROL UNIT. NEXT LEVEL IS MAIN CONTROL UNIT. 01435000 L R8,RCUPRIME GET MAIN CONTROL UNIT BLOK. @VMD0103 01436000 GETCH L R4,RCUCHA PICK UP THE CHANNEL BLOK. @VMD0103 01437000 DROP R8 @VMD0103 01438000 USING RCHBLOK,R4 @VMD0103 01439000 L R5,RCHSTIDC DATA FROM STIDC INSTR. ON THE @VMD0103 01440000 * REAL CHANNEL. 01441000 LTR R5,R5 FLAG -1 MEANS REAL STIDC GAVE @VMD0103 01442000 * CC=3. 01443000 BM PRIVCC3 REAL CHAN GAVE CC=3, SO GIVE THE @VMD0103 01444000 * SAME THING NOW. 01445000 * DATA IN R5 FROM REAL STIDC IS ALL SET EXCEPT FOR ONE THING. 01446000 * THE REAL CHANNEL MIGHT HAVE BEEN A BLOCK MPX, BUT THE VIRTUAL 01447000 * CHANNEL MIGHT BE SUPPOSED TO LOOK LIKE A SELECTOR (BECAUSE 01448000 * OF DEFINE COMMAND). CHECK, AND IF SO RESET R5 TO BE SELECTOR. 01449000 TM VCHTYPE,VCHSEL VIRTUAL CHANNEL IS SELECTOR? @VMD0103 01450000 BNO PSETIDC NO. VALUE IN R5 IS OKAY, USE IT.@VMD0103 01451000 N R5,=X'DFFFFFFF' TURN OFF BLOCK MPX BIT (IF ON). @VMD0103 01452000 B PSETIDC USE STIDC DATA FROM R5. @VMD0103 01453000 DROP R4,R6 @VMD0103 01454000 SPACE 01455000 EJECT 01456000 *--------------------------------------------------------------------* 01457000 * COMPARE AND SWAP - CS 01458000 *--------------------------------------------------------------------* 01459000 PRCS COUNT DMKPRVCS MP-SAFE INCR. TO COUNTER @V407593 01460000 LA R6,3 SET FOR WD BDY CHECK @V2B2638 01461000 B PRCDS1 AND CONTINUE... @V200198 01462000 SPACE 1 01463000 *--------------------------------------------------------------------* 01464000 * COMPARE DOUBLE AND SWAP - CDS 01465000 *--------------------------------------------------------------------* 01466000 PRCDS COUNT DMKPRVCD MP-SAFE INCR. TO COUNTER @V407593 01467000 TM VMINST+1,X'11' R1 AND R3 MUST SPECIFY EVEN REGS @V2B2638 01468000 BNZ SPECEXCP OR WE HAVE INVALID FORMAT. @V200198 01469000 LA R6,7 SET FOR DBL WD CHECK @V200198 01470000 PRCDS1 MC MNCOSIM,MNCLINST CLASS INST, CODE SIMULATION @VM01017 01471000 SLR R1,R1 SET FOR NO INDEXING. @V2B2638 01472000 BAL R8,INSTADR COMPUTE VIRTUAL ADDRESS @VA03696 01473000 LR R7,R3 SET UP FOR BOUNDARY CHECK... @V200198 01474000 NR R7,R6 CHECK IT (PRESERVE R3 FOR PER) @V200198 01475000 BNZ SPECEXCP NOPE, SPECIFICATION EXCEPTION @V200198 01476000 BAL R8,ADTRANS GET REAL ADDRESS @VA03696 01477000 NI VMPSW+4,X'CF' SET CC0 FOR BC @V200198 01478000 NI VMPSW+2,X'CF' SET CC0 FOR EC @V200198 01479000 IC R5,VMINST+1 GET R1/R3 DESIGNATIONS @V200198 01480000 LR R1,R5 AND REMEMBER FOR LATER. @V200198 01481000 SRL R5,2 INDEX TO R1... @V200198 01482000 N R5,F60 IN THE.... @V200198 01483000 LR R4,R5 ...(SAVE FOR POSSABLE PER)... @V200198 01484000 ALR R5,R11 USERS VMBLOK. @V200198 01485000 EX R6,PRCDS3 COMPARE THE PROPER ARGUMENTS @V200198 01486000 BE PRCDS2 EQUAL, OPER3 REPLACES OPER2. @V200198 01487000 CALL DMKPSAFP NOW CHK FETCH (FASTER THIS WAY) @V200198 01488000 BNZ PROTEXCP OOPS... @V200198 01489000 EX R6,PRCDS4 UNEQUAL, OPER2 REPLACES OPER1 @V200198 01490000 LA R1,PERGPRS JUST IN CASE WE HAVE A PER @V200198 01491000 TM VMESTAT,VMEXTCM IN EXTENDED MODE? @V200198 01492000 BO *+12 YES, SKIP THE BC SET... @V200198 01493000 OI VMPSW+4,X'10' SET CC1 IN BC MODE PSW @V200198 01494000 B DOPER GO CHECK FOR PER @V200198 01495000 OI VMPSW+2,X'10' SET CC1 IN EC MODE PSW @V200198 01496000 B DOPER GO CHECK FOR PER @V200198 01497000 PRCDS2 SLL R1,2 INDEX TO R3... @V200198 01498000 N R1,F60 IN THE... @V200198 01499000 ALR R1,R11 USERS VMBLOK. @V200198 01500000 CALL DMKPSASP CHECK OPER2 FOR STORAGE PROT @V200198 01501000 BNZ PROTEXCP OOPS @V200198 01502000 EX R6,PRCDS5 EQUAL, OPER3 REPLACES OPER2 @V200198 01503000 LA R1,PERSALT PER STORAGE ALTERATION @V200198 01504000 LR R2,R6 FIELD LENGTH @V200198 01505000 DOPER TM VMESTAT,VMPERCM IS PER ACTIVE? @V200198 01506000 BZ FASTER NOPE. @V200198 01507000 BAL R9,PERCHEK GO CHECK IT OUT @V200198 01508000 B FASTER DONE @V200198 01509000 EJECT 01510000 PRCDS3 CLC VMGPRS-VMBLOK(0,R5),0(R2) R1 : S2 @V200198 01511000 PRCDS4 MVC VMGPRS-VMBLOK(0,R5),0(R2) R1 <-- S2 (R1 NE S2) @V200198 01512000 PRCDS5 MVC 0(0,R2),VMGPRS-VMBLOK(R1) S2 <-- R3 (R1 EQ S2) @V200198 01513000 EJECT 01514000 *------------------------------------------------ 01515000 * CALLING SEQUENCE FOR PERCHEK: 01516000 * 01517000 * VMESTAT MUST BE CHECKED FOR VMPERCM BEFORE CALLING PERCHEK 01518000 * R1 CONTAINS TYPE OF PER EVENT, PERGPRS OR PERSALT 01519000 * 01520000 * FOR PERGPRS: 01521000 * R4 CONTAINS THE GPR NO. * 4 01522000 * 01523000 * FOR PERSALT: 01524000 * R2 CONTAINS THE FIELD LENGTH 01525000 * R3 CONTAINS THE VIRTUAL ADDRESS WHICH IS CHANGING 01526000 *------------------------------------------------ 01527000 PERCHEK EQU * CHECK FOR PER EVENT SIMULATED 01528000 TM VMESTAT,VMPERCM DOES ANYONE WANT THIS? PER001 01529000 BZR R9 NO PER, RETURN PER001 01530000 TM VMTRCTL,VMTRPER CP PER? PER001 01531000 BZ OWNPER USER PER, GO HANDLE PER001 01532000 L R10,VMPERCTL OTHERWISE IT'S OURS. PER001 01533000 LA R15,PERCR9-PERBLOK(,R10) LOAD START OF CR'S. PER001 01534000 LA R14,PERADDR-PERBLOK(,R10) LOAD EVENT ADDR LOC. PER001 01535000 B TRAPPER AND LOOK AT THE INTERRUPT. PER001 01536000 OWNPER L R10,VMECEXT EXTENTION BLOCK ADDRESS. PER001 01537000 LA R15,EXTCR9-ECBLOK(,R10) START OF CR'S. PER001 01538000 LA R14,EXTPERAD-ECBLOK(,R10) START OF PERADDR, PEPER001 01539000 TRAPPER EQU * GPR 15 = ADDRESS OF CR9,10,11 VALUES 01540000 IC R0,0(,R15) GET CONTROL BYTE FROM C-REG 9 01541000 NR R0,R1 MASKED ON FOR THIS TYPE? 01542000 BCR 8,R9 NO - RETURN 01543000 CH R1,=AL2(PERGPRS) REGISTER ALTERATION? 01544000 BNE PERCH01 NO - CHECK STORAGE 01545000 SRL R4,2(0) GET REGISTER NUMBER 01546000 N R4,F15 INSURE WITHIN RANGE 01547000 L R0,=A(X'8000') GET A ONE BIT FOR REGISTER CHECKING 01548000 SRL R0,0(R4) SHIFT BIT INTO POSITION 01549000 N R0,0(,R15) MONITORING THIS REGISTER? 01550000 BCR 8,R9 NO - RETURN 01551000 PERDONE EQU * PER EVENT NEEDS RECORDING 01552000 TM VMPEND,VMPERPND PER ALREADY PENDING? 01553000 BZ PERDON1 NO - SET UP EVERYTHING 01554000 IC R0,4(0,R14) PER CODE BITS 01555000 OR R0,R1 ADD NEW EVENT TYPE CODE 01556000 STC R0,4(0,R14) ...AND RESET 01557000 BR R9 RETURN TO CALLER 01558000 PERDON1 EQU * SET ALL INFO IN EXTENSION BLOCK 01559000 SLL R1,8(0) SHIFT CODE BITS 01560000 STH R1,4(0,R14) ...TO SET VALUE IN EXTENSION BLOCK 01561000 L R1,VMPSW+4 INSTRUCTION ADDRESS 01562000 LH R0,VMPRGIL INSTR. LENGTH CODE FROM INTRPT 01563000 SLR R1,R0 (PSW ADDR MAY APPEAR NEGATIVE) 01564000 ST R1,0(0,R14) ...GOES IN ALSO 01565000 MVI 0(R14),X'00' MAKE SURE HIGH-ORDER IS ZERO 01566000 OI VMPEND,VMPERPND SET PER DATA AVAILABLE 01567000 BR R9 RETURN TO CALLER 01568000 EJECT 01569000 PERCH01 EQU * CHECK FOR STORAGE ALTERATION PER 01570000 CH R1,=AL2(PERSALT) IF NOT THIS... 01571000 BCR 7,R9 ...DON'T KNOW WHAT IT IS 01572000 L R0,4(,R15) STARTING ADDRESS (VIRTUAL) 01573000 CL R0,8(,R15) DOES IT INVOLVE WRAP-AROUND? 01574000 BH PERCH03 YES - BLOODY 01575000 CLR R0,R3 VIRTUAL ADDRESS IS IN R3 01576000 BL PERCH02 R3 ABOVE LOW BOUND 01577000 BE PERDONE HIT IT ON THE NOSE 01578000 LA R2,0(R2,R3) ADD FIELD LENGTH... 01579000 CLR R2,R0 ...TO CHECK END OF FIELD 01580000 BH PERDONE HIT IT THIS TIME 01581000 BR R9 NO RECORDABLE EVENT 01582000 PERCH02 EQU * R3 ABOVE LOW BOUND 01583000 CL R3,8(,R15) IS IT BELOW TOP END? 01584000 BNH PERDONE HIT IT 01585000 BR R9 OUT OF THE RANGE 01586000 PERCH03 EQU * STORAGE WRAP-AROUND CASE 01587000 CLR R0,R3 BELOW FIRST VALUE? 01588000 BNH PERDONE VIRT ADDR < 1ST OF RANGE @V200198 01589000 CL R3,8(,R15) OR ABOVE LAST VALUE? 01590000 BNH PERDONE NO - EVENT @V200198 01591000 LA R2,0(R2,R3) CHECK END OF FIELD 01592000 CR R2,R0 ... @V200198 01593000 BNL PERDONE HIT IT HERE @V200198 01594000 BR R9 NO RECORDABLE EVENT 01595000 EJECT 01596000 *---------------------------------------------------------------------* 01597000 * 'GETADDR' - COMPUTE VIRTUAL AND REAL ADDRESSES FROM BASE, * 01598000 * DISPLACEMENT FORM. FOR VIRTUAL 370R, A CHECK IS MADE * 01599000 * FOR VIRTUAL PAGE OR SEGMENT EXCEPTION, OR FOR FILLING * 01600000 * IN THE VM SHADOW TABLES. * 01601000 * * 01602000 * ON ENTRY: R9 = RETURN ADDRESS * 01603000 * INSTRUCTION IS IN VMBLOK(VMINST) * 01604000 * R1 = 0 => NO INDEX REGISTER * 01605000 * R1 ¬= 0 => COMPUTE INDEXING * 01606000 * * 01607000 * ON EXIT: REQUIRED PAGE IS IN CORE * 01608000 * R2 = REAL ADDRESS REFERENCED * 01609000 * R3 = VIRTUAL ADDRESS * 01610000 *---------------------------------------------------------------------* 01611000 GETADDR EQU * 01612000 BAL R8,INSTADR GET ADDRESS FROM INSTRUCTION 01613000 BAL R8,ADTRANS TRANSLATE TO REAL ADDRESS 01614000 BR R9 ...AND RETURN TO CALLER 01615000 SPACE 01616000 * INPUTS TO INSTADR: INSTR. IN VMBLOK; R1 = FLAG (SEE ABOVE); 01617000 * R8 = RETURN ADDRESS. 01618000 * OUTPUTS: R3 = VIRTUAL ADDR.; R1, R2 ARE DESTROYED. 01619000 INSTADR EQU * COMPUTE VIRTUAL ADDRESS FROM INSTRUCTION 01620000 LA R3,X'FFF' MASK FOR INSTRUCTION DISPLACEMENT@V213235 01621000 N R3,VMINST GET DISPLACEMENT FIELD ONLY @V213235 01622000 IC R2,VMINST+2 01623000 SRL 2,2(0) BASE REG. NO. * 4 01624000 N R2,F60 01625000 BZ NOBASER ZERO BASE 01626000 L R2,VMGPRS(R2) BASE REGISTER VALUE 01627000 NOBASER EQU * 01628000 LA R3,0(R3,R2) VIRTUAL ADDRESS 01629000 LTR R1,R1 COMPUTE INDEX? 01630000 BCR 8,R8 NO - JUST RETURN 01631000 IC R1,VMINST+1 01632000 SLL R1,2(0) INDEX REG. NO. * 4 01633000 N R1,F60 01634000 BCR 8,R8 NO INDEX - RETURN 01635000 L R1,VMGPRS(R1) INDEX REGISTER VALUE 01636000 LA R3,0(R1,R3) INDEXED VIRTUAL ADDRESS 01637000 BR R8 RETURN 01638000 SPACE 2 01639000 * INPUTS TO ADTRANS: R3 = VIRTUAL ADDR.; R8 = RETURN ADDR. 01640000 * OUTPUTS: R2 = REAL ADDR (OF R3 INPUT); 01641000 * R0, R1, R14, R15 ARE DESTROYED. 01642000 ADTRANS EQU * TRANSLATE VIRTUAL ADDRESS TO REAL 01643000 TM VMESTAT,VMEXTCM IN EC-MODE NOW? 01644000 BZ SIMPTRN NO - THAT'S TOO EASY 01645000 TM VMPSW,TRANMODE IN TRANSLATE MODE ALSO? 01646000 BO CALLVAT YES - A WORTHY CHALLENGE 01647000 SIMPTRN EQU * 01648000 LR R1,R3 VIRTUAL ADDRESS TO R1 01649000 TRANS21 LCTL C1,C1,VMSEG GET SEG-TABLE ORIGIN @V407593 01650000 LRA R2,0(0,R1) TRY FOR REAL ADDRESS @V407593 01651000 BC 8,TR21END GOTIT, LOCK NOT NEEDED. @V407593 01652000 BAL R14,LOCKET GO LOCK/STACK SYSTEM, AND @V407593 01653000 * RETURN HERE WITH LOCK HELD 01654000 TRANS 2,1,OPT=(BRING,DEFER),ADEX=ADDREXCP @V407593 01655000 TR21END BR R8 RETURN TO CALLER @V407593 01656000 EJECT 01657000 CALLVAT EQU * TRANS. VIRT-VIRT TO REAL 01658000 TM VMESTAT,VMINVPAG SHADOW TABLES VALID? @VM01060 01659000 BNZ CALLVAT1 NOPE, CALL DMKVAT FOR THIS @VM01060 01660000 L R1,VMECEXT GET THE USER'S C-REGS 01661000 LCTL C0,C1,EXTSHCR0-ECBLOK(R1) POINT TO SHADOW TABLES 01662000 LRA R2,0(0,R3) MAKE THE ATTEMPT FIRST 01663000 LCTL C0,C0,CPCREG0 RESTORE STANDARD C-REGS 01664000 LCTL C1,C1,VMSEG ...BEFORE WE GO ANYWHERE 01665000 BCR 8,R8 ALL O.K. - LET HIM GO 01666000 CALLVAT1 BAL R14,LOCKET GO LOCK/STACK SYSTEM, AND @V407593 01667000 * RETURN HERE WITH LOCK HELD 01668000 CALL DMKVATRN VIRTUAL ADDRESS IS IN R3 01669000 LTR R0,R0 CHECK RETURN CODE 01670000 BCR 8,R8 SUCCESSFUL TRANSLATION 01671000 CL R1,F5 RELOCATION INTERRUPT ? @VA03696 01672000 BE ADDREXCP NO..NORMAL PATH.. @VA03696 01673000 * INTERRUPT CODE IS IN R1, EXCEPTION ADDRESS IN R3 01674000 L R4,VMPSW+4 SET TO BACK UP PSW ADDRESS 01675000 SH R4,VMPRGIL ILC DATA SAVED IN VMBLOK 01676000 ST R4,VMPSW+4 ... 01677000 GOTO DMKVATEX SIMULATE RELOCATION INTERRUPT 01678000 DS 0F 01679000 DMKPRVNC DC F'0' NO. OF CALLS TO DMKPRVLG @V2B2638 01680000 DMKPRVEK DC F'0' INST COUNT FOR X'08' SSK @V2B2638 01681000 DMKPRVIK DC F'0' INST COUNT FOR X'09' ISK @V2B2638 01682000 DMKPRVEX DC F'0' INST COUNT FOR X'44' EX ON @V2B2638 01683000 * SIM INST 01684000 SPACE 2 01685000 * THE FOLLOWING TABLES MUST BE KEPT INTACT FOR CORRECT COUNTER MAINT 01686000 SPACE 01687000 CNTTAB1 EQU * X'80'-X'85' = 6 ENTRIES @V2B2638 01688000 DMKPRVMS DC F'0' (X'80') INST COUNT FOR SSM @V2B2638 01689000 DC F'0' (X'81') RESERVED @V2B2638 01690000 DMKPRVLP DC F'0' (X'82') INST COUNT FOR LPSW @V2B2638 01691000 DMKPRVDI DC F'0' (X'83') INST COUNT FOR DIAG @V2B2638 01692000 DC F'0' (X'84') RESERVED @V2B2638 01693000 DC F'0' (X'85') RESERVED @V2B2638 01694000 SPACE 01695000 CNTTAB2 EQU * X'AC'-X'B7' = 12 ENTRIES @V2B2638 01696000 DMKPRVMN DC F'0' (X'AC') INST COUNT FOR STNSM @V2B2638 01697000 DMKPRVMO DC F'0' (X'AD') INST COUNT FOR STOSM @V2B2638 01698000 DC F'0' (X'AE') RESERVED @V2B2638 01699000 DC F'0' (X'AF') RESERVED @V2B2638 01700000 DC F'0' (X'B0') RESERVED @V2B2638 01701000 DMKPRVLR DC F'0' (X'B1') INST COUNT FOR LRA @V2B2638 01702000 DC F'0' B2 INSTS COUNTED SEPARATELY @V2B2638 01703000 DC F'0' (X'B3') RESERVED @V2B2638 01704000 DC F'0' (X'B4') RESERVED @V2B2638 01705000 DC F'0' (X'B5') RESERVED @V2B2638 01706000 DMKPRVTC DC F'0' (X'B6') INST COUNT FOR STCLT @V2B2638 01707000 DMKPRVLC DC F'0' (X'B7') INST COUNT FOR LCTL @V2B2638 01708000 SPACE 01709000 DMKPRVB2 EQU * X'B200'-X'B213' = 20 ENTRIES @V2B2638 01710000 DC F'0' (X'B200') RESERVED @V2B2638 01711000 DC F'0' (X'B201') RESERVED @V2B2638 01712000 DMKPRVCP DC F'0' (X'B202') INST COUNT FOR STIDP @V2B2638 01713000 DMKPRVCH DC F'0' (X'B203') INST COUNT FOR STIDC @V2B2638 01714000 DMKPRVTE DC F'0' (X'B204') INST COUNT FOR SCK @V2B2638 01715000 DC F'0' (X'B205') RESERVED @V2B2638 01716000 DMKPRVCE DC F'0' (X'B206') INST COUNT FOR SCKC @V2B2638 01717000 DMKPRVCT DC F'0' (X'B207') INST COUNT FOR STCKC @V2B2638 01718000 DMKPRVPE DC F'0' (X'B208') INST COUNT FOR SPT @V2B2638 01719000 DMKPRVPT DC F'0' (X'B209') INST COUNT FOR STPT @V2B2638 01720000 DMKPRVEP DC F'0' (X'B20A') INST COUNT FOR SPKA @V2B2638 01721000 DMKPRVIP DC F'0' (X'B20B') INST COUNT FOR IPK @V2B2638 01722000 DC F'0' (X'B20C') RESERVED @V2B2638 01723000 DMKPRVPB DC F'0' (X'B20D') INST COUNT FOR PTLB @V2B2638 01724000 DC 5F'0' (X'B20E'-'B212') RESERVED @V2B2638 01725000 DMKPRVRR DC F'0' (X'B213') INST COUNT FOR RRB @V2B2638 01726000 INDTAB DC 28AL1((*-INDTAB)*4) 28 ENTRIES @V2B2638 01727000 SPACE 01728000 DMKPRVCS DC F'0' (X'BA') INST COUNT FOR CS @V2B2638 01729000 DMKPRVCD DC F'0' (X'BB') INST COUNT FOR CDS @V2B2638 01730000 SPACE 3 01731000 * THE FOLLOWING 56-BYTE DATA LIST MUST BE KEPT CONTIGUOUS AND IN ORDER 01732000 * BECAUSE IT IS USED BY THE EXPANDED VIRTUAL MACHINE ASSIST TO PROCESS 01733000 * THE FOLLOWING PRIVILEGED OPS: LPSW, PTLB, SCKC, SIO, SIOF, SPT, SSM, 01734000 * STNSM, AND STOSM. 01735000 SPACE 01736000 DMKPRVMA DS 0F POINTER LIST FOR EXPANDED VMA @V3M4026 01737000 DC V(DMKVSIVS) +0 ENTRY POINT FOR 'SIO' ASSIST @V3M4026 01738000 DC V(DMKVSIEX) +4 BASE ADDR/ENTRY PT FOR 'SIO' @V3M4026 01739000 DC V(DMKDSPCH) +8 NO NEED TO CHECK NEW PSW @V3M4026 01740000 DC V(DMKTMRCC) +12 ENTRY POINT USED BY 'SCKC' @V3M4026 01741000 DC V(DMKTMR) +16 BASE ADDR FOR 'SCKC', 'SPT' @V3M4026 01742000 DC V(DMKTMRSP) +20 ENTRY POINT USED BY 'SPT' @V3M4026 01743000 DC V(DMKVATAT) +24 ADDR OF 'ARCHTECT' IN DMKVAT @V3M4026 01744000 DC V(DMKDSPB) +28 MUST CHECK OUT NEW PSW @V3M4026 01745000 DMKPRVVS DC F'0' +32 NO. OF EVMA SIO/SIOF'S @V3M4026 01746000 DMKPRVVL DC F'0' +36 NO. OF EVMA LPSW'S @V3M4026 01747000 DMKPRVVM DC F'0' +40 NO. OF EVMA SSM/STXSM'S @V3M4026 01748000 DMKPRVVC DC F'0' +44 NO. OF EVMA SCKC'S @V3M4026 01749000 DC F'0' +48 RESERVED @V3M4026 01750000 DMKPRVVP DC F'0' +52 NO. OF EVMA SPT'S @V3M4026 01751000 EJECT 01752000 LTORG 01753000 L4 EQU 4 GENERAL USE AS SYMBOLIC LENGTH. @VMD0103 01754000 EJECT 01755000 COPY EQU 01756000 COPY VMBLOK 01757000 COPY TREXT 01758000 COPY PERBLOKS PER001 01758100 COPY RBLOKS @V508690 01759000 COPY DEVTYPES @V508690 01760000 COPY VBLOKS 01761000 PSA 01762000 COPY CORE 01763000 COPY SAVE @V407593 01764000 END DMKPRVLG 01765000