PTR TITLE 'DMKPTR (CP) VM/370 - RELEASE 6' 00001000
ISEQ 73,80 VALIDATE SEQUENCING OF INPUT 00002000
*. 00003000
* MODULE NAME - 00004000
* 00005000
* DMKPTR 00006000
* 00007000
* FUNCTION - 00008000
* 00009000
* TO MANAGE THE INVENTORY OF REAL SYSTEM PAGES, PROVIDING REAL 00010000
* MEMORY SPACE FOR CONTROL PROGRAM FUNCTIONS AND FOR PAGES OF 00011000
* USER AND CONTROL PROGRAM VIRTUAL MEMORY 00012000
* 00013000
* ATTRIBUTES - 00014000
* 00015000
* SERIALLY REUSABLE, RESIDENT, CALLED VIA SVC 8 00016000
* 00017000
* ENTRY POINTS - 00018000
* 00019000
* DMKPTRAN - TRANSLATE THE VIRTUAL ADDRESS PROVIDED BY THE CALL- 00020000
* ER INTO A REAL MEMORY ADDRESS 00021000
* DMKPTRUL - UNLOCK A PAGE OF REAL MEMORY 00022000
* DMKPTRFR - OBTAIN A PAGE OF REAL MEMORY 00023000
* DMKPTRFT - RETURN A PAGE OF REAL MEMORY TO THE SYSTEM 00024000
* DMKPTRLK - LOCK A PAGE OF REAL MEMORY 00025000
* DMKPTRRS RESET PAGES BELONGING TO USER 00026000
* DMKPTRPW - WAIT FOR USER PAGING TO COMPLETE 00026100
* 00027000
* THE FOLLOWING VALUES MAY BE REFERENCED OR MODIFIED BY EXTERNAL 00028000
* ROUTINES 00029000
* 00030000
* DMKPTRFN - NUMBER OF FREE PAGES CURRENTLY AVAILABLE - INITIAL- 00031000
* IZED BY DMKCPINT 00032000
* DMKPTRF1 - POINTER TO THE CORETABL ENTRY FOR THE FIRST FREE 00033000
* PAGE - INITIALIZED BY DMKCPINT 00034000
* DMKPTRU1 - ADDRESS OF 1ST CORTABLE ENTRY ON FLUSH LIST 00035000
* DMKPTRRT - CPEXBLOK RETURN ADDRESS FOR (DMKPTRPW) 00036000
* DMKPTRFD - CPEXBLOK RETURN ADDRESS TO 'FRET' SWAPPPED PAGE 00037000
* DMKPTRFP - CPEXBLOK RETURN ADDRESS TO EXTEND FREE STORAGE 00038000
* DMKPTRFE - CPEXBLOK RETURN ADDRESS TO FORCE PAGE SWAP 00039000
* DMKPTRRU - ADDRESS OF VMBLOK FOR CURRENT RESERVED PAGE USER 00040000
* DMKPTRCT - NUMBER OF CALLS TO DMKPTRAN 00041000
* DMKPTRF0 - NUMBER OF TIMES DMKPTRFR WAS CALLED AND NO PAGES 00042000
* WERE AVAILABLE 00043000
* DMKPTRFC - NUMBER OF CALLS TO DMKPTRFR 00044000
* DMKPTRFA - ADDRESS OF RESERVED CPEXBLOK USED BY DMKPTRFR 00045000
* DMKPTRRL - HIGH WATER LIMIT FOR RESERVED PAGE USER 00046000
* DMKPTRRC - CURRENT NUMBER OF RESIDENT RESERVED PAGES 00047000
* DMKPTRSC - NUMBER OF RESIDENT, SHARED PAGES 00048000
* DMKPTRSS - NUMBER OF PAGES STOLEN FROM ACTIVE USERS 00049000
* DMKPTRFF - NUMBER OF PAGES TAKEN FROM FLUSHED PAGE LIST 00050000
* DMKPTRRQ - PAGE READ REQUEST QUEUE 00051000
* DMKPTRWQ - PAGE WRITE REQUEST QUEUE 00052000
* DMKPTRCP TABLE OF INDICES FOR CORTABLE SEARCHING 00053000
* DMKPTRPR PAGES RECLAINED 00054000
* 00055000
* ENTRY CONDITIONS - 00056000
* 00057000
* FOR DMKPTRAN - 00058000
* GPR1 = VIRTUAL ADDRESS TO BE TRANSLATED 00059000
* GPR2 = ONE OR MORE OF THE FOLLOWING OPTIONS - 00060000
* BRING - IF THE PAGE IS NOT RESIDENT, BRING IT IN 00061000
* DEFER - DO NOT RETURN TO THE CALLER UNTIL THE PAGE IS 00062000
* RESIDENT 00063000
* LOCK - LOCK THE PAGE INTO REAL MEMORY 00064000
* IOERET - RETURN ANY PAGING IO ERRORS TO THE CALLER 00065000
* IF DEFER IS NOT REQUESTED, THEN: 00066000
* GPR3 = RETURN ADDRESS FOR EXIT WHEN PAGE IS RESIDENT 00067000
* SYSTEM - CALLER IS REFERENCING SYSTEM VM SPACE 00068000
* VFAULT - CALL IS FOR VIRTUAL PAGE FAULT (FROM DMKPRG) @V400141 00069000
* CALLER WILL NOT REFERENCE REAL ADDRESS @V400141 00070000
* RETURNED IN REGISTER 2 @V400141 00071000
* GPR11 = ADDRESS OF USER'S VMBLOK 00072000
* GPR12 = DMKPTRAN BASE 00073000
* GPR13 = SAVEAREA BASE 00074000
* FOR DMKPTRUL - 00075000
* GPR2 = AN ADDRESS WITHIN THE REAL PAGE TO BE UNLOCKED 00076000
* GPR14 = RETURN REGISTER 00077000
* GPR15 = DMKPTRUL BASE 00078000
* 00079000
* FOR DMKPTRLK - 00080000
* GPR 2 = AN ADDRESS WITHIN THE REAL PAGE TO BE LOCKED 00081000
* GPR 14 = RETURN REGISTER 00082000
* GPR 15 = DMKPTRLK BASE 00083000
* 00084000
* 00085000
* FOR DMKPTRFR - 00086000
* GPR2 = PARM REGISTER 00087000
* (=1 IF CALLED BY DMKFREE; =0 FOR ALL OTHER CALLERS) 00088000
* (=2 IF CALLED BY DMKFREE AND THE DMKFRE CALLER 00089000
* IS TO GET A RET CODE INSTEAD OF SYSTEM ABEND 00090000
* STORAGE IS NOT AVAILABLE). 00091000
* GPR12 = DMKPTRFR BASE 00092000
* GPR13 = SAVEAREA BASE 00093000
* 00094000
* FOR DMKPTRFT - 00095000
* GPR7 = ADDRESS OF CORTABLE ENTRY FOR PAGE TO BE FRETTED 00096000
* GPR12 = DMKPTRFT BASE 00097000
* GPR13 = SAVEAREA BASE 00098000
* 00099000
* FOR DMKPTRPW 00099100
* GPR11 = ADDRESS OF VMBLOK OF VIRTUAL MEMORY'S OWNER 00099200
* GPR12 = ADDRESS OF ENTRY POINT 00099300
* GPR13 = ADDRESS OF SAVEAREA 00099400
* 00099500
* EXIT CONDITIONS - 00100000
* 00101000
* FROM DMKPTRAN - NORMAL - 00102000
* CC = 0 - VIRTUAL PAGE IS RESIDENT 00103000
* GPR2 = TRANSLATED REAL ADDRESS 00104000
* CC = 1 - PAGE IS NOT RESIDENT, DEFER NOT SPECIFIED 00105000
* GPR2 = ADDRESS OF PAGTABLE ENTRY 00106000
* 00107000
* FROM DMKPTRAN - ERROR 00108000
* CC = 2 - VIRTUAL ADDRESS PROVIDED LIES OUTSIDE OF USER'S 00109000
* VIRTUAL MEMORY SPACE 00110000
* CC = 3 - IOERROR OCCURRED WHLE ATTEMPTING TO READ PAGE 00111000
* 00112000
* FROM DMKPTRUL - NONE 00113000
* 00114000
* FROM DMKPTRLK - NORMAL - CC = 0 00115000
* 00116000
* FROM DMKPTRFR - NORMAL 00117000
* GPR7 = ADDRESS OF CORTABLE ENTRY FOR PAGE PROVIDED 00118000
* IF THE CALL WAS FROM DMKFREE, THE PAGE IS MERGED INTO THE FREE 00119000
* STORAGE CHAIN VIA A CALL TO DMKFRETR 00120000
* 00121000
* IF DMKPTRFR WAS CALLED WITH PARM=2 AND A PAGE IS NOT 00122000
* IMMEDIATELY AVAILABLE, AND THE NUMBER OF PAGES ON THE 00123000
* WAY OUT IS NOT SUFFICIENT, THEN A SEPARATE TASK IS STARTED 00124000
* FOR THE PURPOSE OF REPLENISHING THE FREE LIST. 00125000
* THIS IS DONE BY STACKING A CPEXBLOK FOR RETURN TO 00126000
* DMKPTRFE TO PERFORM THE REPLENISHMENT FUNCTION. 00127000
* IF THE REPLENISHMENT ROUTINE FINDS THAT THERE ARE NO 00128000
* MORE PAGES TO BE HAD, AND THE REQUEST WHICH RESULTED 00129000
* IN THE STARTING OF THE REPLENISHMENT FUNCTION WAS FOR 00130000
* A CONDITIONAL CALL TO OBTAIN FREE STORAGE, THEN THE 00131000
* THE CPEXBLOK FOR THE CONDITIONAL CALL IS SEARCHED FOR 00132000
* ON THE 'FREEQ'. IF IT IS FOUND, IT IS FRETED AND 00133000
* A RETURN CODE EXIT IS MADE BACK TO DMKFRE. IF IT IS 00134000
* NOT FOUND, THEN IT IS ASSUMED THAT THERE WAS SUFFICIENT 00135000
* DELAYED PAGING ACTIVITY TO SATISFY THE REQUEST; 00136000
* DMKFRE SHOULD HAVE RECEIVED ITS PAGE, SO WE 'GOTO' 00137000
* THE DISPATCHER. 00138000
* 00139000
* FROM DMKPTRFR - ERROR - NONE 00140000
* 00141000
* FROM DMKPTRFT - NONE 00142000
* 00143000
* CALLS TO OTHER ROUTINES - 00144000
* 00145000
* DMKPAGIO - EXIT VIA GOTO TO INITIATE PAGE I/O 00146000
* DMKFREE - OBTAIN FREE STORAGE 00147000
* DMKFRET - RETURN FREE STORAGE 00148000
* DMKSTKCP - STACK DEFERED REQUESTS FOR EXECUTION 00149000
* DMKQCNWT - WRITE ERROR MESSAGE TO USERS 00150000
* DMKPGTPG - OBTAIN DASD SPACE FOR PAGE WRITES 00151000
* DMKDSPCH - EXIT VIA GOTO TO AWAIT INTERRUPTS 00152000
* DMKFRETR - MERGE EXTENDED FREE STORAGE PAGE INTO FREE LIST 00153000
* DMKCFMBK - TO PUT USER IN CONSOLE FUNCTION MODE 00154000
* DMKPTRFT - TO PUT A PAGE ON THE FREELIST 00155000
* DMKPGTPR - TO RELEASE AN OLD PAGE 00156000
* EXTERNAL REFERENCES - 00158000
* 00159000
* DMKPAGQ - QUEUE OF PENDING PAGING TASKS 00160000
* DMKSYSRM - SIZE OF THE REAL MACHINE 00161000
* DMKSCHN1 - NUMBER OF USERS CURRENTLY IN QUEUE1 00162000
* DMKSCHN2 - NUMBER OF USERS CURRENTLY IN QUEUE2 00163000
* DMKSYSOW - ADDRESS OF SYSTEM OWNED VOLUME LIST 00164000
* 00165000
* TABLES / WORKAREAS - 00166000
* 00167000
* CORTABLE - ONE ENTRY PER PAGE OF REAL MEMORY 00168000
* SWPTABLE - ONE ENTRY PER PAGE OF VIRTUAL MEMORY 00169000
* SEGTABLE - USED BY DAT FEATURE TO TRANSLATE VIRTUAL -> REAL 00170000
* PAGTABLE - USED BY DAT FEATURE TO TRANSLATE VIRTUAL -> REAL 00171000
* 00172000
* REGISTER USAGE - 00173000
* 00174000
* GPR0 = SCRATCH 00175000
* GPR1-3 USED TO MANIPULATE CORTABLE CHAIN POINTERS 00176000
* GPR4 = INCREMENT REGISTER - CONTAINS VALUE OF 1 00177000
* GPR5 = SWPTABLE ENTRY BASE 00178000
* GPR6 = SCRATCH 00179000
* GPR7 = CORTABLE ENTRY BASE 00180000
* GPR8 = SCRATCH 00181000
* GPR9 = PAGTABLE ENTRY BASE 00182000
* GPR10 = SECOND BASE REGISTER @V407594 00183000
* GPR11 = VMBLOK BASE 00184000
* GPR12 = DMKPTR BASE 00185000
* GPR13 = SAVEAREA BASE 00186000
* GPR14 = EXTERNAL LINKAGE 00187000
* GPR15 = EXTERNAL LINKAGE 00188000
* 00189000
* NOTES - 00190000
* 00191000
* DMKPTRAN IS GENERALLY CALLED VIA THE 'TRANS' MACRO, WHICH 00192000
* SETS UP THE NECESSARY PARMS IN GPR2, AND TESTS THE CONDITION 00193000
* CODES RETURNED TO THE CALLER 00194000
* 00195000
* OPERATION - 00196000
* 00197000
* THE OPERATION OF DMKPTRAN IS DESCRIBED IN SECTIONS A-D BELOW 00198000
* THE OPERATION OF DMKPTRFR IS DESCIRBED IN SECTION E 00199000
* THE OPERATION OF THE PAGE SELECTION ROUTINE 'SELECT' IS 00200000
* DESCRIBED IN SECTION F 00201000
* THE OPERATION OF DMKPTRFT IS DESCRIBED IN SECTION G 00202000
* THE OPERATION OF DMKPTRUL IS DESCRIBED IN SECTION H 00203000
* THE OPERATION OF DMKPTRLK IS DESCRIBED IN SECTION I 00204000
* THE OPERATION OF DMKPTRRS IS DESCRIBED IN SECTION J 00205000
* 00206000
*. 00207000
EJECT 00208000
COPY OPTIONS 00209000
COPY LOCAL OPTIONS @V306638 00210000
EJECT 00211000
DMKPTR CSECT 00212000
SPACE 3 00213000
EXTRN DMKSYSRM 00214000
EXTRN DMKDSPNP 00215000
EXTRN DMKDSPRQ @VA08037 00215100
EXTRN DMKSCHN1,DMKSCHN2 00216000
EXTRN DMKPAGIO @V200820 00217000
EXTRN DMKSTKCP 00218000
EXTRN DMKVMASH @V407594 00220000
EXTRN DMKSTKMP @V407594 00221000
EXTRN DMKSTKOP @V407594 00222000
EXTRN DMKFREAP @V407594 00223000
EXTRN DMKPAGQ 00224000
EXTRN DMKCFMBK 00225000
EXTRN DMKCVTAB,DMKBLDRT @V408246 00226000
EXTRN DMKFRETR 00227000
EXTRN DMKPGTPR 00228000
EXTRN DMKSYSOW 00229000
EXTRN DMKPGTPG 00230000
EXTRN DMKSCHDL 00231000
ENTRY DMKPTRAN 00232000
ENTRY DMKPTRU1 00233000
ENTRY DMKPTRCP @V408246 00234000
ENTRY DMKPTRFA 00235000
ENTRY DMKPTRF0,DMKPTRFC 00236000
ENTRY DMKPTRFN,DMKPTRF1 00237000
ENTRY DMKPTRXX @V408246 00238000
ENTRY DMKPTRCT,DMKPTRSS,DMKPTRPR @V408246 00239000
ENTRY DMKPTRSC SHARED PAGE COUNT @V408246 00240000
ENTRY DMKPTRFF @V408246 00241000
ENTRY DMKPTRRS @V408246 00242000
ENTRY DMKPTRRL 00243000
ENTRY DMKPTRFD,DMKPTRFP 00244000
ENTRY DMKPTRRU 00245000
ENTRY DMKPGSHR SHARE TABLE CHAIN ANCHOR @V408246 00246000
ENTRY DMKPTRRC 00247000
ENTRY DMKPTRFE 00248000
ENTRY DMKPTRRQ,DMKPTRWQ 00249000
ENTRY DMKPTRSW NO. OF PAGES BEING SWAPPED @V2B2638 00250000
ENTRY DMKPTRRF NO. PAGES EXAMINED DURING STEALS @V2B2638 00251000
ENTRY DMKPTRCS NO. COMP SCANS OF ULIST FOR STEAL@V2B2638 00252000
ENTRY DMKPTRPL,DMKPTRRM - FOR CP ASSIST @V386198 00253000
ENTRY DMKPTRSN @VA08341 00253100
ENTRY DMKPTRFQ @V408246 00254000
ENTRY DMKPTRP2 PAGES RECLAIMED FROM FLUSH LIST @VA07717 00254100
ENTRY DMKPTRUC FLUSHED PAGE COUNT @VA07810 00254200
SPACE 2 00255000
USING PSA,R0 00256000
USING CPEXBLOK,R1 00257000
USING SWPFLAG,R5 00258000
USING CORTABLE,R7 00259000
USING PAGCORE,R9 00260000
USING VMBLOK,R11 00261000
USING SAVEAREA,R13 00262000
SPACE 2 00263000
USING *,R12,R10 @V407594 00264000
EJECT 00265000
*. 00266000
* A. INITIAL ENTRY TO DMKPTRAN - 00267000
* 1. IF THE VIRTUAL ADDRESS IN GPR1 IS WITHIN THE USER'S VIRTUAL 00268000
* MEMORY, CONTINUE; OTHERWISE, RETURN CC 2 00269000
* 2. IF THE REQUESTED PAGE IS RESIDENT, GO SEE IF THE LOCK 00270000
* OPTION HAS BEEN REQUESTED (D, BELOW); OTHERWISE, CONTINUE 00271000
* 3. LOCATE THE PAGTABLE AND SWPTABLE ENTRIES FOR THE PAGE, 00272000
* AND TEST TO SEE IF IT IS IN TRANSIT 00273000
* 4. IF THE PAGE IS IN TRANSIT, SET UP TO WAIT FOR IT (B, BELOW) 00274000
* OTHERWISE, CONTINUE 00275000
* 5. TEST THE PAGTABLE ENTRY TO SEE IF THE PAGE HAS BEEN 00276000
* STOLEN FRON THE USER BUT IS STILL RESIDENT IN THE FLUSH 00277000
* OR FREE LISTS 00278000
* 6. IF THE PAGE IS NOT RESIDENT, GO ALLOCATE A NEW PAGE (C, 00279000
* BELOW); OTHERWISE, CONTINUE 00280000
* 7. RECLAIM THE PAGE FROM THE LIST AND RETURN IT TO THE USER AT 00281000
* STEP C.6 00282000
*. 00283000
SPACE 00284000
DMKPTRAN LA R1,0(,R1) STRIP HIGH BYTE - 24 BIT ADDRESSING ONLY 00285000
ST R1,SAVEWRK9 CLEAR PAGEIO ERROR SWITCH 00286000
ENTER 00287000
LR R10,R12 ESTABLISH SECOND BASE REGISTER @V407594 00288000
A R10,F4096 @V407594 00289000
LA R4,1 ESTABLISH GENRAL INCREMENT REGISTER 00290000
L R0,DMKPTRCT GET COUNT OF CALLS 00291000
ALR R0,R4 BUMP 00292000
ST R0,DMKPTRCT AND SAVE 00293000
RESTART EQU * HERE TO RESTART AFTER INTRANSIT PAGE IS IN 00294000
LR R2,R11 ADDRESS OF CALLER'S VMBLOK 00295000
TM SAVER2+3,SYSTEM CALL FOR SYSTEM V.M. SPACE ?? 00296000
BZ CKADDR NO -- R2 IS CORRECT 00297000
L R2,ASYSVM POINT TO SYSTEM VMBLOK 00298000
SPACE 00299000
CKADDR DS 0H VERIFY VIRTUAL ADDRESS 00300000
CL R1,VMSIZE-VMBLOK(,R2) IS ADDRESS WITHIN MEMORY SPACE 00301000
BL ADDROK YES -- 00302000
CLI FFS,X'00' SET CONDITION CODE 2 00303000
B EXIT AND LEAVE 00304000
ADDROK EQU * VIRTUAL ADDRESS IS VALID 00305000
LCTL C1,C1,VMSEG-VMBLOK(R2) GET SEGMENT TABLE ORIGIN 00306000
LRA R7,0(,R1) DO HARDWARE TRANSLATE 00307000
BNZ TESTSEG PAGE IS NOT RESIDENT - TEST FOR PAGE OR 00308000
* SEGMENT EXCEPTION 00309000
N R7,XPAGNUM CLEAR BYTE DISPLACEMENT 00310000
SRL R7,8 AND GET PAGE # TIMES 8 00311000
A R7,ACORETBL POINT TO CORTABLE ENTRY 00312000
L R9,CORPGPNT POINT TO PAGETABLE ENTRY 00313000
B TESTLOCK AND SEE IF LOCK IS REQUESTED 00314000
SPACE 2 00315000
TESTSEG DS 0H @V4M0167 00316000
BC 4+1,SEGEX CC=1,3 LET SEGEX HANDLE @V4M0167 00317000
EJECT 00318000
GETENTRY EQU * 00319000
LR R9,R7 SAVE ADDRESS OF PAGE TABLE ENTRY 00320000
N R1,=XL4'0000F000' CLEAR SEGMENT NUMBER AND DISPL. 00321000
SRL R1,11 GET PAGE NUMBER*2 00322000
SR R7,R1 POINT TO START OF PAGE TABLE 00323000
AIF (NOT &AP).NOAP1 **AIF*** 00323900
TM APSTAT1,APUOPER RUNNING AS AP @V407594 00324000
BZ GETENTR2 NO, BYPASS AFFINITY LOGIC @V407594 00325000
* FOR SHARED PAGE CALL PTR MUST RETURN TO CALLER @V407594 00326000
* ON THE ORIGINAL PROCESSOR @V407594 00327000
S R7,=F'16' BACK TO HEADER @V407594 00328000
ICM R3,B'0111',PAGSHR-PAGTABLE+1(R7) NAMED SYSTEM @V407594 00329000
BZ GETENTR1 NO @V407594 00330000
TM SHRFLAG-SHRTABLE(R3),SHRNOPRT UNPROTECTED @VA09281 00330100
* SHARED SYSTEM? 00330200
BO GETENTR1 YES, NO NEED TO SET UP PROCESSOR @VA09281 00330300
* AFFINITY SINCE THERE IS ONLY ONE 00330400
* SET OF PAGE/SWAP TABLES 00330500
ICM R3,B'1111',SHRSEGCT-SHRTABLE(R3) SHARED SYSTEM @V407594 00331000
BZ GETENTR1 NO @V407594 00332000
IC R3,LPUADDR+1 LOGICAL PROCESSOR ID @V407594 00333000
STC R3,SAVEPROC TO SAVE AREA @V407594 00334000
GETENTR1 LA R7,16(R7) R7 POINTS TO FIRST PTE @V407594 00335000
GETENTR2 DS 0H @V407594 00336000
.NOAP1 ANOP **ANOP** 00336100
SLL R1,2 GET PAGE NUMBER*8 00337000
LA R5,16*2+8(R1,R7) POINT TO SWAPTABLE ENTRY @V408246 00338000
TM SWPFLAG,SWPTRANS+SWPALLOC WAS THERE A PREVIOUS @V408246 00339000
* REQ? 00340000
BNZ INTRAN YES, ENQUEUE UNTIL COMPLETED @V408246 00341000
* PAGE IS NOT RESIDENT AND NOT IN TRANSIT 00342000
LH R7,PAGCORE GET PAGE TABLE ENTRY 00343000
N R7,=A(X'FFF0') IS THE PAGE STILL IN CORE ? 00344000
BZ READPAGE NO -- MUST GO FIND ANOTHER PAGE 00345000
AIF (NOT &VIRREAL).NOVR1 00346000
CL R11,AVMREAL IS REQUEST FOR VIRT=REAL USER 00347000
BNE PASSVR NO, PROCEED AS NORMAL 00348000
TM SAVER2+3,SYSTEM IS REQUEST FOR SYSTEM SPACE 00349000
BO PASSVR YES, WE ARE USING THE SYSTEM VMBLOK 00350000
A R7,ACORETBL POINT TO THE CORE-TABLE ENTRY 00351000
BAL R3,CKDEFER @V408246 00352000
B DOIO READ THE PAGE INTO STORAGE 00353000
PASSVR DS 0H CONNECTOR 00354000
.NOVR1 ANOP 00355000
A R7,ACORETBL POINT TO CORTABLE ENTRY 00356000
LM R2,R3,CORFPNT GET FORWARD AND BACKWARD CHAIN POINTERS 00357000
ST R2,CORFPNT-CORTABLE(,R3) UNCHAIN THE ENTRY 00358000
ST R3,CORBPNT-CORTABLE(,R2) -- 00359000
SR R2,R2 CLEAR . . @V408246 00360000
ST R2,CORBPNT . . BACK-POINTER @V408246 00361000
TM CORFLAG,CORFREE PAGE ON FREE OR USER LIST? @V408246 00362000
BZ CNTFLR FLUSH LIST PAGE @VA07717 00363100
L R0,DMKPTRPR INCREMENT @V408246 00364000
AR R0,R4 COUNT OF PAGE RECLAIMS @V408246 00365000
ST R0,DMKPTRPR @V408246 00366000
L R0,DMKPTRFN GET NUMBER OF FREE PAGES 00367000
SR R0,R4 DECREMENT FREE COUNT 00368000
ST R0,DMKPTRFN AND SAVE 00369000
BAL R8,SELECT REPLENISH F/L IF NEEDED @VA03893 00370000
L R5,CORSWPNT RESTORE SWAP TABLE ADDRESS @VA03893 00371000
B SETKEYS GO SET VIRTUAL STORAGE KEYS 00372000
CNTFLR L R0,DMKPTRP2 COUNT FLUSH LIST RECLAIMS @VA07717 00372100
AR R0,R4 @VA07717 00372120
ST R0,DMKPTRP2 @VA07717 00372140
L R0,DMKPTRUC FLUSHED PAGE COUNT @VA07810 00372145
SR R0,R4 LESS ONE @VA07810 00372148
BM AB20 CANNOT BE NEGATIVE @VA07810 00372151
ST R0,DMKPTRUC STORE NEW COUNT @VA07810 00372154
TM CORFLAG,CORSHARE SHARED PAGE @VA07717 00372160
BO CLEARID YES @VA07717 00372180
* GET SEGMENT'S OWNER TO DECREASE FLUSHED PAGE COUNT 00372200
SR R0,R0 @VA07717 00372220
IC R0,SWPVPAGE VIRTUAL PAGE NUMBER @VA07717 00372240
AR R0,R4 PLUS ONE FOR HEADER @VA07717 00372260
SLL R0,3 TIMES 8 FOR ENTRY LENGTH @VA07717 00372280
LR R6,R5 SWAP TABLE ENTRY @VA07717 00372300
SR R6,R0 BACK TO HEADER @VA07717 00372320
L R15,0(R6) GET SEGMENT'S OWNER (SWPVM) @VA07717 00372340
LH R0,VMFLPAG-VMBLOK(R15) FLUSHED PAGE COUNT @VA07717 00372360
SR R0,R4 MINUS ONE @VA07717 00372380
BM AB19 CANNOT BE NEGATIVE @VA07717 00372400
STH R0,VMFLPAG-VMBLOK(R15) @VA07717 00372420
B CLEARID RECLAIM PAGE @VA07717 00372440
AB19 ABEND 19 VMFLPAG IS NEGATIVE @VA07717 00372460
SPACE 1 00372480
AB20 ABEND 20 DMKPTRUC IS NEGATIVE @VA07810 00372500
EJECT 00373000
*. 00374000
* B. PROCESSING FOR IN-TRANSIT PAGES - 00375000
* 1. PLACE THE USER IN PAGE-WAIT, INCREMENTING THE WAIT COUNT 00376000
* 2. IF THE THE CALLER SPECIFIED 'DEFER', CONTINUE; OTHERWISE, 00377000
* STACK A CPEXBLOK FOR RETURN TO DMKPTRAN AND EXIT NOW 00378000
* 3. LOCATE THE CPEXBLOK FOR THE REAL PAGE INTO OR FROM 00379000
* WHICH THE VIRTUAL PAGE IS BEING MOVED 00380000
* 4. CONSTRUCT A CPEXBLOK AND QUEUE IT TO THE END OF THE CHAIN 00381000
* ANCHORED AT CPEXMISC 00382000
* 5. EXIT TO DMKDSPCH. WHEN THE PAGE I/O COMPLETES, THE 00383000
* CPEXBLOKS CHAINED TO THE CORTABLE ENTRY WILL BE UNSTACKED 00384000
* AND PROCESSING WILL RESUME 00385000
*. 00386000
SPACE 00387000
INTRAN EQU * HERE IF PAGE IS IN TRANSIT 00388000
NI VMDSTAT,255-VMDSP NO FAST REDSP @V408246 00389000
BAL R3,CKDEFER GO TEST FOR DEFERED RETURN 00390000
LA R0,CPEXSIZE GET CORE FOR 00391000
CALL DMKFREE A CPREQUEST BLOK 00392000
STM R9,R13,CPEXR9 SAVE THESE REGS ONLY ... 00393000
LA R14,TRANRETN SET UP RETURN TO EXECUTION ADDRESS 00394000
ST R14,CPEXADD AND SAVE 00395000
L R3,=A(DMKPAGQ) POINT TO QUEUE OF CPEXBLOKS FOR 00396000
LR R2,R3 IN-TRANSIT PAGES AND SAVE ITS ADDRESS 00397000
TM SWPFLAG,SWPALLOC ENQUEUED FOR ALLOCATION ?? 00398000
BZ FINDTASK NO -- WE HAVE CORRECT LIST 00399000
LA R3,FREEQ POINT TO ALLOCATION LIST 00400000
SR R2,R2 LIST CHAINED ONE-WAY 00401000
SPACE 00402000
FINDTASK L R3,CPEXFPNT-CPEXBLOK(,R3) POINT TO NEXT BLOK 00403000
CR R2,R3 END OF CHAIN 00404000
BE STAKIT YES -- TRANSIT BLOK ALREADY STICKED 00405000
C R9,CPEXR9-CPEXBLOK(,R3) TASK FOR OUR PAGE ?? 00406000
BNE FINDTASK NO -- KEEP LOOKING 00407000
SPACE 00408000
FINDEND L R2,CPEXMISC-CPEXBLOK(,R3) GET POINTER TO DEFERED TASKS 00409000
LTR R2,R2 ANY MORE ?? 00410000
BZ CHAINIT NO -- CHAIN NEW ONE 00411000
LR R3,R2 SAVE BACK POINTER 00412000
B FINDEND AND LOOK FOR END 00413000
SPACE 00414000
STAKIT EQU * HERE IF BLOK ALREADY STACKED 00415000
AIF (NOT &AP).NOAP2 **AIF*** 00415900
CLI SAVEPROC,0 PROCESSOR AFFINITY FOR THIS CALL @V407594 00416000
BE CALLSTK NO, STACK NORMALLY @V407594 00417000
CLC SAVEPROC,LPUADDR+1 YES- FOR THIS PROCESSOR @V407594 00418000
BNE STKOPP NO, STACK FOR OTHER PROCESSOR @V407594 00419000
CALL DMKSTKMP STACK FOR THIS PROCESSOR ONLY @V407594 00420000
B TRANXIT & EXIT @V407594 00421000
STKOPP CALL DMKSTKOP STACK FOR OTHER PROCESSOR ONLY @V407594 00422000
B TRANXIT AND EXIT @V407594 00423000
CALLSTK DS 0H STACK FOR EITHER PROCESSOR @V407594 00424000
.NOAP2 ANOP **ANOP** 00424100
CALL DMKSTKCP STACK NEW BLOK 00425000
B TRANXIT AND LEAVE 00426000
SPACE 00427000
CHAINIT ST R1,CPEXMISC-CPEXBLOK(,R3) CHAIN IN NEW TASK 00428000
ST R2,CPEXMISC AND CLEAR POINTER 00429000
AIF (NOT &AP).NOAP3 **AIF*** 00429900
IC R15,SAVEPROC LOAD AFFINITY (IF ANY) @V407594 00430000
STC R15,CPEXADD & STORE IN CPEXBLOK FOR DMKPAG @V407594 00431000
.NOAP3 ANOP **ANOP** 00431100
SPACE 00432000
TRANXIT GOTO DMKPAGIO START ANY WAITING FOR I/O @VA01491 00433000
SPACE 2 00434000
TRANRETN EQU * HERE WHEN PAGE IS NO LONGER IN TRANSIT 00435000
LA R4,1 RE-ESTABLISH INCREMENTER 00436000
BAL R3,CKWT CHECK WAIT COUNT @V408246 00437000
L R1,SAVER1 RESTORE VIRTUAL ADDRESS 00438000
B RESTART RESTART TRANSLATION PROCESS 00439000
EJECT 00440000
*. 00441000
* C. PROCESSING FOR NON-RESIDENT, NON-TRANSIT PAGES - 00442000
* 1. IF USER HAS SPECIFIED 'BRING', CONTINUE; OTHERWISE, SET 00443000
* CONDITION CODE 1 (PAGE NOT RESIDENT) AND EXIT 00444000
* 2. PLACE THE USER IN PAGE-WAIT, INCREMENTING THE WAIT COUNT 00445000
* 3. TEST FOR THE DEFERED RETURN OPTION AND HANDLE AS IN B.2 00446000
* 4. CALL DMKPTRFR (E, BELOW) TO OBTAIN A FREE PAGE TO ASSIGN 00447000
* TO THE USER 00448000
* 5. IF THE VIRTUAL PAGE HAS NEVER BEEN REFERENCED, CLEAR IT TO 00449000
* BINARY ZEROES AND GO TO STEP C.7 00450100
* 6. CALL DMKPAGIO TO READ THE PAGE FROM THE BACKING STORE, AND 00451000
* GO TO DMKDSPCH TO WAIT FOR IT 00452000
*. 00453000
SPACE 00454000
READPAGE EQU * HERE IF USER PAGE IS NOT RESIDENT 00455000
NI VMDSTAT,255-VMDSP NO FAST REDSP @V408246 00456000
TM SAVER2+3,BRING BRING ASKED ?? 00457000
BO SETWAIT YES -- USER MUST WAIT 00458000
ST R9,SAVER2 SAVE ADDRESS PAGETABLE ENTRY 00459000
CLI F0,X'FF' SET CC = 1 00460000
B EXIT AND LEAVE 00461000
SPACE 00462000
SETWAIT EQU * 00463000
CLI SWPDPAGE,0 HAS PAGE BEEN REFERENCED? @VA08184 00463100
BNE SETWAIT1 YES, CONTINUE NORMALLY @VA08184 00463150
TM SWPFLAG,SWPSHR IS THIS A SHARED PAGE? @VA08184 00463200
BZ SETWAIT1 NO, CONTINUE NORMALLY @VA08184 00463250
CLI FFS,X'00' SET CONDITION CODE 2 - SINCE THE @VA08184 00463300
* PAGE WAS NOT SAVED, IT CANNOT BE 00463350
* REFERENCED 00463400
B EXIT AND EXIT @VA08184 00463450
SPACE 00463500
SETWAIT1 DS 0H @VA08184 00463550
BAL R3,CKDEFER TEST FOR DEFERRED RETURN @V408246 00464000
OI SWPFLAG,SWPALLOC FREEZE PAGE FOR ALLOCATION @V408246 00465000
SR R2,R2 CLEAR PARM REGISTER 00466000
BAL R3,PAGFREE GO GET A FREE PAGE 00467000
NI SWPFLAG,X'FF'-SWPALLOC REMOVE ALLOCATION ENQUEUE FLAG 00468000
STCM R5,B'0111',CORSWPNT+1 SAVE SWPTABLE PNTR (AND @V408246 00469000
* CORFLAG 00470000
OI SWPFLAG,SWPTRANS @V408246 00471000
ST R9,CORPGPNT AND PAGTABLE ENTRY POINTER 00472000
CLI SWPDPAGE,0 RECORD NUMBER ZERO ?? 00473000
BNE DOIO NO -- PAGE MUST BE BROUGHT IN -- 00474000
SPACE 2 00475000
AIF (NOT &AP).NOAP4 **AIF*** 00475900
CLI SAVEPROC,0 PROCESSOR AFFINITY SPECIFIED @V407594 00476000
BE CLRPG NO @V407594 00477000
CLC SAVEPROC,LPUADDR+1 CORRECT PROCESSOR NOW @V407594 00478000
BE CLRPG YES, PROCEED @V407594 00479000
TM APSTAT1,PROCIO CURRENTLY ON MAIN PROCESSOR @V407594 00480000
BZ DOSWTCH NO- SWITCH FROM AP TO MAIN @V407594 00481000
SPACE 1 @V407594 00482000
ABEND 17 ERROR IN PROC'R AFFINITY LOGIC @V407594 00483000
SPACE 1 @V407594 00484000
DOSWTCH SWITCH SWITCH FROM AP TO MAIN @V407594 00485000
SPACE 1 @V407594 00486000
CLRPG DS 0H PROCESS ZEROES PAGE @V407594 00487000
.NOAP4 ANOP **ANOP** 00487100
STM R0,R3,BALRSAVE SAVE THESE REGISTER'S. @V408246 00488000
LR R0,R7 GET ADDRESS OF CORETABLE ENTRY @V408246 00489000
SL R0,ACORETBL GET PAGE ADDRESS /256. @V408246 00490000
SLL R0,8 GET REAL PAGE ADDRESS. @V408246 00491000
L R1,F4096 NUMBER OF BYTES TO CLEAR @V408246 00492000
SLR R2,R2 USE PAD CHARACTER OF ZERO @V408246 00493000
SLR R3,R3 ZERO BYTE COUNT FOR 2'ND OPERAND.@V408246 00494000
MVCL R0,R2 CLEAR ENTIRE PAGE TO BINARY @V408246 00495000
* ZEROES. 00496000
LM R0,R3,BALRSAVE RESTORE REG'S WE USED @V408246 00497000
B PAGEINA AND CONTINUE 00498000
SPACE 00499000
DOIO EQU * HERE TO SET UP FOR REAL PAGE READ 00500000
L R2,PGREAD BUMP TOTAL PAGE READS 00501000
AR R2,R4 -- 00502000
ST R2,PGREAD 00503000
L R2,VMPGREAD GET PAGE READ COUNT 00504000
AR R2,R4 BUMP BY ONE 00505000
ST R2,VMPGREAD AND SAVE 00506000
L R2,VMPGRINQ GET SUM OF RESIDENT PAGES AT EACH READ 00507000
AH R2,VMPAGES ADD CURRENT COUNT 00508000
LH R14,VMFLPAG LOAD FLUSHED PAGES @VA07717 00508100
AR R2,R14 FACTOR INTO NEXT VMWSPROJ @VA07717 00508150
ST R2,VMPGRINQ AND SAVE 00509000
AIF (NOT &AP).NOAP5 **AIF*** 00509900
TM APSTAT1,APUOPER RUNNING AS AP @V407594 00510000
BZ GETCPEX NO, DO PAGE READ @V407594 00511000
TM SWPFLAG,SWPSHR SHARED PAGE @V407594 00512000
BZ GETCPEX NO, DO PAGE READ @V407594 00513000
* IF OTHER PROCESSOR'S COPY OF SHARED PAGE IS RESIDENT @V407594 00514000
* WE CAN SUBSTITUTE AN MVCL FOR THE REAL PAGE I/O @V407594 00515000
SR R14,R14 @V407594 00516000
IC R14,SWPVPAGE LOAD VIRTUAL PAGE NUMBER @V407594 00517000
AR R14,R4 PLUS ONE FOR HEADER @V407594 00518000
SLL R14,3 TIMES 8 FOR ENTRY LENGTH @V407594 00519000
LR R15,R5 POINT TO SWAP TBL ENTRY @V407594 00520000
SR R15,R14 BACK TO HEADER @V407594 00521000
LR R14,R15 ADDRESS OF SWAP TABLE HEADER @VMI0019 00521100
S R14,=A(PAGTSWP) BACK UP TO PAGE TABLE HEADER @VMI0019 00521200
L R14,PAGSHR-PAGTABLE(R14) SHRTABLE ADDRESS @VMI0019 00521300
TM SHRFLAG-SHRTABLE(R14),SHRNOPRT UNPROTECTED @VMI0019 00521400
* SHARED SEGMENT? IF SO, ONLY ONE 00521500
* SET OF PG/SWP TABLES EXIST. 00521600
BO GETCPEX GO DO PAGE READ @VMI0019 00521700
TM SWPFLAG2-SWPTABLE(R15),SWPAPP 2ND SET OF TABLES?@V60B7AA 00522100
LA R15,PAGBMP(,R9) ASSUME IPL PROC'S PAGE--POINT TO@V60B7AA 00522600
* AP PTE 00523100
BZ COPYSHR PAGE OWNED BY IPL PROCESSOR @V60B7AA 00523600
S R15,=A(2*PAGBMP) AP PAGE;POINT TO IPL PROC'S PTE@V60B7AA 00524100
COPYSHR LH R14,0(R15) LOAD PTE OF DUPLICATE PAGE @V407594 00526000
N R14,=A(X'FFF0') PAGE FRAME ONLY @V407594 00527000
BZ GETCPEX PAGE NOT RESIDENT OR RECLAIMABLE @V407594 00528000
SLL R14,8 EXPAND TO REAL ADDRESS @V407594 00529000
LR R2,R7 CORETABLE ENTRY @V407594 00530000
SL R2,ACORETBL REAL ADDRESS/256 @V407594 00531000
SLL R2,8 REAL ADDRESS OF TARGET FRAME @V407594 00532000
L R15,F4096 LENGTH FOR MVCL @V407584 00533000
L R3,F4096 DITTO @V407594 00534000
MVCL R2,R14 COPY PAGE @V407594 00535000
* NOW INSURE SOURCE PAGE WAS NOT CHANGED BEFORE OR @V407594 00536000
* DURING MVCL @V407594 00537000
S R14,F4096 BACK TO BEGINNING OF PAGE @V407594 00538000
ISK R1,R14 STORAGE KEY FOR 1ST HALF OF PAGE @V407594 00539000
LA R14,2048(R14) INCREMENT TO 2ND HALF PAGE @V407594 00540000
SLL R1,8 SAVE KEY @V407594 00541000
ISK R1,R14 INSERT 2ND KEY @V407594 00542000
N R1,=A(X'0202') CLEAR ALL BUT CHANGE BITS @V407594 00543000
BNZ GETCPEX PAGE WAS CHANGED- DO PAGE READ @V407594 00544000
* CALL PAGE REPLENISHMENT IF NECESSARY @V407594 00545000
LM R14,R15,=A(DMKSCHN1,DMKSCHN2) IN-Q COUNTERS @V407594 00546000
L R14,0(R14) Q1 COUNT @V407594 00547000
L R15,0(R15) Q2 COUNT @V407594 00548000
LA R0,1(R14,R15) TOTAL COUNT+1 @V407594 00549000
SRA R0,1 DIVIDE BY 2 @V407594 00550000
C R0,DMKPTRFN MINIMUM PAGES AVAILABLE @V407594 00551000
BNH PAGEINA YES, PROCESS COPIED PAGE @V407594 00552000
BAL R8,SELECTA NO, REPLENISH FREE LIST @V407594 00553000
B PAGEINA 'PAGE READ' COMPLETE @V407594 00554000
.NOAP5 ANOP **ANOP** 00554100
GETCPEX DS 0H @V407594 00555000
LA R0,CPEXSIZE GET CORE FOR 00556000
CALL DMKFREE A CPREQUEST BLOK 00557000
LA R0,6 GET DASD READ DATA OP-CODE 00558000
STM R0,R15,CPEXR0 SAVE ALL REGS 00559000
LA R15,PAGEIN ADDRESS FOR RETURN TO EXECUTION 00560000
ST R15,CPEXADD SET RETURN TO EXECUTION ADDRESS 00561000
AIF (NOT &AP).NOAP6 **AIF*** 00561900
TM SAVER2+3,VFAULT CALLED FOR VIRTUAL PAGE FAULT @V400141 00562000
BO NOAFF YES- BYPASS PROCESSOR AFFINITY @V400141 00563000
IC R15,SAVEPROC LOAD AFFINITY (IF ANY) @V407594 00564000
STC R15,CPEXADD & PLACE IN CPEXBLOK FOR DMKPAG @V407594 00565000
NOAFF DS 0H @V400141 00566000
.NOAP6 ANOP **ANOP** 00566100
L R0,DMKPTRRQ PUSH DOWN PAGE 00567000
ST R1,DMKPTRRQ READ REQUEST 00568000
ST R0,CPEXFPNT STACK 00569000
BAL R8,SELECT REPLENISH FREE LIST IF NECESSARY @VA07693 00570100
B PTRFDISP GO GET I/O STARTED @V408246 00578000
EJECT 00579000
CKDEFER EQU * HERE TO TEST FOR IMMEDIATE RETURN TO CALLER 00580000
SPACE 00581000
TM SAVER2+3,DEFER DEFERED RETURN REQUESTED ? @V213135 00582000
BZ NOTDFERD NO -- PREPARE TO EXIT FORTHWITH @V213135 00583000
LH R2,VMWCNT GET PAGE WAIT COUNT 00584000
ALR R2,R4 UPDATE 00585000
STH R2,VMWCNT AND SAVE 00586000
OI VMRSTAT,VMPGWAIT FLAG USER IN PAGE WAIT 00587000
TM VMRSTAT,VMCPWAIT-VMPGWAIT ALREADY NOT RUNNABLE? @V408246 00588000
BCR 7,R3 YES, BYPASS SCHEDULE CALL @V408246 00589000
CALL DMKSCHDL INSURE THAT USER IS DROPPED FROM Q 00590000
BR R3 EXIT TO CALLER @V213135 00591000
SPACE 00592000
NOTDFERD EQU * HERE TO SET UP FOR NON-DEFERED @V213135 00593000
* RETURN 00594000
LH R2,VMNDCNT GET NON-DEFERRED PAGE READ COUNT @VA04283 00595000
ALR R2,R4 INCREMENT @VA04283 00596000
STH R2,VMNDCNT ...AND SAVE @VA04283 00597000
CLC SAVERETN,SAVER3 HAS RET ADDR BEEN PROCESSED? @VA04283 00598000
BER R3 IF SO, DON'T STACK ANOTHER BLOK @VA04283 00599000
LA R0,CPEXSIZE ... @V213135 00600000
CALL DMKFREE GET CORE FOR A CPREQUEST BLOK 00601000
STM R0,R15,CPEXR0 SAVE ALL REGISTERS 00602000
LA R3,TRANRETN RESTART FROM TOP @V408246 00603000
ST R3,CPEXADD AND RETURN TO EXECUTION ADDRESS 00604000
CALL DMKSTKCP STACK FOR DEFERED RETURN TO PAGTRANS 00605000
L R15,SAVERETN GET CALLER'S RETURN ADDRESS 00606000
L R12,SAVER12 AND BASE REGISTER 00607000
L R0,SAVER3 GET RETURN ADDRESS PASSED ON GPR3@V213135 00608000
ST R0,SAVERETN AND SAVE FOR EXIT WHEN PAGE @V213135 00609000
* COMES IN 00610000
LM R0,R11,SAVER0 GET CALLER'S REGS 00611000
L R13,SAVER13 -- 00612000
CLI ZEROES,X'FF' SET CC = 1 @V213135 00613000
BR R15 AND RETURN NOW 00614000
EJECT 00615000
*. 00616000
* 7. WHEN THE PAGE IS RESIDENT, DECREMENT THE WAIT COUNT, IF IT 00617100
* IS ZERO, REMOVE THE USER FROM PAGE-WAIT 00618000
* 8. SET THE STORAGE KEYS MAINTAINED IN THE SWPTABLE ENTRY INTO 00619100
* THE KEYS OF THE REAL PAGE, AND CONTINUE WITH LOCK OPTION 00620000
* PROCESSING AT D BELOW 00621000
*. 00622000
PAGEIN EQU * HERE AFTER PAGE IS IN CORE 00623000
ST R15,SAVEWRK9 SAVE PAGEIO ERROR SWITCH 00624000
PAGEINA DS 0H @V408246 00625000
BAL R3,CKWT CHECK WAIT COUNT @V408246 00626000
NI SWPFLAG,X'FF'-SWPTRANS RESET IN-TRANSIT FLAG @V408246 00627000
SETKEYS EQU * JOINED HERE FOR RE-CLAIMED PAGES 00628000
TM SWPFLAG,SWPRECMP READ-ONLY PAGE ? 00629000
BZ CLEARID NO @V408246 00630000
CLI SWPDPAGE,0 ZEROS PAGE? @V408246 00631000
BE CLEARID YES, DOESN'T NEED HELP IN SETTING@V408246 00632000
OI SWPFLAG,SWPCHG1 NO -FORCE SWAP TO HI-SPEED @V408246 00633000
CLEARID EQU * 00634000
OI SWPFLAG,SWPREF1 MARK REF'ED INITIALLY @V408246 00635000
NI CORFLAG,CORIOLCK+CORCFLCK RESET ALL BUT THESE @V408246 00636000
LR R6,R7 SAVE POINTER TO CORTABLE ENTRY 00637000
S R6,ACORETBL GET PAGE ADDRESS/256 00638000
SLL R6,8 GET PAGE ADDRESS 00639000
LA R8,2048(,R6) GET ADDRESS OF 2ND HALF PAGE 00640000
L R3,SWPFLAG GET USER'S KEYS IN LOW ORDER @V304735 00641000
N R3,=A(X'F8F8') CLEAR REF/CHANGE BITS @V304735 00642000
SSK R3,R8 SET KEY FOR 2'ND HALF PAGE @V304735 00643000
SRL R3,8 JUSTIFY KEY FOR 1'ST HALF PAGE @V304735 00644000
SSK R3,R6 SET KEY FOR 1'ST HALF PAGE @V304735 00645000
TM SWPFLAG,SWPSHR IS THIS A SHARED PAGE ? @V304735 00646000
BZ PAGEINB NO - NORMAL PATH @V304735 00647000
OI CORFLAG,CORSHARE FLAG CORTABLE ENTRY (SHARED) @V304735 00648000
L R15,DMKPTRSC GET SHARED PAGE COUNTER @V304735 00649000
LA R15,1(,R15) ADD ONE MORE TO IT @V304735 00650000
ST R15,DMKPTRSC SAVE NEW TOTAL @V304735 00651000
PAGEINB DS 0H @V408246 00652000
TM CORFLAG,CORCFLCK CONSOLE FUNCTION LOCK? @V408246 00653000
BO PAGEINC YES, BYPASS COUNT INCREMENT @V408246 00654000
LR R2,R11 SAVE ADDRESS OF VMBLOK @V408246 00655000
TM SAVER2+3,SYSTEM CALL FOR SYSTEM V.M. SPACE? @V408246 00656000
BZ *+8 NO @V408246 00657000
L R2,ASYSVM YES - USE SYSTEM'S VMBLOK @V408246 00658000
ST R2,CORFPNT CORE TABLE ENTRY POINTS TO VMBLOK@V408246 00659000
LH R0,VMPAGES-VMBLOK(,R2) INCREMENT @V408246 00660000
AR R0,R4 USER'S IN CORE PAGE COUNT @V408246 00661000
STH R0,VMPAGES-VMBLOK(,R2) @V408246 00662000
CH R0,VMXPG-VMBLOK(,R2) MAX. PAGES SO FAR? @V408246 00663000
BNH *+8 NO @V408246 00664000
STH R0,VMXPG-VMBLOK(,R2) YES, SET NEW MAX. @V408246 00665000
TM VMPSTAT-VMBLOK(R2),VMRPAGE RESERVE USER? (FOR @V408246 00666000
* R11=R2) 00667000
BZ PAGEINC NO -- NO SPECIAL TREATMENT 00668000
L R2,DMKPTRRC GET COUNT OF RESIDENT, RESERVED PAGES 00669000
ALR R2,R4 AND INCREMENT 00670000
CL R2,DMKPTRRL ABOVE HIGH WATER MARK ?? 00671000
BH PAGEINC YES -- THIS PAGE NOT RESERVED 00672000
ST R2,DMKPTRRC SAVE NEW COUNT 00673000
OI CORFLAG,CORRSV AND FLAG RESERVED PAGE 00674000
L R15,=A(DMKDSPNP) GET ADDRESS OF DYNAMIC PAGE COUNTER 00675000
L R2,0(,R15) GET NUMBER OF ASSIGNABLE PAGE FRAMES 00676000
SLR R2,R4 AND DECREMENT 00677000
ST R2,0(,R15) AND SAVE 00678000
PAGEINC EQU * 00679000
L R1,XPAGNUM CHECK THE VIRTUAL PAGE NUMBER @V408246 00680000
N R1,SAVER1 IS IT ZERO? @V408246 00681000
BNZ TESTLOCK NO, NO FURTHER PROCESSING @V408246 00682000
L R1,VMTIMER VALUE OF SAVED TIMER @V408246 00683000
ST R1,TIMER-PSA(R6) BRING VIRT. 80 UP TO DATE @V408246 00684000
TM VMTLEVEL,VMTON+VMRON VIRTUAL TIMERS RUNNING? @V408246 00685000
BZ TESTLOCK NO @V408246 00686000
TM VMMCR6,VMMVTMR VIRT TIMER ASSIST EN??? @V408246 00687000
BNO TESTLOCK NOPE... @V408246 00688000
ICM R15,B'0111',VMMADDR IS VMASSIST BEING USED???? @V408246 00689000
BZ TESTLOCK NOPE... @V408246 00690000
USING MICBLOK,R15 @V408246 00691000
LA R2,80(,R6) GET VIRT TIMER ADDR. @V408246 00692000
ST R2,MICVTMR SAVE IN VIRT MACH PTR LIST @V408246 00693000
DROP R15 @V408246 00694000
EJECT 00695000
*. 00696000
* D. PROCESSING LOCK OPTION AND EXIT FROM DMKPTRAN - 00697000
* 1. IF THE LOCK OPTION IS NOT SPECIFIED, GO TO STEP D.4; 00698000
* OTHERWISE, CONTINUE 00699000
* 2. IF THE PAGE IS ALREADY LOCKED, SKIP TO STEP D.3; OTHER- 00700000
* WISE, SET THE CORLOCK FLAG IN THE CORFLAG FIELD OF THE 00701000
* CORTABLE ENTRY. 00702000
* 3. ADD ONE TO THE LOCK COUNT IN THE CORTABLE ENTRY 00703000
* 4. SET THE REAL TRANSLATED ADDRESS IN THE CALLER'S GPR2, MAKE 00704000
* THE APPROPRIATE PAGTABLE ENTRY VALID, SET CC = 0, 00705000
* AND EXIT TO THE CALLER 00706000
*. 00707000
SPACE 00708000
TESTLOCK TM SAVER2+3,LOCK SHOULD PAGE BE LOCKED ?? 00709000
BZ GETRADD NO -- GO DEVELOP REAL ADDRESS 00710000
TM CORFLAG,CORIOLCK IS PAGE ALREADY LOCKED? @V408246 00711000
BZ SETLOCKA NO - LOCK IT AND UPDATE COUNT. @V408246 00712000
SETLOCK EQU * NOTE THAT GPR4 = 1 00713000
AL R4,CORLCNT UPDATE LOCK COUNT 00714000
SETLOCKA EQU * GPR4 NOW = TO LOCK COUNT 00715000
ST R4,CORLCNT .... 00716000
OI CORFLAG,CORIOLCK FLAG LOCKED PAGE 00717000
GETRADD DS 0H @V408246 00718000
LA R1,X'FFF' DISPLACEMENT MASK @V408246 00719000
N R1,SAVER1 GET VIRTUAL ADDRESS DISPLACEMENT @V408246 00720000
S R7,ACORETBL GET PAGE ADDRESS/256 00721000
STH R7,PAGCORE UPDATE PAGE TABLE 00722000
SLL R7,8 GET PAGE ADDRESS 00723000
AR R1,R7 FORM REAL ADDRESS IN R1 @V386198 00724000
SPACE 00725000
CLI SAVEWRK9,0 PAGE IN OK ?? 00726000
BNE PAGERROR NO -- 00727000
SPACE 00728000
ST R1,SAVER2 RETURN REAL ADDRESS IN GPR2 @V408246 00729000
EXITCC0 CLI F0,X'00' SET CC = 0 @V407466 00730000
EXIT LM R0,R11,SAVEREGS RESTORE REGS R0 THRU R11 @VM03012 00731000
LCTL C1,C1,VMSEG RESTORE CALLERS SEGMENT TABLE @VM03012 00732000
* ORIGIN 00733000
SVC 12 RETURN TO CALLER @VM03012 00734000
EXITRC LCR R9,R9 PLUS TO MINUS SETS CC = 1 @V407466 00735000
B EXIT EXIT TO RETURN CC=1 @V407466 00736000
EJECT 00737000
*. 00738000
* SEGMENT TABLE EXCEPTION HANDLER 00739000
* 00740000
* 1. BUILD PAGE TABLES AS REQUIRED, RETRY LRA 00741000
* 00742000
*. 00743000
SEGEX DS 0H SEGMENT EXCEPTIONS HERE @V408246 00744000
BC 1,ADDEX LENGTH VIOLATION, DOUBLE CHECK @V408246 00745000
ICM R5,B'0110',1(R7) TEST FOR VALID PTR @V408246 00746000
BZ SEGEXA NONE @V408246 00747000
NI 3(R7),255-SEGINV CLEAR INVALID FLAG @V408246 00748000
L R5,0(,R7) LOAD VALID POINTER @V408246 00749000
LA R5,0(,R5) CLEAR COUNT FIELD @V408246 00750000
S R5,F16 BACK-UP TO HEADER @V408246 00751000
USING PAGSTMP,R5 @V408246 00752000
STCK TEMPR2 STORE TOD CLOCK IN WORK AREA @V407594 00753000
MVC PAGSTMP,TEMPR2 & MOVE HIGH WORD TO PG TBL HDR @V407594 00754000
BC 3,DOWNWEGO CLOCK NOT FUNCTIONING @V408246 00755000
ICM R6,B'0111',PAGSHR+1 NAMED SYSTEM PNTR. @V408246 00756000
BZ SGXNS NOT NAMED @V408246 00757000
ICM R6,B'1111',SHRSEGCT-SHRTABLE(R6) SHARED? @V408246 00758000
BZ SGXNS NO @V408246 00759000
L R0,PAGACT LOAD COUNTS @V407594 00760000
AIF (NOT &AP).NOAP7 **AIF*** 00760900
TM APSTAT1,APUOPER RUNNING IN AP MODE @V407594 00761000
BO CSPGACT YES, USE COMPARE AND SWAP LOGIC @V407594 00762000
.NOAP7 ANOP **ANOP** 00762100
AL R0,=A(X'10000') INCREMENT ACTIVE COUNT @V407594 00763000
ST R0,PAGACT & REPLACE IN PG TBL HDR @V407594 00764000
AIF (NOT &AP).NOAP8 **AIF*** 00764900
B SGXNS @V407594 00765000
CSPGACT LR R14,R0 @V407594 00766000
AL R14,=A(X'10000') INCREMENT ACTIVE COUNT @V407594 00767000
CS R0,R14,PAGACT UPDATE ACTIVE COUNT @V407594 00768000
BC 4,CSPGACT UPDATE FAILED @V407594 00769000
.NOAP8 ANOP **ANOP** 00769100
SGXNS DS 0H @V407594 00770000
CLM R7,B'0111',VMSEG+1 FOR SEGMENT 0? @V408246 00771000
BNE ADDROK NO @V408246 00772000
LRA R15,0 PAGE 0 NOW AVAILABLE? @V408246 00773000
BNZ ADDROK NO @V408246 00774000
MVC TIMER-PSA(4,R15),VMTIMER YES, UPDATE VRT. 80 @V408246 00775000
TM VMMCR6,VMMVTMR IS TIMER ASSIST BEING USED? @V408246 00776000
BZ ADDROK NO @V408246 00777000
ICM R14,B'0111',VMMADDR VM ASSIST ON FOR USER? @V408246 00778000
BZ ADDROK NO @V408246 00779000
LA R0,TIMER-PSA(,R15) POINT TIMER ASSIST HERE... @V408246 00780000
ST R0,MICVTMR-MICBLOK(R14) @V408246 00781000
B ADDROK @V408246 00782000
* 00783000
SEGEXA DS 0H LET SEGTRANS HANDLE EXCEPTION @V408246 00784000
CL R1,VMSTOR-VMBLOK(R2) WITHIN PERMANENT MEMORY @V407594 00785000
BNL ADDEX NO- ADDRESSING EXCEPTION @V407594 00786000
STM R0,R2,SAVEWRK2 SAVE REGS ACROSS BAL @V408246 00787000
BAL R3,CKDEFER CHECK DEFER AND SET PAGEWAIT @V408246 00788000
LM R0,R2,SAVEWRK2 RESTORE AFTER RETURN @V408246 00789000
LR R2,R1 SAVE VIRTUAL ADDRESS @V408246 00790000
* THIS IS THE STANDARD CASE FOR AN INVALID SEGMENT 00791000
* PAGE AND SWAP TABLE HAVE NOT YET BEEN BUILT. 00792000
SRL R2,16 STE NO. @V408246 00793000
LR R1,R2 SEGMENT NUMBER IN GPR1 @V408246 00794000
AR R1,R4 STE NO. + 1 @V408246 00795000
SLL R1,16 ENDING SEGMENT ADDRESS + 1 @V408246 00796000
C R1,VMSTOR OVERSHOT VIRTUAL MACHINE MEMORY? @V408246 00797000
BNH *+8 NO, OK @V408246 00798000
L R1,VMSTOR YES, RESET TO MAX. @V408246 00799000
SRL R1,12 POSITION ENDING ADDRESS @V408246 00800000
BCTR R1,0 ORIGIN 0 COUNT @V408246 00801000
SLL R2,20 POSITION STARTING ADDRESS @V408246 00802000
ALR R1,R2 COMBINE STARTING AND ENDING @V408246 00803000
* ADDRESS 00804000
CALL DMKBLDRT,PARM=PAGTONLY+NEWPAGES @V408246 00805000
ST R2,0(R7) UPDATE STE W/CNT+PG TBL PTR @V408246 00806000
BAL R3,CKWT RESET PAGEWAIT @V408246 00807000
LM R0,R2,SAVEWRK2 RESTORE THEM AGAIN @V408246 00808000
B ADDROK @V408246 00809000
* 00810000
* ADDRESSSNG EXCEPTION, RETURN C.C. = 2 00811000
* 00812000
ADDEX DS 0H ADDRESSING EXCEPTION @V408246 00813000
CLI FFS,0 SET CONDITION CODE 2 @V408246 00814000
B EXIT AND LEAVE @V408246 00815000
* 00816000
DROP R5 @V408246 00817000
USING SWPFLAG,R5 @V408246 00818000
EJECT 00819000
PAGERROR EQU * HERE IF AN IOERROR OCCURED DURING PAGEING 00820000
LR R2,R7 GET REAL PAGE ADDRESS @V386198 00821000
L R3,F4096 LENGTH OF ONE PAGE FRAME .. 00822000
SLR R4,R4 DUMMY ADDRESS FOR MVCL 00823000
SLR R5,R5 LENGTH AND PADDING .. 00824000
MVCL R2,R4 CLEAR THE PAGE FRAME IN ERROR 00825000
SRL R7,8 PAGE NUMBER X 16 @VA07310 00825100
AL R7,ACORETBL BASE CORE TABLE ENTRY @VA07310 00825200
L R5,CORSWPNT PICK-UP SWAPTABLE ENTRY @V408246 00826000
TM SWPFLAG,SWPSHR SHARED PAGE @VA12685 00827050
BZ BADBKST NO, SKIP UNSHARE OF USER @VA12685 00827100
MVC PAGCORE,INVLPTE INVALIDATE PTE @VA12685 00827150
XC CORPGPNT(4),CORPGPNT CLEAR CORETBL PTE PTR @VA12685 00827200
SLR R0,R0 ... @VA12685 00827250
STCM R0,B'0111',CORSWPNT+1 CLR SWPTBL PTR IN CORETBL @VA12685 00827300
NI CORFLAG,255-CORSHARE CLEAR FLAGS @VA12685 00827350
CALL DMKPTRFT PLACE FRAME ON FREE LIST @VA12685 00827400
B HNDLERR ISSUE CP MSG OR RETURN TO USER @VA12685 00827450
SPACE 1 00827500
INVLPTE DC X'0008' INVALID PTE CONSTANT @VA12685 00827550
SPACE 1 00827600
BADBKST OI SWPFLAG,SWPRECMP BACKING STORE UNUSABLE @VA12685 00827650
XC SWPCYL(4),SWPCYL ZEROS PAGE @V408246 00828000
HNDLERR TM SAVER2+3,IOERETN USER WANT TO HANDLE ERROR ? @VA12685 00829500
ST R1,SAVER2 RETURN REAL ADDRESS IN GPR2 @V408246 00830000
BO SETCC3 YES -- JUST RETURN CC 00831000
SPACE 2 00832000
MSG 'DMKPTR410W CP ENTERED; PAGING ERROR' 00833000
CALL DMKQCNWT,PARM=NORET 00834000
CALL DMKCFMBK PUT USER IN CONSOLE FUNTION MODE @VA09005 00834500
SETCC3 TM FFS,X'FF' SET CC = 3 00835000
B EXIT AND EXIT TO CALLER 00836000
SPACE 2 00837000
CKWT EQU * TEST FOR NORMAL OR NON-DEFERED @V213135 00838000
* PAGE 00839000
TM SAVER2+3,DEFER WAS DEFER REQUESTED FOR THIS @V213135 00840000
* PAGE ? 00841000
BZ NOWAIT NO -- USER WAS NOT IN PAGEWAIT, @V213135 00842000
* THEN 00843000
SPACE 00844000
LH R2,VMWCNT GET WAIT COUNT @V213135 00845000
BCT R2,WTCOUNT DECREMENT AND TEST @VA01061 00846000
NI VMRSTAT,X'FF'-VMPGWAIT CLEAR WAIT FLAG. @VA01061 00847000
WTCOUNT STH R2,VMWCNT AND UPDATE NEW COUNT. @VA01061 00848000
TM VMRSTAT,VMCPWAIT STILL NOT RUNNABLE? @V408246 00849000
BCR 7,R3 YES, BYPASS SCHEDULE CALL @V408246 00850000
CALL DMKSCHDL NOTIFY SCHEDULE OF CHANGE OF @V408246 00851000
* STATUS 00852000
BR R3 AND RETURN @V213135 00853000
SPACE 00854000
NOWAIT EQU * HERE IF NEW PAGE WAS NON-DEFERED @V213135 00855000
LH R2,VMNDCNT GET NON-DEFERED COUNT @V213135 00856000
BCTR R2,R0 DECREMENT @V213135 00857000
STH R2,VMNDCNT AND SAVE @V213135 00858000
BR R3 AND RETURN 00859000
* 00860000
DOWNWEGO DS 0H CLOCK DAMAGED - ABEND CVT001 @V408246 00861000
GOTO DMKCVTAB @V408246 00862000
SPACE 1 @V407594 00863000
DROP R12,R10 @V407594 00864000
EJECT 00865000
*. 00866000
* E. DMKPTRFR - ALLOCATE REAL CORE PAGE FRAME 00867000
* 1. IF THE CALLER IS DMKFREE TRYING TO EXTEND SYSTEM FREE 00868000
* STORAGE, CONTINUE; OTHERWISE, SKIP TO STEP 6. 00869000
* 3. RETURN SPARE STORAGE SAVED FOR 'EXTEND' TO FREE STORAGE 00870000
* 4. IF NO PAGES ARE CURRENTLY ON THE FREE LIST OR IN TRANSIT 00871000
* OUT OF THE SYSTEM, CONTINUE; OTHERWISE, SKIP TO STEP 6. 00872000
* 5. OBTAIN A CPEXBLOK, AND SET ITS RETURN ADDRESS TO STEP 10. 00873000
* 6. BRANCH AND LINK TO TO THE PAGFREE SUBROUTINE TO GET A PAGE 00874000
* 7. IF THE PAGE OBTAINED IS NOT FOR FREE STORAGE, PASS THE 00875000
* ADDRESS OF THE CORTABLE ENTRY TO THE CALLER, AND SKIP TO 00876000
* STEP 9; OTHERWISE, CONTINUE 00877000
* 8. FLAG THE CORTABLE ENTRY AS A CP OWNED, FREE STORAGE PAGE, 00878000
* PLACE THE STORAGE OBTAINED INTO THE FREE LIST VIA A CALL 00879000
* TO DMKFRETR, AND RESET THE EXTEND LOCK. 00880000
* 9. BRANCH AND LINK TO THE SELECT SUBROUTINE TO REPLENISH THE 00881000
* FREE PAGE LIST, AND EXIT TO THE CALLER. 00882000
* 10. SCAN ALL OF THE AVAILABLE PAGEABLE STORAGE TO LOCATE A 00883000
* NON-CHANGED PAGE FRAME TO SATISFY THE REQUEST. IF A NON- 00884000
* CHANGED PAGE CAN BE FOUND, ENTER THE SELECT ROUTINE LOGIC 00885000
* AT LABEL 'EXTSRCH' WHERE A PAGE FRAME HAS ALREADY BEEN 00886000
* SELECTED. OTHERWISE ENTER THE SELECT ROUTINE AT THE 00887000
* BEGINNING. 00888000
*. 00889000
SPACE 00890000
ENTRY DMKPTRFR @VA08037 00891100
DMKPTRFR DS 0H @VA08037 00891200
USING *,R12 @VA08037 00891300
STM R0,R11,SAVEREGS @VA08037 00891400
SL R12,LABEL1 @VA08037 00891500
USING DMKPTR,R12 @VA08037 00891600
LR R10,R12 @VA08037 00891700
A R10,F4096 @VA08037 00891800
USING DMKPTR+4096,R10 @VA08037 00891900
B LABEL2 @VA08037 00892000
LABEL1 DC A(DMKPTRFR-DMKPTR) @VA08037 00892100
LABEL2 DS 0H @VA08037 00892200
LA R5,SAVEWRK6 LET R5 POINT TO A HARMLESS SCRATCH-AREA 00895000
* WORD (TO KEEP "OI" AT "SETALLOC" FROM 00896000
* CLOBBERING A RANDOM BYTE PER CALLER'S R5) 00897000
CL R2,F1 HIGH PRIORITY CALL FROM DMKFREE ?? 00898000
BE EXTEND YES, CONT (XTNDLOCK SET BY FRE) @V407466 00899000
CL R2,F2 HIGH PRIORITY CALL + RETURN CODE @V407466 00900000
BNE PAGEGET NO, CAN AFFORD TO WAIT FOR PAGE @V407466 00901000
* YES - CONTINUE (XTNDLOCK SET BY DMKFRE): 00902000
EXTEND SLR R0,R0 CLEAR LENGTH DW'S TO FRET @VM08952 00903000
IC R0,DMKPTRFA GET INTO R0 - LENGTH @VM08952 00904000
L R1,DMKPTRFA ADDRESS OF EXTEND BUFFER @VM08952 00905000
LA R1,0(,R1) CLEAR HI BYTE @VM08952 00906000
CALL DMKFRET RETURN IT TO FREE @VM08952 00907000
SLR R0,R0 INDICATE THAT THE EXTEND BUFFER @V407466 00908000
ST R0,DMKPTRFA HAS BEEN GIVEN OUT @V407466 00909000
LM R0,R1,DMKPTRFN GET NUMBER OF NOW AND FUTURE FREE PAGES 00910000
LTR R0,R0 ANY PAGES IMMEDIATELY AVAILABLE ? 00911000
BP PAGEGET YES -- GO GET ONE 00912000
LA R0,CPEXSIZE NO PAGE IN SIGHT -- DO IT THE HARD WAY 00913000
CALL DMKFREE GET A CPEXBLOK SO WE CAN RETURN 00914000
LA R15,DMKPTRFE GET RETURN ADDRESS TO EXTEND 00915000
STM R15,R13,CPEXADD AND SAVE IN CPEXBLOK 00916000
CALL DMKSTKCP STACK THE BLOK SO WE CAN RESTART 00917000
SIGNAL EXTEND,CONTROL=SERIAL ANNOUNCE EXTEND IN PROG @V407594 00918000
PAGEGET LA R4,1 ESTABLISH DMKPTR'S STANDARD INCREMENTER 00919000
BAL R3,PAGFREE AND GO TRY FOR A PAGE 00920000
SPACE 00921000
DMKPTRFP EQU * HERE AFTER WE HAVE OUR PAGE 00922000
CLC SAVER2,F1 WAS CALL FROM DMKFREE TO EXTEND ?@V304735 00923000
BE EXTPAGE YES - MERGE INTO 'FREE CHAIN' @V304735 00924000
CLC SAVER2,F2 WAS CALL FROM DMKFREE WITH RC @V407466 00925000
BE EXTPAGE YES, MERGE INTO FREE CHAIN @V407466 00926000
ST R7,SAVER7 PASS BACK THE CORTABLE ENTRY ADDRESS 00927000
ST R11,CORFPNT ASSIGN PAGE TO OWNER @V408246 00928000
B EXIT AND EXIT @V3M4026 00929000
SPACE 00930000
EXTPAGE EQU * HERE TO MERGE PAGE INTO FREE STORAGE CHAIN 00931000
MVC CORFPNT,=C'FREE' FIRST, FLAG THE CORTABLE ENTRY 00932000
MVI CORFLAG,CORCP AS A CP OWNED, FREE STORAGE PAGE 00933000
SL R7,ACORETBL GET DISPLACEMENT OF ENTRY INTO TABLE 00934000
SLL R7,8 GET REAL PAGE ADDRESS 00935000
LR R1,R7 INTO GPR1 FOR DMKFRET 00936000
SR R6,R6 SET KEY TO ZERO @VA02537 00937000
LA R5,2048(,R7) ADDRESS OF SECOND 2K @VA02537 00938000
SSK R6,R7 SET FIRST 2K @VA02537 00939000
SSK R6,R5 SET SECOND 2K @VA02537 00940000
LA R0,512 GET THE SIZE OF A PAGE IN DOUBLE WORDS 00941000
CALL DMKFRETR AND MERGE IT INTO THE CHAIN 00942000
LA R0,CPEXSIZE*8 GET ANOTHER LARGE BLOCK @V408246 00943000
CALL DMKFREE ... @VM08952 00944000
ST R1,DMKPTRFA SAVE THE NEW AREA GOTTEN @VM08952 00945000
STC R0,DMKPTRFA AND SAVE ITS LENGTH IN DBL WDS @V407594 00946000
TM APSTAT1,APUOPER RUNNING AS AP @V407594 00947000
BZ SKIPAP NO @V407594 00948000
L R4,=A(DMKFREAP) AP BACK POCKET @V407594 00949000
ICM R1,B'0111',1(R4) ACCESS AP BACK POCKET @V407594 00950000
BNZ SKIPAP REPLENISHMENT NOT REQUIRED @V407594 00951000
SR R0,R0 CLEAR REG @V407594 00952000
IC R0,0(R4) LOAD SIZE OF DMKFREAP (DBL WDS) @V407594 00953000
CALL DMKFREE GET STORAGE @V407594 00954000
STCM R1,B'0111',1(R4) SAVE ITS ADDRESS @V407594 00955000
LA R0,CPEXSIZE MUST GET CPEXBLOK TOO @VA12596 00955100
CALL DMKFREE @VA12596 00955300
ST R1,4(,R4) PUT CPEX POINTER IN DMKFREAP @VA12596 00955500
SKIPAP DS 0H @V407594 00956000
LA R0,CPEXSIZE GET CPEXBLOK @V408246 00957000
CALL DMKFREE @V408246 00958000
LA R15,PTRFDISP AMKE SURE WE WAKE-UP AFTER EXTEND@V408246 00959000
STM R15,R13,CPEXADD @V408246 00960000
CALL DMKSTKCP @V408246 00961000
CLC SAVER2,F2 DMKPTR CALLED WITH PARM = 2 @V407466 00962000
BE EXITCC0 YES, PAGE OBTAINED SUCCESSFULLY @V407466 00963000
B EXIT EXIT WITHOUT PAGE REPLENISHING @V3M4026 00964000
* (XTNDLOCK STILL SET - CLEARED BY DMKFRE) 00965000
EJECT 00966000
* 00967000
* SCAN IN-CORE PAGES FOR NON-CHANGED TO SATISFY EXTEND REQ. 00968000
* 00969000
DMKPTRFE DS 0H HEVE VIA CPEXBLOK TO SELECT PAGE @V408246 00970000
SR R0,R0 @V407594 00971000
ST R0,TEMPR0 CLEAR FLAGS @V407594 00972000
LA R8,SELDSPX GO DIRECTLY TO . . @V408246 00973000
ST R8,SAVEWRK8 . . DSP AFTER SELECT @V408246 00974000
LA R4,1 INCREMENTER (=1) @V408246 00975000
XC SAVEWRK1,SAVEWRK1 DON'T NEED ANYMORE PAGES @V408246 00976000
LA R3,TSTUSR LOOP BRANCH ADDRESS @V408246 00977000
LA R7,DMKPTRU1 CHAIN OF USER Q-DROP PAGES @V408246 00978000
LR R0,R7 SAVE ANCHOR @V408246 00979000
TSTUSR DS 0H @V408246 00980000
L R7,CORFPNT NEXT PAGE ON LIST @V408246 00981000
CR R7,R0 BACK AT THE START? @V408246 00982000
BE FLLSCN YES, SCAN ALL PAGES @V408246 00983000
LR R6,R7 GET PAGE'S REAL ADDRESS @V408246 00984000
SL R6,ACORETBL PAGE NO. * 16 @V408246 00985000
SLL R6,8 PAGE ADDRESS @V408246 00986000
B TESTCHG CHECK FOR CHANGED PAGE @V408246 00987000
* 00988000
* PART TWO OF SCAN IF NO UNCHANGED PAGES 00989000
* 00990000
FLLSCN DS 0H @V408246 00991000
LA R2,FULLSCAN ADDRESS OF FIRST SCAN BLOCK @VA08341 00991100
FLLSCN1 LA R3,CONTST BRANCH ADDRESS @VA08341 00992100
LM R6,R9,0(R2) LOAD TABLE VALUES FOR BXH SEARCH @VA08341 00993100
LTR R6,R6 TEST IF TABLES HAVE BEEN EXCEEDED@VA11926 00993400
BM SCNEND YES--BRANCH OUT @VA11926 00993700
L R1,F4096 CONSTANT TO DECREMENT PAGE ADDR @V407594 00994000
TSTFLAG TM CORFLAG,255-CORSHARE-CORRSV PICK ANY UNLOCKED @V408246 00995000
* PAGE 00996000
BZ TESTCHG YES, TEST CHANGED @V408246 00997000
CONTST SLR R6,R1 GET NEXT REAL PAGE ADDRESS @V407594 00998000
BXH R7,R8,TSTFLAG LET BXH GET NEXT CORETABLE ENTRY @V408246 00999000
LA R2,20(R2) INCREMENT TO NEXT BLOCK TO SCAN @VA08341 00999100
TM SCANFLAG,VEQRUNLK HAVE V=R PAGES BEEN UNLOCKED? @VA08341 00999200
BO FLLSCN1 YES, BRANCH TO TRY THOSE PAGES @VA08341 00999300
SCNEND DS 0H @VA11926 00999350
L R2,SAVER2 RESTORE CALLER'S REGISTER 2 @VA08341 00999400
SR R13,R13 GO DIRECTLY TO PAGIO AFTER SELECT@V408246 01000000
CL R2,F2 CONDITIONAL CALL FROM FREE @V407594 01001000
BNE USERPAGE NO, NORMAL EXTEND CALL @V407594 01002000
LR R13,R2 REMEMBER CONDITIONAL CALL @V407594 01003000
B USERPAGE NO NON-CHANGED PAGES, TAKE ANY @V408246 01004000
TESTCHG DS 0H @V408246 01005000
ICM R5,B'0111',CORSWPNT+1 GET SWAP TABLE ENTRY @V408246 01006000
* POINTER 01007000
BZ FRETIT NO POINTER, PAGE UNOWNED @V408246 01008000
TM SWPFLAG,SWPTRANS+SWPALLOC+SWPCHG1+SWPCHG2 @V408246 01009000
* AVAILABLE? 01010000
BCR 7,R3 NO, TRY NEXT PAGE @V408246 01011000
ISK R15,R6 GET STORAGE KEY @V408246 01012000
SLL R15,8 MAKE ROOM FOR 2ND HALF OF PAGE @V408246 01013000
LA R14,2048(,R6) ADDR FOR 2ND 2K @V408246 01014000
ISK R15,R14 GET OTHER STORAGE KEY @V408246 01015000
LA R14,SWPREF2*256+SWPREF2 GET CHANGE BIT MASK @V408246 01016000
NR R14,R15 WAS PAGE CHANGED? @V408246 01017000
BCR 7,R3 YES, LOOK FOR ANOTHER PAGE @V408246 01018000
TM CORFLAG,CORFLUSH USER FLUSH PAGE? @V408246 01019000
BNZ USERPGA YES @V408246 01020000
RRB 0(R6) MAKE SURE BITS RESET FOR SELECT. @V408246 01021000
BZ *+8 NO RE.F BIT TO BACK-UP @V408246 01022000
OI SWPKEY1,4 VIRT. BACK-UP KEY @V408246 01023000
RRB 2048(R6) . . @V408246 01024000
BZ *+8 NO REF. BIT TO BACK-UP @V408246 01025000
OI SWPKEY2,4 VIRT. BACK-UP KEY @V408246 01026000
* R14 SET UP TO REFLECT NON-CHANGED PAGE 01027000
OI TESTFLG+1,CORRSV SET FOR AP LOOKASIDE MAINT @V407594 01028000
B EXTSRCH PUT PAGE ON FREELIST @V408246 01029000
SPACE 1 @V407594 01030000
PTR7A LA R0,2 CHECK VALUE FOR PTRFR CALL PARM=2@V407594 01031000
CL R13,F2 CONDITIONAL FREE CALL @V4M0192 01032000
BNE PTR7 NO, ABEND @V4M0192 01033000
LA R1,FREEQ ADDR OF THE HEAD OF THE QUEUE @V407594 01034000
LA R5,DMKPTRFP RETURN ADDR FOR OUR REQUEST @V407594 01035000
NEXTREQ LR R4,R1 SAVE PREV REQUEST BLOK ADDRESS @V407594 01036000
L R1,CPEXFPNT-CPEXBLOK(R4) GET THE NEXT REQUEST @V407594 01037000
LTR R1,R1 IS THERE ONE? @V407594 01038000
BNZ REQLOOP YES, GO CHECK IT OUT @V407594 01039000
PTR6A GOTO DMKDSPCH NO DEF REQ, PGE MUST'VE BEEN FND @V407594 01040000
SPACE 3 @V407594 01041000
REQLOOP CL R0,CPEXR2 THIS A DMKFRERC CALL TO EXTEND? @V407594 01042000
BNE PTR6A NOPE, MUST HAVE BEEN STACKED @V407594 01043000
L R13,CPEXR13 RECLAIM SAVE AREA @V407594 01044000
L R2,CPEXFPNT GET PTR TO NEXT DEFERED REQUEST @V407594 01045000
ST R2,CPEXFPNT-CPEXBLOK(R4) STORE IN PREVIOUS @V407594 01046000
LA R0,CPEXSIZE SIZE OF BLOCK @V407594 01047000
CALL DMKFRET DEF. REQ. WILL NEVER BE SATISFIED@V407594 01048000
LA R0,CPEXSIZE*16 SIZE OF EXTEND BUFFER @V407594 01049000
CALL DMKFREE RE-OBTAIN EXTEND BUFFER @V407594 01050000
ST R1,DMKPTRFA SAVE THE BUFFER ADDRESS @V407594 01051000
STC R0,DMKPTRFA AND THE SIZE OF THE BUFFER TOO @V407594 01052000
B EXITRC GO TELL USER: NO MORE STORAGE @V407594 01053000
SPACE 01054000
EJECT 01055000
*. 01056000
* 11. COUNT THE CALLS TO PAGFREE; THEN, DECREMENT AND TEST THE 01057000
* NUMBER OF FREE PAGES AVAILABLE. IF A PAGE IS AVAILABLE, 01058000
* SKIP TO STEP 12; OTHERWISE, CHAIN A CPEXBLOK TO THE QUEUE 01059000
* OF TASKS WAITING FOR PAGES AND EXIT TO DISPATCH. 01060000
*. 01061000
SPACE 01062000
PAGFREE EQU * ENTRY FROM WITHIN DMKPTRAN 01063000
L R0,DMKPTRFC COUNT NUMBER OF CALLS 01064000
ALR R0,R4 -- 01065000
ST R0,DMKPTRFC -- 01066000
SPACE 01067000
L R0,DMKPTRFN GET FREE PAGE COUNTER 01068000
SR R0,R4 DECREMENT @V408246 01069000
BNM GETFREE SOMETHING TO GIVE OUT @V408246 01070000
SPACE 01071000
L R0,DMKPTRF0 COUNT NUMBER OF TIMES WE WERE OUT 01072000
AR R0,R4 OF FREE PAGES TO ASSIGN 01073000
ST R0,DMKPTRF0 -- 01074000
SPACE 01075000
LA R0,CPEXSIZE GET CORE FOR A CPREQUEST BLOK 01076000
CALL DMKFREE 01077000
STM R2,R13,CPEXR2 SAVE REGISTERS 01078000
LR R6,R3 AND RETURN ADDRESS 01079000
LA R2,FREEQ POINT TO QUEUE OF DEFERED REQUESTS 01080000
CL R4,CPEXR2 CALL BY FREE TO EXTEND ?? 01081000
BE SETFIRST YUP, MAKE REQ FIRST ON CHAIN @V407466 01082000
CLC CPEXR2,F2 RETURN CODE CALL FOR EXTEND @V407594 01083000
BNE NEXTQ NO, ADD TO END OF CHAIN @V407594 01084000
SETFIRST L R3,FREEQ CHAIN REQ AHEAD OF ALL OTHERS @V407466 01085000
B QREQUEST -- 01086000
SPACE 01087000
NEXTQ L R3,CPEXFPNT-CPEXBLOK(,R2) GET POINTER TO NEXT BLOK 01088000
LTR R3,R3 ARE THERE ANY ?? 01089000
BZ QREQUEST 01090000
LR R2,R3 SAVE PREVIOUS POINTER 01091000
B NEXTQ AND KEEP LOOKING 01092000
SPACE 2 01093000
QREQUEST ST R1,CPEXFPNT-CPEXBLOK(,R2) CHAIN NEW REQUEST TO END 01094000
SR R5,R5 ZERO TASK CHAIN 01095000
STM R3,R6,CPEXFPNT SET FORWARD POINTER, TASK CHAIN TO 0, 01096000
* AND SAVE EXECUTION ADDRESS 01097000
SPACE 01098000
L R15,PREFIXA ACCESS ABSOLUTE PSA @V407594 01099000
CLI XTNDLOCK-PSA(R15),0 SYSTEM EXTENDING @V407594 01100000
BNE SELDSPX YES -- UNSTACK DMKPTRFE BLOCK @V408246 01101000
LM R14,R15,=A(DMKSCHN1,DMKSCHN2) GET POINTERS TO @V408246 01102000
* Q COUNTS 01103000
L R14,0(,R14) NO. IN Q1 @V408246 01104000
L R15,0(,R15) NO. IN Q2 @V408246 01105000
LA R0,1(R14,R15) 1 + (Q1 + Q2) COUNT @V408246 01106000
ST R0,SAVEWRK1 AND SAVE @V408246 01107000
LA R8,PTRFDISP RETURN @V408246 01108000
ST R8,SAVEWRK8 @V408246 01109000
B USERPAGE FORCE SELECT TO OBTAIN 1 MORE @V408246 01110000
EJECT 01111000
*. 01112000
* 12. IF A FREE PAGE IS AVAIALBLE, UNCHAIN THE CORTABLE ENTRY 01113000
* FROM THE FREELIST, AND, IF THE PAGTABLE POINTER IN THE 01114000
* ENTRY IS VALID, ZERO OUT THE OLD OWNER'S PAGTABLE ENTRY 01115000
* 13. EXIT TO THE CALLER, PASSING BACK THE CORTABLE ENTRY 01116000
* ADDRESS IN GPR7 01117000
*. 01118000
SPACE 01119000
GETFREE EQU * 01120000
ST R0,DMKPTRFN SAVE NEW VALUE. @VA01767 01121000
LR R15,R2 SAVE PARM REGISTER 01122000
L R7,DMKPTRF1 POINT TO FIRST ENTRY ON LIST 01123000
LM R1,R2,CORFPNT GET FORWARD AND BACK CHAIN POINTERS 01124000
ST R1,CORFPNT-CORTABLE(,R2) UNCHAIN THE 01125000
ST R2,CORBPNT-CORTABLE(,R1) CORTABLE ENTRY 01126000
L R1,CORPGPNT GET POINTER TO OWNER'S PAGTABLE ENTRY 01127000
LTR R1,R1 IS IT VALID ?? 01128000
BZ FREEXIT NO -- OK TO LEAVE NOW 01129000
TM 1(R1),PAGINVAL TRY TO CATCH CULPRIT 01130000
BO PTR8A OK 01131000
ABEND 8 GOTCHA 01132000
PTR8A EQU * 01133000
MVI 0(R1),0 SET PAGE TABLE ENTRY -> 0, 01134000
NI 1(R1),PAGINVAL+PAGREF RETAINING THESE FLAGS 01135000
SLR R1,R1 CLEAR OUT 01136000
ST R1,CORPGPNT PTE POINTER 01137000
FREEXIT MVI CORFLAG,CORCP PAGE NOW BELONGS TO CP @VA05378 01138000
LR R2,R15 RESTORE PARM REG @VA05378 01139000
ST R1,CORBPNT ... @V408246 01140000
STCM R1,B'0111',CORSWPNT+1 AND SWAP POINTER @V408246 01141000
BR R3 AND RETURN TO CALLER 01142000
EJECT 01143000
*. 01144000
* F. OPERATION OF THE PAGE SELECTION ROUTINE - 01145000
* 1. IF THERE IS AN ENTRY ON THE FLUSHED PAGE LIST, UNCHAIN IT 01146000
* AND GO TO STEP F.8; OTHERWISE, CONTINUE 01147000
* 2. SEARCH ALL OF AVAILABLE PAGEABLE STORAGE ( IF V=R 01148100
* AREA IS UNLOCKED THEN IT WILL BECOME PAGEABLE 01148600
* STORAGE ) FOR A PAGE WITH THE HARDWARE 'REFERENCED' 01149100
* BITS = 0 01149600
* 3. IF ONE OR BOTH OF THE 'REFERENCED' BITS ARE SET TO ONE, 01150000
* RESET THEM AND CONTINUE SEARCHING PAGEABLE STORAGE 01151000
* 4. IF STORAGE IS EXHAUSTED BEFORE AN UNREFERENCED PAGE IS 01152000
* FOUND, RESTART AT THE TOP OF STORAGE. 01153000
* 5. AFTER AN UNREFERENCED PAGE IS FOUND, SAVE A POINTER TO 01154000
* THE CORTABLE ENTRY FOR THE NEXT REAL PAGE FOR THE SELECT 01155000
* PROCESS TO RESUME AT NEXT TIME. 01156000
* 6. TEST TO SEE IF THE SELECTED PAGE BELONGS TO AN IN-QUEUE 01157000
* VIRTUAL MACHINE; IF SO INCREMENT BOTH THE SYSTEM'S AND THE 01158000
* VIRTUAL MACHINE'S PAGE STEAL COUNT. 01159000
* 7. TEST TO SEE IF THE SELECTED PAGE HAS BEEN CHANGED; IF IT 01160000
* HAS NOT BEEN CHANGED, CALL DMKPTRFT (G, BELOW) TO PLACE IT 01161000
* ON THE FREE LIST AND EXIT; OTHERWISE, CONTINUE 01162000
* 8. IF THE RECOMPUTE FLAG IS SET IN THE SWPTABLE ENTRY, CALL 01163000
* DMKPGTPG TO OBTAIN THE ADDRESS OF A DASD PAGE SLOT IN 01164000
* WHICH TO WRITE THE PAGE; OTHERWISE, CONTINUE 01165000
* 9. BUMP THE PENDING SWAP COUNT, AND CALL DMKPAGIO TO SCHEDULE 01166000
* THE PAGE WRITE; THEN EXIT TO THE CALLER 01167000
* 10. WHEN THE PAGE HAS BEEN WRITTEN, DECREMENT THE PENDING SWAP 01168000
* COUNT AND CALL DMKPTRFT (G, BELOW) TO PLACE IT ON THE FREE 01169000
* LIST 01170000
SPACE 01171000
SELECT DS 0H @V408246 01172000
LM R14,R15,=A(DMKSCHN1,DMKSCHN2) GET POINTERS TO Q 01173000
L R14,0(,R14) COUNTS 01174000
L R15,0(,R15) ... 01175000
SELECTA DS 0H @V408246 01176000
STM R2,R9,SAVEWRK2 SAVE REGS @V408246 01177000
LA R0,1(R14,R15) GET NUMBER IN Q1 + Q2 + 1 01178000
ST R0,SAVEWRK1 AND SAVE FOR LATER. @V408246 01179000
SELECT1 EQU * MAIN PAGE REPLENISHMENT LOGIC 01180000
L R15,PREFIXA ACCESS ABSOLUTE PSA @V407594 01181000
CLI XTNDLOCK-PSA(R15),0 SYSTEM EXTENDING @V407594 01182000
BNE SELEXIT YES -- DO NOT SWAP OUT 01183000
LM R0,R1,DMKPTRFN GET NUMBER OF NOW AND FUTURE FREE PAGES 01184000
AR R0,R1 GET SUM 01185000
C R0,SAVEWRK1 COMPARE TO MINUMUM @V408246 01186000
BNL SELEXIT 'NUF ALREADY 01187000
EJECT 01188000
USERPAGE DS 0H CHECK DEFERED WRITE LIST FIRST @V408246 01189000
L R7,DMKPTRU1 PICK UP FORWARD PTR @V408246 01190000
LA R6,DMKPTRU1 ADDRESS OF ANCHOR LIST @V408246 01191000
CLR R6,R7 ANY ENTRIES? @V408246 01192000
BE SELPAG NO, SCAN CORETBL @V408246 01193000
USERPGA DS 0H @V408246 01194000
ICM R9,B'0111',CORPGPNT+1 GET PTE POINTER @V408246 01195000
BNZ PTR14A @V408246 01196000
ABEND 15 @V408246 01197000
PTR14A DS 0H @V408246 01198000
LM R1,R2,CORFPNT PICK UP F AND B PTRS @V408246 01199000
ST R1,CORFPNT-CORTABLE(,R2) UNCHAIN THE @V408246 01200000
ST R2,CORBPNT-CORTABLE(,R1) CORETABLE ENTRY @V408246 01201000
L R0,DMKPTRFF INCREMENT @V408246 01202000
ALR R0,R4 COUNT OF PAGES MOVED FROM FLUSH @V408246 01203000
ST R0,DMKPTRFF @V408246 01204000
* CORFLUSH BIT IS ON FOR USER LIST PAGES 01205000
L R5,CORSWPNT SWAP TABLE POINTER @V408246 01206000
LA R15,0(,R5) GET SWP TBL PTR FOR VMBLOK @V408246 01207000
SR R2,R2 CLEAR @V408246 01208000
IC R2,SWPVPAGE GET VIRTUAL PAGE NUMBER @V408246 01209000
AR R2,R4 GET VMBLOK PTR @V408246 01210000
SLL R2,3 DISPL. BACK TO VMBLOK PTR @V408246 01211000
SR R15,R2 ADDR. OF VMBLOK PTR @V408246 01212000
L R15,0(,R15) GET VMBLOK PTR @V408246 01213000
ST R15,CORFPNT SAVE FOR LOADING VMBLOK @V408246 01214000
SR R14,R14 CLEAR . . @V408246 01215000
ST R14,CORBPNT . . BACK CHAIN POINTER @V408246 01216000
LR R6,R7 CORE TABLE ENTRY @V408246 01217000
S R6,ACORETBL REAL PAGE NO. * 16 @V408246 01218000
SLL R6,8 REAL PAGE ADDRESS @V408246 01219000
SR R0,R0 @V407594 01220000
ST R0,TEMPR0 CLEAR FLAG BYTES @V407594 01221000
L R0,DMKPTRUC FLUSHED PAGE COUNT @VA07810 01221050
SR R0,R4 LESS ONE @VA07810 01221055
BM AB20 CANNOT BE NEGATIVE @VA07810 01221060
ST R0,DMKPTRUC STORE NEW COUNT @VA07810 01221065
TM CORFLAG,CORSHARE SHARED PAGE @VA07717 01221100
BO CKBKUP YES @VA07717 01221150
LH R0,VMFLPAG-VMBLOK(R15) FLUSHED PAGE COUNT @VA07717 01221200
SR R0,R4 MINUS ONE @VA07717 01221250
BM AB19 ABEND IF NEGATIVE @VA07717 01221300
STH R0,VMFLPAG-VMBLOK(R15) @VA07717 01221350
B CKBKUP CHECK CP BACK-UP CHANGE BIT @V408246 01222000
EJECT 01223000
* 01224000
* SELECT NON-REFERNCED PAGE FROM AMOUNT PAGES BELONGING TO 01225000
* IN-QUEUE TASKS 01226000
* 01227000
SELPAG DS 0H SELECT NON-REFERENCED PAGE @V408246 01228000
AIF (NOT &AP).NOAP21 **AIF*** 01228900
SR R2,R2 @V407594 01229000
ST R2,TEMPR0 CLEAR FLAGS @V407594 01230000
.NOAP21 ANOP **ANOP** 01230100
MVI TESTFLG+1,255-CORSHARE SET-UP FOR INITIAL PASS @V408246 01231000
TM VMPSTAT,VMRPAGE RESERVED PAGE VMBLOK? @V408246 01232000
BZ SELPAGA NO @V408246 01233000
CLC DMKPTRRC,DMKPTRRL RESERVED PAGES AT LIMIT? @V408246 01234000
BL SELPAGA NO @V407594 01235000
XI TESTFLG+1,CORRSV YES, SEARCH FOR ANY @V408246 01236000
B TSTQSCE QUIESCE OPP PROC'R IF REQUIRED @V407594 01237000
SELPAGA DS 0H @V408246 01238000
NI SCANFLAG,255-PASSTWO INITIALIZE FLAG TO 1ST PASS@VA08341 01238100
MVC SCANSTRT(2),SCANBLOK STARTING SCAN AT THIS @VA08341 01238150
* BLOCK OF FRAMES 01238200
LA R1,CURPNT LOAD ADDR OF INDEX TO CORETABLE @VA08341 01238250
LM R6,R9,CURPNT LOAD ALL NEEDED REGISTERS @V407594 01239000
L R2,F4096 VALUE TO DECREMENT PAGE ADDRESS @V407594 01240000
CNOP 0,8 ALIGN FOR PERFORMANCE @V408246 01242000
TESTFLG1 L R15,DMKPTRRF LOAD COUNT OF STEAL REFS @VA07751 01243000
LA R15,1(R15) BUMP 1 @VA07751 01243500
ST R15,DMKPTRRF PUT IT BACK @VA07751 01244000
TESTFLG TM CORFLAG,255-CORSHARE PAGE AVAILABLE ? @VA07751 01244500
BZ TESTRRB YES @V408246 01245000
NONZERO SLR R6,R2 GET NEXT REAL PAGE ADDRESS @V407594 01246000
BXH R7,R8,TESTFLG1 LET BXLE CALC. NEXT ENTRY @VA07751 01247100
LA R6,TOPPNT LOAD ADDRESS FOR LAST PART OF @VA08341 01251100
* COMPLETE SCAN 01251150
CR R6,R1 DID WE JUST SCAN THIS TOP PART? @VA08341 01251200
BNE NEXTBLOK NO--WE ARE NOT DONE YET @VA08341 01251250
LA R1,20(R1) ADDRESS OF 'FENCE' @VA08341 01251300
B PASSONE GO LOAD NEXT SET OF POINTERS @VA08341 01251350
NEXTBLOK LH R6,SCANBLOK BLOCK OF FRAMES WE ARE SCANNING @VA08341 01251400
BCTR R6,0 MOVE ON TO NEXT LOWER BLOCK @VA08341 01251450
C R6,F1 ARE WE NOW POINTING TO BLOCK 1? @VA08341 01251500
BH TSTSTART NO--TEST TO SEE IF WE ARE BACK @VA08341 01251550
* WHERE WE BEGAN THE SCAN 01251600
BL SETBLKNO AT BLOCK '0'--SET TO HIGH BLOCK @VA08341 01251650
TM SCANFLAG,VEQRUNLK AT BLOCK 1--HAS V=R AREA BEEN @VA08341 01251700
* UNLOCKED? 01251750
BO TSTSTART YES. OK TO SCAN THIS BLOCK. @VA08341 01251800
SETBLKNO LA R6,1 VALUE TO INCREMENT @VA08341 01251850
AL R6,DMKPTRCS COUNT OF CORE TABLE WRAPS @VA08341 01251900
ST R6,DMKPTRCS UPDATE COUNTER @VA08341 01251950
LH R6,SCANNUM UPDATE BLOCK POINTER TO TOP BLOCK@VA08341 01252000
TSTSTART STH R6,SCANBLOK UPDATE CURRENT BLOCK POINTER @VA08341 01252050
CH R6,SCANNUM ARE WE SCANNING TOP BLOCK? @VA08341 01252100
BNE CALCSTRT IF NOT, CALCULATE FULLSCAN PTR. @VA08341 01252150
LA R1,FULLSCAN START AT FULLSCAN OF TOP BLOCK @VA08341 01252200
B TST2 TEST FOR END OF FIRST PASS @VA08341 01252250
CALCSTRT LH R15,SCANNUM NUMBER OF FRAME BLOCKS TO SCAN @VA08341 01252300
SR R15,R6 SUBTRACT CURRENT BLOCK NUMBER @VA08341 01252350
SR R14,R14 GET READY FOR MULTIPLY @VA08341 01252400
M R14,F20 20 BYTES FOR EACH FULLSCAN ENTRY @VA08341 01252450
LA R1,FULLSCAN(R15) POINT TO CURRENT FULLSCAN ENTRY@VA08341 01252500
TST2 CH R6,SCANSTRT IS THIS THE BLOCK WE STARTED THE @VA08341 01252550
* SCAN ON? 01252600
BNE PASSONE NO--STILL ON THE FIRST PASS @VA08341 01252650
TM SCANFLAG,PASSTWO HAVE WE COMPLETED TWO PASSES? @VA08341 01252700
BO DOTOP YES--DO TOP SCAN @VA08341 01252750
OI SCANFLAG,PASSTWO INDICATE NOW ON 2ND FULL PASS @VA08341 01252800
PASSONE LM R6,R9,0(R1) LOAD NEXT SET OF POINTERS @VA08341 01252850
LTR R6,R6 TEST IF TABLES HAVE BEEN EXCEEDED@V408246 01253000
BP TESTFLG1 LOOK AGAIN THRU THE LIST @VA07751 01254100
XI TESTFLG+1,CORRSV ALLOW SELECTION OF RESERVED @V408246 01255000
TM TESTFLG+1,CORRSV BEEN AROUND ONCE ALREADY? @V408246 01256000
BO PTR7A YES, ABEND @V407594 01257000
TSTQSCE TM APSTAT1,APUOPER RUNNING IN AP MODE @V407594 01258000
AIF (NOT &AP).NOAP9 **AIF*** 01258100
BZ SELPAGA NO @V407594 01259000
L R15,PREFIXA LOAD PREFIX VALUE @V407594 01260000
CLI XTNDLOCK-PSA(R15),0 SYSTEM EXTENDING @V407594 01261000
BNE SELPAGA YES, BYPASS QUIESCE @V407594 01262000
SIGNAL QUIESCE,CONTROL=SERIAL QUIESCE OTHER PROC'R @V407594 01263000
MVI TEMPR0+1,OPPRSTRT MUST RESTART OTHER PROC'R @V407594 01264000
.NOAP9 ANOP **ANOP** 01264100
B SELPAGA MAY NOW SELECT ANY AVAILABLE PG @V407594 01265000
SPACE 01265100
DOTOP LA R1,TOPPNT LOAD ADDRESS FOR LAST PART OF @VA08341 01265150
* COMPLETE SCAN 01265200
B PASSONE GO LOAD NEXT SET OF POINTERS @VA08341 01265250
SPACE 01265300
ABEND 7 SO- VERY-SORRY (NO PAGES) @V408246 01266000
CNOP 0,8 ALIGN FOR PERF. @V408246 01267000
TESTRRB DS 0H @V408246 01268000
ICM R5,B'0111',CORSWPNT+1 SWAP TABLE ENTRY POINTER @V408246 01269000
BZ FRETIT NONE, PAGE IMMEDIATELY AVAILABLE @V408246 01270000
TM SWPFLAG,SWPTRANS+SWPALLOC IS A REQUEST AVAIL. @V408246 01271000
BNZ NONZERO IF SO WE CAN'T USE IT. @V408246 01272000
AIF (NOT &AP).NOAP10 **AIF*** 01272900
MVI TEMPR0,0 CLEAR FLAG BYTE @V407594 01273000
TM APSTAT1,APUOPER RUNNING AS AP @V407594 01274000
BZ DORRB NO @V407594 01275000
TM TESTFLG+1,CORRSV PHASE ONE @V407594 01276000
BZ DORRB NO, ISSUE RRB @V4M0172 01277000
TM CORFLAG,CORSHARE SHARED PAGE @V407594 01278000
BO DOSHRRRB YES, DO RRB @V407594 01279000
L R15,CORVM LOAD VMBLOK ADDR @V407594 01280000
CL R15,ASYSVM SYSTEM PAGE @V407594 01281000
BE DORRB YES, DO RRB @V407594 01282000
LH R14,LPUADDR LOAD LOGICAL PROC'R ADDR @V407594 01283000
CLM R14,B'0011',VMLOCK+2-VMBLOK(R15) VM ALREADY @V407594 01284000
* LOCKED BY THIS PROCESSOR @V407594 01285000
BE DORRB YES,DO RRB @V407594 01286000
LR R14,R1 SAVE R1 ACROSS LOCK MACRO @V407594 01287000
LR R1,R15 VMBLOK ADDR @V407594 01288000
LOCK OBTAIN,TYPE=VMBLOK,OPTION=NOUPDT,SPIN=NO,SAVE @V407594 01289000
LR R1,R14 RESTORE R1 @V407594 01290000
BC 4,NOLOCK LOCK FAILED @V407594 01291000
MVI TEMPR0,UNLKVM MUST UNLOCK VMBLOK @V407594 01292000
MVI TEMPR0+1,0 CLEAR FLAGS @V407594 01293000
B DORRB RESET REFERENCE BITS @V407594 01294000
DOSHRRRB MVI TEMPR0,RRBSHR PROCESSING SHARED PAGE @V407594 01295000
B DORRB RESET REFERENCE BITS @V407594 01296000
NOLOCK L R15,CORVM GET VMBLOK ADDR @V407594 01297000
TM VMOSTAT-VMBLOK(R15),VMSHR RUNNING SHARED SYSTEM @V407594 01298000
BZ NONZERO NO, BYPASS PAGE FRAME @V407594 01299000
MVI TEMPR0,NOSTEAL REMEMBER CANNOT STEAL PAGE @V407594 01300000
.NOAP10 ANOP **ANOP** 01300100
DORRB DS 0H @V407594 01301000
RRB 0(R6) TEST 1'ST HALF OF PAGE. @V408246 01302000
BC 8+4,TSTRRB2 RESET 2ND KEY @V408246 01303000
OI SWPKEY1,4 REF. BIT TO VIRT. BACK-UP KEY @V408246 01304000
RRB 2048(R6) CLEAR 2ND KEY @V408246 01305000
BC 8+4,STKEY2+4 NO SET, PAGE NOT SELECTED @V408246 01306000
STKEY2 DS 0H @V408246 01307000
OI SWPKEY2,4 REF. BIT TO VIRT. BACK-UP KEY @V408246 01308000
NI SWPFLAG,255-SWPREF1-SWPREF2 RESET CP REF. BITS @V408246 01309000
AIF (NOT &AP).NOAP11 **AIF*** 01309900
TM TEMPR0,UNLKVM DID WE LOCK VMBLOK @V407594 01310000
BZ NONZERO NO, ACCESS NEXT PAGE @V407594 01311000
LR R14,R1 SAVE R1 ACROSS LOCK MACRO @V407594 01312000
L R1,CORVM GET VMBLOK ADDRESS @V407594 01313000
LOCK RELEASE,TYPE=VMBLOK,SAVE UNLOCK VMBLOK @V407594 01314000
LR R1,R14 RESTORE R1 @V407594 01315000
.NOAP11 ANOP **ANOP** 01315100
B NONZERO PAGE NOT SELECTED @V408246 01316000
TSTRRB2 DS 0D 1ST KEY 0, CHECK 2ND KEY @V408246 01317000
BALR R14,0 SAVE C.C. FOR CHANGE TEST @V408246 01318000
RRB 2048(R6) CLEAR 2ND KEY @V408246 01319000
BC 2+1,STKEY2 REF. BIT ON, PAGE NOT AVAILABLE @V408246 01320000
BALR R15,R0 CHANGE C.C. @V408246 01321000
TM SWPFLAG,SWPREF1+SWPREF2 CHECK BACK-UP BITS @V408246 01322000
BNZ STKEY2+4 PAGE REF'ED DON'T SELECT @V408246 01323000
OR R14,R15 SAVE FOR CHANGED PAGE TEST @VA09279 01323100
AIF (NOT &AP).NOAP12 **AIF*** 01323900
TM TEMPR0,NOSTEAL CAN WE SELECT PAGE @V407594 01324000
BO NONZERO NO, ACCESS NEXT PAGE FRAME @V407594 01325000
TM TEMPR0,RRBSHR SHARED PG, AP MODE, PHASE 1 @V407594 01326000
BZ STEALSHR NO, STEAL PAGE @V407594 01327000
SLR R0,R0 DETERMINE PROC'R OWNERSHIP OF PG @V407594 01328000
IC R0,SWPVPAGE LOAD VIRTUAL PAGE NUMBER @V407594 01329000
ALR R0,R4 PLUS 1 FOR HEADER @V407594 01330000
SLL R0,3 TIMES 8 FOR ENTRY LENGTH @V407594 01331000
LR R3,R5 PT TO SWAP TBL ENTRY @V407594 01332000
SLR R3,R0 PT TO SWAP TBL HDR @V407594 01333000
LR R15,R3 SWAP TABLE HEADER @VA09279 01333100
S R15,=A(PAGTSWP) BACK UP TO PAGE TABLE HEADER @VA09279 01333150
L R15,PAGSHR-PAGTABLE(R15) ADDRESS OF SHARETABLE @VA09279 01333200
TM SHRFLAG-SHRTABLE(R15),SHRNOPRT IS SHARED PAGE @VA09279 01333250
* UNPROTECTED? 01333300
BO STEALSHR YES--OK TO STEAL IT @VA09279 01333350
* IF PROTECTED SHARED PAGE, DETERMINE IF FRAME IS 01333400
* OWNED BY THIS PROCESSOR 01333450
TM SWPFLAG2-SWPTABLE(R3),SWPAPP 2ND SET OF TABLES? @V60B7AA 01334100
BO SHPGAP YES @V407594 01335000
TM APSTAT1,PROCIPL IS THIS THE MAIN (IPL) PROC? @V60B7AA 01336100
BO STEALSHR YES, STEAL PAGE @V407594 01337000
B NONZERO ON AP, PG OWNED BY MAIN PROC'R @V407594 01338000
SHPGAP TM APSTAT1,PROCIPL IS THIS NON-IPL PROCESSOR? @V60B7AA 01339100
BO NONZERO NO- ON MAIN PROC'R, AP PAGE @V407594 01340000
STEALSHR DS 0H @V407594 01341000
.NOAP12 ANOP **ANOP** 01341100
TM CORFLAG,CORSHARE SHARED PAGE? @VA09279 01342150
BZ STEALSH1 NO, STEAL IT @VA09279 01342175
SPM R14 CHECK FOR CHANGED SHARED PAGE @VA09279 01342200
BC 8+2,STEALSH1 IF UNCHANGED, STEAL IT @VA09279 01342225
* CHECK TO SEE IF CHANGED SHARED PAGE IS UNPROTECTED 01342250
SLR R0,R0 ZERO REG FOR INSERT @VA09279 01342275
IC R0,SWPVPAGE VIRTUAL PAGE NUMBER @VA09279 01342300
ALR R0,R4 ADD ONE FOR SWAP TABLE HEADER @VA09279 01342325
SLL R0,3 MULTIPLY BY 8 FOR ENTRY LENGTH @VA09279 01342350
LR R15,R5 SWAP TABLE ENTRY ADDRESS @VA09279 01342375
SLR R15,R0 POINT TO SWAP TABLE HEADER @VA09279 01342400
S R15,=A(PAGTSWP) ADDRESS OF PAGE TABLE HEADER @VA09279 01342425
L R15,PAGSHR-PAGTABLE(R15) SHARETABLE ADDRESS @VA09279 01342450
TM SHRFLAG-SHRTABLE(R15),SHRNOPRT IS SHARED PAGE @VA09279 01342475
* UNPROTECTED? 01342500
BZ NONZERO DON'T STEAL PROTECTED SHARED PAGE@VA09279 01342525
* IF UNPROTECTED, STEAL EVEN IF @VA09279 01342550
* CHANGED 01342575
STEALSH1 DS 0H @VA09279 01342600
LR R0,R6 SAVE REAL STORAGE ADDRESS @V408246 01343000
LR R1,R7 SAVE CURRENT CORETABLE ENTRY @V408246 01344000
SLR R0,R2 DECREMENT REAL ADDR BY ONE PAGE @V407594 01345000
AR R1,R8 DECREMENT CURRENT CORETABLE @V408246 01346000
STM R0,R1,CURPNT SAVE THE 'NEW' CURRENT POINTER @V408246 01347000
ST R1,TOPPNT+12 ALSO SAVE IT HERE. @V408246 01348000
CLC SCANBLOK(2),SCANSTRT IS FRAME IN THE CURRENT @VA08341 01348100
* BLOCK? 01348150
BE EXTSRCH YES--OTHER POINTERS ARE OK @VA08341 01348200
LH R0,SCANBLOK POINTER TO CURRENT BLOK OF FRAMES@VA08341 01348250
LH R1,SCANNUM NO. OF BLOCKS AVAILABLE TO SCAN @VA08341 01348300
SR R1,R0 START TO CALCULATE CURRENT @VA08341 01348350
* BLOCK'S FULLSCAN ENTRY 01348400
SR R0,R0 GET READY FOR MULTIPLY @VA08341 01348450
M R0,F20 20 BYTES PER FULLSCAN ENTRY @VA08341 01348500
LA R1,FULLSCAN(R1) CURRENT BLOCK'S FULLSCAN ENTRY @VA08341 01348550
MVC CURPNT+12(4),12(R1) UPDATE CURPNT ADDRESSES @VA08341 01348600
MVC TOPPNT(8),0(R1) UPDATE TOPPNT ADDRESSES @VA08341 01348650
EXTSRCH DS 0H @V408246 01349000
DROP R11 @V408246 01350000
AIF (NOT &AP).NOAP12A **AIF*** 01350025
TM APSTAT1,APUOPER IN AP MODE? @VA09279 01350040
BZ STEALSH2 NO, BYPASS UNPROTECTED CHECK @VA09279 01350055
TM CORFLAG,CORSHARE SHARED PAGE? @VA09279 01350070
BZ STEALSH2 NO -- NO NEED FOR QUIESCE @VA09279 01350085
SLR R0,R0 @VA09279 01350100
IC R0,SWPVPAGE GET PAGE NUMBER @VA09279 01350115
SLL R0,1 MULTIPLY BY 2 FOR PTE SIZE @VA09279 01350130
L R1,CORPGPNT PAGE TABLE ENTRY ADDRESS @VA09279 01350145
SLR R1,R0 BACK UP TO START OF PAGE TABLE @VA09279 01350160
SL R1,F16 BACK UP TO PAGE TABLE HEADER @VA09279 01350175
L R1,PAGSHR-PAGTABLE(,R1) GET SHRTABLE ADDRESS @VA09279 01350190
TM SHRFLAG-SHRTABLE(R1),SHRNOPRT UNPROTECTED? @VA09279 01350205
BZ STEALSH2 NO -- NO QUIESCE NECESSARY @VA09279 01350220
L R1,PREFIXA ACCESS ABSOLUTE PSA @VA09279 01350235
CLI XTNDLOCK-PSA(R1),0 SYSTEM EXTENDING? @VA09279 01350250
BNE STEALSH2 YES--BYPASS QUIESCE @VA09279 01350265
TM TEMPR0+1,OPPRSTRT HAS OTHER PROCESSOR ALREADY @VA09279 01350280
* BEEN QUIESCED? 01350295
BO SETPTLB YES -- CONTINUE @VA09279 01350310
LR R9,R14 SAVE R14 CONTENTS @VA09279 01350325
SIGNAL QUIESCE,CONTROL=SERIAL @VA09279 01350340
LR R14,R9 SAVE FOR CHANGED PAGE TEST @VA09279 01350355
MVI TEMPR0+1,OPPRSTRT REMEMBER TO RESUME OTHER PROC.@VA09279 01350370
SETPTLB TM TESTFLG+1,CORRSV PHASE ONE? @VA09279 01350385
BO OTHRPTLB IF PHASE ONE, TELL OTHER PROC @VA09279 01350400
* TO DO PTLB. THIS PROC. WILL BE 01350415
* MARKED FOR PTLB AT OWNSHR. 01350430
* HERE IF NOT PHASE 1 01350445
TM APSTAT1,PROCIPL IS THIS THE MAIN (IPL) PROC? @V60B7AA 01350465
BO OTHRPTLB YES -- TELL OTHER PROC TO PTLB @VA09279 01350475
OI APSTAT2,CPPTLBR THIS PROC MUST PURGE TLB @VA09279 01350490
B STEALSH2 CONTINUE WITH STEAL @VA09279 01350505
OTHRPTLB L R1,PREFIXB ADDRESS OF OTHER PSA @VA09279 01350520
OI APSTAT2-PSA(R1),CPPTLBR TELL OTHER PROC TO PTLB @V60B7AA 01350540
STEALSH2 DS 0H @VA09279 01350550
.NOAP12A ANOP **ANOP** 01350565
L R15,CORFPNT PAGES OWNER @V408246 01351000
USING VMBLOK,R15 @V408246 01352000
L R9,CORPGPNT PICK-UP PTE POINTER @V408246 01353000
TM VMDSTAT,VMINQ VMBLOK IN-QUEUE? @V408246 01354000
BZ PNTSTL NO @V408246 01355000
L R0,DMKPTRSS YES, INCREMENT @V408246 01356000
ALR R0,R4 TOTAL SYSTEM STEAL COUNT @V408246 01357000
ST R0,DMKPTRSS @V408246 01358000
LH R0,VMSTEALS INCREMENT ALSO @V408246 01359000
ALR R0,R4 INDIVIDUAL STEAL COUNT @V408246 01360000
STH R0,VMSTEALS @V408246 01361000
OI PAGCORE+1,PAGREF NON-RESIDENT PAGE WAS TOUCHED @V408246 01362000
PNTSTL DS 0H @V408246 01363000
TM CORFLAG,CORSHARE SHARED PAGE FRAME? @V408246 01364000
BZ CKPG0 NO, SAVE TIMER IN CASE PAGE 0 @V408246 01365000
L R2,DMKPTRSC DECREMENT @V408246 01366000
SR R2,R4 RESIDENT SHARED PAGE COUNT @V408246 01367000
ST R2,DMKPTRSC @V408246 01368000
AIF (NOT &AP).NOAP13 **AIF*** 01368900
TM APSTAT1,APUOPER RUNNING AS AP @V407594 01369000
BZ OWNSHR NO, INVALIDATE LOOKASIDE BUFFER @V407594 01370000
TM TESTFLG+1,CORRSV PHASE ONE @V407594 01371000
BO OWNSHR YES, WE MUST OWN PAGE @V4M0172 01372000
* EITHER PHASE 2 OR DMKPTRFE SELECTED FLUSH LIST PAGE @V407594 01373000
* DETERMINE WHICH PROCESSOR OWNS SHARED PAGE AND @V407594 01374000
* INVALIDATE PROPER LOOKASIDE BUFFER @V407594 01375000
SR R0,R0 @V407594 01376000
IC R0,SWPVPAGE VIRTUAL PAGE NUMBER @V407594 01377000
AR R0,R4 PLUS ONE @V407594 01378000
SLL R0,3 TIMES 8 @V407594 01379000
LR R2,R5 SWAP TBL ENTRY @V407594 01380000
SR R2,R0 PT TO SWPTBL HEADER @V407594 01381000
TM SWPFLAG2-SWPTABLE(R2),SWPAPP 2ND SET OF TABLES? @V60B7AA 01382100
BO PURAP YES @V407594 01383000
TM APSTAT1,PROCIPL IS THIS THE MAIN (IPL) PROC? @V60B7AA 01384100
BO OWNSHR ON CPU- CPU PAGE @V407594 01385000
OTHSHR L R2,PREFIXB PURGE OTHER LOOKASIDE BUFFER @V407594 01386000
OI APSTAT2-PSA(R2),CPPTLBR SET PTLB REQUIRED @V407594 01387000
L R2,RUNUSER-PSA(R2) ACCESS RUNUSER FOR OTHER @VA08621 01387100
* PROCESSOR 01387200
NI VMDSTAT-VMBLOK(R2),X'FF'-VMDSP NO FAST DISPATCH @VA08621 01387300
* NOW THE OTHER PROCESSOR SHOULD BE QUIESCED AT THIS TIME 01387400
B CKRSV CHECK FOR RESERVED PG @V407594 01388000
PURAP DS 0H PAGE OWNED BY AP @V407594 01389000
TM APSTAT1,PROCIPL MAIN (IPL) PROCESSOR? @V60B7AA 01390100
BO OTHSHR ON CPU- AP PAGE @V407594 01391000
.NOAP13 ANOP **ANOP** 01391100
OWNSHR OI APSTAT2,CPPTLBR SET PTLB REQUIRED @V407594 01392000
CLC RUNUSER,ASYSVM IS RUNUSER SYSTEM @VA08621 01392100
BE CKRSV YES, BRANCH @VA08621 01392150
TM APSTAT1,APUOPER RUNNING AS AP @VA08621 01392200
BZ RESETDSP NO @VA08621 01392250
CLC RUNUSER,LASTUSER RUNUSER STILL LOCKED @VA08621 01392300
BE RESETDSP YES, OK TO RESET VMDSP @VA08621 01392350
NI APSTAT2,X'FF'-CPPTLBR RESET PTLB REQUIRED @VA08621 01392400
PTLB DO IT NOW @VA08621 01392450
B CKRSV @VA08621 01392500
RESETDSP DS 0H @VA08621 01392550
L R2,RUNUSER NO FAST REDISPATCH FOR HIM @VA08621 01392600
NI VMDSTAT-VMBLOK(R2),X'FF'-VMDSP @VA08621 01392650
B CKRSV CHECK FOR RESERVED PAGE @V408246 01393000
CKPG0 DS 0H @V408246 01394000
CL R15,ASYSVM IS THIS SYSTEM PAGE (NON-SHARED) @V407594 01395000
BE CKRSV YES, BYPASS PTLB & PG ZERO LOGIC @V407594 01396000
OI VMESTAT,VMINVPAG INVALIDATE SHADOW TABLES @V408246 01397000
OI APSTAT2,CPPTLBR SET PTLB REQUIRED FOR THIS PROC@RV407594 01398000
AIF (NOT &AP).NOAP14 **AIF*** 01398900
L R2,PREFIXB AND OTHER PROCESSOR @V407594 01399000
OI APSTAT2-PSA(R2),CPPTLBR REDUNDANT IF UP MODE @V407594 01400000
.NOAP14 ANOP **ANOP** 01400100
NI VMDSTAT,255-VMDSP NO FAST REDSP @V408246 01401000
L R3,VMSEG OWNER'S STO @V4M0167 01402000
CLM R9,B'0111',1(R3) PTE FOR PAGE 0? @V4M0167 01403000
BNE CKRSV NO, OR SEGMENT INVALID @V4M0167 01404000
LCTL C1,C1,VMSEG SET OWNER'S STO IN CONTROL REG. @V408246 01405000
LRA R2,0 REAL ADDRESS OF PAGE ZERO @V408246 01406000
BNZ CKRSV PAGE NOT RESIDENT @V408246 01407000
L R2,TIMER-PSA(R2) SAVE THE VIRTUAL TIMER VALUE @V408246 01408000
ST R2,VMTIMER @V408246 01409000
TM VMMCR6,VMMVTMR IS TIMER ASSIST ACTIVE? @V408246 01410000
BZ CKRSV NO @V408246 01411000
ICM R2,B'0111',VMMADDR VM ASSIST ON FOR USER? @V408246 01412000
BZ CKRSV NO @V408246 01413000
LA R0,VMTIMER YES, POINT TIMER ASSIST HERE... @V408246 01414000
ST R0,MICVTMR-MICBLOK(R2) . . @V408246 01415000
CKRSV DS 0H @V408246 01416000
LH R2,VMPAGES DECREMENT @V408246 01417000
SR R2,R4 RESIDENT PAGE COUNT @V408246 01418000
BM PTR18 VMPAGES TO GO NEGATIVE - TERM CP @VA07224 01418100
STH R2,VMPAGES @V408246 01419000
TM CORFLAG,CORRSV STEALING A RESERVED PAGE? @V408246 01420000
BZ CKCHGE NO @V408246 01421000
L R2,=A(DMKDSPNP) GET DYNAMIC PAGE COUNT @V408246 01422000
L R0,0(,R2) INCREMENT @V408246 01423000
ALR R0,R4 PAGEABLE PAGES COUNT @V408246 01424000
ST R0,0(,R2) @V408246 01425000
L R0,DMKPTRRC DECREMENT @V408246 01426000
SR R0,R4 RESIDENT RESERVED PAGE COUNT @V408246 01427000
BNM PTR10A ALRIGHT @V408246 01428000
ABEND 10 @V408246 01429000
ABEND 18 VMPAGES TO GO NEGATIVE - TERM CP @VA07224 01429100
PTR10A DS 0H @V408246 01430000
ST R0,DMKPTRRC @V408246 01431000
EJECT 01432000
CKCHGE DS 0H @V408246 01433000
OI PAGCORE+1,PAGINVAL FLAG PAGE INVALID @V408246 01434000
AIF (NOT &AP).NOAP15 **AIF*** 01434900
TM TEMPR0,UNLKVM DID WE LOCK VMBLOK @V407594 01435000
BZ CKCHGE2 NO @V407594 01436000
LR R1,R15 POINT TO VMBLOK OF OWNER OF PAGE @V407594 01437000
LOCK RELEASE,TYPE=VMBLOK,SAVE UNLOCK VMBLOK @V407594 01438000
MVI TEMPR0,0 CLEAR FLAG BYTE @V407594 01439000
CKCHGE2 DS 0H @V407594 01440000
.NOAP15 ANOP **ANOP** 01440100
OI CORFLAG,CORFLUSH FLAG PAGE SELECTED @V408246 01441000
AIF (NOT &AP).NOAP15A **AIF*** 01441050
TM TEMPR0+1,OPPRSTRT WAS OTHER PROCESSOR QUIESCED? @VA09279 01441100
BZ CKCHGE3 NO--WE DON'T HAVE TO WORRY ABOUT @VA09279 01441150
* CHANGE BITS HAVING BEEN CHANGED 01441200
RRB 0(R6) TEST FIRST HALF OF PAGE--PAGE @VA09279 01441250
* MAY HAVE BEEN CHANGED BY OTHER 01441300
* PROCESSOR IF STEALING UNPROTECTED 01441350
* SHARED PAGE 01441400
BC 4+1,BCHNGE REAL KEY WAS CHANGED @VA09279 01441450
RRB 2048(R6) TEST SECOND HALF OF PAGE @VA09279 01441500
BC 4+1,BCHNGE REAL KEY WAS CHANGED @VA09279 01441550
B CKBKUP TEST BACK-UP BITS @VA09279 01441600
CKCHGE3 DS 0H @VA09279 01441650
.NOAP15A ANOP **ANOP** 01441700
SPM R14 CHECK FOR CHANGED PAGE C.C. @V408246 01442000
BC 4+1,BCHNGE REAL KEYS WERE CHANGED @V408246 01443000
CKBKUP DS 0H @V408246 01444000
TM SWPFLAG,SWPCHG1+SWPCHG2 TEST BACK-UP CHANGE BIT @V408246 01445000
BNZ TESTRCMP PAGE HAS BEEN CHANGED -- @V408246 01446000
SPACE 3 01447000
FRETIT DS 0H PLACE PAGE ON FREE LIST @V408246 01448000
AIF (NOT &AP).NOAP16 **AIF*** 01448900
TM TEMPR0+1,OPPRSTRT RESTART OTHER PROC'R @V407594 01449000
BZ FRETIT2 NO @V407594 01450000
SIGNAL RESUME,CONTROL=PARALLEL ISSUE RESUME ORDER @V407594 01451000
MVI TEMPR0+1,0 CLEAR FLAG @V407594 01452000
FRETIT2 DS 0H @V407594 01453000
.NOAP16 ANOP **ANOP** 01453100
CALL DMKPTRFT FREE LIST ROUTINE @V408246 01454000
B SELECT1 CHECK FOR WORK COMPLETED @V408246 01455000
EJECT 01456000
* 01457000
* UPDATE COPY OF NEW AND/OR CHANGED PAGE ON BACKING STORE 01458000
* 01459000
BCHNGE DS 0H BACK-UP CHANGED BITS @V408246 01460000
RRB 0(R6) CHECK WHICH KEY WAS CHANGED @V408246 01461000
BC 8+2,*+8 NOT 1ST 2K @V408246 01462000
OI SWPKEY1,2 BACK-UP CHANGE BITS @V408246 01463000
RRB 2048(R6) 2ND 2K @V408246 01464000
BC 8+2,*+8 NOT CHANGED @V408246 01465000
OI SWPKEY2,2 BACK-UP CHANGE BIT @V408246 01466000
DROP R15 @V60BC11 01467000
USING VMBLOK,R11 NORMAL VMBLOK BASE @V60BC11 01468000
SPACE 1 01507000
TESTRCMP DS 0H @V408246 01508000
LR R2,R15 SAVE VMBLOK OF PAGES OWNER @V407594 01509000
AIF (NOT &AP).NOAP17 **AIF*** 01509900
TM TEMPR0+1,OPPRSTRT RESTART OTHER PROC'R @V407594 01510000
BZ TSTRCMP2 NO @V407594 01511000
SIGNAL RESUME,CONTROL=PARALLEL ISSUE RESUME ORDER @V407594 01512000
MVI TEMPR0+1,0 CLEAR FLAG @V407594 01513000
TSTRCMP2 DS 0H @V407594 01514000
TM APSTAT1,APUOPER RUNNING AS AP @V407594 01515000
BZ RCMPCHG NO @V407594 01516000
CL R13,F2 DMKPTRFE ENTRY @V407594 01517000
BH RCMPCHG NO, BYPASS UNLOCK OF R11 @V407594 01518000
CL R11,LASTUSER LAST USER @V407594 01519000
BE RCMPCHG YES, DO NOT UNLOCK VMBLOK @V407594 01520000
CL R11,ASYSVM SYSTEM VMBLOK @V407594 01521000
BE RCMPCHG YES, IT IS NEVER LOCKED @V407594 01522000
LR R1,R11 VMBLOK ADDR TO R1 @V407594 01523000
LOCK RELEASE,TYPE=VMBLOK UNLOCK VMBLOK @V407594 01524000
.NOAP17 ANOP **ANOP** 01524100
RCMPCHG CHARGE SWITCH,2 CHARGE PAGE WRITE TO OWNER @V407594 01525000
* 01526000
* IS NEW BACKING STORE LOCATION REQUIRED? 01527000
* 01528000
TM SWPFLAG,SWPRECMP RECOMPUTE BACKING STORE? @V408246 01529000
BNZ TSTOWNR YES @V408246 01530000
SR R1,R1 CLEAR VOLUME INDEX @V408246 01533000
IC R1,SWPCODE AND GET VOLUME INDEX CODE @V408246 01534000
SLL R1,3 GET VOLUME DISPLACEMENT IN TABLE @V408246 01535000
AL R1,=A(DMKSYSOW) POINT TO VOLUME ENTRY IN TABLE @V408246 01536000
LH R1,OWNDRDEV-OWNDLIST(,R1) GET RDEVBLOK INDEX @V408246 01537000
SLL R1,3 CONVERT TO DISPLACEMENT @V408246 01538000
AL R1,ARIODV POINT TO RDEVBLOK @V408246 01539000
CLI RDEVTYPE-RDEVBLOK(R1),TYP2305 FIXED HEAD DEVICE?@V408246 01540000
BE QWRITE YES, FOREGO ARM OPTIMIZATION @V408246 01541000
* 01542000
* MATCH SEGMENT'S OWNER AND R11 FOR DASD COUNTERS 01543000
* 01544000
TSTOWNR DS 0H UPDATE COUNTS FOR SEGMENT'S OWNER@V408246 01545000
LA R1,0(,R5) SWAPT TABLE ENTRY POINTER @V408246 01546000
SR R2,R2 CLEAR @V408246 01547000
IC R2,SWPVPAGE GET VIRTUAL PAGE NO. @V408246 01548000
AR R2,R4 NO. + 1 @V408246 01549000
SLL R2,3 DISPLACEMENT TO TABLE HEADER @V408246 01550000
SR R1,R2 BACK-UP TO TABLE HEADER @V408246 01551000
LR R3,R11 SAVE ORIGINAL VMBLOK POINTER @V408246 01552000
C R11,0(,R1) IS THIS USER THE SEGMENT'S OWNER?@V408246 01553000
BE CHKRCMP YES, NO NEED TO SWITCH FOR COUNT @V408246 01554000
CHARGE SWITCH,0(R1) NO, SWITCH VMBLOK AND TIMER @V407594 01555000
CHKRCMP DS 0H @V408246 01556000
TM SWPFLAG,SWPRECMP CHECK ON RECOMPUTE AGAIN @V408246 01557000
BO GETPAG NO NEED TO RELEASE BACKING STORE @V408246 01558000
CALL DMKPGTPR RELEASE OLD DASD ADDRESS @V408246 01559000
SPACE 3 01560000
GETPAG DS 0H @V408246 01561000
CALL DMKPGTPG GET NEW DASD PAGE ADDRESS @V408246 01562000
CR R3,R11 MATCHING VMBLOKS? @V408246 01563000
BE CHKDSD YES, CHECK RETURN CONDITION @V408246 01564000
LR R2,R11 SAVE SEGMENT'S OWNER @VA07717 01564100
CHARGE SWITCH,3 NO, SWITCH VMBLOK AND TIMER @V407594 01565000
CHKDSD DS 0H @V408246 01566000
LTR R1,R1 ANY PAGES AVAILABLE? @V408246 01567000
BNZ SETADDR YES, SAVE ADDRESS @V408246 01568000
LA R14,DMKPTRU1 USER FLUSH CHAIN @V408246 01569000
L R15,CORBPNT-CORTABLE(,R14) LAST ENTRY @V408246 01570000
ST R7,CORFPNT-CORTABLE(,R15) NEW LAST @V408246 01571000
ST R7,CORBPNT-CORTABLE(,R14) . . @V408246 01572000
STM R14,R15,CORFPNT @V408246 01573000
OI SWPFLAG,SWPRECMP+SWPCHG1 FLAG NO BACKING STORE @V408246 01574000
L R3,DMKPTRUC FLUSHED PAGE COUNT @VA07810 01574050
AR R3,R4 PLUS ONE @VA07810 01574055
ST R3,DMKPTRUC STORE NEW COUNT @VA07810 01574060
TM CORFLAG,CORSHARE SHARED PAGE @VA07717 01574100
BO SELEXIT1 YES @VA09179 01574151
LH R3,VMFLPAG-VMBLOK(R11) FLUSHED PAGE COUNT @VA07922 01574210
AR R3,R4 PLUS ONE @VA07717 01574250
STH R3,VMFLPAG-VMBLOK(R11) @VA07922 01574310
SELEXIT1 CL R13,F2 ENTERED BY CPEXBLOK @VA09179 01574361
BNH SELDISP YES, EXIT TO DMKPAG @VA07922 01574410
CHARGE SWITCH,SAVER11 BACK TO CALLER @VA07922 01574460
B SELEXIT AND LEAVE @V408246 01575000
* 01576000
SETADDR DS 0H @V408246 01577000
ST R1,SWPCYL SAVE BACKING STORE ADDRESS @V408246 01578000
NI SWPFLAG,X'FF'-SWPRECMP TURN OFF SWAPRECMP @VA09460 01578500
EJECT 01579000
QWRITE EQU * HERE TO SWAP THE PAGE 01580000
* GET CPEXBLOK BEFORE UPPING COUNTS SO THAT AN EXTEND ON THIS FREE CALL 01581000
* WILL NOT RESULT IN THE SYSTEM WAITING FOR A NONEXISTANT PAGING INT. 01582000
OI SWPFLAG,SWPTRANS IND. PAGE IS NOW IN TRANSIT @VA01180 01583000
LA R0,CPEXSIZE GET CORE FOR A CPEXBLOK @VA00972 01584000
CALL DMKFREE BEFORE WE BUMP THE COUNTS @VA00972 01585000
L R2,DMKPTRSW GET NUMBER OF PAGES BEING SWAPPED@V2B2638 01586000
AR R2,R4 BUMP BY ONE 01587000
ST R2,DMKPTRSW AND RE-STORE @V2B2638 01588000
L R2,VMPGWRIT COUNT PAGE WRITES 01589000
AR R2,R4 ... 01590000
ST R2,VMPGWRIT ... 01591000
L R2,PGWRITE COUNT FOR SYSTEM .. 01592000
ALR R2,R4 ... 01593000
ST R2,PGWRITE ... 01594000
SPACE 01595000
LA R0,5 GET DASD WRITE DATA OP-CODE 01596000
STM R0,R15,CPEXR0 SAVE ALL REGS 01597000
LA R3,DMKPTRFD SET RETURN TO EXECUTION ADDRESS 01598000
ST R3,CPEXADD -- 01599000
SLR R15,R15 CLEAR... 01600000
ST R15,CPEXR13 SAVE AREA POINTER IN CPEXBLOK 01601000
L R0,DMKPTRWQ PUSH DOWN PAGE 01602000
ST R1,DMKPTRWQ WRITE REQUEST 01603000
ST R0,CPEXFPNT STACK 01604000
SPACE 2 01605000
CL R13,F2 UNSTACKED VIA CPEXBLOCK @V407594 01606000
BNH SELDISP YES, THERE IS NO CALLER @V407594 01607000
CHARGE SWITCH,SAVER11 RESUME CHARGING CALLER @V407594 01608000
B SELECT1 GO SEE IF MORE SWAPS NEEDED 01609000
SPACE 3 01610000
SELEXIT LTR R13,R13 SHOULD WE RETURN TO A CALLER 01611000
BZ SELDISP NO, GOTO THE DISPATCHER 01612000
LM R2,R9,SAVEWRK2 RESTORE PTR SAVE REGISTERS. @V408246 01613000
BR R8 AND EXIT TO CALLER 01614000
EJECT 01615000
DMKPTRFD EQU * HERE TO FRET THE PAGE AFTER IT HAS BEEN WRITTEN 01616000
NI SWPFLAG,255-SWPTRANS-SWPRECMP-SWPCHG1-SWPCHG2 @V408246 01617000
* RESET 01618000
L R1,DMKPTRSW GET NUMBER OF PAGES BEING SWAPPED@V2B2638 01619000
BCTR R1,0 DECREMENT 01620000
ST R1,DMKPTRSW AND RE-STORE @V2B2638 01621000
LTR R15,R15 TEST ERROR FROM PAGIO 01622000
BP DOFRET IO COMPLETED SUCCESSFULLY 01623000
OI SWPFLAG,SWPRECMP+SWPCHG1 BACKING STORE UNUSABLE @V408246 01624000
LR R3,R11 SET-UP FOR TSTOWNR @V408246 01625000
B TSTOWNR GET NEW DASD LOCATION @V408246 01626000
SPACE 3 01627000
DOFRET DS 0H @V408246 01628000
CALL DMKPTRFT FRET THE PAGE @V408246 01629000
AIF (NOT &AP).NOAP18 **AIF*** 01629900
TM APSTAT1,APUOPER RUNNING AS AP @V407594 01630000
BZ SELCHG NO @V407594 01631000
CL R11,LASTUSER LAST USER @V407594 01632000
BE SELCHG YES, DO NOT UNLOCK @V407594 01633000
CL R11,ASYSVM SYSTEM VMBLOK @V407594 01634000
BE SELCHG YES, UNLOCK NOT REQUIRED @V407594 01635000
LR R1,R11 VMBLOK TO R1 @V407594 01636000
LOCK RELEASE,TYPE=VMBLOK UNLOCK VMBLOK @V407594 01637000
.NOAP18 ANOP **ANOP** 01637100
SELCHG CHARGE SWITCH,ASYSVM START CHARGING SYSTEM @V407594 01638000
SELDSPX DS 0H @V408246 01639000
GOTO DMKDSPCH @V408246 01640000
SPACE 3 01641000
PTRFDISP DS 0H @V408246 01642000
SELDISP DS 0H @V408246 01643000
GOTO DMKPAGIO GO TEST FOR I/O TO START @V408246 01644000
EJECT 01645000
*. 01646000
* G. OPERATION OF DMKPTRFT - PLACE A CORTABLE ENTRY ON THE FREELIST 01647000
* 1. BUMP THE NUMBER OF ENTRIES IN THE FREELIST, AND TEST TO 01648000
* SEE IF THERE ARE ANY DEFERED REQUESTS QUEUE FROM FREEQ 01649000
* 2. IF THERE ARE NO DEFERED REQUESTS, SKIP TO STEP 3; OTHER- 01650000
* WISE, UNCHAIN THE FIRST REQUEST, PLACE THE ADDRESS OF THE 01651000
* CORTABLE ENTRY BEING RETURNED IN THE DEFERED CALLER'S GPR7, 01652000
* CALL DMKSTKCP TO STACK THE DEFERED REQUEST, AND EXIT 01653000
* 3. PLACE THE NEW ENTRY AT THE END OF THE FREELIST, AND FLAG 01654000
* IT AS A FREE PAGE; THEN EXIT TO THE CALLER 01655000
*. 01656000
SPACE 01657000
ENTRY DMKPTRFT 01658000
DROP R12,R10 @V407594 01659000
USING *,R15 01660000
DROP R9 01661000
DMKPTRFT STM R0,R2,BALR0 SAVE THESE REGS ONLY 01662000
TM CORFLAG,CORFREE IS PAGE ALREADY IN FREELIST @VA05378 01663000
BZ OKFREE NO, OK TO ADD TO FREE LIST @VA05378 01664000
SPACE 01665000
ABEND 14 @VA05378 01666000
SPACE 01667000
OKFREE EQU * @VA05378 01668000
MVI CORFLAG,CORFREE RESET CORFLAG @V408246 01669000
L R1,FREEQ GET QUEUE OF DEFERED REQUESTS 01670000
LTR R1,R1 ARE THERE ANY ?? 01671000
BZ CHAINPAG NO -- 01672000
SPACE 01673000
ST R7,CPEXR7 SAVE ADDRESS OF CORTABLE ENTRY 01674000
L R2,CORPGPNT POINT TO OLD PTE 01675000
LTR R2,R2 IS THERE ONE ? 01676000
USING PAGCORE,R2 ADDRESSABILITY, JUST IN CASE 01677000
BZ CKQ NO PAGTABLE ENTRY ACTIVE .. 01678000
TM PAGCORE+1,PAGINVAL CATCH CULPRIT 01679000
BO PTR11A OK THIS TIME .. 01680000
ABEND 11 GOTCHA 01681000
PTR11A EQU * 01682000
MVI PAGCORE,0 CLEAR PTE 01683000
NI PAGCORE+1,PAGINVAL+PAGREF RETAINING THESE FLAGS 01684000
SLR R2,R2 CLEAR OUT 01685000
ST R2,CORPGPNT OLD PAGE TABLE ENTRY POINTER 01686000
ST R2,CORBPNT CLEAR BACK-POINTER @V408246 01687000
STCM R2,B'0111',CORSWPNT+1 AND SWAP POINTER @V408246 01688000
CKQ EQU * 01689000
L R2,CPEXFPNT GET POINTER TO NEXT ON Q 01690000
ST R2,FREEQ AND MAKE HIM FIRST 01691000
LR R0,R14 PRESERVE RETURN ADDRESS 01692000
FTSTAK L R2,CPEXMISC GET RELATED TASK POINTER 01693000
CALL DMKSTKCP STACK FOR EXECUTION 01694000
SPACE 01695000
* THIS UNUSUAL CODE IS EXECUTED < 10 % OF THE TIME .. 01696000
USING *,R14 TEMPORARY ADDRESSABILITY 01697000
L R15,=A(DMKPTRFT) GET STANDARD 01698000
DROP R14 ADDRESSABILITY 01699000
USING DMKPTRFT,R15 ... 01700000
LTR R1,R2 ANY MORE IN THE STACK ?? 01701000
BNZ FTSTAK YES -- STACK THEM TOO 01702000
LR R14,R0 RESTORE OUR RETURN ADDRESS 01703000
B FRETEXIT NO -- LEAVE NOW 01704000
SPACE 3 01705000
CHAINPAG DS 0H @V408246 01706000
LA R2,DMKPTRF1 CHAIN ANCHOR FOR FREE LIST PAGES @V408246 01707000
L R1,CORFPNT-CORTABLE(,R2) 1ST PAGE ON LIST @V408246 01708000
ST R7,CORBPNT-CORTABLE(,R1) BACKCHAIN TO NEW 1ST @V408246 01709000
ST R7,CORFPNT-CORTABLE(,R2) FORWARD CHAIN TO NEW @V408246 01710000
* 1ST 01711000
STM R1,R2,CORFPNT 01712000
L R2,DMKPTRFN BUMP NUMBER ... @VA01767 01713000
A R2,F1 ...IN... @VA01767 01714000
ST R2,DMKPTRFN ...FREELIST. @VA01767 01715000
L R2,CORPGPNT POINT TO PTE 01716000
LTR R2,R2 IS THERE ONE ?? 01717000
BZ FRETEXIT NO ... 01718000
TM PAGCORE+1,PAGINVAL IT MUST BE INVALID 01719000
BO FRETEXIT WHEW . 01720000
ABEND 12 01721000
FRETEXIT LM R0,R2,BALR0 RESTORE REGS 01722000
BR R14 AND EXIT 01723000
SPACE 01724000
DROP R2,R5,R7 01725000
EJECT 01726000
*. 01727000
* H. OPERATION OF DMKPTRUL - UNLOCK A PAGE 01728000
* 1. VERIFY THE THE PAGE IS WITHIN THE REAL MACHINE AND IS IN 01729000
* FACT LOCKED 01730000
* 2. DECREMENT AND TEST THE LOCK COUNT IN THE CORTABLE ENTRY; 01731000
* IF IT IS STILL POSITIVE, EXIT; OTHERWISE CONTINUE 01732000
* 3. IF THE LOCK COUNT IS ZERO, RESET THE LOCK FLAG AND EXIT 01733000
* 01734000
*********************************************************************** 01735000
* 01736000
* 01737000
* CP ASSIST INSTRUCTION "PTRUL" - UNLOCK A PAGE FRAME 01738000
* 01739000
* 01740000
* OPERANDS: 01741000
* 1 = ADDRESS OF 'DMKPTRPL' ("PTRUL" DATA LIST) 01742000
* 2 = REAL ADDRESS WITHIN THE PAGE FRAME TO BE UNLOCKED 01743000
* 01744000
* REGISTER INPUT: 01745000
* GPR 14 = EXIT ADDRESS 01746000
* 01747000
* SYSTEM DATA AREAS REFERENCED (BY MODULE): 01748000
* DMKPTR - 'DMKPTRU1' 01749000
* DMKSYS - 'CORTABLE' 01750000
* 01751000
* 01752000
* EXITS: 01753000
* 01754000
* 1. ADDRESS IN GPR 14 (NORMAL COMPLETION) 01755000
* 01756000
* REGISTER OUTPUT: NONE CHANGED BY THIS INSTRUCTION 01757000
* 01758000
* 2. NEXT SEQUENTIAL INSTRUCTION (ABNORMAL COMPLETION) 01759000
* 01760000
* NOTE: THIS EXIT IS FUNCTIONALLY EQUIVALENT TO A NO-OP. 01761000
* 01762000
*********************************************************************** 01763000
*. 01764000
SPACE 01765000
DMKPTRUL DS 0F PAGE UNLOCK ROUTINE CALLED VIA BALR 01766000
ENTRY DMKPTRUL 01767000
USING *,R15 ADDRESSABILITY VIA GPR15 01768000
USING CORTABLE,R2 ADDRESSABILITY FOR CORTABLE ENTRY 01769000
SPACE 01770000
DS 0H EXECUTE CP ASSIST "PTRUL" %V3M4038 01771000
DC X'E603',S(DMKPTRPL,0(R2)) ***%V3M4038 01772000
SPACE 01773000
STM R0,R4,BALRSAVE SAVE REGS THAT ARE CHANGED %V3M4038 01774000
L R1,=A(DMKSYSRM) POINT TO REAL MACHINE SIZE %V3M4038 01775000
CL R2,0(,R1) PAGE TO BE UNLOCKED WITHIN CORE? %V3M4038 01776000
BL PTR2A YES -- %V3M4038 01777000
SPACE 01778000
ABEND 2 DIE 01779000
SPACE 01780000
PTR2A EQU * %V3M4038 01781000
N R2,XPAGNUM GET PAGE NUMBER %V3M4038 01782000
SRL R2,8 DIVIDED BY 256 %V3M4038 01783000
A R2,ACORETBL POINT TO CORETABLE ENTRY %V3M4038 01784000
TM CORFLAG,CORIOLCK IS THE PAGE LOCKED ?? %V3M4038 01785000
BO PTR3A YES -- %V3M4038 01786000
SPACE 01787000
ABEND 3 DIE 01788000
SPACE 01789000
PTR3A EQU * %V3M4038 01790000
L R0,CORLCNT GET LOCK COUNT %V3M4038 01791000
S R0,F1 DECREMENT %V3M4038 01792000
BNM PTR4A CANNOT BE MINUS %V3M4038 01793000
SPACE 01794000
ABEND 4 OR WE DIE 01795000
SPACE 01796000
PTR4A EQU * %V3M4038 01797000
ST R0,CORLCNT SAVE LOCK COUNT %V3M4038 01798000
BP UNLOKXIT LOCK COUNT STILL NON-ZERO %V3M4038 01799000
NI CORFLAG,X'FF'-(CORIOLCK+CORCP) RESET LOCK FLAG. %V408246 01800000
UNLOKXIT LM R0,R4,BALRSAVE RESTORE USER REGS %V3M4038 01801000
BR R14 AND EXIT TO CALLER %V3M4038 01802000
DROP R2 01803000
EJECT 01804000
*. 01805000
* I. OPERATION OF DMKPTRLK - LOCK A PAGE 01806000
* 1. ISOLATES THE REAL PAGE NUMBER FROM THE REAL ADDRESS IN 01807000
* GPR 2, AND REFERENCES THE CORE TABLE. 01808000
* 2. IF THE PAGE IS ALREADY LOCKED (FLAG-BIT SET), SIMPLY 01809000
* INCREMENTS THE LOCK COUNT BY 1, AND EXITS. 01810000
* 3. IF THE PAGE WAS NOT LOCKED, SETS THE 01811000
* FLAG-BIT INDICATING THE PAGE IS NOW LOCKED, SETS THE 01812000
* LOCK COUNT TO 1, AND EXITS. 01813000
* 01814000
*********************************************************************** 01815000
* 01816000
* 01817000
* CP ASSIST INSTRUCTION "PTRLK" - LOCK A PAGE FRAME 01818000
* 01819000
* 01820000
* OPERANDS: 01821000
* 1 = ADDRESS OF 'LOCKLIST' (ADDR OF THE ADDR OF 'CORTABLE') 01822000
* 2 = REAL ADDRESS WITHIN THE PAGE FRAME TO BE LOCKED 01823000
* 01824000
* REGISTER INPUT: 01825000
* GPR 14 = EXIT ADDRESS 01826000
* 01827000
* SYSTEM DATA AREAS REFERENCED (BY MODULE): 01828000
* DMKSYS - 'CORTABLE' 01829000
* 01830000
* 01831000
* EXITS: 01832000
* 01833000
* 1. ADDRESS IN GPR 14 (NORMAL COMPLETION) 01834000
* 01835000
* REGISTER OUTPUT: NONE CHANGED BY THIS INSTRUCTION 01836000
* NOTE: THE CONDITION CODE IS SET TO ZERO 01837000
* 01838000
* 2. NEXT SEQUENTIAL INSTRUCTION (ABNORMAL COMPLETION) 01839000
* 01840000
* NOTE: THIS EXIT IS FUNCTIONALLY EQUIVALENT TO A NO-OP. 01841000
* 01842000
*********************************************************************** 01843000
*. 01844000
SPACE 01845000
DMKPTRLK DS 0F PAGE LOCK ROUTINE CALLED VIA BALR 01846000
ENTRY DMKPTRLK 01847000
USING *,R15 ADDRESSABILITY VIA GPR15 01848000
SPACE 01849000
DS 0H EXECUTE CP ASSIST "PTRLK" %V3M4038 01850000
DC X'E602',S(LOCKLIST,0(R2)) ***%V3M4038 01851000
SPACE 01852000
STM R2,R5,BALR2 SAVE ONLY THE REGS. WE WILL USE %V3M4038 01853000
N R2,XPAGNUM ISOLATE REAL PAGE NUMBER %V3M4038 01854000
SRL R2,8 DIVIDED BY 256 %V3M4038 01855000
AL R2,ACORETBL POINT TO CORTABLE ENTRY %V3M4038 01856000
USING CORTABLE,R2 AND REFERENCE THE CORE TABLE %V3M4038 01857000
LA R5,1 SET R5 = 1 (FOR GENERAL USE) %V3M4038 01858000
TM CORFLAG,CORIOLCK IS PAGE ALREADY LOCKED? %V408246 01859000
BZ PTRLKSTR NO -SET LOCK COUNT TO 1. %V408246 01860000
AL R5,CORLCNT ADD TOTAL NUMBER OF LOCKS. %V408246 01861000
PTRLKSTR ST R5,CORLCNT STORE UPDATED LOCK COUNT %V3M4038 01862000
OI CORFLAG,CORIOLCK ENSURE LOCK FLAG-BIT SET %V3M4038 01863000
LM R2,R5,BALR2 RESTORE THE REGISTERS WE USED, %V3M4038 01864000
SR R15,R15 SET CONDITION-CODE = 0, %V3M4038 01865000
BR R14 AND EXIT TO CALLER. %V3M4038 01866000
SPACE 3 01867000
DROP R15 @V408246 01868000
EJECT 01869000
*. 01870000
* 01871000
* J. OPERATION OF DMKPTRRS - RESET VIRTUAL MEMORY TABLES 01872000
* 1. INVALIDATES EACH VALID STE IN THE VIRTUAL MACHINE'S 01873000
* SEGMENT TABLE AND TIMESTAMPS THE ASSOCIATED 01874000
* PAGE TABLE HEADER. IF THE SEGMENT IS SHARED 01875000
* THEN THE ACTIVE SHARE COUNT IN THE PAGE 01876000
* TABLE HEADER IS ALSO DECREMENTED. 01877000
* 2. IF THE PERFORMANCE FEEDBACK FLAG IS SET INDICATING 01878000
* A HEAVY PAGING LOAD THEN EACH VALID PTE IN THE 01879000
* VIRTUAL MACHINE'S PAGE TABLES IS INVALIDATED AND 01880000
* THE ASSOCIATED CORTABLE ENTRY IS CHAINED ONTO THE 01881000
* FLUSH LIST. FOR A SHARED SEGMENT THIS PROCESS IS 01882000
* ONLY PERFORMED WHEN THE ACTIVE SHARE COUNT HAS 01883000
* DECREMENTED TO 0. 01884000
* 01885000
*. 01886000
* 01887000
USING SEGPAGE,R3 @V408246 01888000
USING SWPFLAG,R5 @V408246 01889000
USING CORTABLE,R7 @V408246 01890000
USING PAGCORE,R9 @V408246 01891000
DMKPTRRS DS 0H @V408246 01892000
TM VMDSTAT,VMINQ IS VM NOW IN A QUEUE @V4M0207 01893000
BOR R14 BYPASS RESET IF SO @V4M0207 01894000
STM R0,R15,FREESAVE (SCH MAY BE CALLER) @V408246 01895000
L R12,APTRAN ESTABLISH ADDRESSABILITY @V408246 01896000
LR R10,R12 SET SECOND BASE REGISTER @V407594 01897000
A R10,F4096 @V407594 01898000
USING DMKPTR,R12,R10 @V407594 01899000
LA R4,1 INCREMENT @V408246 01900000
ICM R6,B'1111',VMSEG GET CNT AND PTR @V408246 01901000
BZ RSEXIT NONE, THEN EXIT @V408246 01902000
NI VMDSTAT,X'FF'-VMDSP ASSURE NO FAST RE-DISPATCH @V4M0167 01903000
MVI TEMPR0,0 ZERO PTLB FLAG @V408246 01904000
LCTL C1,C1,VMSEG GET CORRECT STO IN CONTROL REG @V408246 01905000
LRA R2,0 PAGE ZERO @V408246 01906000
BNZ RSNOTMR NOT AVAILABLE @V408246 01907000
OI VMESTAT,VMINVPAG INVALIDATE ANY SHADOW TABLES @V4M0167 01908000
L R2,TIMER-PSA(R2) SAVE THE VIRTUAL TIMER VALUE @V408246 01909000
ST R2,VMTIMER @V408246 01910000
TM VMMCR6,VMMVTMR IS TIMER ASSIST ACTIVE? @V408246 01911000
BZ RSNOTMR NO @V408246 01912000
ICM R2,B'0111',VMMADDR VM ASSIST OF FOR USER? @V408246 01913000
BZ RSNOTMR NO @V408246 01914000
LA R0,VMTIMER YES, POINT TIMER ASSIT HERE... @V408246 01915000
ST R0,MICVTMR-MICBLOK(R2) @V408246 01916000
RSNOTMR DS 0H @V408246 01917000
SRL R6,24 GET SEG LGTH / 16 @V408246 01918000
AR R6,R4 ORIGIN 1 @V408246 01919000
SLL R6,4 SEG LGTH @V408246 01920000
ICM R3,B'0111',VMSEG+1 GET SEG ADDR @V408246 01921000
SR R9,R9 CLEAR INITIALLY @V408246 01922000
LH R0,VMPAGES CURRENT NO. IN CORE PAGES @V408246 01923000
ST R0,TEMPR1 INITIALIZE COUNT @V408246 01924000
EJECT 01925000
* 01926000
* SCAN THRU THE VIRTUAL MEMORY TABLES, LOOKING FOR VALID ENTIRES 01927000
* 01928000
RSSGLOOP DS 0H LOOP THRU SEGMENT TABLE ENTRIES @V408246 01929000
TM SEGPAGE+3,SEGINV SEGMENT TABLE ENTRY VALID? @V408246 01930000
BO RSNEWSEG NO, MOVE TO NEXT STE @V408246 01931000
SR R8,R8 CLEAR @V408246 01932000
IC R8,SEGPAGE PAGE TABLE LENGTH @V408246 01933000
SRL R8,4 RIGHT JUSTIFY @V408246 01934000
AR R8,R4 ORIGIN 1 @V408246 01935000
ICM R9,B'0111',SEGPAGE+1 PAGE TABLE POINTER @V408246 01936000
L R5,=F'-16' BACK-UP TO START OF TABLE HEADER @V408246 01937000
AR R5,R9 @V408246 01938000
USING PAGSTMP,R5 @V408246 01939000
STCK TEMPR2 STORE TOD CLOCK IN WORK AREA @V407594 01940000
MVC PAGSTMP,TEMPR2 MOVE HIGH WORD TO PG TBL HDR @V407594 01941000
BC 3,DOWNWEGO ABEND CVT001 @V408246 01942000
ICM R2,B'0111',PAGSHR+1 NAMED SYSTEM POINTER? @V408246 01943000
BZ RSPGLOOP NO @V408246 01944000
ICM R2,B'1111',SHRSEGCT-SHRTABLE(R2) SHARED SEG. @V408246 01945000
* COUNT? 01946000
BZ RSPGLOOP NO @V408246 01947000
AIF (NOT &AP).NOAP19 **AIF*** 01947900
TM APSTAT1,APUOPER RUNNING AS AP @V407594 01948000
BO DOCS YES, USE COMPARE AND SWAP LOGIC @V407594 01949000
.NOAP19 ANOP **ANOP** 01949100
LH R2,PAGACT DECREMENT @V408246 01950000
SR R2,R4 ACTIVE SHARED SEGMENT USER COUNT @V408246 01951000
STH R2,PAGACT @V408246 01952000
BP RSISTE SEGMENT STILL BEING USED, @V408246 01953000
* BYPASS RESET @V407594 01954000
AIF (NOT &AP).NOAP20 **AIF*** 01954900
B RSPGLOOP RESET PAGES WITHIN SEGMENT @V4M0172 01955000
DOCS L R14,PAGACT LOAD COUNTS @V407594 01956000
DECRACT LR R2,R14 @V407594 01957000
SL R2,=A(X'10000') DECREMENT ACTIVE COUNT @V407594 01958000
CS R14,R2,PAGACT UPDATE COUNTS @V407594 01959000
BC 4,DECRACT UPDATE FAILED @V407594 01960000
SRL R2,16 ACTIVE COUNT TO LOW HALF WORD @V407594 01961000
LTR R2,R2 SEGMENT STILL IN USE @V407594 01962000
BP RSISTE YES, BYPASS RESET @V407594 01963000
.NOAP20 ANOP **ANOP** 01963100
RSPGLOOP DS 0H LOOP THRU PAGE TABLE ENTIRES @V408246 01964000
TM PAGCORE+1,PAGINVAL PAGE INVALID? @V408246 01965000
BZ RSPGVL NO, VALID @V408246 01966000
TM PAGCORE+1,PAGREF USED WHILE IN-Q? @V408246 01967000
BZ RSPGUPD NO, DONE @V408246 01968000
NI PAGCORE+1,255-PAGREF YES, RESET FLAG @V408246 01969000
LA R0,1 INCREMENT @V408246 01970000
AL R0,TEMPR1 COUNT OF PAGES TOUCHED @V408246 01971000
ST R0,TEMPR1 @V408246 01972000
B RSPGUPD AND OUT @V408246 01973000
RSPGVL DS 0H @V408246 01974000
LH R7,PAGCORE REAL PAGE NO. * 16 @V408246 01975000
N R7,=A(X'FFF0') CLEAR ALL BUT ADDRESS BITS @V408246 01976000
LR R1,R7 SAVE @V408246 01977000
A R7,ACORETBL INDEX TO CORRESPONDING CORE @V408246 01978000
* TABLE ENTRY 01979000
TM CORFLAG,255-CORSHARE PAGE AVAILABLE? @V408246 01980000
BNZ RSPGUPD NO, BYPASS RESET @V408246 01981000
ICM R5,B'0111',CORSWPNT+1 SWAP TABLE POINTER @V408246 01982000
USING SWPFLAG,R5 @V408246 01983000
TM SWPFLAG,SWPTRANS+SWPALLOC PAGE ENQUEUED? @V408246 01984000
BNZ RSPGUPD YES, BYPASS RESET @V408246 01985000
SLL R1,8 GET REAL PAGE ADDRESS @V408246 01986000
RRB 0(R1) RESET REF. BITS FOR THIS PAGE @V408246 01987000
BALR R14,0 SAVE CONDITION CODE @V408246 01988000
BC 8+4,*+8 @V408246 01989000
OI SWPKEY1,4 REF. BIT RESET, BACK-UP TO VIRT @V408246 01990000
RRB 2048(R1) RESET KEY IN 2ND 2K @V408246 01991000
BALR R15,0 SAVE CONDITION CODE @V408246 01992000
BC 8+4,*+8 @V408246 01993000
OI SWPKEY2,4 REF. BIT RESET, BACK-UP TO VIRT. @V408246 01994000
NI SWPFLAG,255-SWPREF1-SWPREF2 RESET CP BACK-UP @V408246 01995000
* BITS 01996000
EJECT 01997000
OR R14,R15 COMBINE C.C. @V408246 01998000
TM CORFLAG,CORSHARE SHARED PAGE FRAME? @V4M0167 01999000
BZ RSSCHG NO, CHECK CHANGED @V4M0167 02000000
SPM R14 CHECK FOR SHARED AND CHANGED @V4M0167 02001000
BC 8+2,RSNOCHG PAGE NOT CHANGED @VA09279 02002100
SLR R15,R15 CLEAR REG FOR INSERT @VA09279 02002200
IC R15,SWPVPAGE VIRTUAL PAGE NUMBER @VA09279 02002300
SLL R15,1 MULTIPLY BY 2 FOR PTE SIZE @VA09279 02002400
L R2,CORPGPNT PAGE TABLE ENTRY ADDRESS @VA09279 02002500
SLR R2,R15 BACK UP TO START OF PAGE TABLE @VA09279 02002600
SL R2,F16 BACK UP TO PAGE TABLE HEADER @VA09279 02002700
L R2,PAGSHR-PAGTABLE(,R2) SHARETABLE POINTER @VA09279 02002800
TM SHRFLAG-SHRTABLE(R2),SHRNOPRT IS SHARED PAGE @VA09279 02002900
* UNPROTECTED? 02003000
BZ RSCHGSHR PAGE IS SHARED, CHANGED, @VA09279 02003100
* PROTECTED--LEAVE FOR DMKVMA 02003200
RSNOCHG L R2,DMKPTRSC FRAME IS UNCHANGED, OR FRAME IS @VA09279 02003300
* CHANGED AND UNPROTECTED 02003400
SR R2,R4 RESIDENT SHARED PAGE COUNT @V4M0167 02004000
ST R2,DMKPTRSC STORE UPDATED COUNT @V4M0167 02005000
RSSCHG DS 0H @V4M0167 02006000
OI PAGCORE+1,PAGINVAL INVALIDATE PAGE TABLE ENTRY @V408246 02007000
OI VMESTAT,VMINVPAG INVALIDATE ANY SHADOW TABLES @V408246 02008000
* ALSO 02009000
OI CORFLAG,CORFLUSH FLAG PAGE ON FLUSH LIST @V408246 02010000
L R15,CORFPNT PAGE'S OWNER @V408246 02011000
LH R2,VMPAGES-VMBLOK(,R15) DECREMENT @V408246 02012000
SR R2,R4 IN-CORE PAGE COUNT @V408246 02013000
BM PTR18 VMPAGES TO GO NEGATIVE - TERM CP @VA07224 02013100
STH R2,VMPAGES-VMBLOK(,R15) @V408246 02014000
L R2,DMKPTRUC FLUSHED PAGE COUNT @VA07810 02014050
AR R2,R4 PLUS ONE @VA07810 02014055
ST R2,DMKPTRUC STORE NEW COUNT @VA07810 02014060
TM CORFLAG,CORSHARE SHARED PAGE @VA07717 02014100
BO RSNFLCNT YES @VA07717 02014150
LH R2,VMFLPAG-VMBLOK(R15) FLUSHED PAGE COUNT @VA07717 02014200
AR R2,R4 PLUS ONE @VA07717 02014250
STH R2,VMFLPAG-VMBLOK(R15) @VA07717 02014300
RSNFLCNT DS 0H @VA07717 02014350
SPM R14 CHECK IF REAL KEYS MUST BE @V408246 02015000
* BACKED UP 02016000
BC 8+2,RSCKCHN REAL KEYS NOT SET @V408246 02017000
OI SWPFLAG,SWPCHG2 MAKE SURE WRITTEN OUT @V408246 02018000
RRB 0(R1) TEST 1ST 2K @V408246 02019000
BC 8+2,*+8 1ST 2K NOT CHANGED @V408246 02020000
OI SWPKEY1,2 REAL CHANGE BIT TO VIRT. BACKUP @V408246 02021000
RRB 2048(R1) TEST 2ND 2K @V408246 02022000
BC 8+2,*+8 NOT CHANGED @V408246 02023000
OI SWPKEY2,2 REAL CHANGE BIT TO VIRT. BACKUP @V408246 02024000
RSCKCHN DS 0H @V408246 02025000
TM VMDSTAT,VMELIG IN ELIGIBLE LIST @VA07714 02025100
BO RSCHNF YES, ADD PAGES TO END OF LIST @VA07714 02025200
LA R15,DMKPTRU1 ANCHOR FOR USER PAGE LIST @V408246 02026000
L R14,CORFPNT-CORTABLE(,R15) 1ST PAGE ON LIST @V408246 02027000
ST R7,CORBPNT-CORTABLE(,R14) BACKCHAIN TO NEW 1ST @V408246 02028000
ST R7,CORFPNT-CORTABLE(,R15) MAKE NEW FIRST @V408246 02029000
STM R14,R15,CORFPNT FILE IN NEW FORW. AND BACKW. @V408246 02030000
* PTRS. 02031000
B RSPGUPD @VA07714 02031100
RSCHNF DS 0H ADD PAGES TO END OF FLUSH LIST @VA07714 02031150
LA R15,DMKPTRU1 POINTER TO LAST ENTRY @VA07714 02031200
L R14,4(R15) POINT TO LAST ENTRY @VA07714 02031250
ST R7,CORFPNT-CORTABLE(R14) FWD CHAIN TO NEW LAST @VA07714 02031300
ST R7,4(R15) POINT TO NEW LAST ENTRY @VA07714 02031350
ST R14,CORBPNT BACKCHAIN NEW ENTRY @VA07714 02031400
ST R15,CORFPNT & FORWARD CHAIN IT @VA07714 02031450
SPACE 3 02032000
RSPGUPD DS 0H @V408246 02033000
LA R9,PAGCORE+2 MOVE POINTER TO NEXT PTE @V408246 02034000
BCT R8,RSPGLOOP LOOP THRU ALL PTE IN THIS SEGMENT@V408246 02035000
RSISTEI DS 0H INVALIDATE STE @VA07230 02036000
OI SEGPAGE+3,SEGINV INVALIDATE STE @V408246 02037000
RSSETPUR DS 0H @V4M0172 02038000
MVI TEMPR0,1 RAISE PTLB FLAG @V408246 02039000
RSNEWSEG DS 0H HANDLE NEXT STE @V408246 02040000
LA R3,SEGPAGE+4 POINT TO NEXT STE @V408246 02041000
BCT R6,RSSGLOOP LOOP THRU ALL STE IN SEGMENT @V408246 02042000
* TABLE 02043000
CLI TEMPR0,0 IMMEDIATE PTLB REQUIRED? @V408246 02044000
BE RSEXIT NO @V408246 02045000
OI APSTAT2,CPPTLBR SET PTLB REQ FOR THIS PROCR @V407594 02046000
L R2,PREFIXB AND OTHER PROCESSOR @V407594 02047000
OI APSTAT2-PSA(R2),CPPTLBR REDUNDANT IF UP MODE @V407594 02048000
RSEXIT DS 0H @V408246 02049000
LM R0,R15,FREESAVE RESTORE REGS. @V408246 02050000
BR R14 AND RETURN TO SCH CALLER @V408246 02051000
SPACE 1 @V4M0172 02052000
RSCHGSHR DS 0H RESET PAGACT TO WHAT IT WAS @V4M0172 02053000
ICM R9,B'0111',SEGPAGE+1 LOAD PAGE TBL POINTER @V4M0172 02054000
L R5,=F'-16' BACK UP TO HEADER @V4M0172 02055000
AR R5,R9 POINT TO HEADER @V4M0172 02056000
USING PAGSTMP,R5 BASE HEADER @V4M0172 02057000
TM APSTAT1,APUOPER RUNNING AS AP @V4M0172 02058000
BO RSINCRCS YES, MUST USE COMPARE & SWAP @V4M0172 02059000
LH R0,PAGACT LOAD ACTIVE COUNT @V4M0172 02060000
AR R0,R4 ADD ONE (SEGMENT STILL VALID) @V4M0172 02061000
STH R0,PAGACT STORE COUNT @V4M0172 02062000
B RSSETPUR FINISHED WITH SEGMENT @V4M0172 02063000
RSINCRCS L R0,PAGACT LOAD ACTIVE & TOTAL COUNTS @V4M0172 02064000
RSCSADD LR R14,R0 COUNTS TO R14 @V4M0172 02065000
AL R14,=A(X'10000') ADD ONE TO ACTIVE COUNT @V4M0172 02066000
CS R0,R14,PAGACT REPLACE COUNTS @V4M0172 02067000
BC 4,RSCSADD UPDATE FAILED @V4M0172 02068000
B RSSETPUR FINISHED WITH SEGMENT @V4M0172 02069000
SPACE 1 02069100
RSISTE DS 0H @VA07230 02069110
CL R11,LASTUSER IS VMA SCAN PENDING @VA07230 02069120
BNE RSISTEI NO- INVALIDATE STE @VA07230 02069130
* PERFORM DMKVMA SCAN HERE AND INVALIDATE STE IF NO CHANGED PAGE 02069140
* IF PAGE HAS BEEN CHANGED LEAVE STE VALID 02069150
CNOP 0,8 @VA07230 02069160
PAGEISK TM PAGCORE+1,PAGINVAL PAGE INVALID @VA07230 02069170
BO INVAL YES, CANNOT BE CHANGED @VA07230 02069180
LH R2,PAGCORE LOAD PTE @VA07230 02069190
SLL R2,8 DEVELOP REAL ADDRESS @VA07230 02069200
N R2,XPAGNUM CLEAR DISPLACEMENT @VA07230 02069210
ISK R0,R2 LOAD FIRST KEY @VA07230 02069220
SLL R0,8 SAVE KEY @VA07230 02069230
LA R2,2048(R2) ADD FOR SECOND HALF OF PAGE @VA07230 02069240
ISK R0,R2 LOAD SECOND KEY @VA07230 02069250
N R0,=A(X'00000202') ISOLATE CHANGE BITS @VA07230 02069260
BNZ RSCHGSHR PAGE WAS CHANGED @VA07230 02069270
INVAL LA R9,PAGCORE+2 POINT TO NEXT PTE @VA07230 02069280
BCT R8,PAGEISK PROCESS NEXT PTE @VA07230 02069290
B RSISTEI INVALIDATE STE- SEG NOT CHANGED @VA07230 02069300
SPACE 1 @V4M0172 02070000
DROP R3,R5,R7,R9 @V408246 02071000
EJECT 02071100
* NOTE.... THIS SUBROUTINE REMOVED FROM DMKPGS BY VM8037 02071120
* B. OPERATION OF DMKPTRPW - 02071140
* 02071160
* 1. CHECK THAT THIS VIRTUAL MACHINE HAS SOME OUTSTANDING 02071180
* PAGING ACTIVITY. IF NONE FOUND RETURN TO CALLER 02071200
* 2. CREATE A CP REQUEST BLOCK TO RESTART AT STEP 1. 02071220
* 3. SEARCH CP PAGE I/O REQUEST CHAINS FOR A REQUEST BLOCK 02071240
* BELONGING TO THIS VIRTUAL MACHINE. IF NONE FOUND 02071260
* SKIP TO STEP 5. 02071280
* 4. QUEUE CP REQUEST BLOCK OFF OF THE PAGE I/O REQUEST BLOCK. 02071300
* SKIP TO STEP 6. 02071320
* 5. CALL DMKSTKCP TO IMMEDIATELY QUEUE THE CP REQUEST BLOCK 02071340
* 6. GOTO DMKDSP 02071360
* 02071380
*. 02071400
DMKPTRPW RELOC @V408246 02071420
LR R10,R12 SET SECOND BASE @VA08037 02071440
A R10,F4096 ......... @VA08037 02071460
USING DMKPTR,R12,R10 @VA08037 02071480
CL R11,ASYSVM ENTERED FOR SYSTEM VMBLOK? @VA08341 02071485
BE EXITA YES, ALL DONE @VA08341 02071490
PTRPWEP DS 0H @V408246 02071500
TM VMRSTAT,VMPGWAIT ALL QUIET? @V408246 02071520
BNZ CHKSTK NO @V408246 02071540
CLC VMNDCNT,F0 QUIET HERE ALSO? @V408246 02071560
BE EXITA YES, ALL DONE @V408246 02071580
* 02071600
* USER HAS OUTSTANDING PAGING ACTIVITY. 02071620
* DEFER RETURN UNTILL ALL IS QUIET. 02071640
* 02071660
CHKSTK DS 0H @V408246 02071680
LA R0,CPEXSIZE GET CPRQ BLOCK @V408246 02071700
CALL DMKFREE @V408246 02071720
USING CPEXBLOK,R1 @V408246 02071740
STM R0,R13,CPEXR0 SAVE MY REGS. @V408246 02071760
LA R0,PTRPWEP RE-ENTER AT THE TOP @V408246 02071780
ST R0,CPEXADD @V408246 02071800
L R4,=A(DMKPTRFQ) FREE LIST QUEUE @V408246 02071820
L R3,=A(DMKPAGQ) PAGE I/O QUEUE @V408246 02071840
LR R2,R3 SAVE ANCHOR @V408246 02071860
* 02071880
* SEARCH PAGING QUEUES FOR A REQUEST BLOCK FOR THIS VMBLOK 02071900
* 02071920
GETTASK DS 0H @V408246 02071940
ICM R3,B'1111',CPEXFPNT-CPEXBLOK(R3) GET ADDR CPEXB @VMI0038 02071960
BZ CKDSPQ NO CPEXBLOK @VMI0038 02071980
CR R2,R3 BACK AT START OF CHAIN? @V408246 02072000
BE STAK YES @V408246 02072020
LR R5,R3 NO, SAVE POINTER @V408246 02072040
LR R15,R5 SET SWITCH NON-ZERO @V408246 02072060
GETEND DS 0H SCAN ALL DEFERRED TASKS @V408246 02072080
C R11,CPEXR11-CPEXBLOK(,R5) THIS USER'S TASK? @V408246 02072100
BNE *+6 NO @V408246 02072120
SR R15,R15 YES, ZERO SWITCH @V408246 02072140
ICM R0,15,CPEXMISC-CPEXBLOK(R5) GET POINTER TO @V408246 02072160
* DEFERED 02072180
BZ CHNIT FOUND @V408246 02072200
LR R5,R0 SAVE BACKPOINTER AND CONTINUE @V408246 02072220
B GETEND @V408246 02072240
CHNIT DS 0H @V408246 02072260
LTR R15,R15 WAS SOMETHING FOUND? @V408246 02072280
BNZ GETTASK NO, KEEP SEARCHING @V408246 02072300
ST R1,CPEXMISC-CPEXBLOK(,R5) NEW LAST BLOCK @V408246 02072320
ST R15,CPEXMISC ZERO FORWARD POINTER @V408246 02072340
B GTDSP ALL DONE @V408246 02072360
SPACE 02072380
* 02072400
* NOT REQUESTS WERE FOUND 02072420
* 02072440
STAK DS 0H TASK NOT FOUND @V408246 02072460
LR R3,R4 @V408246 02072480
SR R4,R4 CLEAR @V408246 02072500
LTR R2,R3 SAVE CHAIN ANCHOR AND TEST @V408246 02072520
BNZ GETTASK CHECK THIS CHAIN ALSO @V408246 02072540
CKDSPQ DS 0H @VMI0038 02072560
CALL DMKSTKCP @VMI0038 02072580
GTDSP DS 0H @V408246 02072780
GOTO DMKDSPCH @V408246 02072800
EXITA DS 0H NOW RETURN TO CALLER WITH CC=0 @V400141 02072860
CLI SAVEWRK1+1,CC0 SET CC FOR CALLER @V408246 02072880
LM R0,R11,SAVEREGS @V408246 02072900
SVC 12 @V408246 02072920
EJECT @V408246 02072940
DS 0D ALIGNMENT 02073000
DMKPTRFN DC F'0' NUMBER OF PAGES IMMEDIATELY AVAILABLE 02074000
DMKPTRSW DC F'0' NUMBER OF PAGES BEING SWAPPED @V2B2638 02075000
DMKPTRF1 DC A(DMKPTRF1) ADDRESS OF 1ST PAGE 02076000
FREELAST DC A(DMKPTRF1) ADDRESS OF LAST PAGE 02077000
SPACE 2 02078000
SPACE 02079000
DMKPTRXX DC A(X'80000000') LOC TO DETERMINE IF USER @V408246 02080000
* CHANGED PAGE 02081000
* SHOULD BE PAGED OUT AFTER BEING DROPPED FROM Q 02082000
SPACE 2 02083000
* THE FOLLOWING 8 BYTE DATA LIST MUST BE KEPT CONTIGUOUS AND IN ORDER 02084000
* BECAUSE IT IS USED BY THE CP ASSIST INSTRUCTIONS "PTRLK" AND "PTRUL". 02085000
SPACE 02086000
DMKPTRPL DS 0F @V386198 02087000
DMKPTRRM DC A(0) +0 STORAGE SIZE (SET BY DMKCPI) @V386198 02088000
LOCKLIST DC V(DMKSYSCS) +4 ADDR OF THE SYSTEM CORE TABLE @V386198 02089000
* 02090000
* DMKPTRU1 IS THE DEFERRED WRITE (FLUSH) LIST ANCHOR 02090100
DMKPTRU1 DC A(DMKPTRU1) A(1ST ENTRY FOR USER PAGES) @V408246 02091000
DC A(DMKPTRU1) A(LAST ENTRY FOR USER PGS) @V408246 02092000
SPACE 1 02092100
DMKPTRUC DC F'0' COUNT OF FLUSHED PAGES @VA07810 02092200
SPACE 2 02093000
DMKPTRRU DC A(0) VMBLOK ADDRESS FOR RESERVED PAGE USER 02094000
SPACE 02095000
FREEQ DC A(0) Q OF DEFERED REQUESTS FOR FREE CORE 02096000
DMKPTRFQ EQU FREEQ @V408246 02097000
DMKPTRFA DC A(0) BLOCK OF STORAGE FOR EXTENDING @VM08952 02098000
SPACE 02099000
DMKPTRRQ DC A(0) PAGE READ REQUEST QUEUE 02100000
DMKPTRWQ DC A(0) PAGE WRITE REQUEST QUEUE 02101000
DC F'-1' FENCE 02102000
SPACE 3 02103000
DMKPTRPR DC F'0' NUMBER OF PAGES RECLAIMED @V2B2638 02104000
* FROM FREE LIST 02104050
DMKPTRP2 DC F'0' NUMBER OF PAGES RECLAIMED @VA07717 02104100
* FROM FLUSH LIST 02104150
SPACE 02105000
DMKPTRF0 DC F'0' NUMBER OF TIMES FREELIST WAS EMPTY 02106000
SPACE 02107000
DMKPTRFC DC F'0' NUMBER OF TIMES DMKPTRFR WAS CALLED 02108000
SPACE 02109000
DMKPTRFF DC F'0' NO. PAGES SWAPPED FROM FLUSH LIST@V2B2638 02110000
DMKPTRSS DC F'0' NO. OF PAGE STEALS FROM ACTIVE @V2B2638 02111000
* USERS 02112000
SPACE 02113000
DMKPTRRF DC F'0' NO. PAGES LOOKED AT DURING STEALS@V2B2638 02114000
DMKPTRCS DC F'0' NO. OF TIMES ENTIRE ULIST EXAMIND@V2B2638 02115000
SPACE 02116000
SPACE 02117000
SPACE 02118000
DMKPTRRL DC F'0' RESERVED PAGE LIMIT 02119000
SPACE 02120000
DMKPTRRC DC F'0' NUMBER OF RESIDENT, RESERVED PAGES 02121000
SPACE 02122000
EJECT 02123000
DMKPTRCP EQU * TABLE IS SET UP BY DMKCPI @V408246 02124000
* THE FOLLOWING DC CONTAINS POINTERS TO INDEX INTO THE CORETBL 02125000
*CURPNT DC A(REAL STORAGE ADDR),A(CUR CORETBL ENTRY),A(INDEX CONT) 02126000
* DC A(LOWEST PAGEABLE CORETBL ENTRY THIS BLOK),A(INCREMENT) 02127100
CURPNT DC A(0),A(0),A(-16),A(0),A(4096) @V408246 02128000
SPACE 1 02129000
FULLSCAN EQU * START OF FULLSCAN TABLE @VA08341 02130100
*FULSCAN2 DC A(ADDR. OF HIGHEST PAGEABLE PAGE),A(HIGH CORETBL ENTRY) 02130150
* DC A(INDEX CONST.),A(FIRST PAGEABLE CORETBL ENTRY),A(INCRE) 02131000
FULSCAN2 DC A(0),A(0),A(-16),A(0),A(4096) @VA08341 02131100
*FULSCAN1 DC A(ADDR. OF HIGHEST V=R PAGE),A(HIGH V=R CORETBL ENTRY) 02131200
* DC A(INDEX CONST.),A(1ST V=R CORETBL ENTRY),A(INCRE) 02131300
FULSCAN1 DC A(0),A(0),A(-16),A(0),A(4096) @VA08341 02131400
*TOPPNT DC A(ADDRESS HIGHEST PAGEABLE PAGE THIS BLOK), 02133100
* DC A(HIGHEST CORETBL ENTRY THIS BLOK), 02133200
* DC A(INDEX CONST),A(CURRENT CORETBL ENTRY),A(INCREMENT) 02134000
SPACE 1 02135000
TOPPNT DC A(0),A(0),A(-16),A(0),A(4096) @V408246 02136000
DC F'-1' FENCE.... @V408246 02137000
SPACE 3 02138000
DMKPTRCT DC F'0' TOTAL CALLS TO DMKPTR 02139000
DMKPTRSC DC F'0' TOTAL RESIDENT SHARED PAGES 02140000
* 02141000
DMKPGSHR DC 2A(DMKPGSHR) ANCHOR FOR SCHRTABLES @V408246 02142000
DMKPTRSN EQU * @VA08341 02142100
SCANNUM DC H'0' NUMBER OF FRAME BLOCKS AVAILABLE @VA08341 02142150
* FOR SCAN 02142200
SCANBLOK DC H'0' NUMBER OF BLOCK CURRENTLY BEING @VA08341 02142250
* SCANNED 02142300
SCANSTRT DC H'0' NUMBER OF BLOCK WHERE CURRENT @VA08341 02142350
* SCAN STARTED 02142400
SCANFLAG DC X'0' FLAGS FOR SCAN PROCESS @VA08341 02142450
PASSTWO EQU X'80' SCAN IS NOW ON 2ND FULL PASS @VA08341 02142500
* THROUGH THE BLOCKS OF FRAMES 02142550
VEQRUNLK EQU X'40' V=R AREA HAS BEEN UNLOCKED BY THE@VA08341 02142600
* OPERATOR AND IS AVAILABLE TO THE 02142650
* SCAN PROCESS 02142700
EJECT 02143000
LTORG 02144000
SPACE 2 02145000
PAGESIZE EQU 15 *** SIZE OF PAGING IOBLOK (USED BY DMKPAGIO) *** 02146000
SPACE 1 02147000
* EQUATES FOR TEMPR0 - USED FOR PAGE SELECTION CONTROL @V407594 02148000
UNLKVM EQU X'80' MUST UNLOCK VMBLOK (CORVM) @V407594 02149000
NOSTEAL EQU X'40' CANNOT STEAL PAGE, BUT DO RRB @V407594 02150000
RRBSHR EQU X'20' PROC'G SHARED PAGE (AP PHASE 1) @V407594 02151000
SPACE 1 02152000
* EQUATES FOR TEMPR0+1 - USED DURING PAGE SELECTION @V407594 02153000
OPPRSTRT EQU X'80' MUST RESTART OTHER PROCESSOR @V407594 02154000
* CONDITION CODE SETTING FOR SAVEWRK1+1 @V407511 02154100
CC0 EQU X'00' CONDITION CODE ZERO - NORMAL @V407511 02154200
EJECT 02155000
COPY VMBLOK 02156000
COPY MICBLOK @V386198 02157000
COPY CORE 02158000
PSA 02159000
COPY SAVE 02160000
COPY RBLOKS 02161000
COPY ALLOC 02162000
COPY EQU 02163000
COPY DEVTYPES 02164000
COPY SHRTABLE @V408246 02165000
END 02166000