ibm:vm370-lib:cp:dmkdsp.assemble_src
Table of Contents
DMKDSP Source
References
- Fixes Applied : 18
- This Source Date : Thursday, December 7, 1978
- Last Fix ID : [HRC065DK]
Source Listing
- DMKDSP.ASSEMBLE.txt
- DSP TITLE 'DMKDSP (CP) VM/370 - RELEASE 6' 00001000
- ISEQ 73,80 00002000
- *. 00003000
- * MODULE NAME - 00004000
- * 00005000
- * DMKDSP 00006000
- * 00007000
- * FUNCTION - 00008000
- * 00009000
- * DMKDSP IS ENTERED AFTER EACH INTERRUPT HANDLER HAS FINISHED 00010000
- * PROCESSING, AND AFTER EACH STACKED CPEXBLOK, I/O REQUEST, 00011000
- * DEFERRED INTERRUPT TASK, AND EXTERNAL INTERRUPT 00012000
- * HAS BEEN SERVICED. IT UPDATES THE 00013000
- * CPU TIMES CHARGED TO THE USER THAT HAS RECEIVED SERVICE, UP- 00014000
- * DATES ALL VIRTUAL TIMERS, AND REFLECTS ANY PENDING INTERRUPTS 00015000
- * FOR WHICH THE USER IS ENABLED. AFTER THE USER'S STATUS HAS 00016000
- * BEEN UPDATED, EITHER THE NEXT AVAILABLE STACKED REQUEST 00017000
- * IS STACKED, OR THE HIGHEST PRIORITY RUNNABLE USER IS 00018000
- * DISPATCHED. 00019000
- * 00020000
- * ATTRIBUTES - 00021000
- * 00022000
- * REENTRANT, RESIDENT, ENTERED VIA GOTO 00023000
- * 00024000
- * ENTRY POINTS - EXECUTABLE 00025000
- * 00026000
- * DMKDSPCH - MAIN ENTRY POINT; SYSTEM LOCK HELD ON ENTRY 00027000
- * DMKDSPA - ENTERED FOR FAST REFLECT - ONLY STATUS UPDATE IS 00028000
- * FOR VIRTUAL TIMERS; SYSTEM LOCK MAY OR MAY NOT 00029000
- * BE HELD 00030000
- * DMKDSPB - ENTERED IF VIRTUAL PSW HAS BEEN ALTERED OUTSIDE OF 00031000
- * DMKDSP; SYSTEM LOCK HELD ON ENTRY 00032000
- * DMKDSPE - ENTERED FOR VIRTUAL TIMER INTERRUPT REFLECT; 00033000
- * SYSTEM LOCK NOT APPLICABLE 00034000
- * DMKDSPRU - ENTRY FOR ATTACHED PROCESSOR SUPPORT TO SELECT 00035000
- * ANOTHER USER TO DISPATCH; SYSTEM LOCK NOT HELD 00036000
- * 00037000
- * ENTRY POINTS - NON-EXECUTABLE 00038000
- * 00039000
- * DMKDSPQS - DISPATCHED USER'S MAXIMUM TIME SLICE 00040000
- * DMKDSPRQ - QUEUE ANCHOR FOR IOBLOKS AND CPEXBLOKS 00041000
- * DMKDSPNP - NUMBER OF DYNAMICALLY ASSIGNABLE PAGE FRAMES NOW 00042000
- * AVAILABLE IN THE SYSTEM 00043000
- * DMKDSPAC - COUNT OF DMKDSPA ENTRIES 00044000
- * DMKDSPBC - COUNT OF DMKDSPB ENTRIES 00045000
- * DMKDSPCC - COUNT OF DMKDSPCH ENTRIES 00046000
- * DMKDSPEC - COUNT OF DMKDSPE ENTRIES 00047000
- * DMKDSPRC - COUNT OF DMKDSPRU ENTRIES 00048000
- * DMKDSP0 - CP ASSIST INSTRUCTION ADDRESS 00049000
- * DMKDSP1 - CP ASSIST INSTRUCTION ADDRESS 00050000
- * DMKDSP2 - CP ASSIST INSTRUCTION ADDRESS 00051000
- * DMKDSPIT - VIRTUAL INTERVAL TIMER REFLECTION COUNTER 00052000
- * DMKDSPCK - VIRTUAL CLOCK COMPARATOR REFLECTION COUNTER 00053000
- * DMKDSPPT - VIRTUAL CPU TIMER REFLECTION COUNTER 00054000
- * 00055000
- * ENTRY CONDITIONS - 00056000
- * 00057000
- * GPR11 = ADDRESS OF VMBLOK OF USER TO CHARGE 00058000
- * GPR12 = ADDRESS OF ENTRY POINT 00059000
- * 00060000
- * THE SWITCH "CPSTATUS" IN PSA INDICATES THE STATE OF THE CPU 00061000
- * PRIOR TO THE LAST INTERRUPT OR UNSTACK OPERATION - IT WILL 00062000
- * INDICATE "RUNNING", "WAITING", OR "CP EXECUTION" 00063000
- * 00064000
- * EXIT CONDITIONS - 00065000
- * 00066000
- * EITHER THE NEXT AVAILABLE STACKED REQUEST IS UNSTACKED OR 00067000
- * THE HIGHEST PRIORITY RUNNABLE USER IS DISPATCHED; IF NO USER 00068000
- * IS RUNNABLE, THE CPU IS PLACED IN AN ENABLED WAIT STATE 00069000
- * 00070000
- EJECT 00071000
- * CALLS TO OTHER ROUTINES - 00072000
- * 00073000
- * DMKERMSG - CALLED TO WRITE ERROR MESSAGES TO USER 00074000
- * DMKUSOFF - CALLED TO LOG OFF A USER WHO HAS ENTERED A DISABLED 00075000
- * WAIT STATE WHILE DISCONNECTED 00076000
- * DMKSCNVU - CALLED TO LOCATE VIRTUAL UNIT BLOKS FOR INTERRUPT- 00077000
- * ING DEVICES 00078000
- * DMKCFMBK - CALLED TO PLACE USER IN CONSOLE FUNCTION MODE 00079000
- * DMKCVTBH - CALLED TO CONVERT BINARY TO HEX 00080000
- * DMKSCHDL - CALLED TO MAINTAIN SCHEDULER LISTS OF ACTIVE USERS 00081000
- * DMKPERIL - CALLED TO HANDLE PER TRACING PER001 00082100
- * DMKVATAB - CALLED TO MAINTAIN VIRTUAL RELOCATE SIMULATION 00083000
- * TABLES FOR VIRTUAL MACHINES WITH THE VR FEATURE 00084000
- * DMKVATBC - CALLED WHEN A VIRTUAL MACHINE GOES FROM EXTENDED 00085000
- * TO BASIC CONTROL MODE 00086000
- * DMKVATEX - GOTO TO RELECT PSEUDO PAGE FAULT 00087000
- * DMKVATMD - CALLED WHEN A VIRTUAL MACHINE IN EXTENDED CONTROL 00088000
- * MODE ENTERS VIRTUAL TRANSLATE MODE 00089000
- * DMKVMASH - CALLED TO CHECK IF LASTUSER CHANGED A SHARED PAGE 00090000
- * DMKVMCEX - CALLED TO REFLECT VMCF MESSAGE HEADER 00092000
- * DMKTRCEX - TO TRACE A VIRTUAL MACHINE EXTERNAL INTERRUPT 00093000
- * DMKTRCIO - TO TRACE A VIRTUAL MACHINE I/O INTERRUPT 00094000
- * DMKTRCIT - TO SET NEEDED "SVC B2" FOR INSTRUCTION TRACING 00095000
- * DMKTRCPG - CALLED TO TRACE A VIRTUAL MACHINE PROGRAM CHECK 00096000
- * DMKFREE - CALLED TO OBTAIN FREE STORAGE 00097000
- * DMKFRET - CALLED TO RELEASE STORAGE BACK INTO FREE POOL 00098000
- * DMKPTRAN - CALLED TO FETCH A PAGE 00099000
- * DMKEXTSP - CALLED TO ISSUE SIGP INSTRUCTION 00100000
- * DMKLOKDF - CALLED TO OBTAIN A LOCK WITHOUT SPINNING 00101000
- * DMKLOKVM - CALLED TO OBTAIN A VMBLOK LOCK 00102000
- * DMKLOKSP - CALLED TO SPIN UNTIL A LOCK IS AVAILABLE 00103000
- * DMKLOKPS - CALLED TO SPIN UNTIL A CONDITION IS SATISFIED 00104000
- * DMKSTKDE - CALLED TO STACK A DEFERRED INTERRUPT TASK 00105000
- * DMKSTKMP - CALLED TO STACK A CPEXBLOK FOR THE CURRENT PROC 00106000
- * DMKMCHSE - CALLED FOR SOFT MACHINE CHECK RECOVERY 00107000
- * DMKMCTPR - CALLED FOR AUTOMATIC PROCESSOR RECOVERY 00108000
- * DMKPRGSM - GOTO TO REFLECT INVALID PSW INTERRUPTION 00109000
- * DMKCCHRF - CALLED TO REFLECT CHANNEL CHECK TO VIRTUAL MACHINE 00109050
- * 00110000
- * EXTERNAL REFERENCES - 00111000
- * 00112000
- * DMKVIOMK - MASK TABLE FOR ACTIVE I/O AND PENDING INTERRUPTS 00113000
- * DMKSCHRL - ANCHOR FOR SCHEDULER'S LIST OF DISPATCHABLE USERS 00114000
- * DMKIOSER - ALLOWED EXIT DURING EXTEND 00115000
- * DMKIOSRC - ALLOWED EXIT DURING EXTEND 00116000
- * DMKPTRFD - ALLOWED EXIT DURING EXTEND 00117000
- * DMKPTRFE - ALLOWED EXIT DURING EXTEND 00118000
- * DMKPTRFP - ALLOWED EXIT DURING EXTEND 00119000
- * DMKPTRRC - RESERVE PAGE USAGE COUNT 00120000
- * DMKSCHTQ - QUEUE OF CLOCK COMPARATOR REQUESTS 00121000
- * DMKLOKSY - GLOBAL SYSTEM LOCK 00122000
- * DMKLOKDS - DISPATCHER QUEUE LOCK 00123000
- * DMKLOKRL - RUN LIST LOCK 00124000
- * DMKLOKTR - TRQ LOCK 00125000
- * 00126000
- * TABLES / WORKAREAS - 00127000
- * 00128000
- * VMBLOK - PRIMARY USER CONTROL TABLE 00129000
- * VDEV,VCU AND VCHBLOKS - STATUS UPDATED WHEN I/O INTERRUPTS 00130000
- * ARE REFLECTED TO A USER 00131000
- * ECBLOK - VMBLOK EXTENSION FOR EXTENDED MODE VIRTUAL MACHINES 00132000
- * 00133000
- * MACROS 00134000
- * 00135000
- * ABEND - TO TERMINATE THE SYSTEM 00136000
- * CALL - TO LINK TO ANOTHER SYSTEM ROUTINE 00137000
- * CHARGE - TO MANAGE THE CPU TIMER FACILITY 00138000
- * COUNT - TO INCREMENT A COUNT 00139000
- * GOTO - TO TRANSFER CONTROL UNCONDITIONALLY 00140000
- * LOCK - TO OBTAIN AND RELEASE A SYSTEM LOCK 00141000
- * SIGNAL - TO SIGNAL THE OTHER PROCESSOR 00142000
- * TRACE - TO LOCATE THE CURREN TRACE TABLE ENTRY 00143000
- * TRANS - TO BRING A PAGEABLE PAGE INTO REAL STORAGE 00144000
- * 00145000
- * REGISTER USAGE - 00146000
- * 00147000
- * GPR0-5 - SCRATCH 00148000
- * GPR6 - VCHBLOK BASE 00149000
- * GPR7 - VCUBLOK BASE 00150000
- * GPR8 - VDEVBLOK BASE; 2ND LEVEL SUBROUTINE LINKAGE 00151000
- * GPR9 - 1ST LEVEL SUBROUTINE LINKAGE 00152000
- * GPR10 - IOBLOK BASE 00153000
- * GPR11 - VMBLOK BASE 00154000
- * GPR12 - DMKDSP BASE 00155000
- * GPR13 - SECOND BASE REGISTER 00156000
- * GPR14 - EXTERNAL LINKAGE 00157000
- * GPR15 - EXTERNAL LINKAGE 00158000
- *. 00159000
- EJECT 00160000
- COPY OPTIONS 00161000
- COPY LOCAL OPTIONS 00162000
- SPACE 2 00163000
- DMKDSP CSECT 00164000
- SPACE 3 00165000
- ENTRY DMKDSPCH 00166000
- AIF (NOT &AP).UPTST0 **AIF*** 00166900
- ENTRY DMKDSPRU @V407508 00167000
- ENTRY DMKDSPRC COUNTER FOR DMKDSPRU @V407508 00168000
- .UPTST0 ANOP **ANOP** 00168100
- ENTRY DMKDSPQS 00169000
- ENTRY DMKDSPRQ 00170000
- ENTRY DMKDSPA 00171000
- ENTRY DMKDSPB 00172000
- ENTRY DMKDSPNP 00173000
- ENTRY DMKDSPIT,DMKDSPCK,DMKDSPPT @V2B2638 00174000
- ENTRY DMKDSPAC,DMKDSPBC,DMKDSPCC,DMKDSPEC - COUNTERS @V386198 00175000
- ENTRY DMKDSP0,DMKDSP1,DMKDSP2 - CP ASSIST INST. ADDRS @V3M4026 00176000
- ENTRY DMKDSPE REFLECT VIRT. TIMER INTS. @V386198 00177000
- SPACE 00178000
- EXTRN DMKERMSG @V386198 00179000
- EXTRN DMKTRCPG 00180000
- EXTRN DMKUSOFF 00181000
- EXTRN DMKVIOMK 00182000
- EXTRN DMKSCNVU 00183000
- EXTRN DMKCFMBK 00184000
- EXTRN DMKCVTBH @VA03802 00185000
- EXTRN DMKSCHDL 00186000
- EXTRN DMKSCHRL 00187000
- EXTRN DMKPERIL PER001 00188100
- EXTRN DMKPRGSM @VA05647 00189000
- EXTRN DMKPTRRC @VA01321 00190000
- EXTRN DMKPTRFD,DMKPTRFE,DMKPTRFP,DMKIOSER,DMKIOSRC @VA02760 00191000
- EXTRN DMKVATAB 00192000
- EXTRN DMKVMASH @V60BC11 00193100
- EXTRN DMKVATBC 00194000
- EXTRN DMKVATEX @V213135 00195000
- EXTRN DMKVATMD 00196000
- EXTRN DMKVMCEX @V387045 00197000
- EXTRN DMKCCHRF @V508690 00197100
- AIF (NOT &TRACE(6)).VR10A 00198000
- EXTRN DMKTRCEX,DMKTRCIO,DMKTRCIT 00199000
- .VR10A ANOP 00200000
- EXTRN DMKMCHSE @VA07369 00201100
- AIF (NOT &AP).UPTST0A **AIF*** 00201200
- EXTRN DMKLOKPS,DMKLOKSY @VA07369 00201300
- EXTRN DMKSCHTQ,DMKMCTPR @V407508 00202000
- EXTRN DMKSTKMP,DMKSTKDE @V407508 00203000
- .UPTST0A ANOP **ANOP** 00203100
- SPACE 2 00204000
- USING PSA,R0 00205000
- USING VMBLOK,R11 00206000
- USING DMKDSP,R12,R13 @V387045 00207000
- EJECT 00208000
- *. 00209000
- * OPERATION - 00210000
- * 00211000
- * A. PROCESSING AT ENTRY 00212000
- * 1. MAIN DISPATCH ENTRY POINT - IF CPSTATUS SWITCH INDICATES 00213000
- * A STACKED REQUEST WAS BEING PROCESSED, GO TO SECTION D. TO 00214000
- * START CHECKING OUT USER'S STATUS. 00215000
- * IF CPSTATUS INDICATES RETURN FROM WAIT OR FROM RUNNING A 00216000
- * USER, BAL TO THE APPROPRIATE ROUTINE TO ACCOUNT FOR THE 00217000
- * TIME, AND PROCEED TO SECTION D TO CHECK OUT THE USER. IF 00218000
- * CPSTATUS INDICATES RETURN FROM RUNNING A USER AND THERE 00219000
- * HAS BEEN NO CHANGE TO THAT USER'S STATUS, GO DIRECTLY TO 00220000
- * SECTION F, BYPASSING SECTIONS D AND E. 00221000
- * 2. FAST REFLECT ENTRY POINT - IF CPSTATUS INDICATES THE 00222000
- * SYSTEM WAS NOT RUNNING A USER, OR IF THAT USER IS NO 00223000
- * LONGER RUNNABLE, OR IF THE SYSTEM IS EXTENDING, THE FAST 00224000
- * REFLECT PATH IS NOT CONTINUED. IF THE SYSTEM LOCK IS HELD 00225000
- * OR CAN BE OBTAINED, CONTINUE PROCESSING IN STEP 1 ABOVE; 00226000
- * OTHERWISE, CONTINUE PROCESSING IN STEP 5 BELOW. IF THE 00227000
- * USER IS RUNNING VIRTUAL TIMERS, BAL TO THE ACCOUNTING 00228000
- * ROUTINE TO UPDATE AND TEST THE USER'S VIRTUAL TIMERS. IF 00229000
- * THE USER IS STILL DISPATCHABLE, INSERT THE PROGRAM MASK 00230000
- * AND CONDITION CODE FROM THE VIRTUAL PSW INTO THE 00231000
- * APPROPRIATE OLD PSW (EITHER I/O OR PROGRAM), STORE THE 00232000
- * UPDATED PSW IN RUNPSW, AND RE-DISPATCH. 00233000
- * 3. NEW PSW ENTRY POINT - IF THE PSW HAS BEEN ALTERED OUTSIDE 00234000
- * OF DMKDSP, FIRST DO ACCOUNTING AS IN STEP 1 ABOVE; THEN 00235000
- * GO DIRECTLY TO THE PSW VALIDATION ROUTINE (SECTION E). 00236000
- * 4. VIRTUAL TIMER INTERRUPT ENTRY - FIRST QUEUE AN EXTERNAL 00237000
- * INTERRUPT BLOCK FOR THIS INTERRUPT. THEN DO ACCOUNTING FOR 00238000
- * THE RUNNING USER, AND GO TO SECTION D TO CHECK OUT THE 00239000
- * USER'S STATUS. 00240000
- * 5. RUN-USER ENTRY POINT - IF CPSTATUS INDICATES RETURN FROM 00241000
- * WAIT OR FROM RUNNING A USER, BAL TO THE APPROPRIATE 00242000
- * ROUTINE TO ACCOUNT FOR THE TIME. IF THE SYSTEM WAS 00243000
- * RUNNING A USER AND THERE IS A TIMER INTERRUPT PENDING FOR 00244000
- * THAT USER, VERIFY THAT THE USER HAS A DEFERRED INTERRUPT 00245000
- * TASK STACKED. IF NOT, SET UP AND STACK THE DEFERRED TASK 00246000
- * FOR ENTRY TO DMKDSPCH. THEN UNLOCK LASTUSER IF LASTUSER 00247000
- * WAS NOT USING SHARED SYSTEMS. IF THERE IS NO SPECIAL 00248000
- * SITUATION (SUCH AS EXTEND OR A QUIESCE SIGNAL) PENDING, 00249000
- * GO TO SECTION H TO SELECT A USER FOR DISPATCHING. 00250000
- * 00251000
- * 00252000
- * 00253000
- * 00254000
- *********************************************************************** 00255000
- * 00256000
- * 00257000
- * CP ASSIST INSTRUCTION "DSP0" - MAIN ENTRY TO DISPATCH 00258000
- * (ALSO USED BY FAST DISPATCH ENTRY (DMKDSPA) 00259000
- * SINCE THE ASSIST IS QUICKER THAN THE "FAST" 00260000
- * SOFTWARE.) 00261000
- * 00262000
- * 00263000
- * OPERANDS: 00264000
- * 1 = ADDRESS OF 'DSP0LIST' (DATA LIST) 00265000
- * 2 = ADDRESS OF 'DSP0EXIT' (EXIT LIST) 00266000
- * 00267000
- * REGISTER INPUT: 00268000
- * GPR 11 = VMBLOK ADDRESS BEING CHARGED FOR CP OVERHEAD TIME 00269000
- * 00270000
- * SYSTEM DATA AREAS REFERENCED (BY MODULE WHERE APPLICABLE): 00271000
- * DMKPSA - 'CPSTATUS', 'IOOPSW', 'PROBSTRT', 'PROBTIME', 00272000
- * 'QUANTUM', 'QUANTUMR', 'RUNUSER', 'TIMER' 00272100
- * ECBLOK, PAGE TABLE, SEGMENT TABLE, VMBLOK, XINTBLOK 00273000
- * USER'S VIRTUAL PAGE ZERO (IF RESIDENT) 00274000
- * 00275000
- * 00276000
- * EXITS TO SPECIFIED OPERAND 2 LIST ADDRESSES: 00277000
- * NOTE: THE CONTENT OF ANY GPR NOT SPECIFIED IN THE FOLLOWING 00278000
- * LISTS, EXCEPT GPRS 12 AND 13, MAY BE UNPREDICTABLE. 00279000
- * 00280000
- * +0 'DISPATCH' (NORMAL EXIT - CAN'T UNSTACK ANY INTERRUPTS) 00281000
- * REGISTER OUTPUT: 00282000
- * GPR 11 = ADDRESS OF VMBLOK OF 'RUNUSER' 00283000
- * 00284000
- * +4 'DMKDSPC3' (EXIT IF SYSTEM COMING FROM WAIT STATE) 00285000
- * REGISTER OUTPUT: 00286000
- * GPR 11 = SAME AS ENTRY CONTENTS 00287000
- * 00288000
- * +8 'XINTQUE' (VIRTUAL LOC. 80 TIMER INTERRUPT TO BE QUEUED) 00289000
- * REGISTER OUTPUT: 00290000
- * GPR 3 = VALUE OF ZERO 00291000
- * GPR 4 = VALUE OF X'00800080' 00292000
- * GPR 9 = ADDRESS OF 'DMKDSPC4' 00293000
- * GPR 11 = ADDRESS OF VMBLOK OF 'RUNUSER' 00294000
- * 00295000
- * +12 'DISPATCH' ('RUNUSER' IS NOT RUNNABLE - IN CP WAIT) 00296000
- * REGISTER OUTPUT: SAME AS EXIT TO +0 'DISPATCH' 00297000
- * 00298000
- * +16 'CKPER' (CAN DO UNSTACK OF A PER OR PAGE FAULT INTERRUPT) 00299000
- * REGISTER OUTPUT: SAME AS EXIT TO +0 'DISPATCH' 00300000
- * 00301000
- * +20 'UNSTPRTY' (CAN UNSTACK EXTERNAL INTERRUPT FOR 'RUNUSER') 00302000
- * REGISTER OUTPUT: 00303000
- * GPR 4 = 'XINTMASK' BITS THAT ARE ON (IN BITS 16-31) 00304000
- * GPR 5 = ADDRESS OF PREVIOUS XINTBLOK (OR 'VMPXINT') 00305000
- * GPR 6 = ADDRESS OF CURRENT XINTBLOK (INT. TO REFLECT) 00306000
- * GPR 11 = ADDRESS OF VMBLOK OF 'RUNUSER' 00307000
- * 00308000
- * +24 'GETIOINT' ('RUNUSER' ENABLED FOR I/O AND I/O INT PENDING) 00309000
- * REGISTER OUTPUT: 00310000
- * GPR 7 = 'VMIOINT' ANDED WITH CHAN. MASKS (IN BITS 0-15) 00311000
- * GPR 11 = ADDRESS OF VMBLOK OF 'RUNUSER' 00312000
- * 00313000
- * +28 'CKWAITST' (VIRTUAL PSW OF 'RUNUSER' HAS WAIT BIT SET ON) 00314000
- * REGISTER OUTPUT: SAME AS EXIT TO +0 'DISPATCH' 00315000
- * 00316000
- * +32 'RUNTIME' (TIMER UPDATING WILL CAUSE AN ABEND CONDITION) 00317000
- * REGISTER OUTPUT: SAME AS EXIT TO +0 'DISPATCH' 00318000
- * 00318100
- * +36 'UNLOCK' (NO STATUS CHANGE HAS OCCURRED) 00318200
- * REGISTER OUTPUT: SAME AS EXIT TO +0 'DISPATCH' 00318300
- * 00319000
- *********************************************************************** 00320000
- *. 00321000
- SPACE 00322000
- DMKDSPCH EQU * MAIN ENTRY - "THE END OF THE WORLD" 00323000
- LR R13,R12 LOAD SECOND BASE REG. @VA05545 00324000
- AL R13,F4096 WITH ADDRESS @VA05545 00325000
- SPACE 00326000
- DS 0H EXECUTE CP ASSIST "DSP0" @V3M4026 00327000
- DMKDSP0 DC X'E60D',S(DSP0LIST,DSP0EXIT) ***@V3M4026 00328000
- SPACE 00329000
- LA R9,1 INCREMENT %V3M4038 00330000
- AL R9,DMKDSPCC THIS PATH COUNT %V3M4038 00331000
- ST R9,DMKDSPCC ... %V3M4038 00332000
- DSPC0 DS 0H TEST CPSTATUS SWITCH %V407508 00333000
- TM CPSTATUS,CPRUN RUNNING USER? %V408246 00334000
- BO DMKDSPC2 YES, CHECK OUT %V408246 00335000
- DMKDSPC1 DS 0H %V408246 00336000
- TM CPSTATUS,CPWAIT WAS SYSTEM IN WAIT STATE? %V408246 00337000
- AIF (&AP).APBR1 **AIF*** 00338000
- BZ UNSTACK NO, MUST BE CP REQUEST BLOCK %VA07369 00338100
- AGO .UPBR1 **AGO*** 00338200
- .APBR1 ANOP **ANOP** 00338300
- BZ DMKDSPC5 NO, MUST BE CP REQUEST BLOCK %VA07369 00338400
- .UPBR1 ANOP **ANOP** 00338500
- DMKDSPC3 DS 0H %V408246 00339000
- BAL R9,WAITIME YES -- DO WAIT TIME ACCOUNTING @V408246 00340000
- B UNLKLAST SEE IF LASTUSER SHOULD BE @V407508 00341000
- * UNLOCKED @V407508 00342000
- * 00343000
- DMKDSPC2 DS 0H VIRT. MACHINE WAS EXECUTING %V408246 00344000
- BAL R9,RUNTIME DO RUN TIME CLEAN UP %V408246 00345000
- DMKDSPC4 DS 0H %V408246 00346000
- TM IOOPSW,4 VIRT. PSW IN I/O OLD? %V408246 00347000
- BZ UNSTACK NO, CHECK FOR STATUS CHANGE %V408246 00348000
- TM VMDSTAT,VMDSP YES, CLEAN STATUS? %V408246 00349000
- BO UNLOCK YES, NO FURTHER CHECKING NEEDED %V407508 00350000
- B UNSTACK NO, CHECK FURTHER %V408246 00351000
- SPACE 00352000
- AIF (NOT &AP).UPTST1 **AIF*** 00352900
- DMKDSPC5 DS 0H STACKED BLOK WAS BEING PROCESSED %V407508 00353000
- TM APSTAT1,APUOPER IS THIS AN AP SYSTEM? %V407508 00354000
- BZ UNSTACK NO, CONTINUE AS IN UP-MODE %V4M0136 00355000
- CLC LPUADDR,VMLOCK+2 IS VM LOCKED BY THIS PROC? @V407508 00356000
- BE UNSTACK YES, CONTINUE NORMALLY @V4M0136 00357000
- CHARGE STOP STOP CHARGING CURRENT VMBLOK @V4M0173 00358000
- L R11,ASYSVM SWITCH R11 TO SYSTEM VMBLOK @V4M0173 00359000
- * SYSTEM VMBLOK @V407508 00360000
- B UNLKLAST GO TRY TO UNLOCK LASTUSER @V407508 00361000
- .UPTST1 ANOP **ANOP** 00361100
- EJECT 00362000
- * THE FOLLOWING TWO DATA LISTS MUST BE KEPT CONTIGUOUS AND IN ORDER 00363000
- * BECAUSE THEY ARE USED BY THE CP ASSIST INSTRUCTION "DSP0". 00364000
- SPACE 2 00365000
- DSP0LIST DS 0F "DSP0" ASSIST DATA LIST @V3M4026 00366000
- SPACE 00367000
- DMKDSPCC DC F'0' +0 COUNT OF ENTRIES TO DMKDSPCH @V3M4026 00368000
- DC A(DMKDSPC4) +4 FOR EXIT WHEN ACCOUNTING DONE @V408246 00369000
- SPACE 2 00370000
- DSP0EXIT DS 0F "DSP0" ASSIST EXIT LIST @V3M4026 00371000
- SPACE 00372000
- DC A(DISPATCH) +0 "ALL HAS GONE WELL" @V386198 00373000
- DC A(DMKDSPC3) +4 SYSTEM COMING FROM WAIT STATE @V408246 00374000
- DC A(XINTQUE) +8 VIRTUAL TIMER WENT NEGATIVE @V386198 00375000
- DC A(DISPATCH) +12 'RUNUSER' IS NOT RUNNABLE @V386198 00376000
- DC A(CKPER) +16 PER OR PAGE FAULT PENDING @V386198 00377000
- DC A(UNSTPRTY) +20 EXT. INT. CAN BE UNSTACKED @V386198 00378000
- DC A(GETIOINT) +24 I/O INT. CAN BE UNSTACKED @V386198 00379000
- DC A(CKWAITST) +28 VIRT. PSW HAS 'WAIT' BIT ON @V386198 00380000
- DC A(RUNTIME) +32 ABEND CONDITION DETECTED @V408246 00381000
- DC A(UNLOCK) +36 EXIT IF CLEAN STATUS @V407508 00382000
- EJECT 00383000
- DMKDSPA DS 0H FAST REFLECT AFTER INSTR. @V213235 00384000
- * SIMULATION 00385000
- USING *,R12 @V213235 00386000
- LM R12,R13,DSPBASE LOAD UP BASE REGS @V387045 00387000
- USING DMKDSP,R12,R13 @V387045 00388000
- COUNT DMKDSPAC INCREMENT FAST REFLECT COUNT @V407508 00389000
- TM CPSTATUS,CPRUN RUNNING USER? @V408246 00390000
- BZ TESTSYS NO, TEST FOR SYSTEM LOCK @V4M0173 00391000
- TM VMRSTAT,VMNORUN VMBLOK RUNNABLE? @V408246 00392000
- BNZ TESTSYS NO, TEST FOR SYSTEM LOCK @V407508 00393000
- TM PROPSW+1,PROBMODE MONITOR CALL BUSY? @V408246 00394000
- BZ TESTSYS YES, TEST FOR SYSTEM LOCK @V407508 00395000
- L R2,PREFIXA GET PROCESSOR PREFIX ADDRESS @V407508 00396000
- CLI XTNDLOCK-PSA(R2),SET IS SYSTEM IN EXTEND? @V407508 00397000
- BE TESTSYS YES, TEST FOR SYSTEM LOCK @V407508 00398000
- L R2,VMSTKCNT GET COUNT OF STACKED BLOCKS @V4M0173 00399000
- LTR R2,R2 ARE ANY BLOCKS STACKED FOR VM? @V4M0173 00400000
- BNZ TESTSYS YES, GO TEST FOR SYSTEM LOCK @V4M0173 00401000
- TM VMPEND,VMPERPND PER PENDING? PER001 00401100
- BO TESTSYS YES, TEST FOR SYSTEM LOCK PER001 00401200
- LM R0,R2,QUANTUMR RESID., CURRENT, AND ORIG. @V408246 00402000
- * TIME-SLICE 00403000
- LTR R1,R1 ANY CURRENT LEFT? @V408246 00404000
- BNP TESTSYS NO, TEST FOR SYSTEM LOCK @V407508 00405000
- ST R1,QUANTUM CHECKPOINT TIMER @V408246 00406000
- TM VMMCR6,VMMFE+VMMVTMR VIRTUAL TIMER RUNNING? @V408246 00407000
- BO DMKDSPAA YES, NO NEED FOR UPDATE @V408246 00408000
- TM VMTLEVEL,VMTON+VMRON VIRTUAL TIMERS RUNNING? @V408246 00409000
- BZ DMKDSPAA NO @V408246 00410000
- SR R2,R0 VIRTUAL TIME USED @V408246 00411000
- LR R0,R2 PROPER REGISTER @V408246 00412000
- BAL R9,UPVIRT YES, UPDATE VIRT. LOCATION 80 @V408246 00413000
- TM VMDSTAT,VMDSP STILL DISPATCHABLE? @V408246 00414000
- BO DMKDSPA1 YES @V408246 00415000
- MVI CPSTATUS,CPEX+CPSUPER SHOW TIMER WAS UPDATED @V407508 00416000
- BAL R8,INCPROBT GO INCREMENT PROBLEM STATE TIME @V407508 00417000
- AIF (&AP).APBR2 **AIF*** 00417100
- B DMKDSPC4 CONTINUE AT MAIN ENTRY @VA07369 00417200
- AGO .UPBR2 **AGO*** 00417300
- .APBR2 ANOP **ANOP** 00417400
- * IN UP-MODE, SUBROUTINE TSTSYS IS A NO-OP. 00418000
- BAL R9,TSTSYS TEST FOR AND OBTAIN SYSTEM LOCK @V407508 00419000
- BZ DMKDSPC4 IF LOCK OBTAINED GOTO MAIN ENTRY @V407508 00420000
- B DSPR1 YES, MAKE ADDITIONAL TESTS @V407508 00421000
- .UPBR2 ANOP **ANOP** 00421100
- SPACE 00422000
- DMKDSPAA DS 0H @V408246 00423000
- TM VMDSTAT,VMDSP ABLE TO FAST REDSP? @V408246 00424000
- BO DMKDSPA1 YES, CONTINUE FAST REDISPATCH @V407508 00425000
- TESTSYS DS 0H TEST FOR SYSTEM LOCK @V407508 00426000
- AIF (&AP).APBR3 **AIF*** 00426100
- B DSPC0 CONTINUE AT MAIN ENTRY @VA07369 00426200
- AGO .UPBR3 **AGO*** 00426300
- .APBR3 ANOP **ANOP** 00426400
- * IN UP-MODE, SUBROUTINE TSTSYS IS A NO-OP. 00427000
- BAL R9,TSTSYS TEST FOR AND OBTAIN SYSTEM LOCK @V407508 00428000
- BZ DSPC0 GOTO MAIN ENTRY IF LOCK OBTAINED @V407508 00429000
- B DSPR0 ELSE, GOTO UNLOCKED ENTRY @V407508 00430000
- .UPBR3 ANOP **ANOP** 00430100
- SPACE 00431000
- DMKDSPA1 DS 0H @V408246 00432000
- AIF (NOT &AP).UPTST2 **AIF*** 00432900
- TM APSTAT1,APUOPER IS THIS AN AP SYSTEM? @V407508 00433000
- BNO GETPSW NO, SKIP TEST FOR SYSTEM LOCK @V407508 00434000
- L R2,=A(DMKLOKSY+2) GET ADDRESS OF SYSTEM LOCK @V407508 00435000
- CLC LPUADDR,0(R2) IS SYSTEM LOCK HELD BY THIS PROC @V407508 00436000
- BNE FINDPSW DETERMINE CORRECT OLD PSW @V4M0173 00437000
- BAL R9,FREESYS FREE SYSTEM LOCK @V407508 00438000
- FINDPSW DS 0H @V4M0173 00439000
- TM IOOPSW,7 VIRTUAL PSW IN IOOLD? @V4M0173 00440000
- BNO GETPSW NO, MUST BE PROPSW @V4M0173 00441000
- LM R0,R1,IOOPSW GET INTERRUPT PSW @V4M0173 00442000
- MVI IOOPSW,0 FLAG I/O OLD PSW NOT VIRTUAL @V4M0173 00443000
- B DMKDSPA2 CONTINUE FAST DISPATCH @V4M0173 00444000
- GETPSW DS 0H @V407508 00445000
- .UPTST2 ANOP **ANOP** 00445100
- LM R0,R1,PROPSW RESTART WITH OLD PSW @V408246 00446000
- DMKDSPA2 DS 0H @V408246 00447000
- TM VMPSTAT,VMV370R EXTENDED MACHINE? @V408246 00448000
- BZ DMKDSPA3 NO @V408246 00449000
- L R2,VMECEXT PNTR. TO VMBLOK 370R EXTENSION @V408246 00450000
- LCTL C4,C5,EXTCR4-ECBLOK(R2) RELOAD POSSIBLE NEW CRS @V408246 00451000
- LCTL C7,C13,EXTCR7-ECBLOK(R2) . . @V408246 00452000
- TM VMTRCTL,VMTRPER IS "PER" TRACING ACTIVE ? @V408246 00453000
- BZ *+12 NO. @V408246 00454000
- L R2,VMPERCTL POINT TO PER BLOCK PER001 00455100
- LCTL C9,C11,PERCR9-PERBLOK(R2) PER001 00456100
- TM VMESTAT,VMEXTCM EXTENDED MODE PSW? @V408246 00457000
- BZ DMKDSPA3 NO @V408246 00458000
- ICM R0,B'0010',VMPSW+2 GET CURRENT C.C. @V408246 00459000
- B RTNADDR SET UP RETURN ADDRESS @V408246 00460000
- DMKDSPA3 DS 0H @V408246 00461000
- NI VMPSW+4,X'3F' CLEAR ILC @V408246 00462000
- ICM R0,B'0010',VMPSW+4 GET CURRENT C.C. @V408246 00463000
- RTNADDR DS 0H @V408246 00464000
- STM R0,R1,RUNPSW SET-UP NEW PSW @V408246 00465000
- TM VMESTAT,VMINVPAG+VMINVSEG+VMNEWCR0 ANY RELOC. @V408246 00466000
- * CHANGE? 00467000
- BZ LDRPSW NO, . . . GO @V408246 00468000
- B PERHAPS YES, HANDLE IN NORMAL WAY @V408246 00469000
- EJECT 00470000
- DMKDSPB DS 0H ENTERED AFTER VIRT. PSW CHANGE @V408246 00471000
- USING *,R12 TEMPORARY ADDRESSABILITY 00472000
- LM R12,R13,DSPBASE LOAD UP BASE REGS @V387045 00473000
- USING DMKDSP,R12,R13 @V387045 00474000
- LA R9,1 INCREMENT @V408246 00475000
- AL R9,DMKDSPBC DISPATCH ENTRIES AFTER PSW CHANGE@V408246 00476000
- ST R9,DMKDSPBC ... 00477000
- LA R9,CKPSW SET EXIT ADDRESS 00478000
- TM CPSTATUS,CPEX HERE VIA STACKED REQUEST ?? 00479000
- BCR 1,R9 YES -- GO CHECK OUT NEW PSW 00480000
- TM CPSTATUS,CPWAIT ENTERED AFTER WAIT 00481000
- BO WAITIME YES -- 00482000
- B RUNTIME GO HANDLE NORMALLY @V386198 00483000
- SPACE 1 00484000
- CKPSW BAL R9,PSWCKSUB GO CHECK OUT NEW PSW @VA05647 00485000
- BZ CKPEND CONTINUE IF IT LOOKS OK @VA05647 00486000
- SPACE 1 00487000
- SPECPSW EQU * TAKE PSW SPEC CHECK INTERRUPT @VA05647 00488000
- LA R0,X'06' SPECIFICATION EXCEPTION CODE @VA05647 00489000
- SLR R1,R1 ZERO ILC FOR THE INTERRUPT @VA05647 00490000
- STH R1,VMPRGIL ... @VA05647 00491000
- GOTO DMKPRGSM GO SWAP PSW'S, ETC....... @VA05647 00492000
- SPACE 2 00493000
- DMKDSPE EQU * ENTERED IF VIRTUAL TIMER INTERRUPT OCCURS @V386198 00494000
- USING *,R12 TEMPORARY @V386198 00495000
- LM R12,R13,DSPBASE LOAD BASE REGISTERS @VA05545 00496000
- USING DMKDSP,R12,R13 @VA05545 00497000
- LA R9,1 INCREMENT @V408246 00498000
- AL R9,DMKDSPEC COUNT ENTRIES TO TIMER REFLECT @V408246 00499000
- ST R9,DMKDSPEC ... @V386198 00500000
- NI VMDSTAT,X'FF'-VMDSP INELIGIBLE FOR FAST DSPCH @V386198 00501000
- SLR R3,R3 CLEAR FOR 'XINTQUE' SUBROUTINE @V386198 00502000
- L R4,=X'00800080' LOC. 80 TIMER INTERRUPT CODE @V3M4026 00503000
- BAL R9,XINTQUE GO QUEUE THE EXTERNAL INTERRUPT @V3M4026 00504000
- AIF (&AP).APBR4 @V5DAACD 00505010
- LA R9,UNSTACK @V5DAACD 00505020
- B RUNTIME @V5DAACD 00505030
- AGO .UPBT4 00505040
- .APBR4 ANOP @V5DAACD 00505050
- * IN UP-MODE, SUBROUTINE TSTSYS IS A NO-OP @V5DAACD 00505060
- BAL R9,RUNTIME @V5DAACD 00505070
- BAL R9,TSTSYS TEST FOR AND OBTAIN SYSTEM LOCK @V5DAACD 00505080
- BZ UNSTACK UNSTACK IF LOCK OBTAINED. @V5DAACD 00505090
- BAL R9,STKDEF ELSE, GO DEFER IT. @V5DAACD 00505100
- B SWITCH AND SWITCH TO ASYSVM @V5DAACD 00505110
- .UPBT4 ANOP @V5DAACD 00505120
- SPACE 00505130
- EJECT 00507000
- AIF (NOT &AP).UPTST3 **AIF*** 00507900
- DMKDSPRU DS 0H ENTRY TO RUN ANOTHER USER @V407508 00508000
- USING *,R12 TEMPORARY ADDRESSABILITY @V407508 00509000
- LM R12,R13,DSPBASE LOAD BASE REGS @V407508 00510000
- USING DMKDSP,R12,R13 SET UP ADDRESSABILITY @V407508 00511000
- COUNT DMKDSPRC INCREMENT THIS ENTRY'S COUNT @V407508 00512000
- TM APSTAT1,APUOPER IS THIS AN AP SYSTEM? @V407508 00513000
- BO DSPR0 YES, O.K. TO CONTINUE @V407508 00514000
- ABEND 6 TERMINATE VM/370 @V407508 00515000
- DSPR0 DS 0H BEGIN PROCESSING @V407508 00516000
- TM CPSTATUS,CPRUN WAS SYSTEM RUNNING A USER? @V407508 00517000
- BZ DSPR2 NO,GO TEST FOR WAIT @V407508 00518000
- BAL R9,RUNTIME DO RUN TIME ACCOUNTING @V407508 00519000
- L R2,=A(DMKLOKSY+2) GET ADDRESS OF SYSTEM LOCK @V407508 00520000
- CLC LPUADDR,0(R2) IS SYSTEM LOCK HELD BY THIS PROC @V407508 00521000
- BE DMKDSPC4 YES, CONT AT MAIN ENTRY @V407508 00522000
- SPACE 00523000
- DSPR1 DS 0H TEST IF SYSTEM LOCK IS HELD @V407508 00524000
- TM VMDSTAT,VMDSP IS VM STILL DISPATCHABLE @V407508 00525000
- BO SWITCH YES, STILL O.K. @V407508 00526000
- BAL R9,STKDEF NO, INSURE A DEF TASK IS STACKED @V407508 00527000
- B SWITCH CONTINUE PROCESSING @V407508 00528000
- SPACE 00529000
- DSPR2 DS 0H TEST FOR SYSTEM IN WAIT @V407508 00530000
- TM CPSTATUS,CPWAIT WAS SYSTEM IN WAIT STATE? @V407508 00531000
- BZ DSPR3 NO, GO TRY TO UNLOCK LASTUSER @V407508 00532000
- BAL R9,WAITIME YES, DO WAIT TIME ACCOUNTING @V407508 00533000
- B SWITCH2 CONTINUE PROCESSING @V407508 00534000
- SPACE 00535000
- DSPR3 DS 0H TRY TO UNLOCK LASTUSER @V407508 00536000
- LR R1,R11 GET CURRENT R11 VMBLOK ADDR @V407508 00537000
- BAL R8,UNLOKVM UNLOCK THIS VMBLOK IF LOCKED @V407508 00538000
- ICM R1,B'1111',STACKVM GET ADDR OF UNSTACKED VMBLOK @V407508 00539000
- BZ SWITCH NO VMBLOK ADDRESS THERE @V407508 00540000
- BAL R8,UNLOKVM UNLOCK THIS VMBLOK IF LOCKED @V407508 00541000
- XC STACKVM(4),STACKVM CLEAR ADDR OF UNSTKED VMBLOK @V407508 00542000
- SWITCH DS 0H SWITCH TO ASYSVM @V407508 00543000
- CHARGE STOP STOP CHARGING CURRENT VMBLOK @V4M0173 00544000
- L R11,ASYSVM SWITCH R11 TO SYSTEM VMBLOK @V4M0173 00545000
- SWITCH2 DS 0H @V407508 00546000
- L R1,LASTUSER GET VALUE OF LASTUSER @V407508 00547000
- CR R1,R11 IS LASTUSER EQUAL TO ASYSVM? @V407508 00548000
- BE TSTXTND YES, ALREADY UNLOCKED @V407508 00549000
- TM VMOSTAT-VMBLOK(R1),VMSHR WAS LASTUSER USING @V407508 00550000
- * SHARED SYSTEMS? @V407508 00551000
- BO TSTXTND YES, DO NOT UNLOCK YET @V407508 00552000
- BAL R8,UNLOKVM2 UNLOCK LASTUSER @V407508 00553000
- ST R11,LASTUSER SET LASTUSER TO ASYSVM @V407508 00554000
- TSTXTND DS 0H @V407508 00555000
- * 00555050
- * IF A DISPATCH SIGNAL HAS BEEN RECEIVED, IT MUST BE 00555100
- * PROCESSED UNLESS ONE OF THE SPECIAL CONDITIONS IS PRESENT 00555150
- * 00555200
- LA R5,CKUSERS SET EXIT ADDRESS @VA08873 00555250
- TM XCPEND,XCDISP DISPATCH SIGNAL PENDING? @VA08873 00555300
- BZ TSTXTND2 NO, GO TEST FOR EXTEND @VA08873 00555350
- LA R5,SPIN YES, SET UP TO SPIN FOR LOCK @VA08873 00555400
- L R3,XCPEND PICK UP WORD OF FLAGS @VA08873 00555450
- DSPXC DS 0H ACKNOWLEDGE DISPATCH SIGNAL @VA08873 00555500
- LR R4,R3 MOVE FLAGS TO WORK REG @VA08873 00555550
- N R4,DISPWKUP TURN OFF DISPATCH & WAKEUP @VA08873 00555600
- CS R3,R4,XCPEND STORE ALTERED WORD OF FLAGS @VA08873 00555650
- BNE DSPXC KEEP TRYING @VA08873 00555700
- TSTXTND2 DS 0H TEST FOR EXTEND @VA08873 00555750
- L R2,PREFIXA GET PROCESSOR PREFIX ADDRESS @V407508 00556000
- CLI XTNDLOCK-PSA(R2),SET IS SYSTEM IN EXTEND? @V407508 00557000
- BNE TESTQSC NO, TEST FOR QUIESCE @V407508 00558000
- TM APSTAT1,PROCIO IS THIS THE MAIN PROCESSOR? @V407508 00559000
- BO TSTXTNDP YES, GO TEST FOR EXTEND PENDING @V407508 00560000
- BAL R9,XTNDAP DO AP-ONLY EXTEND PROCESSING @V407508 00561000
- TSTXTNDP DS 0H TEST FOR EXTEND PENDING @V407508 00562000
- TM EMSPEND,EMSPEXT IS EXTEND PENDING FLAG ON? @V407508 00563000
- BNO NOXTNDP NO, SKIP TURNING OFF XTND PNDG @V407508 00564000
- NI EMSPEND,X'FF'-EMSPEXT TURN OFF EXTEND PENDING @V407508 00565000
- OI EMSREC,EMSREXT TURN ON EXTEND RECEIVED FLAG @V407508 00566000
- NOXTNDP DS 0H @V407508 00567000
- TM APSTAT1,PROCIO IS THIS THE MAIN PROCESSOR? @V407508 00568000
- BO SPIN YES, GO TO SPIN ON SYSTEM LOCK @V407508 00569000
- SR R0,R0 CLEAR R0 INDICATE END COND @V407508 00570000
- LA R1,XTNDLOCK-PSA(,R2) GET ADDR OF EXTEND LOCK @V407508 00571000
- O R1,=A(X'80000000') TURN ON HIGH ORDER BIT @V407508 00572000
- CALL DMKLOKPS SPIN TILL EXTEND COMPLETES @V407508 00573000
- TESTQSC DS 0H @V407508 00574000
- TM EMSPEND,EMSPQUI+EMSINQSC TEST FOR QUIESCE @V4M0210 00575000
- * PENDING OR IN-QUIESCE STATUS @V4M0210 00576000
- BZ TESTFRLK NEITHER ON, GO TEST FRELK FLAG @V4M0210 00577000
- TM EMSPEND,EMSPQUI IS QUIESCE PENDING FLAG ON? @V4M0210 00578000
- BNO IDLEB NO, MUST BE IN-QUIESCE @V4M0210 00579000
- NI EMSPEND,X'FF'-EMSPQUI TURN OFF QUIESCE PENDING @V4M0210 00580000
- OI EMSPEND,EMSINQSC TURN ON IN-QUIESCE FLAG @V4M0210 00581000
- OI EMSREC,EMSRQUI TURN ON QUIESCE RECEIVED FLAG @V407508 00582000
- B IDLEB GO LOAD WAIT STATE @V407508 00583000
- TESTFRLK DS 0H @V407508 00584000
- CLI CPFRELK-PSA(R2),SET IS CPFRELK FLAG ON? @V407508 00585000
- BNE TESTMCLK NO, GO TEST MCH FLAG @V4M0006 00586000
- CLC FRLKPROC-PSA(1,R2),LPUADDR+1 IS THIS FRELK PROC @V407508 00587000
- BE SPIN YES, GO TO SPIN ON SYSTEM LOCK @V4M0006 00588000
- TESTMCLK DS 0H @V407508 00589000
- TM APSTAT4,CPMCHSE IS MCH SOFT ERROR FLAG ON? @VA07615 00590100
- * 00591200
- * AT THIS POINT, NONE OF THE SPECIAL CONDITIONS IS PRESENT 00591300
- * IF DISPATCH SIGNAL HAS BEEN RECEIVED, MUST SPIN FOR LOCK 00591400
- * 00591500
- BNOR R5 EITHER CKUSERS OR SPIN @VA08873 00591600
- SPIN DS 0H SPIN UNTIL SYSTEM LOCK IS FREE @V407508 00592000
- LOCK OBTAIN,TYPE=SYS,SPIN=YES GO GET SYSTEM LOCK @V407508 00593000
- CLI XTNDLOCK-PSA(R2),SET IS SYSTEM IN EXTEND? @V407508 00594000
- BNE TSTFRLK NO, GO TEST FRELK FLAG @V4M0006 00595000
- TM APSTAT1,PROCIO IS THIS THE MAIN PROCESSOR? @V407508 00596000
- BO FLAGCPEX YES, DO NORMAL EXTEND PROCESSING @VA07228 00597000
- TSTFRLK DS 0H @V407508 00598000
- CLI CPFRELK-PSA(R2),SET IS CPFRELK FLAG ON? @V407508 00599000
- BNE TSTMCLK NO, GO TEST MCH FLAG @V4M0006 00600000
- CLC FRLKPROC-PSA(1,R2),LPUADDR+1 IS THIS FRELK PROC @V407508 00601000
- BE FNDPBLOK YES, GO FIND PRIORITY CPEXBLOK @V4M0141 00602000
- TSTMCLK DS 0H @V407508 00603000
- TM APSTAT4,CPMCHSE IS MCH SOFT ERROR FLAG ON? @VA07615 00604100
- BO MCHSXT YES, GOTO DMKMCH FOR SOFT ERROR @V407508 00605000
- B UNLKLAST NO, CONTINUE LOCKED PROCESSING @V407508 00606000
- SPACE 1 00606030
- .UPTST3 ANOP **ANOP** 00606100
- EJECT 00607000
- *. 00608000
- * OPERATION 00609000
- * 00610000
- * B. RUNNING USER ACCOUNTING - 00611000
- * 1. UNFLAG RUNNING STATUS AND TEST IF R11 VMBLOK IS RUNUSER; 00612000
- * IF NOT, UNLOCK R11 VMBLOK AND SWITCH CPU TIMER AND R11 00613000
- * TO RUNUSER. 00614000
- * 2. CHECK IF USER HAS REACHED EITHER TIME-SLICE END OR QUEUE- 00615000
- * SLICE END; IN EITHER CASE, MARK THE USER INELIGIBLE FOR 00616000
- * FAST REDISPATCH. ALSO STORE THE TIME REMAINING IN THE 00617000
- * TIME-SLICE AND INCREMENT THE PROCESSOR PROBLEM STATE 00618000
- * TIME. 00619000
- * 3. IF THE VIRTUAL TIMER IS RUNNING, UPDATE EITHER THE USER'S 00620000
- * VIRTUAL TIMER, IF RESIDENT, OR THE COPY IN THE USER'S 00621000
- * VMBLOK. IF IT CHANGES SIGN FROM POSITIVE TO NEGATIVE, 00622000
- * POST A PENDING INTERRUPT AND MARK THE USER INELIGIBLE FOR 00623000
- * FAST REDISPATCH. 00624000
- *. 00625000
- SPACE 2 00626000
- RUNTIME EQU * CALCULATE TIME THAT WAS USED... %V3M4038 00627000
- MVI CPSTATUS,CPEX+CPSUPER SET PROCESSNG STATUS FLAG %V407508 00628000
- CHARGE STOP GET END OF IN-Q SLICE VMTTIME @ZA12055 00628500
- C R11,RUNUSER STILL POINTING TO RUNUSER ?? %V3M4038 00629000
- BE UNRUN IF YES, SKIP RESET OF CPU TIMER %V3M4038 00630000
- AIF (NOT &AP).UPTST4 **AIF*** 00630900
- LR R1,R11 SAVE CURRENT R11 USER %V407508 00631000
- * IN UP-MODE, SUBROUTINE UNLOKVM IS A NO-OP. 00632000
- BAL R8,UNLOKVM UNLOCK OLD R11 USER IF LOCKED %V407508 00633000
- .UPTST4 ANOP **ANOP** 00633100
- CHARGE SWITCH,RUNUSER SWITCH TIMER & R11 TO RUNUSER %V407508 00634000
- L R1,QUANTUMR CPU TIME REMAINING %V408246 00635000
- B UNRUN+4 ALREADY HAVE REMAINING VALUE %V408246 00636000
- SPACE 00637000
- UNRUN DS 0H %V408246 00638000
- L R1,TIMER CPU TIME REMAINING %V408246 00639000
- LTR R1,R1 ANY? %V3M4038 00640000
- BP B1 %V408246 00641000
- NI VMDSTAT,255-VMDSP NO, REMOVE FAST DISPATCH FLAG %V3M4038 00642000
- OI VMDSTAT,VMTSEND FLAG TIME-SLICE END %V3M4038 00643000
- B1 EQU * %V408246 00644000
- SPACE 00645000
- AIF (NOT &AP).UPTST5 **AIF*** 00645900
- TM APSTAT1,APUOPER IS THIS AN AP SYSTEM? %V4M0203 00646000
- BZ B1A NO, CONTINUE AS IN UP-MODE %V4M0203 00647000
- LM R2,R5,VMCPTIME LOAD BOTH SUPERVISOR TIME VALUES @V4M0203 00648000
- SLDL R2,8 SHIFT OFF 1ST BYTE OF VMCPTIME @V4M0203 00649000
- SLDL R4,8 SHIFT OFF 1ST BYTE OF VMAPTIME @V4M0203 00650000
- ALR R2,R4 COMBINE SUPERVISOR TIME VALUES @V4M0203 00651000
- LM R4,R5,VMTMINQ LOAD QUEUE CPU LIMIT @V4M0203 00652000
- SLDL R4,8 SHIFT OFF 1ST BYTE OF VMTMINQ @V4M0203 00653000
- CLR R2,R4 SEE IF EXCEEDED QUEUE CPU LIMIT @V4M0203 00654000
- BH B2 NO, CHECK VIRTUAL LOC 80 TIMER @V4M0203 00655000
- B B1B YES, GO SET APPROPRIATE FLAGS @V4M0203 00656000
- B1A DS 0H %V4M0203 00657000
- .UPTST5 ANOP **ANOP** 00657100
- CLC VMTTIME(5),VMTMINQ EXCEEDED QUEUE CPU LIMIT? %V3M4038 00658000
- BH B2 NO, CHECK VIRTUAL LOC. 80 TIMER %V408246 00659000
- B1B DS 0H %V4M0203 00660000
- NI VMDSTAT,255-VMDSP REMOVE FAST DISPATCH FLAG %V3M4038 00661000
- OI VMDSTAT,VMQSEND FLAG QUEUE TIME UP %V3M4038 00662000
- B2 EQU * %V408246 00663000
- SPACE 00664000
- BAL R8,INCPROBT GO INCREMENT PROBLEM STATE TIME %V407508 00665000
- L R0,QUANTUM SAVE FOR VIRT. 80 UPDATE %V408246 00666000
- ST R1,QUANTUM SET TIME-SLICE REMAINING VALUE %V408246 00667000
- TM VMMCR6,VMMFE+VMMVTMR VIRTUAL TIMER RUNNING? %V408246 00668000
- BOR R9 YES, NO NEED FOR UPDATE %V408246 00669000
- TM VMTLEVEL,VMTON+VMRON TIMER RUNNING ?? %V408246 00670000
- BZR R9 NO, DONE %V408246 00671000
- S R0,QUANTUMR CALCULATE TIME SPENT IN PROBLEM %V408246 00672000
- UPVIRT DS 0H UPDATE VIRTUAL LOCATION 80 TIMER %V408246 00673000
- BNM DSP3A ACCEPTABLE %V408246 00674000
- L R0,=F'1' STOP DSP003 ABEND - JUST FIDDLE TIMER HRC006DK 00675010
- DSP3A DS 0H %V408246 00676000
- LCTL C1,C1,VMSEG INSURE CORRECT MEMORY SPACE %V408246 00677000
- LRA R2,TIMER-PSA VIRTUAL TIMER AVAILABLE? %V408246 00678000
- BZ *+8 YES %V408246 00679000
- LA R2,VMTIMER NO, POINT AT COPY %V408246 00680000
- L R5,0(,R2) GET TIMER VALUE %V408246 00681000
- SLR R5,R0 UPDATE VIRTUAL TIMER %V408246 00682000
- ST R5,0(,R2) SAVE NEW VALUE %V408246 00683000
- BCR 8+2+1,R9 CARRY MEANS NO INT. TO REFLECT %V3M4038 00684000
- SLR R3,R3 %V3M4038 00685000
- L R4,=X'00800080' %V3M4038 00686000
- NI VMDSTAT,X'FF'-VMDSP RESET RUNNING USER FLAG %V3M4038 00687000
- SPACE 2 00688000
- * QUEUE AN EXTERNAL INTERRUPT BLOCK TO USER'S VMBLOK 00689000
- SPACE 00690000
- XINTQUE LA R2,VMPXINT EXTERNAL INTERRUPT BLOCK CHAIN @V3M4026 00691000
- USING XINTBLOK,R2 ADDRESSABILITY TO BLOCKS... @V3M4026 00692000
- XINTLOOP LR R6,R2 PRESERVE POINTER TO PREVIOUS @V200198 00693000
- L R2,XINTNEXT-XINTBLOK(,R6) NEXT? @V200198 00694000
- LTR R2,R2 @V200198 00695000
- BZ XINTADD NOPE, ADD TO END OF CHAIN @V200198 00696000
- C R3,XINTSORT CHECK FOR COLLATING SEQUENCE @V200198 00697000
- BH XINTLOOP KEEP LOOKING... @V200198 00698000
- BL XINTADD "THIS IS THE PLACE..." @V200198 00699000
- O R4,XINTCODE THESE MAY BE PRESENTED TOGETHER @V200198 00700000
- ST R4,XINTCODE OR ONE AT A TIME @V200198 00701000
- BR R9 EXIT @V3M4026 00702000
- XINTADD LA R0,XINTSIZE NUMBER OF DOUBLEWORDS @V200198 00703000
- CALL DMKFREE GET BLOCK FORM FREE STORAGE @V200198 00704000
- ST R1,XINTNEXT-XINTBLOK(,R6) @V200198 00705000
- SLR R5,R5 PARAMETER IN MEANINGLESS HERE @V200198 00706000
- STM R2,R5,XINTNEXT-XINTBLOK(R1) BUILD NEW @V200198 00707000
- * INTERRUPT BLOCK 00708000
- BR R9 FINIS... @V3M4026 00709000
- DSPBASE DC A(DMKDSP,DMKDSP+4096) BASE REGS @V387045 00710000
- EJECT 00711000
- *. 00712000
- * OPERATION - 00713000
- * 00714000
- * C. WAIT TIME ACCOUNTING - 00715000
- * 1. WAIT TIME IS SUBDIVIDED INTO 3 MAIN CATEGORIES: 00716000
- * A. 'IDLEWAIT' IS ACCUMULATED WHEN THE SYSTEM IS IN A 00717000
- * DORMANT STATE I.E., THERE IS NO OUTSTANDING ACTIVITY 00718000
- * ON THE SYSTEM. 00719000
- * 00720000
- * B. 'IONTWAIT' IS ACCUMULATED WHEN THERE IS ATLEAST 1 00721000
- * ACTIVE CHANNEL PROGRAM IN PROGRESS (OTHER THAN PAGING) 00722000
- * THAT HAS NOT AS YET COMPLETED. 00723000
- * 00724000
- * C. 'PAGEWAIT' IS ACCUMULATED WHEN THE SYSTEM IS IN A 00725000
- * TOTAL PAGE WAIT CONDITION. A TOTAL PAGE WAIT CONDITION 00726000
- * IS DETECTED WHEN ALL RUNNABLE USER'S IN QUEUE 1 AND 00727000
- * QUEUE 2 ARE WAITING FOR PAGES. 00728000
- * 00729000
- * 2. PRIOR TO LOADING A WAIT STATE PSW THE SYSTEM IS ENABLED 00730000
- * FOR EXTERNAL AND I/O INTERRUPTS. IF AN INTERRUPT SHOULD 00731000
- * OCCUR BEFORE LOADING A WAIT STATE PSW THERE WILL BE NO 00732000
- * CHANGE IN SYSTEM WAIT TIME. OTHERWISE, FLAGS IN 00733000
- * THE PSA INDICATE WHAT THE SYSTEM STATE IS 00734000
- * FOR THIS WAIT STATE CONDITION. 00735000
- * 00736000
- * 3. WHEN AN EXTERNAL OR I/O INTERRUPT DOES OCCUR THE VALUE IN 00737000
- * THE PSA FIELD WAITEND IS MOVED INTO THE CORRESPONDING 00738000
- * WAIT FIELD. 00739000
- * 00740000
- * 4. A RETURN IS MADE TO THE CALLER. 00741000
- * 00742000
- *. 00743000
- SPACE 2 00744000
- WAITIME EQU * PERFORM WAIT-TIME ACCOUNTING 00745000
- MVI CPSTATUS,CPEX+CPSUPER SET PROCESSNG STATUS FLAG @V407508 00746000
- * 00747000
- * SUBROUTINE TO ACCOUNT FOR SYSTEM WAIT TIME 00748000
- * 00749000
- SPACE 00750000
- C R11,ASYSVM RUNUSER STILL THE SYSTEM 00751000
- BE WAITPROC YES - @V200820 00752000
- AIF (NOT &AP).UPTST6 **AIF*** 00752900
- LR R1,R11 SAVE CURRENT R11 USER @V407508 00753000
- * IN UP-MODE, SUBROUTINE UNLOKVM IS A NO-OP. 00754000
- BAL R8,UNLOKVM UNLOCK OLD R11 USER IF LOCKED @V407508 00755000
- .UPTST6 ANOP **ANOP** 00755100
- WAITPROC EQU * @V200820 00756000
- CHARGE STOP STOP CHARGING CURRENT VMBLOK @V4M0173 00757000
- L R11,ASYSVM SWITCH R11 TO SYSTEM VMBLOK @V4M0173 00758000
- SPACE 00759000
- TM CPSTAT3,CPTIDLE+CPTPAGE+CPTIONT ANY WAIT FLAGS? @V407508 00760000
- BCR 8,R9 BR. IF SYSTEM INT. WHILE SCANNING VMBLOKS 00761000
- SPACE 00762000
- LM R0,R1,WAITEND GET VALUE IN TIMER AT WAIT END @V407508 00763000
- TM CPSTAT3,CPTIDLE DID TIMER CONTAIN IDLE TIME? @V407508 00764000
- BZ WAITIDLE NO -- @V200820 00765000
- STM R0,R1,IDLEWAIT SAVE NEW IDLE WAIT TIME VALUE 00766000
- B WAITRETN RESET FLAG INDICATOR 00767000
- SPACE 00768000
- WAITIDLE EQU * @V200820 00769000
- L R4,PWTPAGES NO, OF PAGEWAIT PAGES AT ENTRY @V407508 00770000
- * TO WAIT 00771000
- LTR R4,R4 ANY? @V408246 00772000
- BZ WAITA NO, BYPASS ACCUMULATING PAGE @V408246 00773000
- * WAIT TIME 00774000
- LM R2,R3,WAITSTRT GET TIMER VALUE AT ENTRY TO WAIT @V407508 00775000
- SLR R3,R1 @V408246 00776000
- BC 11,*+8 @V408246 00777000
- SL R2,F1 @V408246 00778000
- SLR R2,R0 ELAPSED TIME IN WAIT (ASSUME < @V408246 00779000
- * 30 MINS) 00780000
- SRDL R2,12 VALUE IN MICROSECONDS @V408246 00781000
- STM R2,R3,WAITSTRT SAVE ELAPSED TIME IN WAIT @V407508 00782000
- MR R2,R4 WAIT * PAGEWAIT PAGES @V408246 00783000
- AL R3,PGWAITIM+4 @V408246 00784000
- BC 12,*+8 @V408246 00785000
- AL R2,F1 @V408246 00786000
- AL R2,PGWAITIM @V408246 00787000
- STM R2,R3,PGWAITIM @V408246 00788000
- WAITA DS 0H @V408246 00789000
- TM CPSTAT3,CPTPAGE DID TIMER HAVE PAGE WAIT TIME? @V407508 00790000
- BZ WAITPAGE NO -- @V200820 00791000
- STM R0,R1,PAGEWAIT SAVE NEW PAGE WAIT TIME VALUE 00792000
- B WAITRETN RESET FLAG INDICATOR 00793000
- SPACE 00794000
- WAITPAGE EQU * @V200820 00795000
- STM R0,R1,IONTWAIT SAVE NEW SIMPLE I/O WAIT TIME 00796000
- SPACE 00797000
- WAITRETN MVI CPSTAT3,NONE TURN OFF ANY WAIT STATE FLAG @V407508 00798000
- BR R9 EXIT 00799000
- EJECT 00800000
- *. 00801000
- * OPERATION - 00802000
- * 00803000
- * D. PENDING INTERRUPT UNSTACK - 00804000
- * 1. IF THE USER IS NOT RUNNABLE, GO IMMEDIATELY TO SECTION F. 00805000
- * TO ALTER DISPATCHING STATUS 00806000
- * 2. IF A DELAYED PER INTERRUPT IS PENDING, REFLECT IT TO THE 00807000
- * USER, SWAPPING HIS PSW'S AND STORING THE PER INTERRUPT 00808000
- * CODE AND ADDRESS IN LOW CORE; THEN GO TO THE NEW PSW 00809000
- * VALIDATION ROUTINE (SECTION E.) 00810000
- * 3. IF NO PER INTERRUPT IS PENDING, CHECK FOR PENDING PSEUDO 00811000
- * PAGE FAULTS FOR WHICH THE USER IS ENABLED. IF A PSEUDO 00812000
- * PAGE FAULT IS PENDING, SET THE NEGATIVE EXCEPTION 00813000
- * ADDRESS FROM THE PGBLOK, SET UP THE INTERRUPT CODE, AND 00814000
- * GO TO DMKVATEX TO SIMULATE THE PAGE AVAILABLE INTERRUPT. 00815000
- * IF NO PAGE FAULT IS PENDING, CHECK FOR PENDING EXTERNAL 00816000
- * INTERRUPTS FOR WHICH THE USER IS ENABLED. IF AN EXTERNAL 00817000
- * INTERRUPT SHOULD BE REFLECTED, USE THE PENDING MASK 00818000
- * TO INDEX THE EXTCODES TABLE TO LOCATE THE PROPER CODE TO BE 00819000
- * GIVEN TO THE USER. IF THE USER IS RUNNING AN EXTENDED 00820000
- * MACHINE, VERIFY THAT HE IS NOT IN AN ENABLED EXTERNAL 00821000
- * INTERRUPT LOOP; THEN REFLECT THE INTERRUPT AS IN STEP 2. 00822000
- * WHEN THE NEW PSW HAS BEEN ESTABLISHED, GO TO THE NEW PSW 00823000
- * CHECK OUT ROUTINE (SECTION E.) TO VALIDATE IT 00824000
- * 4. IF NO EXTERNAL INTERRUPT IS REFLECTED, CHECK FOR PENDING 00825000
- * I/O INTERRUPTS FOR WHICH THE USER IS ENABLED. IF THE USER 00826000
- * IS MASKED ON FOR A CHANNEL ON WHICH AN INTERRUPT IS PENDING 00827000
- * LOCATE THE UNIT ON THE CHANNEL WHICH HAS A PENDING CHANNEL 00828000
- * CLASS INTERRUPT. IF NO CHANNEL CLASS INTERRUPT IS PENDING 00829000
- * LOCATE THE FIRST UNIT WITH A CONTROL UNIT OR DEVICE CLASS 00830000
- * INTERRUPT, AND REFLECT IT TO THE USER BY SWAPPING PSW'S, 00831000
- * STORING THE ADDRESS OF THE INTERRUPTING UNIT AND STORING 00832000
- * THE APPROPRIATE CSW STATUS. WHEN THE NEW PSW HAS BEEN 00833000
- * ESTABLISHED, GO TO NEW PSW CHECK OUT ROUTINE (SECTION E.) 00834000
- * TO VALIDATE IT. 00835000
- * 5. IF NO INTERRUPTS ARE PENDING FOR WHICH THE USER IS ENABLED, 00836000
- * GO TO SECTION F. TO UNSTACK THE NEXT PENDING REQUEST 00837000
- * 00838000
- *. 00839000
- EJECT 00840000
- UNSTACK EQU * HERE TO UNSTACK ANY PENDING INTERRUPTS %V3M4038 00841000
- SPACE 00842000
- TM VMRSTAT,VMCPWAIT IS USER RUNNABLE ?? %V3M4038 00843000
- * THE FOLLOWING INSTRUCTION IS NOT PERFORMED BY ECPS 00844000
- BNZ CHKILL NO -- DON'T BOTHER TO UNSTACK %V408246 00845000
- * RATHER, ECPS PERFORMS: 00846000
- * BNZ DISPATCH NO -- DON'T BOTHER TO UNSTACK %V3M4038 00847000
- CKPEND EQU * HERE TO TEST FOR INTERRUPTS PENDING %V3M4038 00848000
- TM VMPEND,VMPERPND+VMPGPND PER/PAGE FAULT PENDING %V3M4038 00849000
- BZ CKEXT NO -- GO CHECK OUT EXTERNALS %V3M4038 00850000
- SPACE 00851000
- CKPER TM VMPEND,VMPERPND IS IT A DELAY PER INT ? @V386198 00852000
- BZ CKPPF NO - MUST BE PSEUDO PAGE FAULT @V213135 00853000
- TM VMTRCTL,VMTRPER WERE WE USING THE P.E.R? PER001 00853050
- BO OURPER YES. CALL DMKPERIL TO FIGURE IT OUTPER001 00853100
- SR R1,R1 PAGE 0 -- 00854000
- TRANS 2,1,OPT=(BRING,DEFER) FETCH IT -- 00855000
- L R1,VMPSW SWAP PSW'S 00856000
- ST R1,PROPSW-PSA(,R2) .. 00857000
- L R1,VMPSW+4 .. 00858000
- ST R1,PROPSW-PSA+4(,R2) .. 00859000
- L R1,PRNPSW-PSA(,R2) 00860000
- ST R1,VMPSW .. 00861000
- L R1,PRNPSW-PSA+4(,R2) .. 00862000
- ST R1,VMPSW+4 .. 00863000
- LA R1,X'80' SET PER INTERRUPT CODE 00864000
- ICM R1,12,VMPRGIL GET ILC 00865000
- ST R1,INTPRL-PSA(,R2) STORE FOR USER 00866000
- L R1,VMECEXT GET VMBLOK EXTENSION 00867000
- LH R0,EXTPERCD-ECBLOK(,R1) GET PER CODE 00868000
- STH R0,PERCODE-PSA(,R2) STORE FOR USER 00869000
- L R0,EXTPERAD-ECBLOK(,R1) GET PER ADDRESS 00870000
- ST R0,PERADD-PSA(,R2) STORE FOR USER 00871000
- NI VMPEND,X'FF'-VMPERPND UNFLAG PER PENDING 00872000
- AIF (NOT &TRACE(6)).NOPC1 AIF TRACING PROG INTERRUPTS 00875000
- TM VMTRCTL,VMTRPRG+VMTRBRIN TRACE ALL OR P.C. 00876000
- BZ CKPSW IF NOT TRACING...BRANCH 00877000
- LM R0,R1,PROPSW-PSA(R2) LOAD OLD PC PSW 00878000
- L R4,INTPRL-PSA(,R2) GET ILC + INTERRUPT CODE 00879000
- LM R2,R3,PRNPSW-PSA(R2) LOAD UP NEW P.C. PSW 00880000
- CALL DMKTRCPG CALL TRACER (PROG. CHECKS) 00881000
- .NOPC1 ANOP 00882000
- SPACE 00883000
- B CKPSW GO CHECK OUT NEW PSW 00884000
- OURPER OI VMRSTAT,VMEXWAIT TAKE MACHINE OUT OF RUNNING. PER001 00884100
- CALL DMKPERIL CALL INTERRUPT HANDLER. PER001 00884200
- NI VMPEND,255-VMPERPND KILL THE PENDING BIT. PER001 00884300
- NI VMRSTAT,255-VMEXWAIT REMOVE THE MACHINE FROM PER001 00884400
- GOTO DMKDSPCH GO TO GROUND FLOOR ZERO. PER001 00884500
- EJECT 00885000
- CKPPF EQU * HERE TO UNSTACK PSEUDO PAGE @V213135 00886000
- * AVAILBLE INTERRUPTS 00887000
- TM VMESTAT,VMEXTCM ONLY IN EC MODE, THOUGH ... @V213135 00888000
- BZ CKEXT NO DICE - @V213135 00889000
- TM VMPSW,VMIOPND AND ONLY IF ENABLED -- @V213135 00890000
- BZ CKEXT NOT THIS TIME -- @V213135 00891000
- NI VMPEND,X'FF'-VMPGPND UNFLAG PAGE FAULT PENDING @V213135 00892000
- L R1,VMPGPNT GET NEXT PAGE AVIALABLE BLOCK @V213135 00893000
- LTR R1,R1 ANY THERE ? @V213135 00894000
- BZ CKEXT NO -- GO TEST EXTERNALS @V213135 00895000
- USING PGBLOK,R1 ADDRESSABILITY FOR PGBLOK @V213135 00896000
- L R0,PGPNT GET NEXT ON THE STACK @V213135 00897000
- ST R0,VMPGPNT AND MAKE HIM FIRST @V213135 00898000
- LTR R0,R0 ANY MORE STACKED ?? @V213135 00899000
- BZ *+8 NO -- NOTHING MORE PENDING @V213135 00900000
- OI VMPEND,VMPGPND RE-SET PENDING FLAG @V213135 00901000
- SLR R8,R8 SET UP GPR8 @V213135 00902000
- STH R8,VMPRGIL TO CLEAR ILC SAVE AREA @V213135 00903000
- L R3,PGADDR AND SET FOR GOTO TO DMKVATEX @V213135 00904000
- LA R0,PGBSIZE RELEASE PGBLOK .. @V213135 00905000
- CALL DMKFRET .. @V213135 00906000
- LA R1,X'14' SET INTERRUPT CODE @V213135 00907000
- OI VMRSTAT,VMEXWAIT DO NOT RUN WHILE REFLECTING -- @V213135 00908000
- GOTO DMKVATEX GO DO IT @V213135 00909000
- EJECT 00910000
- CKEXT DS 0H %V408246 00911000
- ICM R6,B'1111',VMPXINT ANY EXTERNAL INTERRUPTS? %V408246 00912000
- BZ UNSTIO NO %V408246 00913000
- TM VMPSW,VMEXTPND ENABLED FOR EXTERNAL? %V408246 00914000
- BZ UNSTIO NOPE, TRY I/O %V3M4038 00915000
- L R3,VMVCR0 GET SELECTED MASKS %V3M4038 00916000
- TM VMPSTAT,VMV370R EXTENDED CONTROL BLOCK PRESENT? %V3M4038 00917000
- BZ *+8 NOPE, THIS'LL HAVE TO DO %V3M4038 00918000
- L R3,EXTCR0-ECBLOK(,R3) CONTROL REGISTER 0 %V3M4038 00919000
- LA R5,VMPXINT ANCHOR CHAIN FOR EXT. INTERRUPTS %V408246 00920000
- B UNSTLUPA JOIN CODE ALREADY IN PROGRESS %V408246 00921000
- USING XINTBLOK,R6 %V3M4038 00922000
- UNSTLOOP LR R5,R6 PRESERVE PREVIOUS BLOCK ADDRESS %V3M4038 00923000
- L R6,XINTNEXT-XINTBLOK(,R5) NEXT? %V3M4038 00924000
- LTR R6,R6 %V3M4038 00925000
- BZ UNSTIO NOT ENABLED FOR ANY OF THESE %V3M4038 00926000
- UNSTLUPA DS 0H %V408246 00927000
- LH R4,XINTMASK GET MASK VALUE %V3M4038 00928000
- NR R4,R3 SEE IF ENABLE FOR THIS INTERRUPT %V3M4038 00929000
- BZ UNSTLOOP BETTER LUCK NEXT TIME %V3M4038 00930000
- UNSTPRTY EQU * @V387045 00931000
- CLC XINTCODE,=AL2(VMCXCODE) VMCF INTERRUPT ? @V387045 00932000
- BNE UNSTFTCH NO..CONTINUE... @V387045 00933000
- OI VMRSTAT,VMEXWAIT USER CANNOT RUN @V387045 00934000
- CALL DMKSCHDL (IN CASE OF A R11 SWITCH) @V408246 00935000
- CALL DMKVMCEX REFLECT MESSAGE HEADER @V387045 00936000
- UNSTFTCH EQU * @V387045 00937000
- SLR R1,R1 FETCH PAGE ZERO.. @V387045 00938000
- TRANS 2,1,OPT=BRING+DEFER BRING IN PSA @V200198 00939000
- USING PSA,R2 VIRTUAL PAGE ZERO @V200198 00940000
- LM R0,R1,VMPSW CURRENT PSW @V200198 00941000
- STM R0,R1,EXOPSW BECOMES EXTERNAL OLD PSW @V200198 00942000
- LM R0,R1,EXNPSW AND EXTERNAL NEW PSW @V200198 00943000
- STM R0,R1,VMPSW BECOMES NEW CURRENT PSW @V200198 00944000
- LM R7,R9,XINTSORT SAVE BLOCK @V200198 00945000
- TM XINTCODE,X'F0' IS IT CLASS 0 ? @V200198 00946000
- BNZ CLASS1 NO, JUST PRESENT IT @V200198 00947000
- TM XINTCODE+1,X'80' IS THIS INTERVAL TIMER? @V2B2638 00948000
- BZ NOINTV NOPE, SKIP @V2B2638 00949000
- LA R0,1 ADD ONE ... @V2B2638 00950000
- AL R0,DMKDSPIT ... TO THE VIRTUAL INTERVAL ... @V2B2638 00951000
- ST R0,DMKDSPIT ... TIMER REFLECTION COUNTER @V2B2638 00952000
- NOINTV EQU * @V2B2638 00953000
- XR R8,R4 RESET MASK BITS PRESENTED @V200198 00954000
- STC R8,XINTMASK+1 SAVE WHAT'S LEFT OF CLASS ZERO @V200198 00955000
- * INTERRUPTS 00956000
- NC XINTMASK(2),XINTMASK PARTIALLY PRESENTED? @V200198 00957000
- BNZ PARTIAL YES, TREAT SPECIALLY @V200198 00958000
- CLASS1 CLC XINTCODE(2),=X'1005' IS IT CPU TIMER? @V200198 00959000
- LA R1,DMKDSPPT ADDRESS OF THE COUNTER @V2B2638 00960000
- BE UPCNT YES, GO UP THE COUNT @V2B2638 00961000
- CLC XINTCODE(2),=X'1004' CLOCK COMPARATOR? @V200198 00962000
- LA R1,DMKDSPCK ADDRESS OF THE COUNTER @V2B2638 00963000
- BNE UNCHAINX NO, GO UNCHAIN THE XINTBLOK @V2B2638 00964000
- UPCNT LA R0,1 ADD ONE TO THE PROPER COUNTER @V2B2638 00965000
- AL R0,0(R1) ... @V2B2638 00966000
- ST R0,0(R1) AND PUT IT BACK @V2B2638 00967000
- B UNSTCONT CONTINUE @V2B2638 00968000
- UNCHAINX EQU * @V2B2638 00969000
- CLC XINTCODE,=X'2402' LDF interrupt? HRC065DK 00969100
- BE LDFINT Yes HRC065DK 00969200
- CLC XINTCODE,=AL2(VMCXCODE) VMCF INTERRUPT ? @V387045 00970000
- BNE DSPFRT NO..FRET THE BLOCK @V387045 00971000
- L R1,VMCPNT MASTER BLOCK... @V387045 00972000
- C R6,XINTNEXT-XINTBLOK(,R5) CHECK VALIDITY OF @VA12460 00972050
- * CHAIN 00972100
- BE VMCDSPN CONTINUE,CHAIN APPEARS VALID @VA12460 00972150
- LA R5,VMPXINT LOAD ADDRESS OF CHAIN ANCHOR @VA12460 00972200
- VMCCORR DS 0H @VA12460 00972250
- C R6,XINTNEXT-XINTBLOK(,R5) CHECK VALIDITY OF @VA12460 00972300
- * CHAIN 00972350
- BE VMCDSPN CONTINUE, CHAIN IS CORRECTED @VA12460 00972400
- ICM R5,B'1111',XINTNEXT-XINTBLOK(R5) INSERT ADDR @VA12460 00972450
- * OF NEXT ELEMENT 00972500
- BNZ VMCCORR BRANCH IF NOT END OF CHAIN @VA12460 00972550
- VMCDSPN EQU * @V387045 00973000
- ICM R1,B'1111',VMCFPNT-VMCBLOK(R1) NEXT VMCBLOK @V387045 00974000
- BZ DSPFRT NONE..FRET THE BLOCK @V387045 00975000
- TM VMCCSTAT-VMCBLOK(R1),VMCCXINT XINT BLOK ? @V387045 00976000
- BZ VMCDSPN NO..KEEP LOOKING ? @V387045 00977000
- B UNSTCONT SAVE FOR NEXT INTERRUPT... @V387045 00978000
- * HRC065DK 00978100
- LDFINT EQU * HRC065DK 00978200
- MVC PSA+128(4),XINTPARM LDF indication to loc X'80' HRC065DK 00978300
- * HRC065DK 00978400
- DSPFRT EQU * @V387045 00979000
- L R0,XINTNEXT @V200198 00980000
- ST R0,XINTNEXT-XINTBLOK(,R5) @V200198 00981000
- LA R0,XINTSIZE GET COUNT OF DOUBLEWORDS @V200198 00982000
- LR R1,R6 GET ADDRESS OF BLOCK @V200198 00983000
- DROP R2 @V200198 00984000
- USING PSA,R0 @V200198 00985000
- CALL DMKFRET AND RETURN IT TO FREE STORAGE @V200198 00986000
- DROP R0 @V200198 00987000
- USING PSA,R2 @V200198 00988000
- UNSTCONT SRL R8,16 INTERRUPTION CODE @VA01935 00989000
- L R7,PRNPSW SAVE PROGRAM NEW PSW FOR CKLOOP2 @VA05647 00990000
- TM EXOPSW+1,EXTMODE INTERRUPT WHILE IN EC MODE? @VA01935 00991000
- BO ECXINT YES, DO YOUR THING @V200198 00992000
- STH R8,EXOPSW+2 INTERRUPTION CODE @VA01935 00993000
- B CHKLOOP GO CHECK FOR EXTERNAL LOOP @V200198 00994000
- PARTIAL EX R4,TESTSIG SEE IF PRESENTING EXTERNAL @V200198 00995000
- * SIGNALS 00996000
- BZ *+8 NOPE, CAN'T COUNT THEM @V200198 00997000
- O R4,=XL4'1F' NOT OVERLOOKING SIGNALS 3 @V200198 00998000
- * THROUGH 7 00999000
- SLL R4,16 MATCH UP WITH INTERRUPTION CODE @V200198 01000000
- NR R4,R8 ONLY THESE ARE PRESENTABLE @V200198 01001000
- LR R8,R4 INTERRUPTION CODE EXPECTED IN R8 @V200198 01002000
- X R4,XINTCODE RESET THE ONES PRESENTED HERE @V200198 01003000
- STCM R4,B'1100',XINTCODE SAVE THE REST FOR NEXT TIME @V200198 01004000
- B UNSTCONT CONTINUE @V200198 01005000
- ECXINT ST R8,INTEXF STASH 370 INTERRUPT CODE @VA01935 01006000
- * CODE 01007000
- CHKLOOP TM VMPSW,VMEXTPND ENABLED FOR EXTERNAL? @V200198 01008000
- BNO NOLOOP NO, NO PROBLEM @V200198 01009000
- TM VMPSTAT,VMV370R EC MODE MACHINE? @VA04307 01010000
- BZ NOLOOP NO - NO CPU TIMER ETC @VA04307 01011000
- LA R1,INTEX EC MODE INT LOCATION @VA04307 01012000
- TM EXOPSW+1,EXTMODE IN EC MODE? @VA04307 01013000
- BNZ *+8 YES - CONTINUE @VA04307 01014000
- LA R1,EXOPSW+2 BC MODE INT LOCATION @VA04307 01015000
- TM 0(R1),X'FF' IS INTERRUPT NOT CLASS ZERO ? @V3M4026 01016000
- BZ NOLOOP IF YES, A LOOP CONDITION EXISTS @V3M4026 01017000
- EXTLOOP EQU * EXTERNAL LOOP MESSAGE @VA05647 01018000
- SLR R1,R1 NO DATA FOR THIS ERROR MESSAGE @V3M4026 01019000
- L R2,EXTPARMS ERROR CODE: "EXTERNAL INT. LOOP" @V3M4026 01020000
- B DSPERMSG GO TO CALL DMKERMSG TO SEND MSG @V3M4026 01021000
- SPACE 01022000
- NOLOOP EQU * @V200198 01023000
- DROP R2,R6 @V200198 01024000
- USING PSA,0 @V200198 01025000
- AIF (NOT &TRACE(6)).VR10B 01026000
- TM VMTRCTL,VMTREX+VMTRBRIN TRACING EXTERNAL INTERRUPTS ETC? 01027000
- BZ CHKLOOP2 BRANCH IF NOT @VA05987 01028000
- LR R4,R8 INTO R4 @V200198 01029000
- LM R0,R1,EXOPSW-PSA(R2) OLD PSW INTO R0-R1, 01030000
- LM R2,R3,EXNPSW-PSA(R2) NEW PSW INTO R2-R3, 01031000
- CALL DMKTRCEX NOW CALL EXTERNAL INTERRUPT TRACER 01032000
- .VR10B ANOP 01033000
- SPACE 1 01034000
- CHKLOOP2 EQU * CHECK FOR EXT/PGM CHECK LOOP @VA05647 01035000
- * CHECK FOR THE AN EXTERNAL/PROGRAM CHECK LOOP DUE TO 01036000
- * EXTERNAL NEW PSW INVALID, PROGRAM NEW PSW ENABLED FOR 01037000
- * EXTERNAL INTERRUPTIONS, AND TAKING CPU TIMER OR 01038000
- * CLOCK COMPARATOR INTERRUPTION. 01039000
- BAL R9,PSWCKSUB CHECK OUT EXTERNAL NEW PSW @VA05647 01040000
- BZ CKPEND EXTERNAL NEW PSW OK. CONTINUE @VA05647 01041000
- * EXTERNAL NEW PSW IS INVALID. 01042000
- C R8,F255 CLASS ZERO INTERRUPTION? @VA05647 01043000
- BNH SPECPSW BRANCH IF CLASS 0. NO PROBLEM. @VA05647 01044000
- SLL R7,7 PGM NEW PSW BIT 7 TO BIT 0 @VA05647 01045000
- LTR R7,R7 IS PGM NEW PSW BIT 7 ON? @VA05647 01046000
- BM EXTLOOP YES. WE ARE IN A LOOP. @VA05647 01047000
- B SPECPSW NO. JUST TAKE PGM INTERRUPTION. @VA05647 01048000
- EJECT 01049000
- UNSTIO EQU * HERE TO UNSTACK I/O INTERRUPTS %V3M4038 01050000
- SLR R6,R6 CLEAR MASK REGISTER %V3M4038 01051000
- ICM R6,12,VMIOINT GET PENDING INTERRUPT MASK %V3M4038 01052000
- BZ CKWAIT NOTHING PENDING -- %V3M4038 01053000
- TM VMESTAT,VMEXTCM IN EXTENDED CONTROL NOW ? %V3M4038 01054000
- BO UNSTIOXM YES - GO TAKE CARE OF IT. %V3M4038 01055000
- L R7,VMPSW NO - GET ENABLED MASK FROM PSW %V3M4038 01056000
- N R7,=X'FC000000' GET MASKS FOR CHANNELS 0-5 %V3M4038 01057000
- TM VMPSTAT,VMV370R EXTENDED CHANNEL SUPPORT ? %V3M4038 01058000
- BZ GETPEND NOPE - GO "AND" MASKS TOGETHER %V3M4038 01059000
- TM VMPSW,VMIOPND IF YES, CHECK CHANNELS 6-15 BIT %V3M4038 01060000
- BZ GETPEND NOT ON, GO "AND" MASKS TOGETHER %V3M4038 01061000
- L R1,VMECEXT IF ON, GET USER'S CONTROL REG 2 %V3M4038 01062000
- L R15,EXTCR2-ECBLOK(,R1) ... %V3M4038 01063000
- N R15,=X'03FF0000' MASK OUT CHANNELS 6-15 ONLY %V3M4038 01064000
- OR R7,R15 CONCATENATE THE TWO PIECES, %V3M4038 01065000
- B GETPEND AND GO "AND" MASKS TOGETHER %V3M4038 01066000
- UNSTIOXM TM VMPSW,VMIOPND CHECK I/O SUMMARY BIT %V3M4038 01067000
- BZ CKWAIT NOT ENABLED, TEST FOR WAIT STATE %V3M4038 01068000
- L R1,VMECEXT POINT TO EXTENDED CONTROL BLOK %V3M4038 01069000
- L R7,EXTCR2-ECBLOK(,R1) CHAN MASK; 17-31 HARMLESS %V3M4038 01070000
- GETPEND NR R7,R6 MASK PENDING AGAINST ENABLED %V3M4038 01071000
- BZ CKWAIT NOTHING TO UNSTACK -- CHECK WAIT %V3M4038 01072000
- SPACE 01073000
- GETIOINT SLR R1,R1 PREFETCH PAGE ZERO @V386198 01074000
- TRANS 9,1,OPT=(BRING,DEFER) @VA04484 01075000
- SRL R7,1 NONZERO - PUT MASKS INTO BITS 1-16 01076000
- LA R0,2 INDEX VALUE FOR UNIT TABLES 01077000
- L R2,=A(DMKVIOMK) GET ADDRESS OF PENDING MASKS 01078000
- SR R3,R3 CLEAR CHANNEL INDEX 01079000
- SPACE 01080000
- TESTVCH BXLE R7,R7,GETVCH SHIFT LEFT AND TEST FOR 1 BIT 01081000
- ALR R3,R0 NO BIT - INCREMENT INDEX 01082000
- B TESTVCH KEEP LOOKING 01083000
- SPACE 01084000
- GETVCH EQU * 01085000
- LH R6,VMCHTBL(R3) GET INDEX TO VCHBLOK 01086000
- A R6,VMCHSTRT POINT TO VCHBLOK 01087000
- USING VCHBLOK,R6 01088000
- SPACE 01089000
- TM VCHTYPE,VCHSEL IS IT A SELECTOR CHANNEL ? @VA01771 01090000
- BZ GETVCUI NO -- VCHCEDEV NOT VAILD 01091000
- TM VCHSTAT,VCHCEPND CHANNEL CLASS INTERRUPT PENDING ?? 01092000
- BZ GETVCUI NO -- 01093000
- SPACE 01094000
- LH R1,VCHCEDEV GET ADDRESS OF UNIT CAUSING INTERRUPT 01095000
- CALL DMKSCNVU LOCATE VBLOKS 01096000
- LR R4,R6 POINT TO VCHBLOK @VA04484 01097000
- BZ TESTCHAN ALL BLOKS FOUND @VA04484 01098000
- DSP01 ABEND 1 @VA01770 01099000
- EJECT 01100000
- GETVCUI SR R7,R7 CLEAR VCUINT SCANNER 01101000
- ICM R7,12,VCHCUINT GET PENDING MASK 01102000
- BZ CLEARVMX NOTHING PENDING 01103000
- SRL R7,1 INTO BITS 1-16 01104000
- SR R3,R3 CLEAR INDEX 01105000
- SPACE 01106000
- TESTVCU BXLE R7,R7,GETVCU SHIFT AND TEST 01107000
- ALR R3,R0 NO BIT .. 01108000
- B TESTVCU KEEP LOOKING 01109000
- SPACE 01110000
- GETVCU LH R7,VCHCUTBL(R3) GET CONTROL UNIT INDEX 01111000
- A R7,VMCUSTRT POINT TO VCUBLOK 01112000
- USING VCUBLOK,R7 01113000
- SPACE 01114000
- SR R5,R5 SAVE VCUBLOK, CLEAR NEW SHIFTER 01115000
- ICM R5,12,VCUDVINT GET MASK OF INTERRUPTING DEVICES 01116000
- BZ CLEARCHX NOTHING PENDING 01117000
- SRL R5,1 INTO BITS 1-16 01118000
- SR R3,R3 CLEAR INDEX 01119000
- SPACE 01120000
- TESTVDEV BXLE R5,R5,GETVDEV SHIFT AND TEST 01121000
- ALR R3,R0 INDEX 01122000
- B TESTVDEV KEEP LOOKING 01123000
- SPACE 01124000
- GETVDEV LH R8,VCUDVTBL(R3) GET DEVICE INDEX 01125000
- A R8,VMDVSTRT AND DEVELOP ADDRESS OF VDEVBLOK 01126000
- USING VDEVBLOK,R8 01127000
- SPACE 01128000
- TM VDEVSTAT,VDEVPEND+VDEVCHAN+VDEVCUE ANYTHING PENDING ? 01129000
- BZ CLEARCUX NO -- 01130000
- TM VCUINTS,CUE IS CUE PENDING ? 01131000
- BZ TESTCUE NO - USE THIS AS INTERRUPTING DEVICE 01132000
- ALR R3,R0 INCREMENT DEVICE INDEX FOR RE-SCAN 01133000
- TM VDEVSTAT,VDEVCUE IS THIS DEVICE CAUSING CUE ?? 01134000
- BZ TESTVDEV NO -- GO LOOK FOR ANOTHER 01135000
- SPACE 01136000
- TESTCUE EQU * CONTROL-UNIT-END PENDING 01137000
- LR R4,R6 POINT TO VCHBLOK 01138000
- TM VCHTYPE,VCHSEL IS IT A SELECTOR CHANNEL ? @VA01771 01139000
- BNZ TESTCHAN YES -- 01140000
- LR R4,R7 POINT TO VCUBLOK 01141000
- TM VCUTYPE,VCUSHRD+VCUCTCA ON SHARED SUBCHANNEL ?? 01142000
- BNZ TESTCHAN YES -- 01143000
- LR R4,R8 POINT TO VDEVBLOK 01144000
- SPACE 2 01145000
- TESTCHAN EQU * HERE TO TEST STATUS OF SUBCHANNEL 01146000
- LR R2,R9 ADDRESS PAGE 0 IN R2 @VA09137 01146200
- TM VDEVFLG2,VDEVPST THIS INTERRUPT TO BE POSTED? @VA09137 01146500
- BO POST YES @VA09137 01146800
- TM VCHSTAT-VCHBLOK(R4),VCHBUSY IS THE SUBCHANNEL BUSY ?? 01147000
- BZ TESTCE NO -- GO PREPARE TO REFLECT 01148000
- CLC VDEVCSW+4(2),=AL1(0,PCI) IS IT PCI ALONE 01149000
- BNE CKWAIT NO -- SAVE INTERRUPT FOR LATER 01150000
- EJECT 01151000
- TESTCE EQU * 01152000
- TM VCHSTAT-VCHBLOK(R4),VCHCEPND IS A CHANNEL INT. PENDING? 01154000
- BZ TESTCU NO -- GO LOOK FOR CU OR DEVICE INTERRUPTS 01155000
- ALR R3,R0 INCREMENT DEVICE INDEX FOR RESCAN 01156000
- TM VDEVSTAT,VDEVCHAN CHANNEL INT. PENDING? 01157000
- BZ TESTVDEV NO- GO FIND THE NEXT DEVICE 01158000
- POST EQU * @VA09137 01159100
- NI VDEVFLG2,255-VDEVPST TURN OFF POST @VA09137 01159200
- LR R3,R4 SET R3 FOR NEXT TEST 01160000
- LM R4,R5,VDEVCSW GET CSW TO BE STORED 01161000
- NI VDEVCSW+5,X'FF'-PCI REMOVE PCI 01162000
- NI VCHSTAT-VCHBLOK(R3),X'FF'-VCHCEPND REMOVE CE PENDING 01163000
- NI VDEVSTAT,X'FF'-VDEVCHAN REMOVE CE STATUS FROM DEVICE 01164000
- NI VCUSTAT,X'FF'-VCUCEPND AND FROM CU 01165000
- B STORECSW GO FINISH REFLECTING 01166000
- SPACE 3 01167000
- TESTCU EQU * HERE IF INTERRUPT IS NOT CE 01168000
- SR R4,R4 CLEAR OUT 01169000
- SR R5,R5 CSW SAVE REGISTERS 01170000
- TM VCUINTS,CUE IS A CUE PENDING ? 01171000
- BZ TESTDVIC NO -- GO LOOK FOR INTERRUPTS IN DEVICE 01172000
- ICM R5,12,VCUINTS GET CSW STATUS 01173000
- NI VCUINTS,X'FF'-CUE REMOVE CUE FROM CONTROL UNIT 01174000
- NI VDEVSTAT,X'FF'-VDEVCUE AND FORM DEVICE 01175000
- B STORECSW AND GO STORE CSW 01176000
- SPACE 3 01177000
- TESTDVIC EQU * HERE IF INTERRUPT IN IN DEVICE ONLY 01178000
- TM VDEVINTS,ATTN ATTENTION PENDING ?? 01179000
- BZ NOATTN NO -- 01180000
- TM VDEVFLAG,VDEVPOST SINGLE INTERRUPT ? @VA08933 01181000
- BO POSTOFF YES - ATTN + ALL OTHERS @VA04343 01182000
- TM VDEVINTS,X'FF'-(ATTN+UC) ANYTHING ELSE ?? 01183000
- BNZ ATTNPLUS YES -- REFLECT SEPARATE INTERRUPTS 01184000
- B NOATTN REFLECT SINGLE INTERRUPT @VA04343 01185000
- SPACE 01186000
- * HERE TO REFLECT A SINGLE INTERRUPT ALSO WITH ATTENTION 01187000
- POSTOFF NI VDEVFLAG,X'FF'-VDEVPOST TURN OFF VDEVPOST @VA04343 01188000
- NOATTN ICM R5,12,VDEVINTS GET CSW STATUS @VA08933 01189000
- STH R4,VDEVINTS CLEAR PENDING INTERRUPTS @VA09069 01190100
- NI VDEVSTAT,X'FF'-VDEVPEND CLEAR PENDING STATUS 01191000
- B STORECSW AND GO FINISH REFLECTING 01192000
- SPACE 3 01193000
- ATTNPLUS EQU * HERE IF ATTN PLUS OTHER STATUS IS PENDING 01194000
- ICM R5,12,VDEVINTS GET STATUS 01195000
- N R5,=XL4'7DFF0000' CLEAR ATTN AND UC FROM CSW 01196000
- NI VDEVINTS,ATTN+UC LEAVE ONLY ATTN AND UC IN DEVICE 01197000
- EJECT 01198000
- STORECSW EQU * HERE TO FINISH REFLECTIN ALL INTERRUPTS 01199000
- L R1,VMPSW SWAP 01200000
- ST R1,IOOPSW-PSA(,R2) PSW'S 01201000
- L R3,VMPSW+4 ... 01202000
- ST R3,IOOPSW-PSA+4(,R2) ... 01203000
- LH R0,VDEVADD GET UNIT ADDRESS 01204000
- AH R0,VCUADD ... 01205000
- AH R0,VCHADD ... 01206000
- TM VMESTAT,VMEXTCM EXTENDED MACHINE .. 01207000
- BZ *+12 NO -- 01208000
- STCM R0,7,INTTIO-PSA-1(R2) SAVE ADDR IN LOW CORE @VA02716 01209000
- B *+8 01210000
- STH R0,IOOPSW-PSA+2(,R2) SAVE ADDRESS IN LOW CORE 01211000
- L R1,IONPSW-PSA(,R2) GET NEW PSW 01212000
- ST R1,VMPSW AND STORE AS CURRENT 01213000
- L R1,IONPSW-PSA+4(,R2) .. 01214000
- ST R1,VMPSW+4 .. 01215000
- ST R4,CSW-PSA(,R2) STORE 01216000
- ST R5,CSW-PSA+4(,R2) CSW 01217000
- TM CSW-PSA+5(R2),CDC+CCC+IFCC ANY CHANNEL ERRORS @V508690 01217200
- BZ NOCHAN NO, CONTINUE NORMAL PROCESSING @V508690 01217250
- ICM R1,15,VDEVIOER GET IOERBLOK FOR CHANNEL ERROR @V508690 01217300
- BZ NOCHAN NO IOERBLOK, FORGET IT @V508690 01217350
- CALL DMKCCHRF REFLECT CHAN ERROR TO VIRT MACH @V508690 01217400
- NOCHAN EQU * @V508690 01217450
- AIF (NOT &TRACE(9)).TR2 01218000
- TM TRACFLG2,TRAC0C TRACING ACTIVE? 01219000
- BZ NOTRAC2 BRANCH IF NOT 01220000
- * 01221000
- * TRACE UNSTACK OF VIRTUAL I/O INTERRUPT 01222000
- * 01223000
- LA R14,TRCUNSTK SET CODE FOR UNSTAK OF INTERRUPT @V407508 01224000
- BAL R1,GETRACE GET CURRENT TRACE TABLE ENTRY @V4M0017 01225000
- STCM R0,B'0111',ONE(R15) SAVE VIRTUAL DEVICE ADDRESS @V407508 01226000
- ST R11,4(,R15) SAVE VMBLOK PTR 01227000
- ST R4,8(,R15) SAVE VIRTUAL CSW 01228000
- ST R5,12(,R15) ... 01229000
- NOTRAC2 EQU * 01230000
- .TR2 ANOP 01231000
- EJECT 01232000
- * REMOVE PENDING BITS FROM MASKS 01233000
- CLI VDEVINTS,0 ANY STATUS STILL PENDING IN DEVICE ? 01234000
- BNE CHKTRAC CHECK OUT TRACING STATUS @VA04484 01235000
- CLEARCU L R2,=A(DMKVIOMK) GET ADDRESS OF INTERRUPT MASK TABLE 01236000
- LH R3,VDEVADD GET DEVICE ADDRESS (0-F) 01237000
- ALR R3,R3 TIMES 2 01238000
- ALR R3,R2 POINT TO PROPER INTERRUPT MASK 01239000
- XC VCUDVINT,0(R3) CLEAR DEVICE PENDING FLAG FROM CU 01240000
- BNZ CHKTRAC CHECK TRACING STATUS @VA04484 01241000
- SPACE 01242000
- CLEARCH LH R3,VCUADD GET CONTROL UNIT ADDRESS (00-F0) 01243000
- SRL R3,3 TIMES 2 01244000
- ALR R3,R2 POINT TO PROPER MASK 01245000
- XC VCHCUINT,0(R3) CLEAR CU PENDING FLAG FROM CHANNEL 01246000
- BNZ CHKTRAC CHECK TRACING STATUS @VA04484 01247000
- SPACE 01248000
- CLEARVM LH R3,VCHADD GET CHANNEL ADDRESS (000-F00) 01249000
- SRL R3,7 GET ADDRESS TIMES 2 01250000
- ALR R3,R2 POINT TO PENDING MASK 01251000
- XC VMIOINT,0(R3) CLEAR PENDING INTERRUPT 01252000
- BNZ CHKTRAC CHECK TRACING STATUS @VA04484 01253000
- SPACE 01254000
- NI VMPEND,X'FF'-VMIOPND CLEAR SUMMARY BIT 01255000
- CHKTRAC EQU * CHECK TRACING STATUS @VA04484 01256000
- AIF (NOT &TRACE(6)).TR2A @VA04484 01257000
- TM VMTRCTL,VMTRIO+VMTRBRIN TRACING I/O OR SUCH ? @VA04484 01258000
- BZ CKPSW NO..CHECK OUT PSW @VA04484 01259000
- LR R4,R0 DEVICE ADDRESS IN R0 @VA04484 01260000
- LH R5,CSW-PSA+4(,R9) CSW TO R5 @VA04484 01261000
- LM R0,R1,IOOPSW-PSA(R9) OLD PSW IN R0-R1 @VA04484 01262000
- LM R2,R3,IONPSW-PSA(R9) NEW PSW IN R2-R3 @VA04484 01263000
- * VDEVBLOK ADDRESS STILL IN R8 01264000
- CALL DMKTRCIO TRACE THE INTERRUPT @VA04484 01265000
- LR R1,R4 DEVICE ADDRESS TO R1 @VA04484 01266000
- CALL DMKSCNVU RESCAN FOR DEVICE BLOKS @VA04484 01267000
- BZ CKPSW STILL THERE...GOOD @VA04484 01268000
- ABEND 4 SHOULD NOT OCCUR @VA04484 01269000
- .TR2A ANOP 01270000
- B CKPSW BRANCH EVEN IF NO TRACE OPTION @VA05145 01271000
- SPACE 01272000
- CLEARCUX EQU * @VA05145 01273000
- L R2,=A(DMKVIOMK) GET ADDRESS OF INT MASK TABLE @VA12932 01273500
- ALR R3,R2 POINT TO PROPER INTERRUPT MASK @VA05145 01274000
- XC VCUDVINT,0(R3) CLEAR DEVICE PENDING FLAG FROM CU@VA05145 01275000
- BNZ CKPSW GO CHECK PSW @VA05145 01276000
- SPACE 01277000
- LH R3,VCUADD GET CONTROL UNIT ADDRESS (00-F0) @VA05145 01278000
- SRL R3,3 TIMES 2 @VA05145 01279000
- CLEARCHX EQU * @VA05145 01280000
- ALR R3,R2 POINT TO PROPER MASK @VA05145 01281000
- XC VCHCUINT,0(R3) CLEAR CU PENDING FLAG FROM CHAN @VA05145 01282000
- BNZ CKPSW GO CHECK PSW @VA05145 01283000
- SPACE 01284000
- LH R3,VCHADD GET CHANNEL ADDRESS (000-F00) @VA05145 01285000
- SRL R3,7 GET ADDRESS TIMES 2 @VA05145 01286000
- CLEARVMX EQU * @VA05145 01287000
- ALR R3,R2 POINT TO PENDING MASK @VA05145 01288000
- XC VMIOINT,0(R3) CLEAR PENDING INTERRUPT @VA05145 01289000
- BNZ CKPSW GO CHECK PSW @VA05145 01290000
- SPACE 01291000
- NI VMPEND,X'FF'-VMIOPND CLEAR SUMMARY BIT @VA05145 01292000
- B CKPSW GO CHECK PSW @VA05647 01293000
- EJECT 01294000
- *. 01295000
- * OPERATION - 01296000
- * 01297000
- * E. NEW PSW VALIDATION - 01298000
- * 1. IF THE USER IS NOT RUNNING AN EXTENDED MACHINE,VERIFY THAT 01299000
- * HE HAS NOT LOADED AN EXTENDED PSW. 01300000
- * 2. IF THE USER IS RUNNING AN EXTENDED MACHINE AND IS GOING 01301000
- * FROM EXTENDED TO BASIC CONTROL MODE, CALL DMKVATBC TO CLEAN 01302000
- * UP ANY SHADOW TRANSLATION TABLES 01303000
- * 3. IF THE USER HAS LOADED AN EXTENDED PSW, FLAG HIS MACHINE 01304000
- * IN EXTENDED MODE AND CHECK TO SEE IF HE IS ENTERING 01305000
- * VIRTUAL TRANSLATE MODE ALSO. IF HE IS, CALL DMKVATMD TO 01306000
- * INITIALIZE SHADOW TABLES 01307000
- * 4. CONDITION CODE ZERO IS RETURNED IF THE PSW IS 01308000
- * VALID. OTHERWISE CONDITION CODE THREE IS RETURNED. 01309000
- * 01310000
- *. 01311000
- SPACE 2 01312000
- PSWCKSUB EQU * SUBROUTINE TO CHECK ANY NEW PSW @VA05647 01313000
- NI VMDSTAT,255-VMDSP NOT RUN USER @VA08989 01314100
- TM VMPSTAT,VMV370R ALLOWED TO ENTER EXTENDED MODE ?? 01315000
- BZ CKBCPSW NO - PSW MUST BE VANILLA 01316000
- TM VMPSW+1,EXTMODE EXTENDED PSW ?? 01317000
- BO CKEXTPSW YES -- GO CHECK IT OUT 01318000
- TM VMESTAT,VMEXTCM LEAVING EXTENDED MODE ?? 01319000
- BZ CKTRACE NO, WAS & IS BC, GO CHK TRACE @VA04140 01320000
- CALL DMKVATBC YES -- CLEAN UP TABLES 01321000
- NI VMESTAT,X'FF'-VMEXTCM-VMPERCM UNFLAG PER & @V408246 01322000
- * EXTENDED 01323000
- B CKTRACE GO CHECK OUT TRACE @VA04140 01324000
- EJECT 01325000
- CKEXTPSW EQU * CHECK OUT EXTENDED MODE PSW 01326000
- OI VMESTAT,VMEXTCM FLAG EXTENDED 01327000
- TM VMPSW,TRANMODE ADDRESS TRANSATE MODE ALSO ?? 01328000
- BZ GETMASK NO PER001 01329050
- TM VMOSTAT,VMSHR IS USER EC,TRANSLATE AND SHARED? @VA09151 01329100
- BNO NOTSHR NO NOT SHARED....... @VA09151 01329300
- CALL DMKVATBC YES MUST THROW AWAY SHADOW TABLES@VA09151 01329500
- NOTSHR DS 0H @VA09151 01329700
- CALL DMKVATMD ENTER ADDRESS TRANSLATE MODE 01330000
- GETMASK L R0,EXTZBIT GET MASK OF "MUST BE ZERO" BITS 01339000
- N R0,VMPSW TEST 1ST WORD OF PSW 01340000
- BNZ BADPSW ILLEGAL PSW FORMAT 01341000
- TM VMPSW+4,X'FF' ILLEGAL BITS IN 2ND WORD 01342000
- BNZ BADPSW ILLEGAL PSW IF BIT SET - GO GIVE MESSAGE 01343000
- CKTRACE EQU * HERE TO CHECK OUT TRACING @VA04140 01344000
- AIF (NOT &TRACE(6)).TR4 **AIF** 01345000
- NI VMTRCTL,255-VMTRPER ... PER001 01345050
- NI VMESTAT,255-VMPERCM ... PER001 01345100
- TM VMPSW+1,EXTMODE IN EXT MODE? PER001 01345150
- BNO OUROWN THEN USER CAN'T HAVE OWN PER PER001 01345200
- TM VMPSW,PERMODE IS USER PER ON? PER001 01345250
- BNO OUROWN NO, GO CHECK FOR CP PER PER001 01345300
- OI VMESTAT,VMPERCM AND USER PER FLAG PER001 01345350
- B CKTRACE2 AND CONTINUE PER001 01345400
- OUROWN TM VMPERFLG,VMPERUSE IS PER TRACE ACTIVE? PER001 01345450
- BNO CKTRACE2 NO, SKIP THIS NONSENSE PER001 01345500
- L R1,VMPERCTL LOAD POINTER TO TRACE CTL BLOCK PER001 01345550
- CLI PERCR9-PERBLOK(R1),00 ANY STOPS ACTIVE? PER001 01345600
- BE CKTRACE2 NO, SKIP OI PER001 01345650
- OI VMESTAT,VMPERCM TURN ON ANY BIT PER001 01345700
- OI VMTRCTL,VMTRPER ... PER001 01345750
- CKTRACE2 EQU * HERE TO CHECK TRACE PER001 01345800
- TM VMTRCTL,VMTRBRIN INSTRUCTION TRACING SET ? 01346000
- BZ CKPSWOK NOPE - OK TO GET OUT NOW @VA05647 01347000
- L R1,VMTREXT YES - REFERENCE TRACE CNTRL BLOCK@VA04140 01348000
- USING TREXT,R1 ... 01349000
- CLI TREXIN2,X'FF' ADDRESS "NULL" OR ALREADY FILLED IN ? 01350000
- BNE CKPSWOK NOT X'FF' - MUST BE ALREADY @VA05647 01351000
- * FILLED IN 01352000
- CLI TREXIN1,X'FF' CHECK THE "NEXT INSTRUCTION" ADDRESS 01353000
- BNE CKPSWOK NOT X'FF' - MUST BE ALREADY @VA05647 01354000
- * FILLED IN 01355000
- TM VMPSW+1,WAIT IS USER PERCHANCE IN WAIT STATE ? 01356000
- BO CKPSWOK IF YES, DON'T SET ANYTHING YET @VA05647 01357000
- TM TREXFLAG,TREXNDSP SKIP THE TRCIT CALL? @VA04044 01358000
- BO CKPSWOK YES - TRC WILL TURN OFF LATER @VA05647 01359000
- L R1,VMPSW+4 OK - WHERE-TO-GO INTO R1, AND 01360000
- CALL DMKTRCIT SET NEW "SVC B2" INSTRUCTION 01361000
- DROP R1 @VA04044 01362000
- .TR4 ANOP 01363000
- CKPSWOK EQU * THE PSW IS VALID @VA05647 01364000
- SR R0,R0 SET CONDITION CODE ZERO @VA05647 01365000
- BR R9 GO BACK FROM WHENCE WE CAME @VA05647 01366000
- BADPSW EQU * PSW IS BAD. TELL CALLER ABOUT IT.@VA05647 01367000
- TM FFS,X'FF' SET CONDITION CODE THREE @VA05647 01368000
- BR R9 AND GO BACK. HE WILL HANDLE @VA05647 01369000
- SPACE 01370000
- CKBCPSW EQU * HERE TO CHECK OUT BC MODE PSW 01371000
- TM VMPSW+1,EXTMODE ILLEGAL BIT FOR BC MODE MACHINE 01372000
- BZ CKTRACE OK, GO CHECK OUT TRACING @VA04140 01373000
- B BADPSW OTHERWISE, GO GIVE MESSAGE 01374000
- EJECT 01375000
- CKWAIT EQU * CHECK HERE FOR DISABLED OR IDLE WAIT STATES: %V3M4038 01376000
- SPACE 01377000
- NI VMRSTAT,X'FF'-(VMPSWAIT+VMIDLE) UNFLAG WAIT %V3M4038 01378000
- TM VMPSW+1,WAIT STILL IN WAIT ?? %V3M4038 01379000
- BZ DISPATCH NO -- GO DISPATCH %V3M4038 01380000
- OI VMRSTAT,VMPSWAIT FLAG IN WAIT %V3M4038 01381000
- SPACE 01382000
- CKWAITST SLR R1,R1 CLEAR R1 EC MODE @V386198 01383000
- L R3,XRIGHT16 AND GET MASK FOR ALL EXT CHANNELS@VA02145 01384000
- L R2,VMVCR0 CR0 OR ECBLOK @VA02145 01385000
- TM VMESTAT,VMEXTCM RUNNING IN EC MODE ? @VA02145 01386000
- BNZ CKENBL YES..CHECK I/O SUMMARY @VA02145 01387000
- N R3,=A(X'3FF') IF NOT..DISABLE 0-5 @VA02145 01388000
- LH R1,VMPSW PICK UP CHANNEL MASK BITS + @VA02145 01389000
- N R1,=A(X'FC00') ALL BUT CHANNEL 0 - 5 @VA02145 01390000
- TM VMPSTAT,VMV370R EC MODE MACHINE ? @VA02145 01391000
- BZ TSTMASK NO..CHECK OUT ENABLED @VA02145 01392000
- CKENBL EQU * HERE TO TEST FOR ENABLED I/O @VA02145 01393000
- TM VMPSW,VMIOPND SUMMARY ENABLED? @VA02145 01394000
- BZ TSTMASK NO..SEE IF ANY ENABLED @VA02145 01395000
- LH R0,EXTCR2-ECBLOK(,R2) EXTENDED CHANNEL MASK @VA02145 01396000
- NR R0,R3 LESS CH 0-5 ..MAYBE @VA02145 01397000
- OR R1,R0 COMBINE WITH PSW MASK @VA02145 01398000
- TSTMASK EQU * @VA02145 01399000
- ICM R0,B'0011',VMIOACTV ACTIVE I/O MASK @V408246 01400000
- BNZ DISPATCH SOMETHING GOING ON @V408246 01401000
- LTR R1,R1 ENABLED ON ANY CHANNELS? @VA02145 01402000
- BZ CKENEXT NO..CHECK OUT TIMERS, ECT.. @VA02145 01403000
- CH R0,VMNDCNT ANY NON-DEFERED PAGE ON THE WAY @V213135 01406000
- BE SETIDLE NO -- SET IDLE WAIT STATE @V213135 01407000
- TM VMESTAT,VMEXTCM WILL USER BE ABLE TO TAKE IT @V213135 01408000
- BO DISPATCH YES -- LEAVE HIM IN QUEUE @V213135 01409000
- SETIDLE OI VMRSTAT,VMIDLE FLAG IDLE MACHINE FOR QUEUE DROP @V213135 01410000
- B DISPATCH AND LEAVE @V213135 01411000
- CKENEXT EQU * @VA02145 01412000
- OI VMRSTAT,VMIDLE FLAG FOR Q DROP @VA02145 01413000
- TM VMPSW,VMEXTPND ENABLED FOR EXT INTERRUPTS? @VA02145 01414000
- BZ DISABLED NO..DISABLED WAIT STATE @VA02145 01415000
- TM VMPSTAT,VMV370R EC MODE MACHINE? @VA02145 01416000
- BZ EXTBCM NO..NO CLOCK COMP..CPU TIMER @VA02145 01417000
- L R2,EXTCR0-ECBLOK(,R2) PICK UP CR0 @VA02145 01418000
- LR R1,R2 AND SWITCH TO R1 @VA02145 01419000
- N R1,=A(X'0C00') ENABLED FOR EXTENDED TIMERS, ECT.@VA02145 01420000
- BNZ DISPATCH YES..INTERRUPT WILL COME.. @VA02145 01421000
- EXTBCM EQU * @VA02145 01422000
- LR R1,R2 CR0 TO R1 @VA02145 01423000
- N R1,=A(X'41') EXT KEY + VMCF @V387045 01424000
- BNZ DISPATCH YESยฌยฌLET HIM GO @VA02145 01425000
- TM VMTLEVEL,VMRON REAL TIMER RUNNING? @VA02145 01426000
- BZ DISABLED NO..DISABLED WAIT STATE @VA02145 01427000
- N R2,=A(X'80') ENABLED FOR INTERVAL TIMER? @VA02145 01428000
- BNZ DISPATCH YES..IT'LL COME LATER.. @VA02145 01429000
- EJECT 01430000
- DISABLED TM VMOSTAT,VMSYSOP IS USER ALLOWED TO DISABLE ? @V3M4026 01431000
- BO DISPATCH O.K. IF SYSTEM OPERATOR @V3M4026 01432000
- LA R2,450 ERROR CODE: "DISABLED WAIT PSW" @V3M4026 01433000
- SPACE 01434000
- LA R0,3 SIZE OF MESSAGE BUFFER @V3M4026 01435000
- CALL DMKFREE GO GET THE SPACE FOR IT... @V3M4026 01436000
- LR R3,R1 SAVE ADDR IN R3 (FOR ERMSG FRET) @V3M4026 01437000
- MVI 0(R3),C'''' ADD BEG. DELIMITER TO MSG DATA @V3M4026 01438000
- L R1,VMPSW GET FIRST HALF OF PSW IN ERROR @V3M4026 01439000
- CALL DMKCVTBH CONVERT FOR OUTPUT @V3M4026 01440000
- STM R0,R1,1(R3) SAVE IT @V3M4026 01441000
- MVI 9(R3),C' ' CLEAN UP MESSAGE OUTPUT... @V3M4026 01442000
- L R1,VMPSW+4 GET SECOND HALF @V3M4026 01443000
- CALL DMKCVTBH CONVERT IT @V3M4026 01444000
- STM R0,R1,10(R3) AND SAVE @V3M4026 01445000
- MVI 18(R3),C'''' ADD ENDING DELIMITER TO MSG DATA @V3M4026 01446000
- LA R0,19 SIZE OF MESSAGE IN BYTES @V3M4026 01447000
- LR R1,R3 ADDRESS OF THE MESSAGE @V3M4026 01448000
- ICM R2,B'1100',PSWPARMS LOAD OPTION REGISTER @V3M4026 01449000
- ICM R3,B'1000',F3+3 LOAD SIZE OF BUFFER TO FRET @V3M4026 01450000
- SPACE 01451000
- DSPERMSG EQU * HERE TO SEND MSG @V3M4026 01452000
- NI VMOSTAT,X'FF'-VMCFRUN STOP RUNNING IN CF MODE @V3M4026 01453000
- OI VMRSTAT,VMCFWAIT AND PUT IN CF WAIT RIGHT NOW @V3M4026 01454000
- ICM R0,B'1110',=C'DSP' MODULE ID FOR CALL TO ERM @V3M4026 01455000
- CALL DMKERMSG INVOKE ERROR MESSAGE WRITER @V3M4026 01456000
- CALL DMKCFMBK PLACE USER IN CONSOLE FUNC. MODE @V3M4026 01457000
- * B DISPATCH CONTINUE... @V407508 01458000
- EJECT 01459000
- *. 01460000
- * 01461000
- * OPERATION - 01462000
- * 01463000
- * F. COMPLETE PROCESSING FOR CURRENT USER - 01464000
- * 1. CALL DMKSCHDL IF NECESSARY TO ALTER DISPATCHING PRIORITY OF 01465000
- * THE USER FOR WHICH DISPATCH WAS ENTERED. 01466000
- * 2. UNLOCK THE CURRENT USER IF THAT USER IS NOT LASTUSER OR 01467000
- * THE SYSTEM VMBLOK (WHICH IS NOT LOCKED). IF THE CURRENT 01468000
- * USER IS RUNNABLE AND THE OTHER PROCESSOR IS IDLE, SIGNAL 01469000
- * THE OTHER PROCESSOR. 01470000
- * 3. UNLOCK LASTUSER IMMEDIATELY IF THAT USER IS NOT USING 01471000
- * SHARED SYSTEMS. OTHERWISE, WAIT UNTIL ANOTHER USER IS 01472000
- * SELECTED TO RUN, OR UNTIL A WAIT STATE IS LOADED. 01473000
- * 4. IF THE SYSTEM IS IN EXTEND AND THE CURRENT PROCESSOR IS 01474000
- * THE ATTACHED PROCESSOR RELEASE THE SYSTEM LOCK AND SPIN 01475000
- * UNTIL EXTEND COMPLETES. 01476000
- * 5. IF AUTOMATIC PROCESSOR RECOVERY IS PENDING, CALL DMKMCTPR. 01477000
- * 6. IF THE OTHER PROCESSOR NEEDS THE SYSTEM LOCK, RELEASE IT 01478000
- * AND GO TO SECTION H TO SELECT A USER FOR DISPATCHING. 01479000
- * 01480000
- * 01481000
- *********************************************************************** 01482000
- * 01483000
- * 01484000
- * CP ASSIST INSTRUCTIONS "DSP1" AND "DSP2" - DISPATCH A BLOK 01485000
- * 01486000
- * 01487000
- * OPERANDS: 01488000
- * 1 = ADDRESS OF 'DSP1LIST' (DATA LIST) 01489000
- * 2 = ADDRESS OF 'DSP1EXIT' (EXIT LIST) 01490000
- * 01491000
- * REGISTER INPUT: 01492000
- * GPR 11 = ADDRESS OF THE VMBLOK OF USER BEING PROCESSED 01493000
- * 01494000
- * SYSTEM DATA AREAS REFERENCED (BY MODULE WHERE APPLICABLE): 01495000
- * DMKPSA - 'APSTAT2', 'ASYSVM', 'PROBSTRT', 'STACKVM', 01496000
- * RUN AND STATUS FIELDS, TRACING INFORMATION 01496100
- * CPEXBLOK, ECBLOK, IOBLOK, MICBLOK, PAGE AND SEGMENT TABLES, 01497000
- * SHRTABLE, TREXT, TRQBLOK, VMABLOK, VMBLOK, XINTBLOK 01498000
- * 01499000
- * 01500000
- * NOTE: ONLY CR, FPR, AND GPR 12-13 CONTENTS WILL NOT BE CHANGED 01501000
- * IF NOT MENTIONED IN THE FOLLOWING EXIT LISTS. ALL OTHER GPR 01502000
- * VALUES AT EXIT POINTS SHOULD BE CONSIDERED UNPREDICTABLE. 01503000
- * 01504000
- * "DSP1" EXITS TO SPECIFIED OPERAND 2 LIST ADDRESSES: 01505000
- * 01506000
- * +0 'OFFCALL' (THIS USER IS TO BE LOGGED OFF THE SYSTEM) 01507000
- * REGISTER OUTPUT: 01508000
- * GPR 11 = ENTRY CONTENT - VMBLOK ADDRESS BEING PROCESSED 01509000
- * 01510000
- * +4 'SCHDL' (MUST CALL SCHEDULER TO CHECK DISPATCHING QUEUE) 01511000
- * REGISTER OUTPUT: SAME AS EXIT TO +0 'OFFCALL' 01512000
- * 01513000
- * "DSP1" AND "DSP2" EXITS TO SPECIFIED OPERAND 2 LIST ADDRESSES: 01514000
- * 01515000
- * +8 'UNLOCK1' (THE SYSTEM EXTEND LOCK IS SET TO X'FF') 01516000
- * REGISTER OUTPUT: SAME AS EXIT TO +0 'OFFCALL' 01517000
- * 01518000
- * +12 'FRETCPEX' (CP ASSIST "FRET" COULDN'T FRET CPEXBLOK) 01519000
- * REGISTER OUTPUT: 01520000
- * GPR 0 = VALUE OF X'0000000A' 01521000
- * GPR 1 = ADDRESS OF CPEXBLOK 01522000
- * GPR 2-11 = CPEXBLOK VALUES ('CPEXR2' TO 'CPEXR11') 01523000
- * 01524000
- * +16 'CKSHRSYS' (CAN'T COMPLETE CHECKS FOR SHARED SYSTEM USER) 01525000
- * REGISTER OUTPUT: 01526000
- * GPR 10 = ADDRESS OF VMBLOK TO BE DISPATCHED 01526100
- * GPR 11 = ADDRESS OF VMBLOK OF 'LASTUSER' 01527000
- * 01528000
- * +20 'FREELOCK' DSP2 EXIT IF VMNOECPS IS NON-ZERO @VMD0134 01529100
- * REGISTER OUTPUT: @VMD0134 01529200
- * GPR 1 = ADDRESS OF VMBLOK TO BE DISPATCHED @VMD0134 01529300
- * GPR 11 = ASYSVM VALUE @VMD0134 01529400
- * 01533000
- * +24 'IDLEECPS' (THE RUN LIST, 'DMKSCHRL', IS EMPTY) 01534000
- * REGISTER OUTPUT: REGISTERS ARE UNPREDICTABLE 01535000
- * 01536000
- * +28 'DSP2' (A BAD EC-MODE ENVIRONMENT HAS BEEN DETECTED) 01537000
- * REGISTER OUTPUT: 01538000
- * GPR 11 = ADDRESS OF VMBLOK TO BE DISPATCHED 01539000
- * 01540000
- * "DSP1" AND "DSP2" EXITS UPON DISPATCH OF A BLOK: 01541000
- * 01542000
- * EXIT BY IOBLOK OR TRQBLOK DISPATCH: (EXIT TO NEW GPR 12 VALUE) 01543000
- * REGISTER OUTPUT: 01544000
- * GPR 10 = ADDRESS OF THE IOBLOK/TRQBLOK 01545000
- * GPR 11 = ADDRESS OF THE VMBLOK OF 'IOBUSER'/'TRQBUSER' 01546000
- * GPR 12 = EXIT ADDRESS ('IOBIRA'/'TRQBIRA') 01547000
- * 01548000
- * EXIT BY CPEXBLOK DISPATCH: (EXIT TO NEW ADDRESS IN GPR 15) 01549000
- * REGISTER OUTPUT: 01550000
- * GPR 0-14 = CPEXBLOK VALUES ('CPEXR0' TO 'CPEXR14') 01551000
- * GPR 15 = CPEXBLOK VALUE ('CPEXADD') 01552000
- * 01553000
- * EXIT BY VMBLOK DISPATCH: (EXIT TO ADDRESS IN 'VMPSW'+4) 01554000
- * REGISTER OUTPUT: 01555000
- * CR 0 = VALUE FROM EITHER 'CPCREG0' OR 'EXTSHCR0' 01556000
- * CR 1 = VALUE FROM EITHER 'VMSEG' OR 'EXTSHCR1' 01557000
- * CR 4-8 = VALUES FROM ECBLOK ('EXTCR4' - 'EXTCR8') OR 01558000
- * ENTRY CONTENTS 01558100
- * CR 9-11 = VALUES FROM ECBLOK ('EXTCR9' - 'EXTCR11') OR 01559000
- * VALUES FROM TREXT ('TREXCR9' - 'TREXCR11') OR 01560000
- * ENTRY CONTENTS 01561000
- * CR 12-13 = VALUES FROM ECBLOK ('EXTCR12' - 'EXTCR13') OR 01562000
- * ENTRY CONTENTS 01562100
- * FPR 0-6 = VALUES FROM VMBLOK ('VMFPRS') 01563000
- * GPR 0-15 = VALUES FROM VMBLOK ('VMGPRS') 01564000
- * 01565000
- *********************************************************************** 01566000
- *. 01567000
- EJECT 01568000
- DISPATCH EQU * ALTER USER STATUS AND DISPATCH... 01569000
- SPACE 01570000
- DS 0H EXECUTE CP ASSIST "DSP1" @V3M4026 01571000
- DMKDSP1 DC X'E607',S(DSP1LIST,DSP1EXIT) ***@V3M4026 01572000
- SPACE 01573000
- L R1,VMRSTAT SCH BITS %V408246 01574000
- N R1,SCHMASK JUST 'IMPORTANT' BITS %V408246 01575000
- SL R1,SCHMON REMOVE 'ON' BITS, SHOULD LEAVE %V408246 01576000
- * 'ZERO' 01577000
- BC 2,UNLOCK YES, NO FURTHER CHECKING %V407508 01578000
- * NECESSARY 01579000
- CHKILL DS 0H %V408246 01580000
- C R11,ASYSVM IS VMBLOK = SYSTEM? %V408246 01581000
- BE UNLOCK YES, NOTHING FURTHER TO CHECK %V4M0173 01582000
- TM VMOSTAT,VMKILL SHOULD USER BE LOGGED OFF ? %V3M4038 01583000
- BZ SCHDL NO, CHECK FOR RUNNABLE STATUS %V407508 01584000
- TM VMQSTAT,VMCFREAD IS READ PENDING? %V3M4038 01585000
- BO OFF IF SO, EXIT %V3M4038 01586000
- TM VMOSTAT,VMCF EXECUTING A CONSOLE FUNCTION NOW %V3M4038 01587000
- BO SCHDL YES, WAIT UNTIL IT'S ALL DONE %V407508 01588000
- OFF NI VMQSTAT,255-VMCFREAD TURN OFF FLAG AND EXIT %V3M4038 01589000
- NI VMOSTAT,255-VMKILL DO NOT CALL TWICE %V3M4038 01590000
- TM VMRSTAT,VMLOGOFF IN LOGOFF? %V3M4038 01591000
- BO UNLOCK DON'T CALL USO AGAIN %V407508 01592000
- OI VMRSTAT,VMLOGOFF DO NOT RUN THIS VM %V3M4038 01593000
- OFFCALL DS 0H LOG USER OFF SYSTEM @VA13025 01594000
- TM VMRSTAT,VMEXWAIT IS USER IN EXECUTION WAIT @VA13025 01594200
- BO DELAYOFF YES, WAIT UNTIL FINISHED @VA13025 01594400
- CALL DMKUSOFF LOG USER OFF SYSTEM @VA08667 01594600
- B UNLOCK GO UNLOCK USER @V407508 01595000
- SPACE 1 @VA13025 01595100
- DELAYOFF OI VMOSTAT,VMKILL RESET THE VMKILL BIT @VA13025 01595200
- NI VMRSTAT,255-VMLOGOFF RESET LOGOFF BIT IN VMBLOK @VA13025 01595300
- TM VMSPMFLG,VMCFRD1 IS BACK-UP BIT ON ? @VA13025 01595400
- BZ SCHDL NO, THEN JUST GO TO SCHEDULER @VA13025 01595500
- OI VMQSTAT,VMCFREAD YES, THEN SET CFREAD FLAG @VA13025 01595600
- B SCHDL AND GO TO SCHEDULER @VA13025 01595700
- SPACE 1 @VA13025 01595800
- * 01596000
- * THE FOLLOWING TWO DATA LISTS MUST BE KEPT CONTIGUOUS AND IN ORDER 01597000
- * BECAUSE THEY ARE USED BY CP ASSIST INSTRUCTIONS "DSP1" AND "DSP2". 01598000
- SPACE 01599000
- DSP1LIST DS 0F "DSP1" & "DSP2" ASSIST DATA LIST @V3M4026 01600000
- SPACE 01601000
- * NOTE: THE WORD AT DISPLACEMENT 28 WILL BE INCREMENTED 01601200
- * BY 4 DURING IPL IF THIS CPU HAS CP ASSIST LEVEL 18 01601400
- * OR 19. THIS ALLOWS USE OF THE "OLD" LEVEL OF FRET ASSIST. 01601600
- SPACE , 01601800
- DMKDSPRQ DC 4A(DMKDSPRQ) +0 IO, TRQ, CPEX BLOK ANCHORS @V3M4026 01602000
- DMKDSPQS DC A(X'F00') +16 50 MILLISEC. DSP. TIME SLICE @V3M4026 01603000
- PTRRTLOC DC A(0) +20 RESERVED @V408246 01604000
- SCHRLOC DC A(DMKSCHRL) +24 LIST OF RUNNABLE USERS @V386198 01605000
- DC V(DMKFREMX) +28 ADDRESS OF 'MAXSIZE' @VA14280 01606100
- DC V(DMKFRETL) +32 ADDR OF CP ASSIST DATA LIST @V386198 01607000
- DC V(DMKVATAT) +36 ADDR OF TABLE 'ARCHTECT' @V386198 01608000
- DSPSAVE DC 6F'0' +40 SAVE AREA FOR CPEX REGS 12-1 @V386198 01609000
- SCHMASK DS 0F +60 BITS REQUIRING CHECK 01610000
- DC AL1(VMNORUN) VMRSTAT @V408246 01611000
- DC AL1(VMRUN+VMINQ+VMTSEND+VMQSEND) VMDSTAT @V408246 01612000
- DC AL1(VMKILL) VMOSTAT @V408246 01613000
- DC AL1(VMPRIDSP) VMQSTAT @V408246 01614000
- SCHMON DS 0F +64 THE ONLY ALLOWABLE VALUE 01615000
- DC AL1(0) VMRSTAT @V408246 01616000
- DC AL1(VMRUN+VMINQ) VMDSTAT @V408246 01617000
- DC AL2(0) VMOSTAT, VMQSTAT @V408246 01618000
- SPACE 2 01619000
- DSP1EXIT DS 0F "DSP1" & "DSP2" ASSIST EXIT LIST @V3M4026 01620000
- SPACE 01621000
- DC A(OFFCALL) +0 USER GOING TO BE LOGGED OFF @V386198 01622000
- DC A(SCHDL) +4 NEED TO GO THRU SCHEDULER @V386198 01623000
- DC A(UNLOCK1) +8 THE SYSTEM IS EXTENDING @V407508 01624000
- DC A(FRETCPEX) +12 CAN'T RELEASE A CPEXBLOK @V386198 01625000
- DC A(CKSHRSYS) +16 CAN'T DO SHARED SYS. CHECKS @V386198 01626000
- DC A(FREELOCK) +20 VMNOECPS BIT IS NON-ZERO @VMD0134 01627100
- DC A(IDLEECPS) +24 CAN'T DISPATCH A USER @V407508 01628000
- DC A(DSP2) +28 ABEND CONDITION DETECTED @V386198 01629000
- EJECT 01630000
- SCHDL CALL DMKSCHDL CALL THE SCHEDULER 01631000
- UNLOCK DS 0H UNLOCK THE CURRENT USER %V407508 01632000
- SPACE 01633000
- DS 0H EXECUTE CP ASSIST DSP2 %V407508 01634000
- DMKDSP2 DC X'E611',S(DSP1LIST,DSP1EXIT) ***%V407508 01635000
- UNLOCK1 DS 0H %V407508 01636000
- SPACE 01637000
- LR R1,R11 SAVE CURRENT R11 USER %V407508 01638000
- CHARGE STOP STOP CHARGING CURRENT VMBLOK %V4M0173 01639000
- L R11,ASYSVM SWITCH R11 TO SYSTEM VMBLOK %V4M0173 01640000
- AIF (NOT &AP).UPBR4 **AIF*** 01640900
- * IN UP-MODE, SUBROUTINE UNLOKVM1 IS A NO-OP. 01641000
- BAL R8,UNLOKVM1 UNLOCK OLD R11 USER %V407508 01642000
- L R15,PREFIXB ACCESS PSA OF OTHER PROCESSOR %V4M0173 01643000
- CLI CPSTATUS-PSA(R15),CPWAIT IS IT IDLE %V4M0173 01644000
- BNE UNLKLAST NO - PROCESS STACKVM %V4M0173 01645000
- TM VMDSTAT-VMBLOK(R1),VMRUN IS OLD R11 VM RUNNABLE @V4M0173 01646000
- BZ UNLKLAST NO- BYPASS WAKE-UP SIGNAL @V4M0173 01647000
- BAL R9,WAKSIG ALERT OTH PROC @VA09257 01648000
- .UPBR4 ANOP **ANOP** 01648100
- UNLKLAST DS 0H SEE IF LASTUSER IS TO BE UNLOCKD %V407508 01649000
- AIF (&AP).APBR5 **AIF*** 01649100
- CLI XTNDLOCK,SET IS SYSTEM IN EXTEND? %VA07369 01649200
- BE FLAGCPEX YES, DO EXTEND PROCESSING %VA07369 01649300
- AGO .UPBR5 **AGO*** 01649400
- .APBR5 ANOP **ANOP** 01649500
- TM APSTAT1,APUOPER IS THE AP OPERATIONAL? %V407508 01650000
- BNO EXTNDTST NO, LEAVE EVERYTHING AS IS %V407508 01651000
- L R1,STACKVM GET ADDR OF UNSTACKED VMBLOK @V407508 01652000
- LTR R1,R1 IS ANY ADDRESS THERE? @V407508 01653000
- BZ NOSTKVM NO, SKIP TRYING TO UNLOCK VM @V407508 01654000
- BAL R8,UNLOKVM UNLOCK VMBLOK IF LOCKED @V407508 01655000
- SLR R1,R1 CLEAR R1 @V407508 01656000
- ST R1,STACKVM CLEAR ADDR OF UNSTACKED VMBLOK @V407508 01657000
- NOSTKVM DS 0H @V407508 01658000
- L R1,LASTUSER GET VALUE OF LASTUSER @V407508 01659000
- CR R1,R11 IS LASTUSER EQUAL TO ASYSVM? @V407508 01660000
- BE EXTNDTST YES, ALREADY UNLOCKED @V407508 01661000
- TM VMOSTAT-VMBLOK(R1),VMSHR WAS LASTUSER USING @V407508 01662000
- * SHARED SYSTEMS @V407508 01663000
- BO EXTNDTST YES, LEAVE LOCKED @V4M0173 01664000
- BAL R8,UNLOKVM2 UNLOCK LASTUSER @V407508 01665000
- ST R11,LASTUSER SET LASTUSER = ASYSVM @V407508 01666000
- EJECT 01667000
- EXTNDTST DS 0H TEST FOR EXTEND %V407508 01668000
- L R2,PREFIXA GET PROCESSOR PREFIX ADDRESS %V407508 01669000
- CLI XTNDLOCK-PSA(R2),SET IS SYSTEM IN EXTEND? %V407508 01670000
- BNE MCHTEST NO, TEST FOR SOFT ERROR PENDING %V407508 01671000
- TM APSTAT1,PROCIO IS THIS THE MAIN PROCESSOR? @V407508 01672000
- BO FLAGCPEX YES, DO EXTEND PROCESSING @V4M0173 01673000
- BAL R9,XTNDAP DO AP-ONLY EXTEND PROCESSING @V407508 01674000
- BAL R9,FREESYS NO, AP RELEASES THE SYSTEM LOCK @V407508 01675000
- SR R0,R0 CLEAR R0 TO INDICATE END COND @V407508 01676000
- LA R1,XTNDLOCK-PSA(,R2) GET ADDR OF EXTEND LOCK @V407508 01677000
- O R1,=A(X'80000000') TURN ON HIGH ORDER BIT @V407508 01678000
- CALL DMKLOKPS SPIN TILL EXTEND COMPLETES @V407508 01679000
- CLI CPFRESW-PSA(R2),SET IS FRESW FLAG ON FOR AP? @V407508 01680000
- BNE CKUSERS2 NO, SELECT A USER TO DISPATCH @V407508 01681000
- LOCK OBTAIN,TYPE=SYS,SPIN=YES GO SPIN ON SYSTEM LOCK @V407508 01682000
- MVI CPFRESW-PSA(R2),NONE TURN OFF FRESW FLAG @V407508 01683000
- B FNDPBLOK FIND 1ST PRIORITY BLOK FOR PROC @V4M0141 01684000
- .UPBR5 ANOP **ANOP** 01684100
- SPACE 01685000
- MCHTEST DS 0H TEST FOR NEEDED RECOVERY %V407508 01686000
- * IN UP-MODE, FLAG CPAPRPND IS ALWAYS 0. 01687100
- * ECPS CHECKS CPMCHLK IN APSTAT2 INSTEAD OF CPMCHSE; 01687600
- * ECPS EXITS TO UNLOCK1 IF THIS FLAG IS ON. 01688100
- TM APSTAT4,CPMCHSE+CPAPRPND TEST MCH RECOVRY FLAGS %VA07615 01688600
- AIF (&AP).APBR6 **AIF*** 01689100
- BZ CKCPSTAK NONE SET, CONTINUE NORMALLY %VA07615 01689600
- CHARGE START START CHARGING SYSTEM VMBLOK @VA07615 01690100
- AGO .UPBR6 **AGO*** 01690600
- .APBR6 ANOP **ANOP** 01691100
- BZ SYSLKTST NONE SET, CHECK SYS LOCK FLAG %VA07615 01691600
- CHARGE START START CHARGING SYSTEM VMBLOK @V4M0173 01693000
- TM APSTAT4,CPAPRPND IS AUTO PROC RECOVERY PENDING? @VA07615 01694100
- BNO MCHSXT NO, GOTO DMKMCH FOR SOFT ERROR @V407508 01695000
- GOTO DMKMCTPR DO AUTOMATIC PROCESSOR RECOVERY @V407508 01696000
- SPACE 01697000
- MCHSXT DS 0H EXIT TO DMKMCHSE @V407508 01698000
- .UPBR6 ANOP **ANOP** 01698100
- GOTO DMKMCHSE DO SOFT ERROR RECOVERY @V407508 01699000
- AIF (NOT &AP).UPTST7 **AIF*** 01699900
- SPACE 01700000
- SYSLKTST DS 0H CHECK SYSTEM LOCK FLAG %VA07615 01701100
- * IN UP-MODE, FLAG CPSYSLK IS ALWAYS 0. 01701200
- TM APSTAT3,CPSYSLK DOES OTHER PROC NEED SYS LOCK? %VA07615 01701300
- BZ CKCPSTAK NO, CONTINUE NORMALLY %VA07615 01701400
- BAL R9,FREESYS RELEASE SYSTEM LOCK @V407508 01702000
- B CKUSERS GO SELECT A USER TO DISPATCH @V407508 01703000
- .UPTST7 ANOP **ANOP** 01703100
- EJECT 01704000
- *. 01705000
- * 01706000
- * OPERATION - 01707000
- * 01708000
- * G. UNSTACK DEFERRED BLOCKS 01709000
- * 1. TO UNSTACK ANY BLOK, FIRST LOCK THE ASSOCIATED VMBLOK. IF 01710000
- * THE LOCK IS NOT AVAILABLE, SKIP THIS BLOK AND SCAN FOR 01711000
- * ANOTHER BLOK FOR A DIFFERENT VM. FOR A GIVEN VM, BLOKS ARE 01712000
- * UNSTACKED IN THE FOLLOWING ORDER: DEFERRED INTERRUPT TASK; 01713000
- * PRIORITY CPEXBLOKS; IO/TRQ BLOKS; NORMAL CPEXBLOKS. 01714000
- * 2. EXAMINE FIRST THE STACK OF IO/TRQ BLOKS. IF SYSTEM IS NOT 01715000
- * EXTENDING, UNSTACK NORMALLY; OTHERWISE, ONLY UNSTACK PAGING 01716000
- * OR PCI IOBLOKS. 01717000
- * 3. BEFORE EXAMINING THE STACK OF CPEXBLOKS, OPEN A WINDOW FOR 01718000
- * INTERRUPTS IF THE SYSTEM IS NOT EXTENDING. 01719000
- * 4. EXAMINE THE STACK OF CPEXBLOKS. IF SYSTEM IS NOT EXTENDING 01720000
- * UNSTACK NORMALLY; OTHERWISE ONLY UNSTACK THOSE THAT WILL 01721000
- * ALLOW THE SYSTEM TO EXTEND. IF A 01722000
- * CPEXBLOK FOR THE OTHER PROCESSOR IS ENCOUNTERED, GIVE UP 01723000
- * THE SYSTEM LOCK, SIGNAL THE OTHER PROCESSOR, AND GO TO 01724000
- * SECTION H TO SELECT A USER TO DISPATCH. 01725000
- * 01726000
- *. 01727000
- SPACE 2 01728000
- EJECT 01729000
- CKCPSTAK EQU * FIRST, TEST FOR STACKED REQUESTS %V3M4038 01730000
- LA R15,DMKDSPRQ GET ADDRESS OF DSP REQUEST STACK %V4M0173 01731000
- C R15,IOBFPNT-IOBLOK(,R15) IS THE LIST EMPTY? %V4M0173 01732000
- BE WINDOW YES, GO OPEN INTERRUPT WINDOW %V4M0173 01733000
- SPACE 01734000
- FLAGCPEX DS 0H %V408246 01735000
- BAL R9,LOCKOBDS GET LOCK FOR DSP STACKS @VA09257 01736000
- SPACE 01737000
- LA R15,DMKDSPRQ POINT TO REQUEST STACK %V3M4038 01738000
- LR R10,R15 INTIALIZE R10 %V407508 01739000
- AIF (&AP).APBR7 **AIF*** 01739100
- CLI XTNDLOCK,SET IS SYSTEM IN EXTEND? %VA07369 01739200
- AGO .UPBR7 **AGO*** 01739300
- .APBR7 ANOP **ANOP** 01739400
- L R3,PREFIXA GET PROCESSOR PREFIX ADDRESS %V407508 01740000
- CLI XTNDLOCK-PSA(R3),SET IS SYSTEM IN EXTEND? %V407508 01741000
- .UPBR7 ANOP **ANOP** 01741100
- BNE NOEXTND NO, CONTINUE NORMALLY %V407508 01742000
- USING IOBLOK,R10 SET UP ADDRESSABILITY TO IOBLOK @V407508 01743000
- NXTIOB DS 0H @V407508 01744000
- L R10,IOBFPNT GET FIRST/NEXT IO OR TRQ BLOK @V407508 01745000
- CLR R10,R15 ANY REQUESTS LEFT? @V407508 01746000
- BE EXTDISP NO, GO LOOK FOR XTND CPEXBLOKS @V407508 01747000
- TM 0(R10),X'80' IS THIS A TRQ @VA07831 01747100
- BO NXTIOB YES, DO NOT UNSTACK @VA07831 01747150
- * BIT IS ON FOR ALL TRQ'S & 01747200
- * OFF FOR ALL PAGING IOB'S 01747250
- TM IOBFLAG,IOBPAG IS IOB A PAGING TASK @V407508 01748000
- BO GETVM YES, GO TO LOCK ASSOCIATED VM @V407508 01749000
- TM IOBCSW+5,PCI IS IOB A PCI INERRUPT? @V407508 01750000
- BNO NXTIOB NO, GO GET NEXT IOBLOK @V407508 01751000
- GETVM DS 0H @V407508 01752000
- AIF (NOT &AP).UPTST8 **AIF*** 01752900
- L R1,IOBUSER GET ADDRESS OF ASSOCIATED VM @V407508 01753000
- * IN UP-MODE, SUBROUTINE LOCKVM IS A NO-OP. 01754000
- BAL R9,LOCKVM GO TO LOCK THIS VM @V407508 01755000
- BNZ DOWN LOCK NOT OBTAINED, TERM VM/370 @V407508 01756000
- .UPTST8 ANOP **ANOP** 01756100
- B PROCIOB LOCK HELD, PROCESS THIS IOB @V407508 01757000
- SPACE 01758000
- NOEXTND DS 0H NORMAL PROCESSING %V407508 01759000
- L R10,IOBFPNT GET FIRST/NEXT IO OR TRQ BLOK %V407508 01760000
- AIF (NOT &AP).UPTST9 **AIF*** 01760900
- CLR R10,R15 ANY REQUESTS LEFT? %V407508 01761000
- BE CKCPREQ NO, GO LOOK FOR CPEXBLOKS %V407508 01762000
- TM APSTAT1,APUOPER IS THIS AN AP SYSTEM? %V4M0173 01763000
- BZ PROCIOB NO, GO PROCESS THIS IOB %V4M0173 01764000
- L R1,IOBUSER GET ADDRESS OF ASSOCIATED VM @V407508 01765000
- BAL R9,LOCKVM GO TO LOCK THIS VM @V407508 01766000
- BZ TESTDEF LOCK OBTAINED @VA09257 01767100
- L R2,PREFIXB ACCESS OTHER PSA @VA09257 01767120
- CLI CPSTATUS-PSA(R2),CPRUN IS OTHER PROCR ENABLED @VA09257 01767140
- BNE NOEXTND NO, BYPASS IOB @VA09257 01767160
- B SIGPDSP YES, SIGNAL DISPATCH @VA09257 01767180
- DSPSIG SIGNAL DISPATCH @VA09257 01767200
- BR R9 @VA09257 01767220
- WAKSIG SIGNAL WAKEUP @VA09257 01767240
- BR R9 @VA09257 01767260
- TESTDEF DS 0H @VA09257 01767280
- DROP R11 STOP USING R11 FOR VMBLOK @V407508 01768000
- USING VMBLOK,R1 SET UP ADDRESSABILITY TO VMBLOK @V407508 01769000
- TM VMPEND,VMDEFSTK IS A DEFERRED INTERRUPT PENDING @V407508 01770000
- BNO TESTP NO, TEST FOR PRIORITY CPEXBLOKS @V4M0141 01771000
- L R2,VMDFTPNT GET ADDRESS OF DEFERRED INT TASK @V407508 01772000
- CLC LPUADDRX,CPEXPROC-CPEXBLOK(R2) IS THIS DEFERRED @V407508 01773000
- * TASK FOR THE OTHER PROCESSOR? @V407508 01774000
- BNE PROCCP GO TO UNSTACK THIS TASK @V407508 01775000
- B SIGNLDSP GO ISSUE DISPATCH SIGNAL @V407508 01776000
- SPACE 01777000
- TESTP DS 0H @V407508 01778000
- LH R2,VMPRRCT GET CNT OF PRIORITY CPEXBLOKS @V4M0141 01779000
- LTR R2,R2 ARE THERE PRIORITY CPEXBLOKS? @VA07581 01779100
- BNZ FINDPTSK FIND PRIORITY CPEXBLOK @V4M0136 01780000
- TESTIO DS 0H @V407508 01781000
- C R10,IOBFPNT-IOBLOK(,R15) IS THIS THE 1ST IOB? @V407508 01782000
- BE PROCIOB YES, NO PRIOR IOB EXIST @V407508 01783000
- LH R2,VMSTKCNT GET IOB/CPEX COUNT @V407508 01784000
- C R2,F1 IS THIS COUNT > 1? @V407508 01785000
- BNH PROCIOB NO, GO PROCESS THIS IOB @V407508 01786000
- BAL R9,FINDIOB LOOK FOR A PRIOR IOB @V407508 01787000
- DROP R1 STOP USING R1 AS VMBLOK BASE @VA07369 01787100
- .UPTST9 ANOP **ANOP** 01787200
- PROCIOB DS 0H PROCESSING FOR IO OR TRQ BLOKS %V407508 01788000
- LM R2,R3,IOBFPNT GET FORWARD & BACKWARD POINTERS %V407508 01789000
- ST R2,IOBFPNT-IOBLOK(,R3) REPLACE FORWARD POINTER %V407508 01790000
- * OF PREVIOUS ELEMENT %V407508 01791000
- ST R3,IOBBPNT-IOBLOK(,R2) REPLACE BACKWARD POINTER %V407508 01792000
- * OF NEXT ELEMENT %V407508 01793000
- USING VMBLOK,R11 START USING R11 AS VMBLOK BASE %V4M0173 01795000
- L R11,IOBUSER SWITCH R11 TO NE VMBLOK %V4M0173 01796000
- LH R2,VMSTKCNT GET IOB/CPEX COUNT FOR THIS VM %V407508 01797000
- BCTR R2,0 DECREMENT THIS COUNT BY 1 %V407508 01798000
- STH R2,VMSTKCNT REPLACE WITH UPDATED COUNT %V407508 01799000
- BAL R9,LOCKRLDS RELEASE LOCK ON DSP STACKS @VA09257 01800100
- AIF (NOT &TRACE(9)).TR10 ** AIF ** %V3M4038 01801000
- TM TRACFLG2,TRAC10 TRACING ACTIVE? %V3M4038 01802000
- BZ NOTRAC3 BRANCH IF NOT %V3M4038 01803000
- * 01804000
- * TRACE UNSTACK OF IOBLOK OR TRQBLOK 01805000
- * 01806000
- LA R14,TRCUNBLK SET CODE FOR UNSTACK OF BLOK %V407508 01807000
- BAL R1,GETRACE GET CURRENT TRACE TABLE ENTRY %V4M0017 01808000
- STCM R11,B'0111',ONE(R15) STORE VMBLOK ADDRESS %V4M0173 01809000
- MVC 4(4,R15),VMRSTAT SAVE STATUS OF NEW VMBLOK %V4M0173 01810000
- ST R10,8(,R15) POINT TO IOBLOK OR TRQBLOK %V3M4038 01811000
- L R1,IOBIRA GET INTERRUPT RETURN ADDRESS %VA07237 01812000
- ST R1,12(,R15) SAVE THE RETURN ADDRESS %VA07237 01813000
- NOTRAC3 EQU * %V3M4038 01814000
- .TR10 ANOP 01815000
- CHARGE START START CHARGING NEW VMBLOK %V4M0173 01816000
- L R12,IOBIRA GET INTERRUPT RETURN ADDRESS %VA07237 01816100
- ST R11,STACKVM REMEMBER UNSTACKED VMBLOK %V407508 01817000
- BR R12 AND GO .. %V3M4038 01818000
- EJECT 01819000
- CKCPREQ EQU * CHECK FOR STACKED CPEXBLOKS %V3M4038 01820000
- * 01826000
- * OPEN WINDOW FOR INTERRUPTS 01827000
- * 01828000
- BAL R9,LOCKRLDS RELEASE LOCK ON DSP STACKS @VA09257 01829100
- WINDOW DS 0H %V4M0173 01830000
- AIF (NOT &AP).UPTST10 **AIF*** 01830900
- TM APSTAT1,PROCIO IS THIS THE MAIN PROCESSOR? %V4M0173 01831000
- BO ENABLE YES, OPEN WINDOW ON MAIN PROC %V4M0173 01832000
- LA R15,DMKDSPRQ GET ADDRESS OF DSP REQUEST STACK @V4M0173 01833000
- C R15,CPEXFPNT-CPEXBLOK(,R15) IS THE LIST EMPTY? @V4M0173 01834000
- BE DONE2 YES, GO FREE THE SYSTEM LOCK AND @V4M0173 01835000
- * SELECT A USER TO DISPATCH @V4M0173 01836000
- B GETDSLOK NO, GO GET LOCK ON DSP STACKS @V4M0173 01837000
- .UPTST10 ANOP **ANOP** 01837100
- SPACE 01838000
- ENABLE DS 0H %V4M0173 01839000
- * THE FOLLOWING 'SSM ENABLE/SSM DISABLE' INSTRUCTIONS ARE 01840000
- * ARE NOT PERFORMED BY ECPS. 01841000
- SSM IOWINDOW OPEN WINDOW FOR IO INTERRUPTS %V4M0173 01842000
- SSM *+1 AND CLOSE AGAIN %V408246 01843000
- * 01844000
- LA R15,DMKDSPRQ GET ADDRESS OF DSP REQUEST STACK %V4M0173 01845000
- C R15,CPEXFPNT-CPEXBLOK(,R15) IS THE LIST EMPTY? %V4M0173 01846000
- BE DONE2 YES, GO GET A USER TO DISPATCH %V4M0173 01847000
- GETDSLOK DS 0H %V4M0173 01848000
- BAL R9,LOCKOBDS GET LOCK ON DSP STACKS @VA09257 01849000
- LA R15,DMKDSPRQ RESTORE ADDRESS OF REQUEST STACK %V407508 01850000
- LR R2,R15 INITIALIZE R2 %V407508 01851000
- USING CPEXBLOK,R2 GET ADDRESSABILITY TO CPEXBLOK %V407508 01852000
- NXTCP DS 0H %V407508 01853000
- L R2,CPEXFPNT GET NEXT CPEXBLOK POINTER %V407508 01854000
- AIF (NOT &AP).UPTST11 **AIF*** 01854900
- CR R2,R15 ANY CPEXBLOKS LEFT? %V407508 01855000
- BE DONE NO, GO GET A USER TO RUN %V407508 01856000
- TM APSTAT1,APUOPER IS THIS AN AP SYSTEM? %V4M0173 01857000
- BZ PROCCP NO, UNSTACK THIS CPEXBLOK %V4M0173 01858000
- L R1,CPEXR11 GET ADDRESS OF ASSOCIATED VM @V407508 01859000
- BAL R9,LOCKVM TRY TO LOCK THIS VM @V407508 01860000
- * UNSTK CPEXBLOK HAS PRIORITY OVER RUNNING USER 01861100
- BZ UNSTK GOT THE LOCK-GO UNSTK CPEXBLOK @VA09257 01861110
- L R15,PREFIXB ACCESS OTH PROC PSA @VA09257 01861120
- TM XCPEND-PSA(R15),XCDISP EXTINT PEND? @VA09257 01861130
- BO NOSIGNAL YES-SIGP REDUNDANT @VA09257 01861140
- CLI CPSTATUS-PSA(R15),CPRUN RUNNING USER? @VA09257 01861150
- BZ NOSIGNAL NO - DON'T BOTHER @VA09257 01861160
- B SIGPDSP @VA09257 01861170
- NOSIGNAL LA R15,DMKDSPRQ RESTORE R15 @VA09257 01861180
- B NXTCP SEE IF MORE ON Q @VA09257 01861190
- UNSTK DS 0H @VA09257 01861200
- DROP R11 STOP USING R11 AS VMBLOK BASE @V407508 01862000
- USING VMBLOK,R1 USE R1 AS BASE FOR VMBLOK @V407508 01863000
- TM VMPEND,VMDEFSTK IS A DEFERRED INTERRUPT PENDING @V407508 01864000
- BNO TSTP NO, TEST FOR PRIORITY CPEXBLOKS @V4M0141 01865000
- L R2,VMDFTPNT GET ADDRESS OF DEFERRED INT TASK @V407508 01866000
- CLC LPUADDRX,CPEXPROC IS THIS DEFERRED TASK FOR THE @V407508 01867000
- * OTHER PROCESSOR @V407508 01868000
- BNE PROCCP GO TO UNSTACK THIS TASK @V407508 01869000
- B SIGNLDSP GO ISSUE DISPATCH SIGNAL @V407508 01870000
- SPACE 01871000
- TSTP DS 0H @V407508 01872000
- LH R3,VMPRRCT GET CNT OF PRIORITY CPEXBLOKS @V4M0141 01873000
- LTR R3,R3 ARE THERE ANY PRIORITY CPEXBLOKS @VA07381 01873100
- BNZ FINDPTSK FIND PRIORITY CPEXBLOK @V4M0136 01874000
- TSTIO DS 0H @V407508 01875000
- LH R3,VMSTKCNT GET IOB/CPEX COUNT @V407508 01876000
- C R3,F1 IS THIS COUNT > 1? @V407508 01877000
- BNH TSTCP NO, TEST CPEXBLOK FOR AFFINITY @V4M0141 01878000
- BAL R9,FINDIOB LOOK FOR A PRIOR IOB @V407508 01879000
- BAL R9,FINDCP LOOK FOR A PRIOR CPEXBLOK @V407508 01880000
- TSTCP DS 0H TEST CPEXBLOK FOR PROC AFFINITY @V4M0141 01881000
- CLC CPEXPROC,LPUADDRX IS THIS CPEXBLOK STACKED FOR @V4M0141 01882000
- * THE OTHER PROCESSOR? @V4M0141 01883000
- BNE PROCCP NO, GO PROCESS THIS CPEXBLOK @V4M0141 01884000
- SIGNLDSP DS 0H SIGNAL OTHER PROCESSOR @V4M0141 01885000
- BAL R8,UNLOKVM1 UNLOCK THIS VM @V4M0141 01886000
- SIGPDSP DS 0H @VA09257 01886500
- BAL R9,LOCKRLDS RELEASE LOCK ON DSP STACKS @VA09257 01887100
- BAL R9,FREESYS RELEASE THE SYSTEM LOCK @V4M0141 01888000
- L R15,PREFIXB ACCESS OTHER PSA @VA08311 01888400
- TM XCPEND-PSA(R15),XCDISP IS DISPATCH XC PENDING ? @VA08311 01888500
- BO CKUSERS YES- SKIP REDUNDANT SIGNAL @VA08311 01888600
- BAL R9,DSPSIG TELL OTH PROC ABOUT CPEXBLOK @VA09257 01889000
- B CKUSERS GO SELECT A USER TO DISPATCH @V4M0141 01890000
- DROP R1 STOP USING R1 AS VMBLOK BASE @VA07369 01890100
- .UPTST11 ANOP **ANOP** 01890200
- SPACE 01891000
- PROCCP DS 0H %V407508 01892000
- L R3,CPEXFPNT GET ADDRESS OF NEXT ELEMENT %V407508 01893000
- L R4,CPEXBPNT GET ADDRESS OF PREVIOUS ELEMENT %V407508 01894000
- ST R3,CPEXFPNT-CPEXBLOK(,R4) REPLACE FORWARD PTR %V407508 01895000
- * OF PREVIOUS ELEMENT %V407508 01896000
- ST R4,CPEXBPNT-CPEXBLOK(,R3) REPLACE BACKWARD PTR %V407508 01897000
- * OF NEXT ELEMENT %V407508 01898000
- USING VMBLOK,R11 USE R11 AS BASE FOR VMBLOK %V4M0173 01900000
- L R11,CPEXR11 SWITCH R11 TO NEW VMBLOK %V4M0173 01901000
- AIF (NOT &AP).UPTST12 **AIF*** 01901900
- * IN UP-MODE, FLAG CPEXPRIO IS NEVER ON. 01902000
- TM CPEXTYPE,CPEXPRIO IS THIS A PRIORITY CPEXBLOK? %V4M0141 01903000
- BZ CHKNORM NO, CHECK FOR NORMAL CPEXBLOK %V407508 01904000
- LH R3,VMPRRCT GET CNT OF PRIORITY CPEXBLOKS @V4M0141 01905000
- BCTR R3,0 DECREMENT THIS COUNT BY 1 @V407508 01906000
- STH R3,VMPRRCT REPLACE WITH UPDATED COUNT @V407508 01907000
- B NEXT CONTINUE PROCESSING BLOK @V407508 01908000
- SPACE 01909000
- CHKNORM DS 0H %V407508 01910000
- * IN UP-MODE, FLAG CPEXDEFR IS NEVER ON. 01911000
- TM CPEXTYPE,CPEXDEFR IS THIS A DEFERRED INT TASK? %V407508 01912000
- BZ NORMCP NO, MUST BE A NORMAL CPEXBLOK %V407508 01913000
- NI VMPEND,X'FF'-VMDEFSTK TURN OFF DEFERRED FLAG @V407508 01914000
- B NEXT CONTINUE PROCESSING BLOK @V407508 01915000
- SPACE 01916000
- NORMCP DS 0H %V407508 01917000
- .UPTST12 ANOP **ANOP** 01917100
- LH R3,VMSTKCNT GET IOB/CPEX COUNT FOR THIS VM %V407508 01918000
- BCTR R3,0 DECREMENT THIS COUNT BY 1 %V407508 01919000
- STH R3,VMSTKCNT REPLACE WITH UPDATED COUNT %V407508 01920000
- NEXT DS 0H %V407508 01921000
- BAL R9,LOCKRLDS RELEASE LOCK ON DSP STACKS @VA09257 01922100
- CHARGE START START CHARGING NEW VMBLOK %V4M0173 01923000
- ST R11,STACKVM REMEMBER UNSTACKED VMBLOK %V407508 01924000
- DROP R2 STOP USING R2 AS BASE FOR CPEXBK %V407508 01925000
- USING CPEXBLOK,R1 USE R1 AS BASE FOR CPEXBLOK %V407508 01926000
- LR R1,R2 GET CPEXBLOK ADDRESS IN R1 %V407508 01927000
- LM R5,R7,CPEXADD GET EXECUTION ADDRESS, GPR0,1 %V3M4038 01928000
- LM R2,R4,CPEXREGS+12*4 GET GPRS 12-14 %V3M4038 01929000
- STM R2,R7,DSPSAVE SAVE REGS ACROSS CALL TO FRET %V3M4038 01930000
- LM R2,R11,CPEXREGS+2*4 GET NEW USER'S GPR2-11 %V3M4038 01931000
- LA R0,CPEXSIZE GET SIZE OF CPEXBLOK %VA07369 01931100
- AIF (NOT &AP).UPTST13 **AIF*** 01931200
- * IN UP-MODE, FLAG CPEXDEFR IS NEVER ON. 01932000
- TM CPEXTYPE,CPEXDEFR IS THIS A DEFERRED INT TASK %V407508 01933000
- BO NOFRET YES, DO NOT FRET STORAGE %V407508 01934000
- * IN UP-MODE, FLAG CPEXLPSW IS NEVER ON. 01936000
- TM CPEXTYPE,CPEXLPSW IS THIS A 'SWITCH' CPEXBLOK? %V407508 01937000
- BO CPLPSW YES, SAVE CPEXR15 BEFORE FRET %V407508 01938000
- .UPTST13 ANOP **ANOP** 01938100
- FRETCPEX CALL DMKFRET TO FREE STORAGE %V3M4038 01939000
- NOFRET DS 0H %V407508 01940000
- LM R12,R1,DSPSAVE RESTORE KEY REGS AFTER CALL %V3M4038 01941000
- LTR R15,R15 SET CONDITION CODE %V3M4038 01942000
- BR R15 AND GO ... %V3M4038 01943000
- SPACE 01944000
- AIF (NOT &AP).UPTST14 **AIF*** 01944900
- CPLPSW DS 0H @V407508 01945000
- L R14,CPEXR15 GET CPEXR15 VALUE @V407508 01946000
- ST R14,DSPSAVE+OFFR15 SAVE ACROSS CALL TO FRET @V407508 01947000
- MVC PSWADDR,CPEXADD SAVE CPEXADD ACROSS FRET CALL @V407508 01948000
- CALL DMKFRET RETURN CPEXBLOK TO FREE STORAGE @V407508 01949000
- MVC TEMPSAVE(LNPSW),CPPSW SET UP PSW IN TEMPSAVE @V407508 01950000
- LM R12,R1,DSPSAVE RESTORE REGS AFTER CALL TO FRET @V407508 01951000
- LPSW TEMPSAVE LOAD PSW TO GO TO EXECUTION ADDR @V407508 01952000
- .UPTST14 ANOP **ANOP** 01952100
- SPACE 2 01953000
- EXTDISP EQU * HERE IF THE SYSTEM IS EXTENDING -- 01954000
- LM R3,R7,EXTADDRS GET VALUES OF ALLOWED EXITS @V407508 01955000
- LR R2,R15 INITIALIZE R2 @V407508 01956000
- DROP R1 STOP USING R1 AS CPEXBLOK BASE @V407508 01957000
- USING CPEXBLOK,R2 USE R2 AS CPEXBLOK BASE @V407508 01958000
- EXTCP DS 0H @V407508 01959000
- L R2,CPEXFPNT GET ADDRESS OF NEXT CPEXBLOK @V407508 01960000
- CR R2,R15 ANY CPEXBOLKS LEFT? @V407508 01961000
- BE DONE NO, GO RELEASE LOCKS AND WAIT @V407508 01962000
- L R14,CPEXADD GET VALUE OF EXIT ADDRESS @V407508 01963000
- LA R14,0(,R14) CLEAR HIGH-ORDER BYTE @V407508 01964000
- CR R3,R14 IS THIS AN ALLOWED EXIT? @V407508 01965000
- BE EXTVM YES, GO LOCK VM @V407508 01966000
- CR R4,R14 ANOTHER ALLOWED EXIT? @V407508 01967000
- BE EXTVM YES, GO LOCK VM @V407508 01968000
- CR R5,R14 ANOTHER ALLOWED EXIT? @V407508 01969000
- BE EXTVM YES, GO LOCK VM @V407508 01970000
- CR R6,R14 IS EXIT FOR AN I/O ERROR? @V407508 01971000
- BE PAGCHK YES, CHECK IF IT IS PAGING @V407508 01972000
- CR R7,R14 ANOTHER I/O ERROR EXIT? @V407508 01973000
- BNE EXTCP NO, GET NEXT CPEXBLOK @V407508 01974000
- PAGCHK DS 0H @V407508 01975000
- L R10,CPEXR10 GET IOBLOK ADDR FROM CPEXBLOK @V407508 01976000
- TM IOBFLAG,IOBPAG IS IOBLOK FOR PAGING? @V407508 01977000
- BO EXTVM YES, GO LOCK VM @V407508 01978000
- L R8,CPEXR8 GET RDEVBLOK ADDRESS @V407508 01979000
- L R10,RDEVFIOB-RDEVBLOK(,R8) GET QUEUED IOBLOK @V407508 01980000
- CKLIST DS 0H TEST ALL IOBLOKS QUEUED @V407508 01981000
- CR R8,R10 ANY MORE IOBLOKS? @V407508 01982000
- BE EXTCP NO, GO GET NEXT CPEXBLOK @V407508 01983000
- TM IOBFLAG,IOBPAG IS IOBLOK FOR PAGING? @V407508 01984000
- BO EXTVM YES, GO LOCK VM @V407508 01985000
- L R10,IOBFPNT GET NEXT IOBLOK ON QUEUE @V407508 01986000
- B CKLIST GO CHECK THIS IOBLOK @V407508 01987000
- EXTVM DS 0H @V407508 01988000
- AIF (NOT &AP).UPTST15 **AIF*** 01988900
- L R1,CPEXR11 GET ADDRESS OF ASSOCIATED VM @V407508 01989000
- * IN UP-MODE, SUBROUTINE LOCKVM IS A NO-OP. 01990000
- BAL R9,LOCKVM TRY TO LOCK THIS VM @V407508 01991000
- BNZ DOWN LOCK NOT OBTAINED, TERM VM/370 @V407508 01992000
- .UPTST15 ANOP **ANOP** 01992100
- B PROCCP LOCK OBTAINED, PROCESS CPEXBLOK @V407508 01993000
- DROP R2 STOP USING R2 AS CPEXBLOK BASE @V407508 01994000
- EJECT 01995000
- * 01996000
- * INTERNAL SUBROUTINES 01997000
- * 01998000
- AIF (NOT &AP).UPTST16 **AIF*** 01998900
- LOCKVM DS 0H @V407508 01999000
- * R1=ADDR OF VM TO BE LOCKED @V407508 02000000
- TM APSTAT1,APUOPER IS THIS AN AP SYSTEM? @V4M0136 02001000
- BZR R9 NO, RETURN TO CALLER @V4M0136 02002000
- C R1,LASTUSER IS VM = LASTUSER? @V407508 02003000
- BER R9 YES, RETURN-ALREADY LOCKED @V407508 02004000
- C R1,ASYSVM IS VM = ASYSVM? @V407508 02005000
- BER R9 YES, RETURN-NO LOCK NEEDED @V407508 02006000
- LOCK OBTAIN,TYPE=VMBLOK,SPIN=NO,SAVE TRY TO LOCK VM @V407508 02007000
- BR R9 RETURN TO CALLER @V407508 02008000
- * 02009000
- UNLOKVM DS 0H UNLOCK A VM @V407508 02010000
- * R1=ADDR OF VM TO BE UNLOCKED @V407508 02011000
- LH R0,LPUADDR GET LOGICAL CPU ADDRESS @V407508 02012000
- CH R0,VMLOCK+2-VMBLOK(,R1) IS VMBLOK LOCKED? @V407508 02013000
- BNER R8 NO, RETURN TO CALLER @V407508 02014000
- UNLOKVM1 DS 0H SKIP LASTUSER CHECK @V407508 02015000
- C R1,LASTUSER IS VM = LASTUSER? @V407508 02016000
- BER R8 YES, RETURN-DO NOT UNLOCK @V407508 02017000
- C R1,ASYSVM IS VM = ASYSVM? @V407508 02018000
- BER R8 YES, RETURN-ASYSVM NOT LOCKED @V407508 02019000
- UNLOKVM2 DS 0H SKIP ASYSVM CHECK @V407508 02020000
- LOCK RELEASE,TYPE=VMBLOK,SAVE GO UNLOCK THIS VM @V407508 02021000
- BR R8 RETURN TO CALLER @V407508 02022000
- EJECT 02023000
- * 02024000
- TSTSYS DS 0H @V407508 02025000
- TM APSTAT1,APUOPER IS THIS AN AP SYSTEM? @V407508 02026000
- BZR R9 NO, RETURN TO CALLER @V407508 02027000
- L R2,=A(DMKLOKSY+2) GET ADDRESS OF SYSTEM LOCK @V407508 02028000
- CLC LPUADDR,0(R2) IS SYSTEM LOCK HELD BY THIS PROC?@V407508 02029000
- BER R9 YES, RETURN TO CALLER @V407508 02030000
- GETSYS DS 0H TRY TO GET SYSTEM LOCK @V407508 02031000
- LOCK OBTAIN,TYPE=SYS,SPIN=NO TRY TO GET SYSTEM LOCK @V407508 02032000
- BR R9 RETURN TO CALLER @V407508 02033000
- * 02034000
- FREESYS DS 0H RELEASE SYSTEM LOCK @V407508 02035000
- LOCK RELEASE,TYPE=SYS RELEASE SYSTEM LOCK @V407508 02036000
- BR R9 RETURN TO CALLER @V407508 02037000
- .UPTST16 ANOP **ANOP** 02037100
- * 02038000
- GETRACE DS 0H GET CURRENT TRACE TABLE ENTRY %V407508 02039000
- TRACE CODE=(R14),R15,R2,R3 GET CURRENT TRACE ENTRY %V407508 02040000
- BR R1 RETURN TO CALLER %V4M0017 02041000
- EJECT 02042000
- AIF (NOT &AP).UPTST17 **AIF*** 02042900
- * 02043000
- STKDEF DS 0H 02044000
- TM VMPEND,VMDEFSTK IS A DEFERRED TASK PENDING @V407508 02045000
- BOR R9 YES, RETURN TO CALLER @V407508 02046000
- L R1,VMDFTPNT GET ADDR OF DEFERRED TASK BLOK @V407508 02047000
- USING CPEXBLOK,R1 GET ADDRESSABILITY TO DEF TASK @V407508 02048000
- STM R0,R15,CPEXREGS SAVE CURRENT REGS @V407508 02049000
- L R2,ADSPCH GET ADDR OF DSP MAIN ENTRY @V407508 02050000
- ST R2,CPEXADD SET UP RETURN ADDR FOR DEF TASK @V407508 02051000
- CALL DMKSTKDE STACK DEFERRED TASK @V407508 02052000
- DROP R1 @V407508 02053000
- BR R9 RETURN TO CALLER @V407508 02054000
- EJECT 02071000
- * 02072000
- XTNDAP DS 0H AP-ONLY EXTEND PROCESSING @V407508 02073000
- C R11,LASTUSER IS LASTUSER EQUAL TO ASYSVM? @V407508 02074000
- BER R9 YES, RETURN TO CALLER @V407508 02075000
- L R11,LASTUSER SWITCH R11TO LASTUSER @V4M0173 02076000
- CHARGE START START CHARGING LASTUSER @V4M0173 02077000
- CALL DMKVMASH CHECK FOR CHANGED PAGES @V407508 02078000
- NOUNSHR DS 0H @V4M0136 02082000
- CHARGE STOP STOP CHARGING LASTUSER @V4M0173 02083000
- L R11,ASYSVM SWITCH R11 TO SYSTEM VMBLOK @V4M0173 02084000
- L R1,LASTUSER GET VALUE OF LASTUSER @V407508 02085000
- BAL R8,UNLOKVM2 UNLOCK LASTUSER @V407508 02086000
- ST R11,LASTUSER SET LASTUSER TO ASYSVM @V407508 02087000
- BR R9 RETURN TO CALLER @V407508 02088000
- .UPTST17 ANOP **ANOP** 02088100
- * 02089000
- INCPROBT DS 0H INCREMENT PROBLEM STATE TIME %V407508 02090000
- CLC VMTMOUTQ,PROBSTRT HAS CALCULATION BEEN DONE? %VA07582 02090100
- BER R8 YES, RETURN TO CALLER %VA07582 02090200
- LM R2,R3,VMTMOUTQ GET TIMER AT PROBLEM STATE END %V407508 02091000
- LM R4,R5,PROBSTRT GET TIMER AT PROBLEM STATE START %V407508 02092000
- SLR R5,R3 CALC 2ND HALF OF ELAPSED TIME %V407508 02093000
- BNM *+6 WAS THERE A CARRY? %V407508 02094000
- BCTR R4,0 NO CARRY, SIGNIFICANT DIFFERENCE %V407508 02095000
- SLR R4,R2 CALC 1ST HALF OF ELAPSED TIME %V407508 02096000
- LM R2,R3,PROBTIME GET TOTAL PROBLEM TIME %V4M0142 02097000
- SLR R3,R5 SUBTRCT 2ND HALF OF ELAPSED TIME %V4M0142 02098000
- BNM *+6 WAS THERE A CARRY? %V4M0142 02099000
- BCTR R2,0 NO CARRY, SIGNIFICANT DIFFERENCE %V4M0142 02100000
- SLR R2,R4 SUBTRCT 1ST HALF OF ELAPSED TIME %V4M0142 02101000
- STM R2,R3,PROBTIME STORE NEW TOTAL PROBLEM TIME %V4M0142 02102000
- BR R8 RETURN TO CALLER %V407508 02103000
- EJECT 02104000
- AIF (NOT &AP).UPTST18 **AIF*** 02104900
- * 02105000
- FINDPTSK DS 0H FIND PRIORITY CPEXBLOK FOR VM @V4M0141 02106000
- * R1=VM ADDR; R15=DSP STACK ADDR @V407508 02107000
- USING CPEXBLOK,R14 USE R14 AS BASE FOR CPEXBLOK @V407508 02108000
- LR R14,R15 LOAD POINTER TO START SEARCH @V407508 02109000
- FNDNXTP DS 0H @V407508 02110000
- L R14,CPEXFPNT GET FIRST/NEXT CPEXBLOK @V407508 02111000
- CR R14,R15 ANY CPEXBLOKS LEFT? @V407508 02112000
- BE DOWN NO, TERMINATE VM/370 @V4M0136 02113000
- C R1,CPEXR11 IS CPEXBLOK FOR THIS VM? @V407508 02114000
- BNE FNDNXTP NO, GO GET NEXT CPEXBLOK @V407508 02115000
- TM CPEXTYPE,CPEXPRIO IS THIS A PRIORITY CPEXBLOK? @V4M0141 02116000
- BNO FNDNXTP NO, GO GET NEXT CPEXBLOK @V407508 02117000
- LH R8,CPEXPROC GET ADDR OF RELATED PROCESSOR @V407508 02118000
- LTR R8,R8 IS THERE A RELATED PROCESSOR @VA07402 02118100
- BZ PICKCPEX NO, TAKE THIS CPEXBLOK @VA07402 02118300
- CH R8,LPUADDR IS THIS THE RELATED PROCESSOR @V407508 02119000
- BNE SIGNLDSP NO, GO ISSUE DISPATCH SIGNAL @V4M0136 02120000
- LR R2,R14 GET ADDRESS OF THIS CPEXBLOK @V407508 02121000
- B PROCCP GO PROCESS THIS CPEXBLOK @V407508 02122000
- * 02123000
- FINDIOB DS 0H FIND IO OR TRQ REQUEST @V407508 02124000
- * R1=VM ADDR; R15=DSP STACK ADDR @V407508 02125000
- USING IOBLOK,R14 USE R14 AS BASE FOR IOBLOK @V407508 02126000
- LR R14,R15 LOAD POINTER TO START SEARCH @V407508 02127000
- FNDNXTI DS 0H @V407508 02128000
- L R14,IOBFPNT GET FIRST/NEXT IOBLOK @V407508 02129000
- CR R14,R15 ANY IOBLOKS LEFT? @V407508 02130000
- BER R9 NO, RETURN TO CALLER @V407508 02131000
- C R1,IOBUSER IS IOBLOK FOR THIS VM? @V407508 02132000
- BNE FNDNXTI NO, GO GET NEXT IOBLOK @V407508 02133000
- LR R10,R14 GET ADDRESS OF THIS IOBLOK @V407508 02134000
- B PROCIOB GO PROCESS THIS IOBLOK @V407508 02135000
- * 02136000
- FINDCP DS 0H FIND CPEXBLOK @V407508 02137000
- * R1=VM ADDR; R15=DSP STACK ADDR @V407508 02138000
- USING CPEXBLOK,R14 USE R14 AS BASE FOR CPEXBLOK @V407508 02139000
- LR R14,R15 LOAD POINTER TO START SEARCH @V407508 02140000
- FNDNXTC DS 0H @V407508 02141000
- L R14,CPEXFPNT GET FIRST/NEXT CPEXBLOK @V407508 02142000
- CR R14,R2 ANY PRIOR CPEXBLOKS LEFT? @V4M0141 02143000
- BER R9 NO, RETURN TO CALLER @V407508 02144000
- C R1,CPEXR11 IS CPEXBLOK FOR THIS VM? @V407508 02145000
- BNE FNDNXTC NO, GO GET NEXT CPEXBLOK @V407508 02146000
- TM CPEXTYPE,CPEXDEFR+CPEXPRIO IS IT A NORMAL BLOK? @V4M0141 02147000
- BNZ FNDNXTC NO, GO GET NEXT CPEXBLOK @V407508 02148000
- LH R8,CPEXPROC GET ADDR OF RELATED PROC, IF ANY @V4M0141 02149000
- LTR R8,R8 IS THERE A RELATED PROC? @V4M0141 02150000
- BZ PICKCPEX NO, TAKE THIS CPEXBLOK @V4M0141 02151000
- CH R8,LPUADDRX IS IT STACKED FOR OTHER PROC? @V4M0141 02152000
- BE FNDNXTC YES, GO GET NEXT CPEXBLOK @V4M0141 02153000
- PICKCPEX DS 0H @V4M0141 02154000
- LR R2,R14 GET ADDRESS OF THIS CPEXBLOK @V407508 02155000
- B PROCCP GO PROCESS THIS CPEXBLOK @V407508 02156000
- DROP R14 STOP USING R14 AS BASE @V407508 02157000
- * 02158000
- FNDPBLOK DS 0H FIND 1ST PRIORITY BLOK FOR PROC @V4M0141 02159000
- BAL R9,LOCKOBDS GET LOCK ON DISPATCH STACKS @VA09257 02160000
- LA R15,DMKDSPRQ GET ADDRESS OF DSP STACKS @V407508 02161000
- LR R2,R15 LOAD POINTER TO START SEARCH @V407508 02162000
- USING CPEXBLOK,R2 USE R2 AS BASE FOR CPEXBLOK @V407508 02163000
- NXTP DS 0H @V407508 02164000
- L R2,CPEXFPNT GET FIRST/NEXT CPEXBLOK @V407508 02165000
- CR R2,R15 ANY CPEXBLOKS LEFT? @V407508 02166000
- BE DOWN NO, TERMINATE VM/370 @V407508 02167000
- TM CPEXTYPE,CPEXPRIO IS THIS A PRIORITY CPEXBLOK @V4M0141 02168000
- BNO NXTP NO, GO GET NEXT CPEXBLOK @V407508 02169000
- CLC LPUADDR,CPEXPROC IS THIS THE RELATED PROCESSOR? @V407508 02170000
- BNE NXTP NO, GO GET NEXT CPEXBLOK @V407508 02171000
- L R1,CPEXR11 GET ADDRESS OF ASSOCIATED VM @V407508 02172000
- BAL R9,LOCKVM TRY TO LOCK THIS VM @V407508 02173000
- BZ PROCCP GO PROCESS THIS CPEXBLOK @V407508 02174000
- DROP R2 STOP USING R2 AS CPEXBLOK BASE @V407508 02175000
- DOWN DS 0H TERMINATE VM/370 @V407508 02176000
- ABEND 5 EXPECTED BLOK NOT FOUND @V407508 02177000
- .UPTST18 ANOP **ANOP** 02177100
- EJECT 02178000
- *. 02179000
- * 02180000
- * OPERATION - 02181000
- * 02182000
- * H. SELECT A USER FOR DISPATCHING 02183000
- * 1. IF THE SYSTEM IS LOCKED FOR RUNNING USERS DUE TO EXTEND, 02184000
- * CPFRELK BEING SET, OR CPSHRLK BEING SET, GO TO STEP 4 TO 02185000
- * LOAD A WAIT STATE. 02186000
- * 2. SCAN THE RUN LIST FOR A DISPATCHABLE CANDIDATE - THAT IS, A 02187000
- * RUNNABLE VM THAT EITHER HAS NO AFFINITY OR AFFINITY TO THE 02188000
- * CURRENT PROCESSOR. TRY TO LOCK THIS VM, IF THE LOCK IS NOT 02189000
- * AVAILABLE, LOOK FOR ANOTHER CANDIDATE. IF THE RUN LIST IS 02190000
- * EXHAUSTED BEFORE A CANDIDATE IS FOUND, GO TO STEP 4 TO LOAD 02191000
- * A WAIT STATE. 02192000
- * 3. ONCE A VM IS LOCKED, CALL DMKVMASH IF NECESSARY TO CHECK 02193000
- * FOR SHARED SYSTEM VIOLATION; SET UP DISPATCH TIME SLICE; 02194000
- * LOAD FLOATING POINT REGS; BUILD RUNPSW, RUNCR0, AND RUNCR1; 02195000
- * CALL DMKVATAB IF SHADOW TABLES ARE BAD; SET UP FOR PER (IF 02196000
- * PER TRACING IS ACTIVE); AND SET UP FOR ASSIST. BEFORE THE 02197000
- * ACTUAL DISPATCH OF THIS VM, PERFORM THE FOLLOWING ADDITIONAL 02198000
- * TASKS: WAKE-UP THE OTHER PROCESSOR, IF IT IS IDLE; ISSUE A 02199000
- * PTLB IF REQUIRED; AND SET THE CLOCK COMPARATOR IF NECESSARY. 02200000
- * THEN DISPATCH THE VM BY LOADING THE TIMERS, CONTROL 02201000
- * REGISTERS, GENERAL REGISTERS, AND PSW. 02202000
- * 4. IF THE SYSTEM IS EXTENDING OR IF CPSHRLK IS SET, OR IF 02203000
- * THERE IS NO DISPATCHABLE USER ON THE RUN LIST, LOAD A WAIT 02204000
- * STAT ENABLED FOR EXTERNAL AND I/O INTERRUPTS. IF THIS 02205000
- * PROCESSOR IS BEING QUIESCED OF IF CPFRELK IS SET, LOAD A 02206000
- * WAIT ENABLED ONLY FOR EXTERNAL INTERRUPTS. 02207000
- * 02208000
- *. 02209000
- SPACE 2 02210000
- DONE DS 0H PREPARE TO SEARCH RUN LIST @V407508 02211000
- BAL R9,LOCKRLDS RELEASE LOCK ON DSP STACKS @VA09257 02212100
- DONE2 DS 0H %V4M0173 02213000
- AIF (NOT &AP).UPTST19 **AIF*** 02213900
- * IN UP-MODE, SUBROUTINE FREESYS IS A NO-OP. 02214000
- BAL R9,FREESYS RELEASE THE SYSTEM LOCK %V407508 02215000
- .UPTST19 ANOP **ANOP** 02215100
- SPACE 2 02216000
- CKUSERS DS 0H %V407508 02217000
- AIF (&AP).APBR8 **AIF*** 02217100
- CLI XTNDLOCK,SET IS SYSTEM IN EXTEND? %VA07369 02217200
- AGO .UPBR8 **AGO*** 02217300
- .APBR8 ANOP **ANOP** 02217400
- L R2,PREFIXA GET PROCESSOR PREFIX ADDRESS %V407508 02218000
- CLI XTNDLOCK-PSA(R2),SET IS SYSTEM IN EXTEND? %V407508 02219000
- .UPBR8 ANOP **ANOP** 02219100
- BE LOADIDLE YES, GO LOAD A WAIT %V4M0006 02220000
- CKUSERS2 DS 0H %V407508 02221000
- AIF (NOT &AP).UPTST20 **AIF*** 02221900
- * IN UP-MODE, FLAG CPFRELK IS NEVER ON. 02222000
- CLI CPFRELK-PSA(R2),SET IS CPFRELK FLAG ON? %V407508 02223000
- BE IDLEB YES, GO LOAD A WAIT %V4M0006 02224000
- .UPTST20 ANOP **ANOP** 02224100
- TM CPSTAT2,CPSHRLK LOCKED FOR RUNUSERS? %V408246 02225000
- * THE FOLLOWING INSTRUCTION IS NOT PERFORMED BY ECPS. 02226000
- BO LOADIDLE YES %V408246 02227000
- * RATHER ECPS DOES THE FOLLOWING: 02228000
- * BO IDLEECPS YES %V407508 02229000
- AIF (NOT &AP).UPTST21 **AIF*** 02229900
- LOCKRL DS 0H %V407508 02250000
- LOCK OBTAIN,TYPE=RL GET LOCK ON RUNLIST %V407508 02251000
- .UPTST21 ANOP **ANOP** 02251100
- L R10,SCHRLOC GET IN-Q VMBLOK LIST ANCHOR %V407508 02252000
- LR R1,R10 LOAD POINTER TO START SEARCH %V407508 02253000
- DROP R11 STOP USING R11 AS VMBLOK BASE %V407508 02254000
- USING VMBLOK,R1 USE R1 AS BASE FOR VMBLOK %V407508 02255000
- AIF (NOT &AP).UPTST22 **AIF*** 02255900
- * THE FLAG IN TEMPSAVE IS NOT MAINTAINED BY ECPS. 02256000
- MVI TEMPSAVE,NONE INIT FLAG TO WAKE-UP OTHER PROC %V4M0001 02257000
- .UPTST22 ANOP **ANOP** 02257100
- FNDUSRA DS 0H %V407508 02258000
- L R1,VMQFPNT GET FIRST/NEXT VMBLOK ON RUNLIST %V407508 02259000
- CR R1,R10 ANY VMBLOKS LEFT? %V407508 02260000
- * THE FOLLOWING INSTRUCTION IS NOT PERFORMED BY ECPS. 02261000
- BE IDLEA NO, GO LOAD A WAIT %V407508 02262000
- * RATHER ECPS DOES THE FOLLOWING: 02263000
- * BE IDLEECPS NO, GO LOAD A WAIT %V407508 02264000
- TM VMDSTAT,VMRUN IS THIS VM RUNNABLE? %V407508 02265000
- BZ FNDUSRA NO, GO GET NEXT VMBLOK %V407508 02266000
- TM VMRSTAT,VMCPWAIT ARE ANY RSTAT FLAGS STILL ON? %V407508 02267000
- BNZ FNDUSRA YES, GO GET NEXT VMBLOK %V407508 02268000
- AIF (NOT &AP).UPTST23 **AIF*** 02268900
- TM APSTAT1,APUOPER IS THIS AN AP SYSTEM? %V4M0173 02269000
- BZ FREELOCK NO, SELECT THIS USER TO RUN %V4M0173 02270000
- TM VMPEND,VMDEFSTK IS A DEFERRED TASK PENDING? @V4M0173 02271000
- BO FNDUSRA YES, SKIP THIS VM @V4M0173 02272000
- TM VMAFF,VMAFFON DOES VM HAVE AFFINITY? @V407508 02273000
- BNO GETLOCK NO, TRY TO LOCK THIS VMBLOK @V4M0155 02274000
- CLC VMAFF,LPUADDR+1 IS AFF FOR THIS PROC? @V407508 02275000
- BE GETLOCK YES, TRY TO LOCK THIS VMBLOK @V4M0155 02276000
- MVI TEMPSAVE,SET SET FLAG TO WAKE-UP OTHER PROC @V4M0155 02277000
- B FNDUSRA GO GET NEXT VMBLOK @V4M0155 02278000
- SPACE 02279000
- GETLOCK DS 0H @V407508 02280000
- L R2,VMSTKCNT GET COUNT OF STACKED BLOCKS @V4M0173 02281000
- LTR R2,R2 ARE ANY BLOCKS STACKED FOR VM? @V4M0173 02282000
- BNZ FNDUSRA SKIP VM IF THERE ARE BLOCKS @V4M0136 02283000
- BAL R9,LOCKVM TRY TO LOCK THIS VM @V407508 02284000
- BNZ FNDUSRA LOCK NOT OBTAINED, GET NEXT VM @V407508 02285000
- TM VMDSTAT,VMRUN IS VM REALLY RUNNABLE? @V407508 02286000
- BNO FREEVM NO, UNLOCK THIS VM & GET ANOTHER @V407508 02287000
- TM VMRSTAT,VMCPWAIT ARE ANY RSTAT FLAGS STILL ON? @V407508 02288000
- BNZ FREEVM YES, GO UNLOCK THIS VM @V407508 02289000
- TM VMPEND,VMDEFSTK IS A DEFERRD TASK PENDING? @V407508 02290000
- BO FREEVM YES, UNLOCK THIS VM @V407508 02291000
- L R2,VMSTKCNT GET COUNT OF STACKED BLOCKS? @V4M0173 02292000
- LTR R2,R2 ARE ANY BLOCKS STACKED FOR VM? @V4M0173 02293000
- BZ FREELOCK NO, SELECT THIS VM @V407508 02294000
- FREEVM DS 0H @V407508 02295000
- BAL R8,UNLOKVM1 UNLOCK VM FROM RUNLIST @V4M0136 02296000
- B FNDUSRA GO GET NEXT VMBLOK ON LIST @V407508 02297000
- .UPTST23 ANOP **ANOP** 02297100
- SPACE 02298000
- * ECPS:VM/370 DSP2 EXIT IF VMNOECPS BYTE IS NON-ZERO @VMD0134 02298100
- FREELOCK DS 0H %V407508 02299000
- LR R10,R1 SAVE VMBLOK JUST SELECTED %V407508 02300000
- DROP R1 STOP USING R1 AS BASE FOR VMBLOK %V407508 02301000
- LOCK RELEASE,TYPE=RL RELEASE RUNLIST LOCK %V407508 02302000
- C R10,RUNUSER IS NEW VM SAME AS RUNUSER? %V407508 02303000
- BNE FNDUSRD NO, NO CHANCE FOR FAST DISPATCH %V407508 02304000
- USING VMBLOK,R10 USE R10 AS BASE FOR VMBLOK %V407508 02305000
- L R0,QUANTUM RESIDUAL SLICE %V408246 02306000
- LTR R0,R0 ANY? %V408246 02307000
- BM GETQS NO %V408246 02308000
- * THE FOLLOWING FAST RE-DISPATCH INSTRUCTIONS ARE NOT 02309000
- * IMPLEMENTED BY ECPS. IF THERE IS TIME REMAINING IN THE 02310000
- * TIMESLICE, ECPS BRANCHES TO SETQUANT. 02311000
- AIF (NOT &AP).UPTST24 **AIF*** 02311900
- C R10,LASTUSER IS RUNUSER = LASTUSER @V407508 02312000
- BE TSTFAST YES, SEE IF O.K. FOR FAST DISP @V407508 02313000
- CLC VMLSTPRC,LPUADDR+1 WAS VM LAST RUN ON THIS PROC @V407508 02314000
- BNE SETQUANT NO, TAKE NORMAL PATH @V407508 02315000
- ST R10,LASTUSER RESET LASTUSER FOR REDISPATCH @V407508 02316000
- TSTFAST DS 0H TEST FOR FAST DISPATCH @V407508 02317000
- .UPTST24 ANOP **ANOP** 02317100
- TM VMDSTAT,VMDSP+VMRUN+VMINQ EVERYTHING IN ORDER? @V408246 02318000
- BNO SETQUANT NO, TAKE NORMAL PATH @V408246 02319000
- TM IOOPSW,4 VIRT. PSW IN I/O OLD? @V408246 02320000
- BNO SETQUANT NO @V408246 02321000
- ST R0,TIMER SET REMAINING TIME SLICE @V408246 02322000
- LM R0,R1,IOOPSW INTERRUPTED PSW @V408246 02323000
- MVI IOOPSW,0 FLAG I/O OLD PSW NOT VIRTUAL @V408246 02324000
- DROP R10 STOP USING R10 AS VMBLOK BASE @V407508 02325000
- USING VMBLOK,R11 USE R11 AS VMBLOK BASE @V407508 02326000
- LR R11,R10 SWITCH R11 TO NEW VM @V4M0173 02327000
- CHARGE START START CHARGING THIS VMBLOK @V4M0173 02328000
- L R15,VMMICRO SET UP TO GET MICBLOK ADDRESS @VA06300 02328100
- LA R15,0(R15) GET MICBLOK ADDRESS, IF ANY @VA06300 02328200
- LTR R15,R15 SEE IF MICBLOK EXISTS @VA06300 02328300
- BZ NOVMA NO, SKIP PENDING INTERRUPT CHECK @VA06300 02328400
- BAL R9,CHKPENDG GO SEE IF MICPEND SHOULD BE SET @VA06300 02328500
- NOVMA DS 0H @VA06300 02328600
- MVI CPSTATUS,CPRUN+CPSUPER SET FLAG FOR RUNNING VM @V407508 02329000
- MVC PROBSTRT,VMTMOUTQ SAVE TIMER AT PROB STATE STRT @V4M0136 02330000
- B DMKDSPA2 SET C.C. AND CONTROL REGS @V408246 02331000
- SPACE 02332000
- FNDUSRD DS 0H %V408246 02333000
- L R2,RUNUSER GET ADDRESS OF LAST RUNNING VM %V407508 02334000
- AIF (NOT &AP).UPTST25 **AIF*** 02334900
- C R2,LASTUSER IS RUNUSER STILL LOCKED? %V407508 02335000
- BNE *+8 NO, LEAVE FLAG ALONE %V407508 02336000
- .UPTST25 ANOP **ANOP** 02336100
- NI VMDSTAT-VMBLOK(R2),X'FF'-VMDSP RESET FLAG %V407508 02337000
- L R2,LASTUSER GET LASTUSER %V407508 02338000
- CR R2,R11 IS LASTUSER = ASYSVM? %V407508 02339000
- BE GETQS YES, LASTUSER ALREADY UNLOCKED %V407508 02340000
- CR R2,R10 IS THIS A SWITCH FROM LASTUSER? %V4M0136 02341000
- BE GETQS NO, NO NEED TO CHECK LASTUSER %V4M0136 02342000
- TM VMOSTAT-VMBLOK(R2),VMSHR WAS LASTUSER SHARED? %V407508 02343000
- BNO FRELAST NO, GO UNLOCK LASTUSER %V407508 02344000
- LR R11,R2 SWITCH R11 TO LASTUSER %V4M0173 02345000
- CHARGE START START CHARGING LASTUSER %V4M0173 02346000
- CKSHRSYS CALL DMKVMASH CHECK FOR CHANGED PAGE %V408246 02347000
- CHARGE STOP STOP CHARGING LASTUSER %V4M0173 02360000
- FRELAST DS 0H %V407508 02361000
- AIF (NOT &AP).UPTST28 **AIF*** 02361900
- L R1,LASTUSER GET ADDRESS OF LASTUSER %V407508 02362000
- * IN UP-MODE, SUBROUTINE UNLOKVM2 IS A NO-OP. 02363000
- BAL R8,UNLOKVM2 UNLOCK LASTUSER %V407508 02364000
- .UPTST28 ANOP **ANOP** 02364100
- GETQS DS 0H %V408246 02365000
- L R0,DMKDSPQS GET FULL TIMESLICE %V408246 02366000
- TM VMQLEVEL-VMBLOK(R10),VMCOMP COMPUTE BOUND? %V407508 02367000
- BZ *+8 NO -- %V408246 02368000
- SLL R0,2 YES - QUADRUPLE SLIICEI %V408246 02369000
- SETQUANT DS 0H %V408246 02370000
- ST R0,TIMER SET QUANTUM %V408246 02371000
- LR R11,R10 SWITCH R11 TO NEW VM %V4M0173 02372000
- CHARGE START START CHARGING THIS VMBLOK %V4M0173 02373000
- ST R11,LASTUSER SET LASTUSER %V407508 02374000
- AIF (NOT &AP).UPTST29 **AIF*** 02374900
- * VMLSTPRC IS ALWAYS 0 WHEN THE SYSTEM IS RUNNING ON A 02375000
- * PROCESSOR WITHOUT THE MULTI-PROCESSING FEATURE. 02376000
- MVC VMLSTPRC,LPUADDR+1 INDICATE VM RUN ON THIS PROC %V407508 02377000
- .UPTST29 ANOP **ANOP** 02377100
- ST R11,RUNUSER SET RUNUSER %V4M0173 02380000
- AIF (NOT &FLOATPT).FPR1 %V407508 02381000
- LD Y0,VMFPRS LOAD FLOAT REGS FROM NEW VM %V407508 02382000
- LD Y2,VMFPRS+8 .. %V407508 02383000
- LD Y4,VMFPRS+16 .. %V407508 02384000
- LD Y6,VMFPRS+24 .. %V407508 02385000
- .FPR1 ANOP %V407508 02386000
- NOFPRS DS 0H %V4M0173 02387000
- EJECT 02388000
- *---------------------------------------------------------------------* 02389000
- * NOW THE ACTUAL DISPATCHING PSW IS BUILT FROM DATA IN * 02390000
- * THE "VMPSW" AND STATUS SWITCHES INDICATING THE PSW * 02391000
- * FORMAT, REQUESTED EXTENDED FEATURES, ETC. IF DISPATCH * 02392000
- * TRACING IS ENABLED, THE RUNNING PSW AND VMBLOK ADDRESS * 02393000
- * WILL BE TRACED BEFORE THE CONTROL REGISTERS ARE LOADED * 02394000
- * FOR THE USER'S DISPATCH. IF VM ASSIST IS ON, SETUP IS DONE * 02395000
- * FOR CONTROL REGISTER 6 AND THE MICBLOK. * 02396000
- *---------------------------------------------------------------------* 02397000
- L R1,VMPSW+4 GET NEW PSW ADDRESS %V3M4038 02398000
- ST R1,RUNPSW+4 START BUILDING PSW FOR DISPATCH %V3M4038 02399000
- SLR R0,R0 %V3M4038 02400000
- ICM R0,B'0100',VMPSW+1 GET USER KEY AND EMWP BITS %V3M4038 02401000
- O R0,=X'070D0000' ADD TRAN+IO+EXT+ECMODE+PROB+MC %V3M4038 02402000
- TM VMESTAT,VMEXTCM VIRTUAL MACHINE IN EC-MODE ? %V3M4038 02403000
- BO LOADEXT YES - FINISH HIS PSW %V3M4038 02404000
- MVI RUNPSW+4,X'00' STRIP OFF ILC, CC, PGM MASK %V3M4038 02405000
- NI VMPSW+4,X'3F' THROW AWAY HIS ILC BITS %V3M4038 02406000
- ICM R0,B'0010',VMPSW+4 ...ADD CC, PGM MASK TO PSW %V3M4038 02407000
- B HALFPSW SAVE FIRST HALF OF PSW %V3M4038 02408000
- SPACE 02409000
- LOADEXT EQU * LOAD EXTENDED-MODE PSW %V3M4038 02410000
- O R0,VMPSW ADD HIS CC, PGM MASK %V3M4038 02411000
- HALFPSW ST R0,RUNPSW SET FIRST WORD OF PSW %V3M4038 02412000
- SPACE 02413000
- PERHAPS DS 0H %V408246 02414000
- NI VMMCR6,255-(VMMSHADT+VMMPROB+VMMNOSK+VMMFE) %V408246 02415000
- L R0,CPCREG0 ASSUME VM/370 ARCHITECTURE %V3M4038 02416000
- L R1,VMSEG AND 2'ND LEVEL MEMORY %V3M4038 02417000
- TM VMPSTAT,VMV370R ARE EC-REGS. PRESENT %V3M4038 02418000
- BZ SETCREGS NO - STANDARD VM/370 CREGS %V3M4038 02419000
- L R2,VMECEXT EC-REGS. ARE IN THE ECBLOK %V3M4038 02420000
- USING ECBLOK,R2 %V3M4038 02421000
- LCTL C4,C13,EXTCR4 LOAD USER'S VALUES IN REAL CREGS %V3M4038 02422000
- TM VMESTAT,VMEXTCM ALSO IN EC-MODE NOW ? %V3M4038 02423000
- BZ CHKRUNE NO - STANDARD VM/370 CREGS 0-1 %V3M4038 02424000
- TM VMESTAT,VMINVSEG+VMNEWCR0 UNHEALTHY SITUATION %V3M4038 02425000
- BZ CHKTRAN BUT WE REALLY CAN'T HAVE IT %V3M4038 02426000
- ABEND 2 HOW DID WE GET HERE, ANYWAY ??? 02427000
- CHKTRAN TM VMPSW,TRANMODE IN VIRTUAL TRANSLATE MODE ? %V3M4038 02428000
- BZ CHKRUNE NO, USE STAN. VM/370 ARCHITECTURE%V3M4038 02429000
- L R0,EXTSHCR0 ELSE GET USER'S ARCHITECTURE %V3M4038 02430000
- L R1,EXTSHCR1 AND HIS 3'RD LEVEL MEMORY. %V3M4038 02431000
- OI VMMCR6,VMMSHADT TURN ON VMA SHADOW TABLE FLAG %V408246 02432000
- EJECT 02433000
- DROP R2 %V3M4038 02434000
- CHKRUNE TM VMESTAT,VMINVPAG+VMSHADT SHADOW TABLES BAD ?? %V3M4038 02435000
- BNO SETCREGS IF NOT - READY TO DISPATCH HIM %V3M4038 02436000
- CALL DMKVATAB INVALIDATE SHADOW PAGE TABLES %V3M4038 02437000
- SPACE 02438000
- SETCREGS ST R0,RUNCR0 SET UP FOR CONTROL REGISTER 0. %V3M4038 02439000
- ST R1,RUNCR1 SET UP FOR CONTROL REGISTER 1. %V3M4038 02440000
- NI VMESTAT,X'FF'-VMINVPAG RESET INVALID PAGE FLAG %V3M4038 02441000
- TAKEOFF EQU * ALMOST READY TO DISPATCH HIM %V3M4038 02442000
- TM VMTRCTL,VMTRPER IS "PER" TRACING ACTIVE ? %V3M4038 02443000
- BZ RELPSW NO. %V3M4038 02444000
- RELPER DS 0H %V3M4038 02445000
- L R2,VMPERCTL TRACE EXTENSION % PER001 02446000
- LCTL C9,C11,PERCR9-PERBLOK(R2) LOAD TRACE C-REGS % PER001 02447000
- OI RUNPSW,PERMODE ENABLE PER IN RUNPSW %V3M4038 02448000
- SPACE 02449000
- RELPSW EQU * FINAL STRETCH BEFORE WE GO... %V3M4038 02450000
- LA R9,TSTTRQ1 PREPARE FALL THROUGH ADDRESS %VA06300 02450100
- OI VMDSTAT,VMDSP FLAG DISPATCHED RUNUSER %V3M4038 02451000
- LA R6,CPCREG6 %V408246 02452000
- TM CPSTAT2,CPMICON IS VMA ON FOR SYSTEM ? %V3M4038 02453000
- BZ TSTTRQ NO - LEAVE CREG6 ZERO %V407508 02454000
- ICM R15,B'0111',VMMADDR IS USER ASSIST ON ? %V3M4038 02455000
- BZ TSTTRQ NO - LEAVE CREG6 ZERO %V407508 02456000
- TM VMTRCTL,VMTRSVC+VMTRPRV+VMTRBRIN TRACING THESE? %V3M4038 02457000
- BNZ TSTTRQ YES - LEAVE VM ASSIST OFF %V407508 02458000
- OI VMMCR6,VMMFE TURN ON VMA ASSIST FOR USER %V3M4038 02459000
- TM VMOSTAT,VMSHR RUNNING WITH SHARED SYSTEMS %V3M4038 02460000
- BZ *+8 IF NOT, ALLOW ISK/SSK BY VMA %V3M4038 02461000
- OI VMMCR6,VMMNOSK VMA NOT TO HANDLE ISK/SSK %V3M4038 02462000
- TM VMPSW+1,PROBMODE USER IN PROBLEM STATE? %V3M4038 02463000
- BZ *+8 NO..PROB BIT IS OK.. %V3M4038 02464000
- OI VMMCR6,VMMPROB TURN ON PROBLEM BIT.. %V3M4038 02465000
- LA R6,VMMICRO %V408246 02466000
- USING MICBLOK,R15 R15 SET UP ABOVE (BY 'ICM') %V3M4038 02467000
- CHKPENDG EQU * ENTRY FROM FAST DISPATCH %VA06300 02467100
- SLR R4,R4 CLEAR MASK REG %V3M4038 02468000
- * HERE TO CHECK FOR PENDING INTERRUPTS 02469000
- NI MICVIP,255-MICPEND RESET PENDING INTERRUPT BIT %V3M4038 02470000
- L R3,VMVCR0 ECBLOK POINTER %V3M4038 02471000
- ICM R4,B'1100',VMIOINT PENDING INTERRUPT MASK %V3M4038 02472000
- BZ PGPEND CHECK FOR PSEUDO PAGE FAULTS %V407508 02473000
- TM VMESTAT,VMEXTCM USER IN EC MODE ? %V3M4038 02474000
- BZ INTPEND NO..CAN'T CONTROL SYSTEM MASK %V3M4038 02475000
- L R5,EXTCR2-ECBLOK(,R3) PICK UP I/O MASK BITS %V3M4038 02476000
- NR R5,R4 LESS INTERRUPTS NOT PENDING %V3M4038 02477000
- BNZ INTPEND MUST TURN ON INT PENDING BIT %V3M4038 02478000
- PGPEND DS 0H CHECK FOR PSEUDO PAGE FAULTS %V407508 02479000
- TM VMESTAT,VMEXTCM FIRST SEE IF EC-MODE %V407508 02480000
- BZ EXPEND NO, CHECK FOR EXTERNL INTERRUPTS %V407508 02481000
- TM VMPEND,VMPGPND IS A PSEUDO PAGE FAULT PENDING? %V407508 02482000
- BO INTPEND TURN ON INTERRUPT PENDING BIT %V407508 02483000
- EXPEND DS 0H CHECK FOR EXTERNAL INTERRUPTS %V407508 02484000
- L R4,VMPXINT %V408246 02485000
- LTR R4,R4 ANY EXT INT PENDING? %V408246 02486000
- BZ TSTTRQ %V407508 02487000
- TM VMPSTAT,VMV370R EC MODE MACHINE ? %V3M4038 02488000
- BZ *+8 NO..CR0 ALREADY INTACT %V3M4038 02489000
- L R3,EXTCR0-ECBLOK(,R3) PICK UP CR0 %V3M4038 02490000
- B XPNMSK %V408246 02491000
- USING XINTBLOK,R4 %V3M4038 02492000
- XPNEXT EQU * %V3M4038 02493000
- L R4,XINTNEXT POINTER TO NEXT BLOK %V3M4038 02494000
- LTR R4,R4 PENDING EXT INTERRUPT? %V3M4038 02495000
- BZ TSTTRQ ALL SET IF NO %V407508 02496000
- XPNMSK DS 0H %V408246 02497000
- LH R5,XINTMASK PENDING INTERRUPT MASK %V3M4038 02498000
- NR R5,R3 LESS INTERRUPTS NOT PENDING %V3M4038 02499000
- BZ XPNEXT LOOP THROUGH EXT BLOKS %V3M4038 02500000
- INTPEND EQU * %V3M4038 02501000
- OI MICVIP,MICPEND SET INTERRUPT PENDING.. %V3M4038 02502000
- DROP R15,R4 %V3M4038 02503000
- TSTTRQ DS 0H TEST FOR TRQ AND IDLE %V407508 02504000
- BR R9 POSSIBLE EXIT TO FAST DISPATCH %VA06300 02504100
- TSTTRQ1 EQU * %VA06300 02504200
- AIF (NOT &AP).UPTST30 **AIF*** 02504900
- TM APSTAT1,APUOPER IS THE AP OPERATIONAL? %V407508 02505000
- BNO DSPTRC NO, SKIP TESTS FOR TRQ AND IDLE %V407508 02506000
- TM VMPSTAT,VMV370R IS VM AN EC MODE MACHINE @V407508 02507000
- BNO TSTIDLE @V407508 02508000
- LOCK OBTAIN,TYPE=TR GET THE LOCK ON THE TRQ CHAIN @V407508 02509000
- L R10,=A(DMKSCHTQ) GET ADDRESS OF TRQ CHAIN @V407508 02510000
- USING TRQBLOK,R10 USE R10 AS BASE FOR TRQBLOK @V407508 02511000
- L R10,TRQBFPNT GET FIRST TRQ ON CHAIN @V407508 02512000
- C R11,TRQBUSER IS TRQ FOR THIS VM? @V407508 02513000
- BNE FRETRQL NO, GO FREE THE TRQ LOCK @V407508 02514000
- C R10,ACTIVTRQ IS THIS TRQ ACTIVE ON THIS PROC? @V407508 02515000
- BE FRETRQL YES, GO FREE THE TRQ LOCK @V407508 02516000
- SCKC TRQBVAL ELSE SET NEW CLK COMPARATOR REQ @V407508 02517000
- ST R10,ACTIVTRQ INDICATE THIS TRQ IS ACTIVE @V407508 02518000
- DROP R10 STOP USING R10 AS TRQBLOK BASE @V407508 02519000
- FRETRQL DS 0H @V407508 02520000
- LOCK RELEASE,TYPE=TR RELEASE THE TRQ LOCK @V407508 02521000
- TSTIDLE DS 0H @V407508 02522000
- MVI TEMPSAVE,NONE TURN OFF WAKE-UP FLAG @V4M0001 02523000
- L R2,PREFIXB GET PREFIX VALUE OF OTHER PROC @V407508 02524000
- CLI CPSTATUS-PSA(R2),CPWAIT IS OTHER PROC IN WAIT? @V4M0136 02525000
- BNE DSPTRC NO, GO TRACE DISPATCH @V4M0136 02526000
- BAL R9,WAKSIG WAKE UP IDLE PROC @VA09257 02527000
- DSPTRC DS 0H %V407508 02528000
- .UPTST30 ANOP **ANOP** 02528100
- AIF (NOT &TRACE(9)).TR1 %V3M4038 02529000
- TM TRACFLG2,TRAC0A TRACING ACTIVE? %V3M4038 02530000
- BZ NOTRAC1 BRANCH IF NOT %V3M4038 02531000
- * 02532000
- * TRACE DISPATCH OF NEW USER 02533000
- * 02534000
- LA R14,TRCRUN SET CODE FOR DISPATCH OF USER %V407508 02535000
- BAL R1,GETRACE GET CURRENT TRACE TABLE ENTRY %V4M0017 02536000
- MVC ONE(THREE,R15),ZEROES CLEAR REST OF FIRST WORD %V4M0173 02537000
- ST R11,4(0,R15) TRACE RUNUSER VMBLOK POINTER %V3M4038 02538000
- MVC 8(8,R15),RUNPSW AND HIS PSW %V3M4038 02539000
- NOTRAC1 EQU * %V407508 02540000
- .TR1 ANOP 02541000
- LCTL C6,C6,0(R6) LOAD APPROPRIATE VMA VALUE %V407508 02542000
- SPACE 02543000
- TM APSTAT2,CPPTLBR IS PTLB REQUIRED? %V407508 02544000
- BNO MORE NO, CONTINUE WITH DISPATCH %V407508 02545000
- NI APSTAT2,X'FF'-CPPTLBR RESET PTLB REQUIRED FLAG %VA07615 02546100
- PTLB ISSUE PTLB %VA07615 02547100
- MORE DS 0H %V407508 02548000
- SLR R15,R15 CLEAR WORK REGISTER %V407508 02549000
- ST R15,STACKVM INITIALIZE ADDR FOR DSP REENTRY %V407508 02550000
- MVC PROBSTRT,VMTMOUTQ SAVE TIMER AT PROB STATE STRT %V407508 02551000
- MVI IOOPSW,0 FLAG I/O PSW NOT VIRTUAL %V408246 02552000
- MVC QUANTUM,TIMER CHECKPOINT TIMER AT ENTRY TO %V408246 02553000
- * PROBLEM STATE 02554000
- LDRPSW DS 0H %V408246 02555000
- LCTL C0,C1,RUNCR0 SET-UP VIRT. MEMORY CREGS %V408246 02556000
- MVI CPSTATUS,CPRUN SET RUNNING USER FLAG %V407508 02557000
- CHARGE STOP STORE SUPERVISOR TIME FOR USER %V407508 02558000
- SPT VMTMOUTQ GIVE USER REMAINING TIME LEFT %V3M4038 02559000
- LM R0,R15,VMGPRS RESTORE USER REGISTERS %V3M4038 02560000
- LPSW RUNPSW -------> %V3M4038 02561000
- EJECT 02562000
- AIF (NOT &AP).UPTST31 **AIF*** 02562900
- * 02563000
- * LOAD A WAIT ENABLED ONLY FOR EXTERNAL INTERRUPTS 02564000
- * 02565000
- IDLEB DS 0H @V407508 02566000
- MVI CPSTAT3,CPTIDLE TURN ON IDLE WAIT FLAG @V407508 02567000
- LM R0,R1,IDLEPSW GET WAIT STATE PSW @V407508 02568000
- STM R0,R1,RUNPSW SAVE FOR WHEN LOADED @V407508 02569000
- NI RUNPSW,X'FF'-IOMASK TURN OFF I/O MASK @V407508 02570000
- MVC TIMER,FFS AVOID UNNECESSARY TIMER INTS @V407508 02571000
- LA R1,IDLEWAIT GET ADDRESS OF TIMER FIELD @V407508 02572000
- COUNT APWAITS INCREMENT COUNT OF AP-TYPE WAITS @V407508 02573000
- ST R11,RUNUSER SET RUNUSER TO ASYSVM @V407508 02574000
- MVC TEMPR0,CPCREG0 MOVE CR0 INTO WORKAREA @V4M0210 02575000
- NC TEMPSAVE+2(2),NOCLK TURN OFF EXTRANEOUS BITS @V4M0136 02576000
- OI TEMPSAVE+2,MFAMASK+EMSMASK+XCMASK INSURE MFA, @V4M0136 02577000
- * EMS, AND XC BITS ARE ON @V4M0136 02578000
- LCTL C0,C0,TEMPSAVE LOAD ALTERED CONTROL REG 0 @V4M0136 02579000
- B SETWAIT GO TO LOAD WAIT @V407508 02580000
- .UPTST31 ANOP **ANOP** 02580100
- * 02581000
- * LOAD A WAIT ENABLED FOR EXTERNAL & I/O INTERRUPTS 02582000
- * 02583000
- IDLEECPS DS 0H ECPS EXIT TO LOAD A WAIT STATE @V407508 02584000
- L R11,ASYSVM SET R11 TO ASYSVM @V407508 02585000
- B LOADIDLE CONTINUE WITH LOADING A WAIT @V407508 02586000
- SPACE 02587000
- IDLEA DS 0H COME HERE WHEN RUNLIST IS EMPTY @V407508 02588000
- AIF (NOT &AP).UPTST32 **AIF*** 02588900
- LOCK RELEASE,TYPE=RL RELEASE RUNLIST LOCK @V407508 02589000
- CLI TEMPSAVE,SET SHOULD OTHER PROC BE AWOKEN? @V4M0001 02590000
- BNE LOADIDLE NO, GO LOAD AN ENABLED WAIT @VA07840 02591000
- MVI TEMPSAVE,NONE TURN OFF WAKE-UP FLAG @V4M0001 02592000
- L R14,PREFIXB GET PREFIX VALUE OF OTHER PROC @V4M0001 02593000
- BAL R9,WAKSIG SIGNAL THE OTH PROC @VA09257 02596000
- .UPTST32 ANOP **ANOP** 02596950
- LOADIDLE DS 0H NO TASKS CURRENTLY EXECUTABLE @V213235 02597000
- L R2,RUNUSER GET ADDRESS OF RUNUSER @V407508 02598000
- C R2,LASTUSER IS RUNUSER STILL LOCKED? @V407508 02599000
- BNE *+8 NO, SKIP RESETTING OF FLAG @V407508 02600000
- NI VMDSTAT-VMBLOK(R2),X'FF'-VMDSP RESET FLAG @V407508 02601000
- ST R11,RUNUSER SET RUNUSER TO ASYSVM @V407508 02602000
- AIF (NOT &AP).UPTST33 **AIF*** 02602900
- TM APSTAT1,APUOPER IS THE AP OPERATIONAL? @V407508 02603000
- BNO SETUP NO, GO SET UP PSW FOR WAIT @V407508 02604000
- L R2,PREFIXA GET PROCESSOR PREFIX ADDRESS @V407508 02607000
- CLI XTNDLOCK-PSA(R2),SET IS SYSTEM IN EXTEND? @V4M0006 02608000
- BNE UNDOLAST NO, GO CHECK LASTUSER @V4M0136 02609000
- C R11,LASTUSER IS LASTUSER STILL LOCKED? @VA07840 02609100
- BE SETUP NO, GO SET UP PSW FOR WAIT @VA07840 02609200
- TM APSTAT1,PROCIO IS THIS THE MAIN PROCESSOR? @V4M0136 02610000
- BO SETUP YES, GO SET UP PSW FOR WAIT @V4M0136 02611000
- BAL R9,XTNDAP DO AP-ONLY EXTEND PROCESSING @V4M0136 02612000
- B SETUP GO SET UP PSW FOR WAIT @V4M0136 02613000
- UNDOLAST DS 0H @V4M0136 02614000
- C R11,LASTUSER IS LASTUSER STILL LOCKED? @VA07840 02614100
- BE TSTSTAK NO, GO TEST FOR BLKS TO UNSTACK @VA07840 02614200
- L R2,LASTUSER GET ADDRESS OF LASTUSER @V407508 02615000
- TM VMOSTAT-VMBLOK(R2),VMSHR IS LASTUSER SHARED @V407508 02616000
- BNO UNLLST NO, GO UNLOCK LASTUSER @V407508 02617000
- LR R11,R2 SWITCH R11 TO LASTUSER @V4M0173 02618000
- CHARGE START START CHARGING LASTUSER @V4M0173 02619000
- CALL DMKVMASH CHECK FOR CHANGED PAGES @V407508 02620000
- RESET DS 0H @V407508 02625000
- CHARGE STOP STOP CHARGING LASTUSER @V4M0173 02626000
- L R11,ASYSVM SWITCH R11 TO SYSTEM VMBLOK @V4M0173 02627000
- UNLLST DS 0H @V407508 02628000
- L R1,LASTUSER GET ADDRESS OF LASTUSER @V407508 02629000
- BAL R8,UNLOKVM2 UNLOCK LASTUSER @V407508 02630000
- ST R11,LASTUSER SET LASTUSER TO ASYSVM @V407508 02631000
- TSTSTAK DS 0H TEST FOR STACKED BLOCKS @VA07840 02631010
- L R15,PREFIXB ACCESS OTHER PSA @VA08311 02631014
- TM XCPEND-PSA(R15),XCDISP IS DISPATCH XC PENDING ? @VA08311 02631015
- BO SETUP YES- SKIP REDUNDANT SIGNAL @VA08311 02631016
- LA R15,DMKDSPRQ GET ADDR OF DSP REQUEST STACK @VA07840 02631020
- C R15,IOBFPNT-IOBLOK(,R15) IS THE LIST EMPTY? @VA07840 02631030
- BNE TSTLOCK NO, GO SEE IF SYSTEM LOCK IS FREE@VA07840 02631040
- C R15,CPEXFPNT-CPEXBLOK(,R15) OTHER LIST EMPTY TOO@VA07840 02631050
- BE SETUP YES, GO SET UP PSW FOR WAIT @VA07840 02631060
- TSTLOCK DS 0H SEE IF SYSTEM LOCK IS FREE @VA07840 02631070
- BAL R9,GETSYS GO TRY FOR SYSTEM LOCK @VA07840 02631080
- BZ CKCPSTAK SYSTEM LOCK FREE, GO UNSTACK BLKS@VA07840 02631090
- .UPTST33 ANOP **ANOP** 02631100
- SETUP DS 0H SET UP PSW FOR WAIT @V407508 02632000
- LM R0,R1,IDLEPSW WAIT STATE PSW ENABLED FOR EXT. AND I/O 02633000
- STM R0,R1,RUNPSW SAVE FOR WHEN LOADED 02634000
- MVC TIMER,FFS AVOID UNNECESSARY TIMER INTERRUPTS 02635000
- SSM RUNPSW ENABLE FOR INTERRUPTS @V407508 02636000
- SSM *+1 DISABLE BEFORE GETTING LOCK @V407508 02637000
- LOCK OBTAIN,TYPE=RL GET LOCK ON RUNLIST @V407508 02638000
- AIF (NOT &AP).UPTST34 **AIF*** 02638900
- L R4,PREFIXB GET PREFIX ADDRESS OF OTHER PROC @V4M0136 02639000
- L R4,RUNUSER(R4) GET RUNUSER OF OTHER PROC @V4M0136 02640000
- .UPTST34 ANOP **ANOP** 02640100
- L R3,=A(DMKSCHRL) ANCHOR FOR LIST OF RUN-Q USERS @V408246 02641000
- C R3,VMQFPNT-VMBLOK(,R3) ANY USERS IN RUN-Q? @V408246 02642000
- AIF (NOT &AP).UPTST35 **AIF*** 02642900
- BE STIDLEWT NO, GO SET IDLE WAIT @V4M0136 02643000
- C R4,VMQFPNT-VMBLOK(,R3) IS 1ST USER IN RUN LIST @V4M0136 02644000
- * RUNUSER ON THE OTHER PROC? @V4M0136 02645000
- BNE CKPAGEWT NO, GO CALC PAGE WAIT STATUS @V4M0136 02646000
- C R4,VMQBPNT-VMBLOK(,R3) IS LAST USER IN RUN LIST @V4M0136 02647000
- * RUNUSER ON THE OTHER PROC? @V4M0136 02648000
- .UPTST35 ANOP **ANOP** 02648100
- BNE CKPAGEWT NO, GO CALC PAGE WAIT STATUS @V4M0136 02649000
- STIDLEWT DS 0H ONLY ONE USER ON RUN LIST @V4M0136 02650000
- LOCK RELEASE,TYPE=RL RELEASE LOCK ON RUN LIST @VA07394 02650100
- LDIDLEWT DS 0H SET UP FOR IDLE WAIT @VA07394 02650200
- LA R1,IDLEWAIT TIMER FIELD @V408246 02651000
- OI CPSTAT3,CPTIDLE TURN ON IDLE WAIT FLAG @V407508 02652000
- B SETWAIT ... @V408246 02654000
- SPACE 3 02655000
- CKPAGEWT DS 0H @V408246 02656000
- * CHECK 02657000
- LR R1,R3 @V408246 02658000
- DROP R11 DROP REAL VMBLOK POINTER @V408246 02659000
- USING VMBLOK,R1 TEMPORARY USE R1 AS VMBLOK @V408246 02660000
- * POINTER 02661000
- SR R0,R0 CLEAR FOR COUNT OF PAGEWAIT PAGES@V408246 02662000
- SR R2,R2 CLEAR FOR COUNT OF I/O TASKS @V408246 02663000
- NEXTVMBK DS 0H @V408246 02664000
- L R1,VMQFPNT NEXT USER ON CHAIN @V408246 02665000
- CR R1,R3 AT END OF CHAIN? @V408246 02666000
- BE PAGEING YES, CHECK STATUS @V408246 02667000
- AIF (NOT &AP).UPTST36 **AIF*** 02667900
- CR R1,R4 IS THIS RUNUSER OF OTHER PROC? @V4M0136 02668000
- BE NEXTVMBK YES, SKIP THIS VMBLOK @V4M0136 02669000
- .UPTST36 ANOP **ANOP** 02669100
- TM VMRSTAT,VMPGWAIT IS THIS USER IN PAGE WAIT? @V408246 02670000
- BZ IOCYLCES NO @V408246 02671000
- LH R5,VMPAGES NO. RESIDENT PAGES @V408246 02672000
- CH R5,VMWSPROJ MAXIMUM VALUE? @V408246 02673000
- BNL *+8 YES @V408246 02674000
- LH R5,VMWSPROJ NO, RESET TO MAX @V408246 02675000
- AR R0,R5 ACCUMULATE VALUE @V408246 02676000
- B NEXTVMBK @V408246 02677000
- IOCYLCES DS 0H @V408246 02678000
- AIF (NOT &AP).UPTST38 **AIF*** 02678100
- TM VMRSTAT,VMIOWAIT IS THIS USER IN I/O WAIT? @VA07394 02678200
- BZ NEXTVMBK NO, GO GET NEXT USER ON CHAIN @VA07394 02678300
- .UPTST38 ANOP **ANOP** 02678400
- LA R2,1(,R2) INCREMENT COUNT OF I/O WAIT TASKS@V408246 02679000
- B NEXTVMBK @V408246 02680000
- * 02681000
- DROP R1 @V408246 02682000
- USING VMBLOK,R11 @V408246 02683000
- * 02684000
- PAGEING DS 0H @V408246 02685000
- LOCK RELEASE,TYPE=RL,SAVE RELEASE LOCK ON RUNLIST @V407508 02686000
- L R4,=A(DMKPTRRC) POINTER TO RESERVED PAGE COUNT @V408246 02687000
- L R4,0(,R4) RESERVED PAGE COUNT @V408246 02688000
- AL R4,DMKDSPNP + PAGEABLE PAGES -> TOTAL @V408246 02689000
- * PAGEABLE PAGES 02690000
- CR R0,R4 UPPER LIMIT? @V408246 02691000
- BNH *+6 NO @V408246 02692000
- LR R0,R4 YES, RESET @V408246 02693000
- ST R0,PWTPAGES SAVE FOR EXIT FROM WAIT @V407508 02694000
- ALR R0,R0 2 * PAGES WAITING @V408246 02695000
- CR R0,R4 2 * PAGE-WAIT PAGES > PAGEABLE @V408246 02696000
- * PAGES ?? 02697000
- BH PIOCYCL YES @V408246 02698000
- LTR R2,R2 ANY I/O TASKS? @V408246 02699000
- BNZ LOADIO YES @V408246 02700000
- AIF (NOT &AP).UPTST39 **AIF*** 02700100
- LTR R0,R0 ARE THERE ANY PAGE WAIT PAGES? @VA07394 02700200
- BZ LDIDLEWT NO, GO LOAD AN IDLE WAIT @VA07394 02700300
- .UPTST39 ANOP **ANOP** 02700400
- PIOCYCL DS 0H @V408246 02701000
- LA R1,PAGEWAIT SET PAGE WAIT TIMER @V408246 02702000
- OI CPSTAT3,CPTPAGE TURN ON PAGE WAIT FLAG @V407508 02703000
- B SETWAIT @V408246 02704000
- LOADIO DS 0H @V408246 02705000
- LA R1,IONTWAIT SET I/O WAIT TIMER @V408246 02706000
- OI CPSTAT3,CPTIONT TURN ON I/O WAIT FLAG @V407508 02707000
- SETWAIT DS 0H @V408246 02708000
- SLR R15,R15 CLEAR WORK REGISTER @V407508 02709000
- ST R15,STACKVM INITIALIZE ADDR FOR DSP REENTRY @V407508 02710000
- MVI CPSTATUS,CPWAIT FLAG SYSTEM AS IN WAIT @V407508 02711000
- SPT 0(R1) SET TIMER POINTED TO BY REG. 1 @V408246 02712000
- LM R2,R3,0(R1) SAVE INITIAL TIMER VALUE @V408246 02713000
- STM R2,R3,WAITSTRT FOR WAIT EXIT @V407508 02714000
- LPSW RUNPSW --ZZZZZZ--ZZZZZ-- 02715000
- SPACE 2 02715010
- LOCKRLDS DS 0H @VA09257 02715015
- LOCK RELEASE,TYPE=DS RELEASE LOCK ON DSP STKS @VA09257 02715020
- BR R9 @VA09257 02715025
- SPACE 2 02715030
- LOCKOBDS DS 0H SPACE SAVER CODE @VA09257 02715035
- LOCK OBTAIN,TYPE=DS OBTAIN LOCK ON DSP STKS @VA09257 02715040
- BR R9 @VA09257 02715045
- EJECT 02716000
- * CONSTANTS AND EXECUTED INSTRUCTIONS 02717000
- SPACE 02718000
- DS 0D 02719000
- IDLEPSW DC X'030E0000',X'00000000' WAIT-STATE IDLE PSW 02720000
- SPACE 02721000
- EXTZBIT DC X'B800C0FF' MUST-BE-ZERO BITS FOR EC-MODE PSW 02722000
- SPACE 02723000
- TESTSIG TM =AL1(SIGMASK),*-* EXECUTED TO TEST EXT SIGNAL ENABLED 02724000
- SPACE 02725000
- EXTPARMS DC X'80',C'W',AL2(452) RETURN; WNG; ERROR CODE. @V3M4026 02726000
- SPACE 02727000
- PSWPARMS DC X'C0',C'W' RETURN, FRET R3 SPACE; WNG MSG. @V3M4026 02728000
- * THESE ADDRESSES MUST REMAIN TOGETHER AND IN THIS ORDER 02729000
- EXTADDRS DC A(DMKPTRFD) EXIT ALLOWED DURING EXTEND @V407508 02730000
- DC A(DMKPTRFE) .. @V407508 02731000
- DC A(DMKPTRFP) .. @V407508 02732000
- DC A(DMKIOSER) .. @V407508 02733000
- DC A(DMKIOSRC) .. @V407508 02734000
- SPACE 3 02735000
- * MEASUREMENT COUNTERS @V386198 02736000
- SPACE 02737000
- DMKDSPNP DC F'0' COUNT OF ASSIGNABLE PAGE FRAMES @V386198 02738000
- DMKDSPAC DC F'0' ENTRIES TO DMKDSPA 02739000
- DMKDSPBC DC F'0' ENTRIES TO DMKDSPB 02740000
- DMKDSPEC DC F'0' ENTRIES TO DMKDSPE @V386198 02741000
- AIF (NOT &AP).UPTST37 **AIF*** 02741900
- DMKDSPRC DC F'0' ENTRIES TO DMKDSPRU @V407508 02742000
- DISPWKUP DC X'CFFFFFFF' TURN OFF WAKEUP & DISPATCH @VA08873 02742060
- .UPTST37 ANOP **ANOP** 02742100
- DMKDSPIT DC F'0' VIRT INTV TIMER INT REF, X'0080' @V2B2638 02743000
- DMKDSPCK DC F'0' VIRT CLOCK COMP INT REF, X'1004' @V2B2638 02744000
- DMKDSPPT DC F'0' VIRT CPU TIMER INT REF, X'1005' @V2B2638 02745000
- SPACE 02747000
- APWAITS DC F'0' AP INDUCED WAITS @V407508 02748000
- CPPSW DC A(X'000C0000') FIRST HALF OF PSW TO UNSTACK @V407508 02749000
- * SWITCH CPEXBLOK @V407508 02750000
- PSWADDR DC F'0' SECOND HALF OF PSW @V407508 02751000
- NOCLK DC X'E31F' ALL BITS BUT MFA, EMS, AND XC @V4M0136 02752000
- IOWINDOW DC X'02' MASK ENABLING FOR I/O INTERRUPTS @V4M0173 02753000
- SPACE 02754000
- FORCE EQU X'02' PARAMETER FOR CALL TO DMKUSOFF @V200820 02755000
- SET EQU X'FF' USED TO TEST IF FLAG IS SET @V407508 02756000
- NONE EQU X'00' USED TO TEST IF FLAG IS OFF @V407508 02757000
- ONE EQU 1 CONSTANT ONE @V407508 02758000
- THREE EQU 3 CONSTANT THREE @V407508 02759000
- LNPSW EQU 8 LENGTH OF PSW @V407508 02760000
- OFFR15 EQU 12 OFFSET OF R15 IN DSPSAVE @V407508 02761000
- EJECT 02762000
- LTORG 02763000
- EJECT 02764000
- COPY VMBLOK 02765000
- COPY XINTBLOK @V200198 02766000
- COPY PGBLOK @V213135 02767000
- EJECT 02768000
- COPY TREXT 02769000
- COPY PERBLOKS PER001 02769500
- COPY VBLOKS 02770000
- PSA 02771000
- COPY SAVE 02772000
- COPY TIMER INCLUDE DSECT FOR TRQBLOK @V407508 02773000
- COPY IOBLOKS 02774000
- COPY EQU 02775000
- COPY RBLOKS @VA04189 02776000
- COPY MICBLOK 02777000
- COPY VMCBLOKS @V387045 02778000
- END DMKDSP @V200820 02779000
ibm/vm370-lib/cp/dmkdsp.assemble_src.txt ยท Last modified: 2023/08/06 13:36 by Site Administrator