BLD TITLE 'DMKBLD (CP) VM/370 - RELEASE 6' 00001000 ISEQ 73,80 VALIDATE SEQUENCING OF SYSIN 00002000 *. 00003000 * MODULE NAME - 00004000 * 00005000 * DMKBLD 00006000 * 00007000 * CONTENTS - 00008000 * 00009000 * DMKBLDRT - BUILD REAL SEGMENT, PAGE, AND SWAP TABLES 00010000 * DMKBLDRL - RELEASE REAL SEGMENT, PAGE, AND SWAP TABLES 00011000 * DMKBLDVM - BUILD A NEW VMBLOK 00012000 * DMKBLDEC - BUILD AND INITIALIZE AN ECBLOK 00013000 *. 00014000 EJECT 00015000 COPY OPTIONS 00016000 COPY LOCAL 00017000 SPACE 2 00018000 DMKBLD CSECT 00019000 SPACE 00020000 USING PSA,R0 00021000 USING VMBLOK,R11 00022000 USING SAVEAREA,R13 00023000 SPACE 00024000 EXTRN DMKSCNRD 00025000 EXTRN DMKCVTBH 00026000 EXTRN DMKCVTAB @V408246 00026500 EXTRN DMKSCHCP,DMKTMRCK @V2B4320 00027000 EXTRN DMKRIORN LIST OF 3705 DEVICES IN DMKRIO @V200820 00028000 AIF (NOT &VIRREAL).VIRT0 00029000 EXTRN DMKSLC,DMKQCNWT 00030000 EXTRN DMKERMSG 00031000 .VIRT0 ANOP 00032000 EJECT 00033000 *. 00034000 * SUBROUTINE NAME - 00035000 * 00036000 * DMKBLDRT - BUILD REAL SEGMENT, PAGE, AND SWAP TABLES 00037000 * 00038000 * FUNCTION - 00039000 * 00040000 * TO CREATE AND INITIALIZE SEGMENT, PAGE, AND SWAP TABLES, 00041000 * AS A FUNCTION OF VIRTUAL CORE SIZE, AS PART OF THE 00042000 * PROCESS OF CREATING A USER'S VIRTUAL MACHINE. 00043000 * 00044000 * ATTRIBUTES - 00045000 * 00046000 * REENTRANT, PAGEABLE, CALLED VIA SVC 00047000 * 00048000 * ENTRY POINT - 00049000 * 00050000 * DMKBLDRT 00051000 * 00052000 * ENTRY CONDITIONS - 00053000 * 00054000 * GPR 1 = BEGINING AND ENDING ADDRESS TO BUILD TABLES. 00055000 * BYTES 0-1 = BEGINING ADDRESS 00056000 * FIRST 4 BITS = 0,NEXT 8 BITS = SEGMENT, NEXT 4 = PAGE 00057000 * BYTES 2-3 = ENDING ADDRESS 00058000 * FIRST 4 BITS = 0,NEXT 8 BITS = SEGMENT, NEXT 4 = PAGE 00059000 * 00060000 * PARMS ARE PASSED IN R2+3: 00061000 * 00062000 * PAGTONLY = BUILD ONE PAGE/SWAP TABLE & RETURN IN R1 00062100 * NEWPAGES = BUILD A NEW PAGE/SWAP TABLE 00063000 * NEWSEGS = BUILD SET OF NEW SEGMENT TABLES 00064000 * KEEPSEGS = RETAIN THE INFORMATION IN THE OLD SEGMENT TABLE 00065000 * OLDVMSEG = VMSEG POINTER IN VMBLOK IS VALID 00066000 * 00067000 * 00068000 * GPR 11 = ADDRESS OF USER'S VMBLOK 00069000 * GPR 12 = ADDRESS OF DMKBLDRT 00070000 * GPR 13 = ADDRESS OF STANDARD SAVE AREA 00071000 * 00072000 * EXIT CONDITIONS - 00073000 * 00074000 * SEGMENT, PAGE, AND SWAP TABLES HAVE BEEN CREATED AND FILLED IN 00075000 * 00076000 * CALLS TO OTHER ROUTINES - 00077000 * 00078000 * DMKFREE - TO OBTAIN FREE STORAGE FOR TABLES TO BE CREATED 00079000 * DMKERMSG - TO OUTPUT ERROR MESSAGES 00080000 * DMKBLDRL - TO RELEASE THE OLD SEGMENT TABLE 00081000 * 00082000 * EXTERNAL REFERENCES - 00083000 * 00084000 * AVMREAL - POINTER TO VMBLOK OF VIRT=REAL USER 00085000 * DMKSLC - ADDRESS OF UPPER BOUNDARY OF VIRT=REAL AREA 00086000 * 00087000 * TABLES / WORK AREAS - 00088000 * 00089000 * SEGMENT TABLE 00090000 * PAGE TABLE 00091000 * SWAP TABLE 00092000 EJECT 00093000 * REGISTER USAGE - 00094000 * 00095000 * GPR 6 = ADDRESS OF SEGMENT TABLE 00096000 * GPR 7 = ADDRESS OF PAGE TABLE 00097000 * GPR 8 = ADDRESS OF SWAP TABLE 00098000 * GPR 11 = ADDRESS OF USER'S VMBLOK 00099000 * GPR 12 = BASE REGISTER 00100000 * GPR 13 = ADDRESS OF STANDARD SAVE AREA 00101000 * 00102000 * GPRS 0-5, 9-10, AND 14-15 ARE WORK REGISTERS. 00103000 * 00104000 * NOTES - 00105000 * 00106000 * OPERATION - 00107000 * A) IF PAGE-SWAP SKIP SPECIFIED, GO TO STEP C 00108000 * B) ADJUST R5 WITH NEW TOTAL NUMBER OF PAGES TO BUILD 00109000 * PAGE AND SWAP TABLES FOR 00110000 * C) IF SKIP SEGTABLE PROCESS SPECIFIED, GO TO 1.7 00111000 * D) IF THERE IS AN OLD VMSEG POINTER, TEST IF NUMBER OF 00112000 * ENTRIES IS THE SAME AS DESIRED IN THE NEW SEGTABLE. 00113000 * IF NOT THE SAME, OR IF NO OLD VMSEG, GO TO STEP 1 00114000 * E) IF OLD SEGTABLE ENTRIES ARE TO BE SAVED, GO TO STEP 1.7 00115000 * F) CALL BLDRL TO RELEASE ALL PAG-SWAP TABLES, BUT NOT 00116000 * OLD SEGTABLE, AND GO TO STEP 1.7 00117000 * 00118000 * 00119000 * 1. DMKFREE IS CALLED FOR 15 DOUBLE WORDS OF FREE STORAGE FOR 00120000 * THE SEGMENT TABLE. THE ADDRESS OBTAINED FROM DMKFREE IS 00121000 * ROUNDED (AS NEEDED) TO ALIGN THE SEGMENT TABLE ON A 64-BYTE 00122000 * 1.10 IF DATA IN OLD SEGTABLE IS NOT TO BE SAVED, GO TO 1.14 00123000 * 1.11 MOVE DATA FROM OLD SEGTABLE TO NEW 00124000 * 1.12 IF NEW SEGTABLE > OLD, GO TO STEP 1.15 00125000 * 1.13 SET R1,R2 FOR FRETS OF OLD PAG-SWP TABLES NOT MOVED 00126000 * AND FRET OLD SEGTABLE. GO TO STEP 1.2 00127000 * 1.14 SET R1,R2 FOR FRET OF ALL PAGE,SWAP,SEG TABLES. GO TO 1.2 00128000 * 1.15 SET R1,R2 FOR FRET OF OLD SEGTABLE ONLY 00129000 * 00130000 * 1.2 CALL BLDRL TO DO FRETS 00131000 * 00132000 * 1.3 STORE NEW VMSEG, VMSEGDSP 00133000 * 00134000 * 00135000 * 1.60 IF OLD SEGTABLE ENTRIES NOT SAVED, GO TO 1.62 00136000 * 1.61 COMPUTE START OF INVALID STE'S 00137000 * 1.62 INVALIDATE STE'S 00138000 * 00139000 * 1.70 IF VIRT=REAL GO TO STEP 2 00140000 * 1.71 IF SKIP PAG-SWP BUILD SPECIFIED, RETURN TO CALLER 00141000 * 1.72 ADJUST R6 FOR START OF SEGMENTS TO BUILD 00142000 * PAGE AND SWAP TABLES FOR 00143000 * 00144000 * 1.5 IF VM ASSIST IS AVAILABLE, ADDRESS OF SEGMENT TABLE 00145000 * IS PUT INTO MICBLOK. 00146000 * 00147000 * 2. THEN, DEPENDING UPON THE CORE SIZE, THE APPROPRIATE SIZE 00148000 * OF PAGE TABLE AND SWAP TABLE FOR A SEGMENT ARE COMPUTED AND 00149000 * OBTAINED FROM FREE STORAGE, AND THEN INITIALIZED TO THEIR 00150000 * DEFAULT VALUES. 00151000 * 00152000 * 2.1 IF PAGETONLY IS SPECIFIED, RETURN TO CALLER. 00152100 * 3. STEP 2 IS THEN REPEATED, AS NECESSARY, UNTIL SUFFICIENT 00153000 * PAGE TABLES AND SWAP TABLES HAVE BEEN OBTAINED AND SET UP 00154000 * TO HANDLE THE VIRTUAL MACHINE SIZE SPECIFIED. 00155000 * 00156000 * 4. BEFORE RETURNING TO THE CALLER; THE VMPSTAT FIELD IS 00157000 * CHECKED FOR VIRT=REAL OPTION. IF THIS USER DOES NOT HAVE 00158000 * VIRT=REAL PRIVILEGE, EXIT TO THE CALLER. OTHERWISE 00159000 * DETERMINE IF THE VIRT=REAL AREA CAN BE GIVEN TO THIS USER, 00160000 * 00161000 * A. CALCULATE THE SIZE OF VIRT=REAL AREA; A(DMKSLC-4096), 00162000 * IS THE SIZE IN BYTES OF THE AREA. 00163000 * 00164000 * B. VIRTUAL MACHINE SIZE MUST BE LESS THAN VIRT=REAL SIZE 00165000 * 00166000 * C. THE POINTER IN PSA WORD MUST BE ZERO (0) 00167000 * INDICATING THE VIRT=REAL AREA IS FREE AND NOT IN USE 00168000 * 00169000 * IF THE ABOVE CONDITIONS ARE MET, THE PAGE AND SEGMENT 00170000 * TABLE ENTRIES ARE CHANGED TO REFLECT THAT THE PAGES ARE IN 00171000 * REAL STORAGE. THE AVMREAL WORD IN PSA IS ALTERED TO POINT 00172000 * TO THIS USER'S VMBLOK. EXIT IS NOW MADE TO THE CALLER. 00173000 * 00174000 * 00175000 * 00176000 * RESPONSES - 00177000 * 00178000 * STORAGE IS VIRTUAL=REAL 00179000 * 00180000 * 00181000 * ERROR MESSAGES - 00182000 * 00183000 * DMKBLD200E VIRT=REAL AREA NOT AVAILABLE; IN USE BY 00184000 * 00185000 * 00186000 * DMKBLD201E VIRT=REAL AREA NOT AVAILABLE; DAMAGED PAGES 00187000 * 00188000 * DMKBLD202E VIRT=REAL AREA NOT AVAILABLE; INSUFFICIENT STORAGE 00189000 * 00190000 *. 00191000 EJECT 00192000 DC CL8'DMKBLD' MODULE IDENTIFIER. 00193000 SPACE 00194000 DMKBLDRT RELOC BUILD REAL SEGMENT, PAGE, AND SWAP TABLES 00195000 LR R5,R1 SAVE THE CORE SIZE 00196000 N R5,F4095 CLEAR OUT FIRST ADDRESS @V304635 00197000 LA R5,1(,R5) INCREASE IT BY 1 FULL PAGE. @V304635 00198000 LR R0,R5 SAVE TOTAL NUMBER OF PAGES @V304635 00199000 TM SAVER2+3,NEWPAGES NEW PAGE TABLES REQUESTED @V304635 00200000 BZ BLDRT01 NO, THEN NO NEED TO ADJ R5 @V304635 00201000 SRL R1,16 ADDRESS OF FIRST SEG. TO BUILD. @V304635 00202000 SR R5,R1 GET NEW TOTAL NUMBER OF PAGES @V304635 00203000 * TO BUILD PAG-SWP TABLES FOR 00204000 BLDRT01 EQU * @V304635 00205000 TM SAVER2+3,PAGTONLY JUST WANT TABLE? @V408246 00205100 BO SEGSKIP YES, SKIP SEGMENT TABLE @V408246 00205300 * PROCESSING 00205500 SR R1,R1 CLEAR R1 00206000 SRDL R0,8 SHIFT TO OBTAIN NUMBER OF SEGMENT TABLES 00207000 LTR R1,R1 DID IT COME OUT EVEN ? 00208000 BZ BLDR01 YES, THIS TIME. 00209000 AL R0,F1 ADD 1 TO R0 IF NOT. 00210000 BLDR01 LR R3,R0 REMEMBER NUMBER OF SEGMENT TABLES IN R3 00211000 SR R4,R4 ZIP REG @V304635 00212000 TM SAVER2+3,OLDVMSEG IS THERE AN OLD SEGTABLE @V304635 00213000 BZ NOSEG01 NO, THEN LEAVE R4=0 @V304635 00214000 IC R4,VMSEG SET R4=NUMBER SEGTABLES IN @V304635 00215000 LA R4,1(,R4) OLD VMSEG(ORIGIN 1) @V304635 00216000 NOSEG01 EQU * @VA06171 00216600 CR R4,R3 IS OLD HIGHER THAN NEW @VA06171 00217200 BL BLDRT02 NO WE NEED FREE STORAGE @VA06171 00217800 * FOR THE NEW SEGTABLE 00219000 TM SAVER2+3,KEEPSEGS KEEP OLD SEG. TABLE DATA ? @V304635 00220000 BO SEGSKIP YES, THE OLD SEGTABLE WILL DO @V304635 00221000 SR R1,R1 CLEAR @V408246 00222100 IC R1,VMSEG SEGMENT COUNT/16 -1 @V408246 00222300 LA R1,1(,R1) SEGMENT COUNT/16 @V408246 00222500 SLL R1,4+4 SEGMENT COUNT * 16 @V408246 00222700 BCTR R1,0 -1 @V408246 00222900 CALL DMKBLDRL,PARM=DELPAGES RELEASE PAGE/SWAP TABLES @V304635 00224000 B SEGSKIP FINISHED WITH SEGTABLE PROCESSING@V304635 00225000 EJECT 00226000 BLDRT02 EQU * HERE TO GET FREE STORAGE FOR @V304635 00227000 CLI SAVER2+3,KEEPSEGS+OLDVMSEG COMPRESS SEGTABLE? @V408246 00228100 BE COMPPAGE YES, GET STORAGE FOR NEW SEG @V408246 00228200 CLI SAVER2+3,NEWPAGES+KEEPSEGS+OLDVMSEG+DELPAGES @V408246 00228300 BE COMPPAGE COMPRESS SEGMENT TABLE @V408246 00228400 CR R4,R3 WILL NEW PAGES FIT INTO OLD? @V408246 00228500 BNL SEGSKIP YES, LEAVE OLD AS IS @V408246 00228600 COMPPAGE DS 0H BUILD NEW TABLES @V408246 00228700 SLL R0,3 8 DBL-WORDS NEEDED FOR EACH 64-BYTE SEG. 00240000 AL R0,F7 PLUS 7 TO ENSURE 64-BYTE ALIGNMENT 00241000 CALL DMKFREE GET SPACE FOR REAL SEGMENT TABLES 00242000 LA R6,63(,R1) ROUND UP TO NEXT 64-BYTE BOUNDARY 00243000 N R6,=A(X'FFFFC0') (IN R6) 00244000 ST R1,SAVEWRK1 SAVE REAL BEGINING OF NEW @V304635 00245000 TM SAVER2+3,OLDVMSEG OLD TABLES? @V408246 00246010 BZ NOSOLD NOPE, BYPASS QUIESE @V408246 00246030 BLDRQ DS 0H MAKE SURE OLD TABLE IS QUITE @V408246 00246050 L R8,VMSEG START OF OLD SEG TABLE @V408246 00246070 LA R8,0(,R8) @V408246 00246090 LR R9,R4 LENGTH OF OLD / 64 @V408246 00246110 SLL R9,6 LENGTH OF OLD TABLE @V408246 00246130 LA R9,0(R9,R8) END OF OLD TABLE @V408246 00246150 SR R1,R1 VIRTUAL ADDRESS OF SEGMENT @V408246 00246170 USING SEGTABLE,R8 @V408246 00246190 SEGQCHK DS 0H @V408246 00246210 TM SEGPAGE+3,SEGENQ+SEGINV SEGMENT AVAILABLE? @V408246 00246230 BNO SEGCHKL YES, CHECK NEXT @V408246 00246250 ICM R0,B'0110',SEGPAGE+1 (ONLY IF POINTER = 0) @V408246 00246270 BNZ SEGCHKL NOT ZERO @V408246 00246290 TRANS 2,1,OPT=(DEFER) WAIT FOR AWHILE @V408246 00246310 B BLDRQ START ALL OVER AGAIN @V408246 00246330 SEGCHKL DS 0H @V408246 00246350 A R1,=A(X'10000') NEXT VIRTUAL SEGMENT ADDRESS @V408246 00246370 LA R8,4(,R8) NEXT STE ADDRESS @V408246 00246390 CR R8,R9 LAST ENTRY PROCESSESED? @V408246 00246410 BL SEGQCHK NO @VA08670 00246430 DROP R8 @V408246 00246450 NOSOLD DS 0H @V408246 00246470 TM SAVER2+3,KEEPSEGS KEEP OLD SEG. TABLE DATA ? @V304635 00247000 BZ NOMOVE NO, THEN SKIP THE MVCL @V304635 00248000 LR R7,R3 GET NUM SEGTABLES IN NEW VMSEG @V304635 00249000 SLL R7,6 TIMES 64 BYTES PER TABLE @V304635 00250000 LR R9,R4 GET NUM SEGTABLES IN OLD VMSEG @V304635 00251000 SLL R9,6 TIMES 64 @V304635 00252000 L R8,VMSEG GET OLD VMSEG ORIGIN @V304635 00253000 LA R8,0(,R8) WITHOUT LENGTH @V304635 00254000 LR R2,R6 SAVE STARTING ADDRESS OF VMSEG @V304635 00255000 MVCL R6,R8 MOVE OLD SEGTABLE DATA TO NEW @V304635 00256000 LR R6,R2 RESTORE STARTING ADDRESS OF VMSEG@V304635 00257000 EJECT 00257100 NOMOVE TM SAVER2+3,OLDVMSEG IS THERE AN OLD SEGTABLE. @V304635 00258000 BZ SKIPFRET NO, THEN DON'T FRET ABOUT IT @V304635 00259000 CALBLDRL CALL DMKBLDRL,PARM=DELSEGS FRET OLD SEGMENT TABLE @V304635 00260000 EJECT 00260100 SKIPFRET ST R6,VMSEG STORE NEW SEGTABLE POINTER @V304635 00261000 LR R15,R3 GET NUMBER OF SEGMENT TABLES LESS 1 00262000 BCTR R15,0 ... 00263000 STC R15,VMSEG AND STORE IN LEFTMOST BYTE OF VMSEG. 00264000 LR R15,R6 GET SEGTABLE POINTER @V304635 00265000 S R15,SAVEWRK1 SUB REAL BEG OF SEGTABLE @V304635 00266000 STH R15,VMSEGDSP SAVE IN VMBLOK @V304635 00267000 L R15,VMMICRO GET ADDRESS OF MICBLOK @V201537 00268000 LA R15,0(R15) CLEAR ANY FLAG BITS @V201537 00269000 LTR R15,R15 IS THERE A MICBLOK? @V201537 00270000 BE NOMIC1 BRANCH IF NOT @V201537 00271000 USING MICBLOK,R15 @V201537 00272000 MVC MICRSEG,VMSEG SAVE SEG TABLE PTR FOR MICRO ASST@V201537 00273000 DROP R15 @V201537 00274000 NOMIC1 EQU * @V201537 00275000 TM SAVER2+3,KEEPSEGS IF WE DIDN'T SAVE OLD SEG @V304635 00276000 BZ ALLNG TABLE ENTRIES, THEN ALL OF NEW @V304635 00277000 * SEGTABLE ENTRIES ARE INVALID 00278000 SR R3,R4 SUB NUM OLD SEGTABLES FROM NEW @V304635 00279000 BNP SEGSKIP IF NEG, THEN THERE ARE NO @V304635 00280000 * INVALID STE, SINCE WE DECREASED 00281000 * THE SEGTABLE AND SAVED DATA 00282000 SLL R4,6 GET DSP FROM TOP OF SEGTABLE TO @V304635 00283000 * START INVALIDATING 00284000 AR R6,R4 BY MUL NUM SEGTABLES BY 64. AND @V304635 00285000 * ADD TO SEGTABLE ORIGIN IN R6 00286000 ALLNG LA R15,1 INVALID STE INDICATOR @V304635 00287000 BLDRSEG ST R15,0(R6) STORE INVALID STE @V304635 00288000 MVC 4(60,R6),0(R6) DO ALL SEGTABLE @V304635 00289000 LA R6,64(,R6) POINT TO NXT SEGTABLE @V304635 00290000 BCT R3,BLDRSEG DO NXT SEGTABLE(IF ANY) @V304635 00291000 EJECT 00292000 SEGSKIP EQU * FINISHED WITH SEGTABLE PROCESSING@V304635 00293000 TM SAVER2+3,NEWPAGES REQUESTING PAGE TABLES ? @VM03017 00294000 BZ RETBLDRT IF NOT - RETURN TO CALLER @VM03017 00295000 SLR R3,R3 CLEAR @VM03017 00296000 L R6,VMSEG GET SEGTABLE ORIGIN @VM03017 00297000 LH R3,SAVER1 GET SEG TO BEG BUILD @V304635 00298000 SRL R3,4 DROP THE PAGE NUMBER @V304635 00299000 SLL R3,2 GET DSP INTO VMSEG TO START @V304635 00300000 DOPAGSWP LA R6,0(R3,R6) POINT TO 1ST STE TO BUILD FOR @V304635 00301000 L R3,=XL4'00010000' TO ADD 1 TO PAGE NUMBER IN SWPTABLE 00302000 LA R10,8 TO ADD 8 TO A REGISTER LATER 00304000 TM SAVER2+3,PAGTONLY RETURN IN R2 REQUESTED? @V408246 00305100 BZ BLDRPAGE NO, THEN CONTINUE @V408246 00305200 LA R6,SAVEWRK9 YES, POINT TO DUMMY STE @V408246 00305300 LA R4,16 LOAD R4 WITH CONSTANT 16 @V408246 00305400 CR R5,R4 INSURE BUILD IS FOR 1 SEG @V408246 00305500 BNH ISINVAL ELSE QUIT @V408246 00305600 ABEND 3 @V408246 00305700 USING SEGTABLE,R6 00306000 * INITIALIZE PAGE & SWAP TABLES FOR ONE SEGMENT OF 16 PAGES (OR LESS) 00307000 BLDRPAGE LA R4,16 LOAD THE CONSTANT 16 00308000 ICM R15,B'0011',SEGPAGE+1 IS THERE A PAGTABLE PTR @V408246 00309100 BNZ NOTINVAL YES THERE IS ONE @V408246 00309200 TM SEGPAGE+3,SEGINV IF NOT, MAKE SURE IT'S @VA08431 00309305 BO ISINVAL NOT ON DASD BUT INVALID @VA08431 00309405 CLI SAVER2+3,OLDVMSEG+KEEPSEGS+NEWPAGES+NEWSEGS ?? @V408246 00309500 BNE BLD4 NO, DIE @V408246 00309600 TM SEGPAGE+3,SEGENQ IS SEGMENT ENQUEUED? @V408246 00309700 BZ SKIPBLD NO, BYPASS @V408246 00309800 ABEND 4 @V408246 00309900 NOTINVAL DS 0H @V408246 00310000 CLI SAVER2+3,OLDVMSEG+KEEPSEGS+NEWPAGES+NEWSEGS @V304635 00311000 BE SKIPBLD ONLY BUILD THOSE INVALID STE @V304635 00312000 TM SAVER2+3,OLDVMSEG+KEEPSEGS+NEWPAGES BUILD ALL ? @V304635 00313000 BNO BLDTHEM YES @V304635 00314000 LH R1,SAVER1+2 GET ENDING ADDRESS TO BUILD FOR @V304635 00315000 SLL R1,12 ADD TO IT THE DISPLACEMENT @V304635 00316000 CL R1,VMSTOR ADDRESS < VM STORAGE SIZE @V304635 00317000 BH BLDTHEM NO - BUILD PAGE TABLES @V304635 00318000 CLR R5,R4 IS THERE 16 PAGES IN SEGMENT @V304635 00319000 BL FORCE16 NO - FORCE IT TO 16 @V304635 00320000 CLI SEGPLEN,X'F0' ARE THERE PRESENTLY 16 PAGES IN @V304635 00321000 * SEG 00322000 BE SKIPBLD YES - THEN NO NEED TO BUILD @V304635 00323000 * ANYTHING 00324000 FORCE16 LA R5,16 BUILD 16 PAGE TABLE ENTRIES @V304635 00325000 BLDTHEM L R2,VMSEG GET SEGTABLE ORIGIN @V304635 00326000 LA R2,0(,R2) STRIP LENGTH @V304635 00327000 LR R1,R6 GET CURRENT STE ADDRESS @V304635 00328000 SR R1,R2 DSP INTO SEGTABLE @V304635 00329000 SRL R1,2 DIVIDED BY 4=SEGMENT NUMBER @V304635 00330000 LR R2,R1 SAVE SEG NUM IN LOW BYTE R2 @V304635 00331000 SLL R1,20 MOVE BEG SEG NUM TO FRET. @V304635 00332000 SLL R2,4 ENDING SEGMENT NUMBER @V304635 00333000 OR R1,R2 FORM BEGINING/ENDING ADDRESSES @V304635 00334000 CALL DMKBLDRL,PARM=DELPAGES RELEASE OLD PAGE TABLES @V304635 00335000 * THEN BUILD NEW DUMMY TABLE 00336000 ISINVAL EQU * @V304635 00337000 CR R5,R4 AT LEAST 16 PAGES ? 00338000 BNL BLDRP16 BRANCH IF YES 00339000 LR R4,R5 NUMBER OF PAGES LEFT INTO R4 IF < 16 00340000 BLDRP16 BCTR R4,0 SUBTRACT 1 00341000 LA R0,PAGBMP LOAD SIZE OF PAGE AND SWPTABLES @V407511 00342100 SRL R0,3 OBTAIN NUMBER OF DOUBLEWORDS @V407511 00342200 * PAGTABLE+SWAPTABLE 00342600 CALL DMKFREE PAGE AND SWAP TABLE @V408246 00343100 LR R7,R1 PAGETABLE HEADER @V408246 00343600 USING PAGTABLE,R7 @V408246 00344100 STCK PAGSTMP TIME-STAMP PAGE TABLE @V408246 00344600 BC 8+4,*+10 IGNORE ANY TIMER ERROR HERE @V408246 00345100 XC PAGSTMP,PAGSTMP ZERO IN CASE OF ERROR @V408246 00345600 XC PAGACT(12),PAGACT CLEAR HEADER @V408246 00346100 MVC PAGCORE,F8+2 INVALIDATE 1ST ENTRY @V408246 00346600 MVC PAGCORE+2(15*2),PAGCORE INVALIDATE REST OF THE @V408246 00347100 * ENTRIES 00347600 LA R2,PAGCORE LOAD ADR OF PTE @V408246 00348100 ST R2,SEGPAGE STORE IN SEGTABLE @V408246 00348600 LR R15,R4 GET NUMBER OF PAGES @V408246 00349100 SLL R15,4 SHIFT FOR HARDWARE @V408246 00349600 STC R15,SEGPLEN AND SAVE IN SEGTABLE @V408246 00350100 OI SEGPAGE+3,SEGINV @V408246 00350600 * SIGNALS NO PAGES IN CORE 00351100 LA R8,PAGCORE+16*2 START OF SWAP TABLE HEADER @V408246 00351600 USING SWPTABLE,R8 00356000 ST R11,SWPVM STORE VMBLOK ADDRESS IN SWPTABLE HEADER 00357000 ST R2,SWPPAG STORE PAGTABLE ADDRESS IN SWPTABLE HEADER 00358000 LA R2,SWPFLAG LOAD 1ST SWPTABLE ENTRY ADDRESS 00359000 ST R2,PAGSWP STORE SWPTABLE ADDRESS IN PAGTABLE HEADER 00360000 LA R4,1(,R4) RELOAD NUMBER OF PAGES 00361000 LA R1,SWPRECMP LOAD RECOMPUTE FLAG 00363000 SLL R1,24 SHIFT TO HIGH ORDER BYTE 00364000 SR R2,R2 LOAD ZERO FOR 2ND WORD OF SWPTABLE ENTRY 00365000 BLDRINIT DS 0H @V408246 00366100 STM R1,R2,SWPFLAG INITIALIZE SWPTABLE - ZEROES PAGE 00367000 AR R1,R3 ADD 00010000 TO PAGE NUMBER IN SWPTABLE 00368000 AR R8,R10 R8+8 - POINT TO NEXT SWPTABLE ENTRY 00370000 BCT R4,BLDRINIT BRANCH IF MORE ENTRIES 00371000 LA R4,1 INCREMENT @V408246 00371100 L R14,PREFIXA GET PREFIX VALUE TO ADDRESS PSA @V4M0132 00371300 * AT ABSOLUTE 0 @V4M0132 00371400 AL R4,TTSEGCNT(R14) ADD INCR TO TOTAL SEGMENT CNT @V4M0132 00371500 ST R4,TTSEGCNT(R14) STORE UPDATED SEGMENT COUNT @V4M0132 00371600 SKIPBLD LA R6,SEGPAGE+4 POINT TO NXT STE @V304635 00372000 S R5,F16 SUBTRACT 16 FROM NUMBER OF PAGES 00373000 BP BLDRPAGE ITERATE THE PROCESS IF SOME PAGES LEFT. 00374000 AIF (NOT &VIRREAL).VIRT1 00375000 TM SAVER2+3,VRALOC ATTEMPT TO GIVE OUT V=R AREA @VM03144 00376000 BZ RETBLDRT NOPE, DONE; BR. @VM03144 00377000 TM VMPSTAT,VMREAL IS USER A VIRT=REAL USER 00378000 BO VIRTREAL IF YES, TRY TO GIVE HIM THE AREA 00379000 .VIRT1 ANOP 00380000 RETBLDRT DS 0H @V408246 00380100 TM SAVER2+3,PAGTONLY RETURN IN R2 REQUESTED? @V408246 00380300 BZ RETBLD2 NOPE @V408246 00380500 MVC SAVER2,SAVEWRK9 PASS BACK 'STE' IN REGISTER @V408246 00380700 RETBLD2 DS 0H @V408246 00380900 EXIT @V408246 00381100 * 00382000 DROP R6,R7,R8 00383000 DOWNWEGO DS 0H @V408246 00383100 GOTO DMKCVTAB @V408246 00383200 EJECT 00383300 AIF (NOT &VIRREAL).VIRT2 00384000 VIRTREAL ICM R1,15,AVMREAL LOAD V=R VMBLOK POINTER @VM08649 00385000 BM BLD201 BRANCH, IF AREA HAS DAMAGED PAGES 00386000 BP BLD200 BRANCH, IF AREA ALREADY IN USE 00387000 L R1,=A(DMKSLC-4096) GET SIZE OF VIRT=REAL AREA 00388000 LTR R1,R1 CHECK IF V=R SYSGENED @VM08649 00389000 BM BLD202 BRANCH, IF AREA NOT DEFINED FROM SYSGEN 00390000 L R0,VMSIZE LOAD SIZE OF THIS VIRTUAL MACHINE 00391000 CR R0,R1 IS VIRTUAL MACHINE > THEN VIRT=REAL AREA 00392000 BH BLD202 IF YES, USER CAN'T HAVE IT 00393000 SPACE 00394000 USING SEGTABLE,R7 00395000 USING PAGCORE,R8 @V408246 00396100 USING SWPTABLE,R9 00397000 USING CORTABLE,R10 00398000 SPACE 00399000 LA R4,16 PAGE NUMBERING TO START WITH 1 00400000 LR R6,R0 SIZE OF THIS VIRTUAL MACHINE @VA01062 00401000 SRL R6,12 TOTAL NO. OF PAGES REQUIRED @VA01062 00402000 S R6,F1 LESS ONE FOR HIPAGE @VA01377 00403000 L R7,VMSEG GET SEGMENT TABLE ADDRESS 00404000 NI SEGPAGE+3,255-SEGINV CLEAR INVALID BIT @V408246 00404100 L R8,SEGPAGE LOAD ADDRESS OF PAGE TABLE 00405000 LA R8,0(,R8) CLEAR OUT NUMBER OF PAGES 00406000 LA R9,PAGCORE+16*2+8 ADDRESS OF 1ST SWAPTABLE @V408246 00407100 SR R5,R5 CLEAR REG 00410000 IC R5,SEGPLEN NUMBER OF PAGES IN THIS SEGMENT 00411000 SRL R5,4 SHIFT OUT UNWANTED BITS 00412000 L R10,ACORETBL LOAD ADDRESS OF CORE TABLE 00413000 LA R8,PAGCORE+2 SKIP ENTRY FOR PAGE 0 @V408246 00414100 LA R9,SWPTABLE+8 SKIP SWAP ENTRY FOR PAGE 0 00415000 LA R10,CORTABLE+16 SKIP CORE ENTRY FOR PAGE 0 00416000 NXTENTRY DS 0H @V408246 00417100 ST R11,CORFPNT STORE USER'S VMBLOK ADDRESS. @V408246 00417600 L R0,F1 LOCK COUNT OF 1 TO 00419000 ST R0,CORLCNT STORE IN CORE TABLE ENTRY 00420000 ST R9,CORSWPNT STORE ADDRESS OF SWAP TABLE ENTRY 00421000 ST R8,CORPGPNT STORE ADDRESS OF PAGE TABLE ENTRY 00422000 MVI CORFLAG,CORCFLCK+CORIOLCK LOCK PAGE IN CORE @V408246 00423100 STH R4,PAGCORE SOTRE REAL PAGE NUMBER @V408246 00423200 BCTR R6,R0 KEEP COUNT OF PAGES ALLOCATED @VA01062 00425000 LTR R6,R6 GOT 'EM ALL? @VA01062 00426000 BZ HIPAGE ALL EXCEPT PAGE 0 @VA01062 00427000 LA R8,PAGCORE+2 GET NEXT PAGE TABLE ENTRY ADDRESS@V408246 00428100 LA R9,SWPTABLE+8 GET NEXT SWAP TABLE ENTRY 00429000 LA R10,CORTABLE+16 GET NEXT CORE TABLE ENTRY 00430000 LA R4,16(,R4) INCREMENT THE PAGE NUMBER 00431000 BCT R5,NXTENTRY PROCESS ALL CORE TABLE ENTRIES FOR SEG. 00432000 LA R7,SEGTABLE+4 POINT TO NEXT SEG. TABLE ADDR. 00433000 NI SEGPAGE+3,255-SEGINV CLEAR INVALID BIT @V408246 00433100 IC R5,SEGPLEN PICK UP NUM, PAGES IN THIS SEGMENT 00434000 SRL R5,4 CLEAR OUT UNWANTED BITS 00435000 A R5,F1 CORRECTION FOR BCT LOOP 00436000 L R8,SEGPAGE LOAD ADDRESS OF THIS PAGE TABLE 00437000 LA R8,0(,R8) CLEAR OUT PAGE NUMBER 00438000 LR R9,R8 BACK UP THE ADDRESS OF THE PAGE 00439000 S R9,F4 TABLE SO THAT THE SWAP TABLE 00440000 L R9,0(,R9) ADDRESS CAN BE FOUND 00441000 B NXTENTRY CONTINUE PROCESSING ALL ENTRIES 00442000 SPACE 00443000 HIPAGE L R1,=A(DMKSLC-4096) FIND PAGE 0 ADDRESS 00444000 SRL R1,8 INDEX FOR PROPER CORE TABLE ENTRY 00445000 L R7,VMSEG LOAD ADDRESS OF SEG. FOR PAGE 0 00446000 L R8,SEGPAGE LOAD ADDRESS OF PAGE 0 00447000 LA R8,0(,R8) CLEAR HIGH BYTE 00448000 LR R9,R8 GET ADDRESS OF SWAP ENTRY FOR 00449000 S R9,F4 PAGE 0. 00450000 L R9,0(,R9) 00451000 L R10,ACORETBL LOAD ADDRESS OF CORE TABLE AND 00452000 LA R10,CORTABLE(R1) LOCATE TOP OF VIRT=REAL - 4096 00453000 STH R1,PAGCORE STORE ADDRESS OF REAL PAGE 0 @V408246 00454100 ST R11,CORFPNT STORE USER'S VMBLOK ADDRESS. @V408246 00454200 L R0,F1 CONSTANT FOR LOCK COUNT 00457000 ST R0,CORLCNT SET LOCK COUNT 00458000 ST R9,CORSWPNT STORE SWAP ADDRESS OF PAGE 0 00459000 ST R8,CORPGPNT STORE PAGE ADDRESS OF PAGE 0 00460000 MVI CORFLAG,CORCFLCK+CORIOLCK LOCK PAGE IN CORE @V408246 00461100 ST R11,AVMREAL THIS USER NOW OWNS THE VIRT=REAL AREA 00462000 L R15,PREFIXB GET PREFIX ADDR OF OTHER PROC @V4M0132 00462100 ST R11,AVMREAL(R15) MAINTAIN AVMREAL IN BOTH PSA'S @V4M0132 00462200 SLR R0,R0 ZERO R-0 00463000 STH R0,VMPAGES CLEAR NUMBER PAGES RESIDENT (PAGEABLE) 00464000 STH R0,VMWSPROJ ZERO PROJECTED WORKING SET SIZE 00465000 OI VMQLEVEL,VMAEX GIVE THIS USER ASSURED EXECUTION @VA08851 00465500 MSG 'STORAGE IS VIRTUAL=REAL' 00467000 CALL DMKQCNWT,PARM=NORET 00468000 EXIT 00469000 BLD200 LA R2,200 MESSAGE DMKBLD200 00470000 DROP R11 00471000 CL R1,F1 IS V=R AREA UNLOCKED? @V4M0167 00471100 BNE *+8 NO, O.K. @V4M0167 00471200 L R1,ASYSVM YES, SHOW SYSTEM AS V=R OWNER @V4M0167 00471300 USING VMBLOK,R1 00472000 MVC SAVEWRK2(8),VMUSER USERID 00473000 DROP R1 00474000 USING VMBLOK,R11 00475000 LA R1,SAVEWRK2 ADDRESS OF THE DATA 00476000 LA R0,8 LENGTH OF DATA 00477000 B VARDATA SEND THE MESSAGE 00478000 SPACE 00479000 BLD201 LA R2,201 MESSAGE DMKBLD201 00480000 B CALLERM SEND THE MESSAGE 00481000 SPACE 00482000 BLD202 LA R2,202 MESSAGE DMKBLD202 00483000 CALLERM SLR R0,R0 00484000 SLR R1,R1 00485000 VARDATA ICM R0,B'1110',=C'BLD' MODULE IDENTIFIER 00486000 CALL DMKERMSG WRITE THE MESSAGE 00487000 * 00488000 * RETURN WILL BE DIRECTLY TO THE CALLER FROM DMKERM 00489000 * 00490000 SPACE 00491000 SPACE 00492000 BLDMSG CALL DMKQCNWT,PARM=NORET 00493000 EXIT 00494000 SPACE 00495000 DROP R7,R8,R9,R10 00496000 .VIRT2 ANOP 00497000 EJECT 00498000 *. 00499000 * SUBROUTINE NAME - 00500000 * 00501000 * DMKBLDRL - RELEASE REAL SEGMENT, PAGE, AND SWAP TABLES 00502000 * 00503000 * FUNCTION - 00504000 * 00505000 * TO RELEASE SEGMENT, PAGE, AND SWAP TABLES 00506000 * WHEN THEY ARE NO LONGER NEEDED. 00507000 * 00508000 * ATTRIBUTES - 00509000 * 00510000 * REENTRANT, PAGEABLE, CALLED VIA SVC 00511000 * 00512000 * ENTRY POINT - 00513000 * 00514000 * DMKBLDRL 00515000 * 00516000 * ENTRY CONDITIONS - 00517000 * GPR 2 - PARM REGISTER 00518000 * DELSEGS = RELEASE SEGMENT TABLE 00519000 * DELPAGES = RELEASE PAGE/SWAP TABLES 00520000 * 00521000 * PAGTONLY RELEASE TABLE POINTED TO BE R1 00521100 * 00522000 * GPR 1 = BEGINING AND ENDING ADDRESS TO RELEASE 00523000 * BYTE 0-1 = FIRST ADDRESS TO RELEASE 00524000 * FIRST 4 BITS = 0, NEXT 8 BITS = SEGMENT, NEXT 4 = PAGE 00525000 * BYTE 2-3 = LAST ADDRESS TO RELEASE 00526000 * FIRST 4 BITS = 0, NEXT 8 BITS = SEGMENT, NEXT 4 = PAGE 00527000 * 00528000 * GPR 11 = ADDRESS OF USER'S VMBLOK 00529000 * GPR 12 = ADDRESS OF DMKBLDRL 00530000 * GPR 13 = ADDRESS OF STANDARD SAVE AREA 00531000 * 00532000 * EXIT CONDITIONS - 00533000 * 00534000 * SWAP, PAGE, AND SEGMENT TABLES HAVE 00535000 * BEEN RETURNED TO FREE STORAGE. 00536000 * 00537000 * CALLS TO OTHER ROUTINES - 00538000 * 00539000 * DMKFRET - TO RETURN TABLES TO FREE STORAGE 00540000 * 00541000 * EXTERNAL REFERENCES - 00542000 * 00543000 * NONE 00544000 * 00545000 * TABLES / WORK AREAS - 00546000 * 00547000 * SWAP TABLE 00548000 * PAGE TABLE 00549000 * SEGMENT TABLE 00550000 EJECT 00551000 * REGISTER USAGE - 00552000 * 00553000 * GPR 6 = ADDRESS OF SEGMENT TABLE 00554000 * GPR 7 = ADDRESS OF PAGE TABLE 00555000 * GPR 11 = ADDRESS OF USER'S VMBLOK 00556000 * GPR 12 = BASE REGISTER 00557000 * GPR 13 = ADDRESS OF STANDARD SAVE AREA 00558000 * 00559000 * GPRS 0-2, 4-5, 14-15 ARE WORK REGISTERS. 00560000 * 00561000 * GPRS 3, 8-10 ARE NOT USED. 00562000 * 00563000 * NOTES - 00564000 * 00565000 * NONE 00566000 * 00567000 * OPERATION - 00568000 * A) IF JUST A SEGTABLE FRET, GO TO 1.5 00569000 * B) IF ALL PAG-SWP TABLES TO BE FRETTED, 00570000 * GO TO STEP D 00571000 * C) USE R1 TO ADJ FOR PARTIAL FRET, GO TO STEP 1 00572000 * D) SET FOR FRET OF ALL PAGE-SWP TABLES. GO TO STEP 1 00573000 * 00574000 * 00575000 * 1. EACH ENTRY IN THE 16 WORD SEGMENT TABLE IS EXAMINED TO SEE 00576000 * IF IT HAS A VALID ENTRY. IF YES, THE SIZES OF THE 00577000 * SWAP TABLE AND PAGE TABLE ARE COMPUTED, AND THEY ARE 00578000 * RETURNED TO FREE STORAGE VIA DMKFRET. THIS 00579000 * PROCESS IF REPEATED FOR ALL OF THE POSSIBLE 16 00580000 * SEGMENT TABLE ENTRIES. 00581000 * 1.5 IF A FRET OF PAG-SWP TABLES ONLY, RETURN TO CALLER 00582000 * 00583000 * 00584000 * 2. FINALLY, THE BEGINNING ADDRESS OF THE SEGMENT TABLE 00585000 * IS COMPUTED FROM ITS ALIGNED ADDRESS AND DISPLACEMENT, 00586000 * AND IT ALSO IS RETURNED TO FREE STORAGE VIA DMKFRET. 00587000 * 00588000 * 3. DETERMINE IF USER IS USING THE VIRT=REAL AREA; 00589000 * IF HE IS ZERO (AVMREAL) FIELD IN PSA BEFORE RETURNING 00590000 * TO THE CALLER. 00591000 * 00592000 *. 00593000 EJECT 00594000 DMKBLDRL RELOC RELEASE REAL SEGMENT, PAGE, & SWAP TABLES 00595000 CLI SAVER2+3,DELSEGS SEGS TABLE RELEASE ONLY ? @V304635 00596000 BE JUSSEG YES, THEN DO IT @V304635 00597000 L R6,VMSEG LOAD SEGMENT TABLE ADDRESS @V304635 00598000 LA R6,0(,R6) STRIP LENGTH @V408246 00598100 USING SEGTABLE,R6 00599000 LA R4,1 LOAD UNUSED SEGMENT INDICATOR 00601000 TM SAVER2+3,PAGTONLY PAGE TABLE FROM REG? @V408246 00602100 BNO CHKSEG NO @V408246 00602300 LA R6,SAVER1 R6 POINTS TO THE STE (R1) @V408246 00602500 LA R5,1 DO ONLY ONE TABLE @V408246 00602700 B BLDRL01 ALL SET UP @V408246 00602900 * 00603100 CHKSEG DS 0H CALCULATE STARTING STE AND @V408246 00603300 * COUNT OF STES 00603500 L R8,SAVER1 GET ADDRESSES OF SEGMENTS @V304635 00604000 LR R9,R8 SAVE STARTING/ENDING ADDRESSES @V408246 00605100 SRL R8,20 GET STARTING STE NUMBER @V408246 00605300 LR R15,R9 SAVE THE REMAINING ADDRESS @V304635 00606000 N R15,=A(X'F0000') PAGE NUMBER WITHING SEG. = 0? @V408246 00607100 BZ COMPSEG YES - SEGMENT ADDRESS IS OK @VM03135 00608000 LA R8,1(,R8) SKIP PARTIAL SEGMENT @VM03135 00609000 COMPSEG DS 0H @V408246 00610100 SRL R9,4 ENDING SEG. NUMBER TO LOW R9 @V408246 00610600 N R9,F255 CLEAR ALL BUT SEGMENT NUMBER @V408246 00611100 SR R9,R8 R9=NUM STE-1 TO FRET @V304635 00612000 BM RETBLDRL RETURN IF PARTIAL SEGMENT @V304635 00613000 LA R5,1(,R9) R5 = NUMBER OF SEGMENTS TO FRET @VM03171 00614000 SLL R8,2 DSP OF 1ST STE TO FRET @V304635 00615000 LA R6,0(R8,R6) R6 POINTS TO 1ST STE TO FRET @V304635 00616000 BLDRL01 EQU * @V304635 00617000 RELRLOOP L R7,SEGPAGE LOAD PAGE TABLE ADDRESS 00618000 N R7,=A(X'FFFFFE') CLEAR POSSIBLE INVALID BIT @V408246 00619100 BZ RELRNEXT NOTHING THERE BUT INVALID BIT @V408246 00619200 ICM R15,B'0011',SEGPAGE+1 IS THERE A PAGETABLE PTR @V408246 00619300 BNZ DOFRET YES, THEN FRET IT @V408246 00619400 TM SEGPAGE+3,SEGINV IF NOT, MAKE SURE IT'S @VA08431 00619505 BO RELRNEXT NOT ON DASD BUT INVALID @VA08431 00619605 * ATTEMPTING TO RELEASE A SEGMENT THAT HAS ITS TABLE 00619700 * MIGRATED TO BACKING STORE 00619800 ABEND 5 @V408246 00619900 EJECT 00620000 * 00620100 * PROCESS INDIVIDUAL STES, RETURN PAGE/SWAP TABLE TO 00620200 * AVAILABLE FREE STORAGE 00620300 * 00620400 DOFRET DS 0H HERE TO FRET TABLES @V408246 00620500 SR R2,R2 CLEAR REG @V408246 00620600 IC R2,SEGPLEN PAGE TABLE LENTH (NO PAGES -1) @V304635 00621000 SRL R2,4 NUM. PAGES TO LOW ORDER REG. @V304635 00622000 CL R11,AVMREAL V=R? @VA04952 00622400 BE FRETPGTB YES - GO FRET PAGE TABLE @VA04952 00622800 LA R14,1(,R2) NUM. PAGES+1 FOR BCT LOOP @V304635 00623000 USING PAGCORE,R7 @V408246 00624100 CHKPAGE DS 0H @V408246 00624600 LH R0,PAGCORE PTE @V408246 00625100 N R0,=A(X'FFF0') CHECK FOR REAL PAGE ALLOCATED @V408246 00625600 BZ NXTPAGE NO @V408246 00626100 ABEND 2 ERROR - PAGE NOT RELEASED @V408246 00626600 NXTPAGE DS 0H @V408246 00627100 LA R7,PAGCORE+2 NEXT PAGE TABLE ENTRY @V408246 00627600 BCT R14,CHKPAGE PROCESS AL PAGE TABLE ENTIRES @V408246 00628100 FRETPGTB DS 0H @V408246 00628600 L R15,PREFIXA GET PREFIX VALUE TO ADDRESS PSA @V4M0132 00629100 * AT ABSOLUTE 0 @V4M0132 00629200 L R0,TTSEGCNT(R15) GET CURRENT TOTAL SEGMENT CNT @V4M0132 00629300 BCTR R0,0 DECREMENT THIS SYSTEM COUNT @V4M0132 00629400 ST R0,TTSEGCNT(R15) REPLACE UPDATED SEGMENT COUNT @V4M0132 00629500 L R1,SEGPAGE GET PAGETABLE POINTER @V408246 00630600 ST R4,SEGPAGE CLEAR STE ENTRY @V408246 00631100 OI VMESTAT,VMINVPAG REMEMBER TO RESET TLB @V408246 00631600 OI APSTAT2,CPPTLBR SET PTLB REQUIRED FOR THIS PROCR@V407594 00631700 L R15,PREFIXB AND OTHER PROCESSOR @V407594 00631720 OI APSTAT2-PSA(R15),CPPTLBR (IF THERE IS ANOTHER) @V407594 00631740 N R1,=A(X'FFFFFE') CLEAR POSSIBLE INVALID BIT @V408246 00632100 S R1,F16 BACK-UP TO START OF CORE FOR @V408246 00632600 * TABLES 00633100 LA R0,PAGBMP LOAD SIZE OF PAGE AND SWPTABLES @V407511 00633600 SRL R0,3 OBTAIN NUMBER OF DOUBLEWORDS @V407511 00634100 CALL DMKFRET @V408246 00634600 ST R4,0(,R6) STORE INVALID STE @V408246 00635100 RELRNEXT LA R6,SEGPAGE+4 POINT TO NEXT SEGMENT TABLE ENTRY 00643000 BCT R5,RELRLOOP LOOP IF MORE SEGMENT TABLE ENTRIES 00644000 EJECT 00644100 * 00644200 * FINISHED RESETING INDIVIDUAL STES, NOT PROCESS SEGMENT 00644300 * TABLE 00644400 * 00644500 JUSSEG TM SAVER2+3,DELSEGS REQUEST ALSO TO FRET SEGS. @V304635 00645000 BZ RETBLDRL NO, THEN RETURN TO CALLER @V304635 00646000 L R1,VMSEG GET ADDRESS OF SEGMENT TABLE BLOCK 00647000 LR R0,R1 REMEMBER IN R0 00648000 LA R1,0(,R1) STRIP OFF HIGH-ORDER BYTE, 00649000 SH R1,VMSEGDSP GET THE REAL BEGINNING OF IT 00650000 SRL R0,24 OBTAIN NO. OF SEGMENT TABLES (LESS 1) 00651000 SLL R0,3 TIMES 8, FOR 8 DBL- WORDS EACH 00652000 AL R0,F15 PLUS 8, PLUS 7 FOR ALIGNMENT 00653000 CALL DMKFRET NOW RETURN IT TO FREE STORAGE 00654000 SR R15,R15 CLEAR 00655000 ST R15,VMSEG THE SLOT IN THE VMBLOK. 00656000 AIF (NOT &VIRREAL).VIRT3 00657000 C R11,AVMREAL DOES USER OCCUPY VIRT=REAL AREA 00658000 BNE RETBLDRL NO - EXIT TO CALLER @V4M0237 00659100 NI VMQLEVEL,X'FF'-VMAEX NOLONGER FAVORED. @VM08649 00660000 ST R15,AVMREAL YES, REMOVE THE AREA FROM HIM 00661000 L R14,PREFIXB GET PREFIX ADDR OF OTHER PROC @V4M0132 00661100 ST R15,AVMREAL(R14) MAINTAIN AVMREAL IN BOTH PSA'S @V4M0132 00661200 .VIRT3 ANOP 00662000 RETBLDRL EXIT @V304635 00663000 * 00664000 DROP R6,R7 00665000 EJECT 00666000 *. 00667000 * SUBROUTINE NAME - 00668000 * 00669000 * DMKBLDVM - BUILD A NEW VMBLOK 00670000 * 00671000 * FUNCTION - 00672000 * 00673000 * TO CREATE AND PARTIALLY INITIALIZE A VMBLOK FOR A 00674000 * USER IDENTIFIED BY HIS TERMINAL REAL DEVICE BLOCK. 00675000 * 00676000 * ATTRIBUTES - 00677000 * 00678000 * REENTRANT, PAGEABLE, CALLED VIA SVC 00679000 * 00680000 * ENTRY POINT - 00681000 * 00682000 * DMKBLDVM 00683000 * 00684000 * ENTRY CONDITIONS - 00685000 * 00686000 * GPR 8 = ADDRESS OF TERMINAL REAL DEVICE BLOCK 00687000 * GPR 9 = ADDRESS OF NICBLOK ( IF DEVTYPE = TYP3705 ) 00688000 * GPR 12 = ADDRESS OF DMKBLDVM 00689000 * GPR 13 = ADDRESS OF STANDARD SAVE AREA 00690000 * 00691000 * EXIT CONDITIONS - 00692000 * 00693000 * VMBLOK HAS BEEN CREATED, CLEARED, PARTIALLY FILLED IN, 00694000 * AND CHAINED TO THE OTHER VMBLOKS. 00695000 * 00696000 * GPR 11 = ADDRESS OF VMBLOK JUST CREATED. 00697000 * 00698000 * CALLS TO OTHER ROUTINES - 00699000 * 00700000 * DMKFREE - TO OBTAIN FREE STORAGE FOR VMBLOK TO BE CREATED 00701000 * DMKSCNRD - TO CONVERT TERMINAL DEVICE ADDRESS TO CCU FORM 00702000 * DMKCVTBH - CONVERT TERMINAL REAL DEVICE ADDRESS TO HEX 00703000 * 00704000 * EXTERNAL REFERENCES - 00705000 * 00706000 * DMKRIORN 00707000 * 00708000 * TABLES / WORK AREAS - 00709000 * 00710000 * NONE 00711000 EJECT 00712000 * REGISTER USAGE - 00713000 * 00714000 * GPR 8 = ADDRESS OF RDEVBLOK FOR TERMINAL 00715000 * GPR 11 = ADDRESS OF NEWLY CREATED VMBLOK 00716000 * GPR 12 = BASE REGISTER 00717000 * GPR 13 = ADDRESS OF STANDARD SAVE AREA 00718000 * 00719000 * GPRS 0-1 AND 14-15 ARE WORK REGISTERS 00720000 * 00721000 * GPRS 2-7 AND 9-10 ARE NOT USED. 00722000 * 00723000 * NOTES - 00724000 * 00725000 * NONE 00726000 * 00727000 * OPERATION - 00728000 * 00729000 * 1. FREE STORAGE IS OBTAINED VIA DMKFREE FOR A VMBLOK, 00730000 * WHICH IS THEN CLEARED. THE VM CHANNEL TABLE IS SET 00731000 * TO ALL FFFF'S, INDICATING THAT NO VIRTUAL CHANNELS 00732000 * HAVE BEEN BUILT YET. THE ADDRESS OF THE TERMINAL 00733000 * RDEVBLOK (IN R8 AT ENTRY) IS STORED IN VMTERM. 00734000 * 00735000 * 2. A USERID CONSISTING OF 'LOGON' + THE THREE-BYTE HEX 00736000 * TERMINAL REAL DEVICE ADDRESS IS STORED AS THE USERID 00737000 * (FOR EXAMPLE 'LOGON063' OR 'LOGON8B5'). 00738000 * 00739000 * 3. THE USER IS SIGNALED IN CONSOLE-FUNCTION-WAIT, AND 00740000 * THE USER IS PUT INTO DISABLED WAIT STATE. ALSO, THE 00741000 * TERMINAL REAL DEVICE BLOCK IS SET TO THE DEFAULT VALUES FOR 00742000 * THE BLIP, LINE-END, CHARACTER-DELETE, AND LINE-DELETE SYMBOLS. 00743000 * 00744000 * 4. FINALLY, THE NEWLY CREATED VMBLOK IS PATCHED INTO 00745000 * THE CHAIN OF ACTIVE VMBLOKS, AND RETURN IS MADE TO THE 00746000 * CALLER. 00747000 *. 00748000 EJECT 00749000 DMKBLDVM RELOC BUILD NEW VMBLOK 00750000 CLC SAVER8,=C'AUTO' AUTOLOG CMD. @V305535 00751000 BE AUTOLOG1 YES - THEN NO RDEVBLOK @V305535 00752000 LTR R8,R8 R8 MUST BE GREATER THAN 0 00753000 BNP BLD1 CATCH CALLER BUG IF BAD GR8 @V200820 00754000 AUTOLOG1 EQU * HERE FOR AUTOLOG USER @V305535 00755000 LA R0,VMBSIZE GET STORAGE FOR A VMBLOK 00756000 CALL DMKFREE ... 00757000 CHARGE STOP STOP CHARGING CALLER FOR LOGON @V407594 00758000 CL R11,ASYSVM IS THIS SYSTEM @V407594 00758010 BE NOUNLK YES, BYPASS UNLOCK @V407594 00758020 CL R11,LASTUSER LAST USER @V407594 00758030 BE NOUNLK YES, BYPASS UNLOCK @V407594 00758040 LR R14,R1 SAVE NEW VMBLOK @V407594 00758050 LR R1,R11 VMBLOK TO UNLOCK @V407594 00758060 LOCK RELEASE,TYPE=VMBLOK,SAVE UNLOCK R11 VMBLOK @V407594 00758070 LR R1,R14 RESTORE NEW VMBLOK TO R1 @V407594 00758080 NOUNLK DS 0H @V407594 00758090 LR R11,R1 REFERENCE VIA R11 AS USUAL 00759000 USING VMBLOK,R11 ... 00760000 MVC VMBLOK(8),ZEROES CLEAR ENTIRE VMBLOK 00761000 MVC VMBLOK+8(256),VMBLOK ... 00762000 MVC VMBLOK+264(VMBSIZE*8-264),VMBLOK ... 00763000 MVC VMCHTBL(8),FFS FFFF-FILL THE VM CHANNEL TABLE 00764000 MVC VMCHTBL+8(24),VMCHTBL (INDICATING NO CHANNELS THERE YET) 00765000 MVC VMVTERM(2),FFS INDICATE NO VIRTUAL CONSOLE @V200820 00766000 OI VMRSTAT,VMLOGON+VMCFWAIT 'NOT YET LOGGED ON' & IN CFWAIT 00767000 OI VMMLEVEL,VMMSGON+VMWNGON+VMMCODE+VMMTEXT+VMMLINED 00768100 MVI VMPSW+1,WAIT PUT USER INTO DISABLED WAIT STATE. 00769000 MVC VMTMOUTQ,=X'7FFFFFFFFFFFF000' INITIALIZE VMTMOUTQ 00770000 MVC VMTTIME(16),VMTMOUTQ VMTTIME AND VMTMINQ 00771000 TM APSTAT1,APUOPER RUNNING AS AP @V407594 00772010 BZ NOAP NO @V407594 00772020 MVC VMCPTIME,HALFTIME INITIALIZE TIMER @VA09438 00772021 MVC VMAPTIME,HALFTIME INITIALIZE TIMER @VA09438 00772023 MVC VMMORETM,=XL2'320A' DEFAULT 50/10 SECONDS HRC101DK 00772026 LR R1,R11 VMBLOK PTR @V407594 00772030 LOCK OBTAIN,TYPE=VMBLOK,OPTION=NOUPDT,SPIN=NO @V407594 00772040 * IT IS NOT NECESSARY TO UNLOCK R11 AT ENTRY (ASYSVM) @V407594 00772050 LA R0,CPEXSIZE SIZE OF DEFERRED EXECUTION BLOCK @V407594 00772060 CALL DMKFREE OBTAIN DEFERRED EXECUTION BLOCK @V407594 00772070 ST R1,VMDFTPNT & SAVE ITS ADDRESS IN VMBLOK @V407594 00772080 NOAP DS 0H @V407594 00772090 CHARGE START START CHARGING NEW USER @V4M0203 00772092 STCK VMTODINQ CURRENT TOD @V408246 00772100 BC 3,DOWNWEGO ABEND CVT001 @V408246 00772300 LM R2,R3,VMTODINQ CONVERT TO PRIORITY UNITS @V408246 00772500 SL R2,STARTIME . . @V408246 00772700 SLDL R2,5 . . @V408246 00772900 ST R2,VMEPRIOR INITIAL PRIORITY @V408246 00773100 LA R2,5 INITIAL PROJECTED WORKING SET @V408246 00773300 * VALUE 00773500 ST R2,VMWSPROJ . . @V408246 00773700 L R15,ASYSLC REFERENCE SYSLOCS INFORMATION 00775000 USING SYSLOCS,R15 ... 00776000 MVC VMTLEND(4),DMKSYSLE DEFAULT EDITING CHARACTERS @V200820 00777000 MVI VMGRFTAB,X'6A' SET LOGICAL TAB CHAR TO DEFAULT @V60A6B6 00777100 CLC SAVER8,=C'AUTO' IS THIS AN AUTOLOG USER? @VA04867 00777200 BE AUTOLOG2 IF SO, BRANCH @VA04867 00777400 ST R8,VMTERM SET REAL TERM RDEVBLOK PTR @V200820 00778000 USING RDEVBLOK,R8 @V200820 00779000 TM RDEVTMCD,RDEVUSC8 IS IT AN ASCII TYPE? @VA08845 00779100 BZ NOTASC NO, BRANCH @VA08845 00779200 MVI VMTLDEL,X'AD' DEFAULT LINEDEL TO LEFT BRACKET @VA08845 00779300 NOTASC EQU * @VA08845 00779400 LA R1,CLASSPEC*256+TYP3705 IS THIS A 3705 RDEVBLOK@V200820 00780000 CH R1,RDEVTYPC ... @V200820 00781000 BE BLDNIC YES, BYPASS TEST FOR TERMINAL @VM01043 00782000 * CLASS 00783000 CLI RDEVTYPC,CLASTERM IS THIS A TERMINAL CLASS @VM01043 00784000 BNE BLDRTERM NO,CONTINUE @VM01043 00785000 TM RDEVTYPE,TYPBSC IS THIS A BISYNC LINE @VM01043 00786000 BZ BLDRTERM NO, CONTINUE @VM01043 00787000 BLDNIC EQU * @VM01043 00788000 USING NICBLOK,R9 GR9 STILL O.K. FROM ENTRY @V200820 00789000 ST R11,NICUSER SET VMBLOK POINTER IN NICBLOK @V200820 00790000 L R1,DMKSYSLL SYSTEM DEFAULT LINE LENGTHS @V200820 00793000 STCM R1,B'0100',NICLLEN SET LINE LEN FOR 2741-TYPE D@V200820 00794000 TM NICTYPE,NICTERM+NICCIBM 2741-TYPE TERMINAL ? @V200820 00795000 BO BYPAS YES...O.K. AS IS @VA04807 00796000 TM NICTYPE,NICGRAF REMOTE GRAPHICS? @VA04807 00796165 BNO BYPAS1 NO...TTY TYPE @VA04807 00796330 STCM R1,B'0001',NICLLEN USE GRAPHICS LINE LENGTH @VA04807 00796495 B BYPAS @VA04807 00796660 BYPAS1 STCM R1,B'0010',NICLLEN USE TTY LINE LENGTH @VA04807 00796825 BYPAS EQU * @VM01043 00798000 CALL DMKSCNRD GET RADDR FROM RDEVBLOK @V200820 00799000 L R3,=A(DMKRIORN) LIST OF 3705 RDEVBLOK PTRS @V200820 00800000 L R2,0(0,R3) COUNT OF 3705'S IN THE LIST @V200820 00801000 BLDNFND EQU * FIND DEVICE CODE FOR THIS 3705 @V200820 00802000 CH R1,6(0,R3) COMPARE AGAINST DEVICE ADDRESS @V200820 00803000 BE BLDNFRN O.K. -- FOUND IT @V200820 00804000 LA R3,4(0,R3) NEXT LIST ENTRY @V200820 00805000 BCT R2,BLDNFND SEARCH THE LIST @V200820 00806000 B BLD1 OOPS -- LOGIN ON A NON-EXISTENT DEVICE@V200820 00807000 BLDNFRN EQU * ADD DEVICE CODE TO VMTRMID @V200820 00808000 SL R3,=A(DMKRIORN) GET DISP TO LIST ENTRY @V200820 00809000 SRL R3,2(0) ...IN NUMBER OF ENTRIES @V200820 00810000 MVC VMUSER(4),=C'LOGN' USERID IS "LOGN103C", ETC. @V200820 00811000 LR R1,R3 GET DEVICE CODE VALUE @VM01043 00812000 CALL DMKCVTBH CONVERT TO HEXADECIMAL @VM01043 00813000 STC R1,VMUSER+4 SAVE DEVICE CODE VALUE @VM01043 00814000 SLL R3,12(0) MOVE DEVICE CODE TO HIGH-ORDER @V200820 00815000 LH R2,NICNAME BASIC RESOURCE ID FROM NICBLOK @V200820 00816000 OR R3,R2 ADD DEVICE CODE FOR MESSAGES @V200820 00817000 STH R3,VMTRMID ...SAVE IN THE VMBLOK @V200820 00818000 LR R1,R2 RESOURCE ID TO GR1 FOR USERID @V200820 00819000 B BLDNAME GO FINISH USERID CONSTRUCTION @V200820 00820000 DROP R9 @V200820 00821000 BLDRTERM EQU * RDEVBLOK IS A SINGLE TERMINAL @V200820 00822000 SR R1,R1 CLEAR FOR IC 00823000 IC R1,RDEVTYPE GET TERMINAL DEVICE TYPE 00824000 SRL R1,4 ISOLATE ADAPTER TYPE 00825000 IC R1,DMKSYSLL(R1) GET DEFAULT LINE LENGTH 00826000 STC R1,RDEVLLEN STORE IT 00827000 TM RDEVTYPC,CLASGRAF GRAPHICS CONSOLE? @VA04807 00827150 BNO PSUP NO...SET PRINT SUPPRESS @VA04807 00827300 L R1,DMKSYSLL GET DEFAULT LINE LENGTHS @VA04807 00827450 CLI RDEVMDL,X'05' 3270-5? HRC073DK 00827500 BNE *+8 No HRC073DK 00827520 LA R1,132 Y, default size is 132 HRC073DK 00827540 STCM R1,B'0001',RDEVLLEN STORE GRAPHICS LINE LENGTH @VA04807 00827600 PSUP EQU * @VA04807 00827750 OI RDEVFLAG,RDEVPSUP ASSUME TERMINAL HAS PRINT-SUPPRESS 00828000 ST R11,RDEVUSER SET VMBLOK POINTER IN RDEVBLOK @V200820 00829000 TM RDEVADD,RDEVLDEV Is this an LDEV? HRC065DK 00829100 BO LOGOLDEV Yes HRC065DK 00829200 MVC VMUSER(5),=C'LOGON' USERID IS "LOGON03C", ETC. @V200820 00830000 CALL DMKSCNRD GET REAL DEVICE ADDRESS IN BINARY@V200820 00831000 BLDNAME EQU * CONVERT TO HEXADECIMAL FOR USERID@V200820 00832000 CALL DMKCVTBH ... @V200820 00833000 STCM R1,B'0111',VMUSER+5 SETUP LAST PART OF USERID @V200820 00834000 AUTOLOG2 EQU * AUTOLOG ON USER @V305535 00835000 L R1,ASYSVM START WITH SYSTEM VMBLOK, 00836000 L R14,VMPNT-VMBLOK(,R1) POINT TO 1ST USER IN CHAIN 00837000 LTR R14,R14 ANYBODY THERE AT ALL ? 00838000 BZ BLDVM1ST NOPE - PUT IN THE VERY 1ST GUY. 00839000 MVC VMPNT(4),VMPNT-VMBLOK(R14) ... 00840000 ST R11,VMPNT-VMBLOK(,R14) ... 00841000 BLDSTR11 ST R11,SAVER11 STORE R11 FOR RETURNING TO CALLER 00842000 EXIT RETURN TO CALLER. 00843000 EJECT 00844000 BLDVM1ST ST R11,VMPNT LET THE ONE USER POINT TO HIMSELF, AND 00845000 ST R11,VMPNT-VMBLOK(,R1) STORE HIS ADDR AT ANCHOR IN SYSVM 00846000 B BLDSTR11 AND GO RETURN R11 TO OUR CALLER. 00847000 LOGOLDEV EQU * HRC065DK 00847100 LH R1,RDEVADD Get the LDEV address HRC065DK 00847200 N R1,F4095 Keep only the dev num HRC065DK 00847300 CALL DMKCVTBH Make it displayable HRC065DK 00847400 STCM R1,7,VMUSER+5 Put dev addr in userid HRC065DK 00847500 MVC VMUSER(5),=C'LOGNL' Logon name for LDEVs HRC065DK 00847600 B AUTOLOG2 Go log user on HRC065DK 00847700 * 00848000 ABEND 1 ENTRY WITH INVALID RDEVBLOK PTR @V200820 00849000 * 00850000 DROP R8,R15 00851000 EJECT 00852000 *. 00853000 * SUBROUTINE NAME - 00854000 * 00855000 * DMKBLDEC - BUILD AN EXTENDED CONTROL MODE BLOCK 00856000 * 00857000 * FUNCTION - 00858000 * 00859000 * TO ALLOCATE STORAGE FOR A VIRTUAL ECBLOK AND THE TWO 00860000 * TRQBLOK'S REQUIRED FOR A VIRTUAL MACHINE WITH THE 00861000 * ECMODE OPTION, AND TO INITIALIZE THESE BLOCKS. 00862000 * 00863000 * ATTRIBUTES - 00864000 * 00865000 * RE-ENTRANT, PAGEABLE, CALLED VIA SVC 00866000 * 00867000 * ENTRY CONDITIONS - 00868000 * 00869000 * GR13 = ADDRESS OF A STANDARD SAVEAREA 00870000 * GR12 = ADDRESS OF DMKBLDEC 00871000 * GR11 = ADDRESS OF THE USER'S VMBLOK 00872000 * 00873000 * EXIT CONDITIONS - 00874000 * 00875000 * GPRS 0-13 UNCHANGED, VMECEXT POINTS TO THE NEW ECBLOK 00876000 * VMBLOK HAS BEEN MARKED FOR ECMODE OPERATION ALLOWED 00877000 * 00878000 * CALLS TO OTHER ROUTINES - 00879000 * 00880000 * DMKFREE - TO ALLOCATE STORAGE FOR THE BLOCKS 00881000 * 00882000 * EXTERNAL REFERENCES - 00883000 * 00884000 * DMKSCHCP - INTERRUPT RETURN FOR CPU TIMER TRQBLOK 00885000 * DMKTMRCK - INTERRUPT RETURN FOR CLOCK COMPARATOR TRQBLOK 00886000 * 00887000 * TABLES / WORK AREAS - NONE 00888000 * 00889000 * REGISTER USAGE - 00890000 * 00891000 * GR14,15 EXTERNAL LINKAGE REGISTERS 00892000 * GR13 = SAVEAREA ADDRESSABILITY 00893000 * GR12 = MODULE BASE ADDRESSABILITY 00894000 * GR11 = VMBLOK ADDRESSABILITY 00895000 * GR10 = ECBLOK ADDRESSABILITY 00896000 * GR0-9 ARE WORK REGISTERS 00897000 * 00898000 * OPERATION - 00899000 * 00900000 * 1. STORAGE IS ALLOCATED FOR THE ECBLOK ITSELF, AND THE 00901000 * ADDRESS OF THE ECBLOK IS PLACED IN VMECEXT IN THE VMBLOK. 00902000 * 2. STORAGE IS ALLOCATED FOR TWO TRQBLOK'S, ONE FOR THE 00903000 * VIRTUAL CPU TIMER (IRA = DMKSCHCP), AND ONE FOR THE 00904000 * VIRTUAL TOD CLOCK COMPARATOR (IRA = DMKTMRCK). 00905000 * 3. RESET VALUES FOR THE CONTROL REGISTERS ARE MOVED INTO 00906000 * THE ECBLOK FIELDS, AND THE TRQBLOK'S ARE CONNECTED 00907000 * TO THE ECBLOK ANCHORS. 00908000 * 4. THE VMPSTAT FLAGS IN THE VMBLOK ARE UPDATED TO SHOW 00909000 * THAT AN ECBLOK NOW EXISTS. 00910000 *. 00911000 EJECT 00912000 DMKBLDEC RELOC , BUILD AND INITIALIZE AN ECBLOK @V2B4320 00913000 SPACE 00914000 LA R0,EXTSIZE SIZE OF EXTENDED CONTROL BLOCK @V2B4320 00915000 CALL DMKFREE SET ASIDE SOME FREE STORAGE @V2B4320 00916000 LR R10,R1 ADDRESS IT VIA GR10 @V2B4320 00917000 USING ECBLOK,R10 @V2B4320 00918000 XC 0(EXTSIZE*8,R1),0(R1) @V2B4320 00919000 ST R10,VMECEXT CONNECT ECBLOK TO THE VMBLOK @V2B4320 00920000 MVC EXTCR2(8),FFS SET C-REG 2,3 TO X'FFFFFFFF' @V2B4320 00921000 MVI EXTCR0+3,X'E0' RESET VALUES FOR C-REG 0 @V2B4320 00922000 MVI EXTCR14,X'C4' . . .C-REG 14 @V2B4320 00923000 MVI EXTCR15+2,X'02' . . .C-REG 15 @V2B4320 00924000 LA R0,TRQBSIZE GET TWO TRQBLOK'S @V2B4320 00925000 CALL DMKFREE ONE FOR THE VIRTUAL CPU TIMER @V2B4320 00926000 ST R1,EXTCPTRQ HANG IT OFF OF THE ECBLOK @V2B4320 00927000 USING TRQBLOK,R1 @V2B4320 00928000 XC 0(TRQBSIZE*8,R1),0(R1) @V2B4320 00929000 ST R11,TRQBUSER SET VMBLOK POINTER @V2B4320 00930000 L R2,=A(DMKSCHCP) INTERRUPT RETURN ADDRESS @V2B4320 00931000 ST R2,TRQBIRA . . . @V2B4320 00932000 SPACE 00933000 CALL DMKFREE GR0 IS STILL SET FROM BEFORE @V2B4320 00934000 ST R1,EXTCCTRQ ONE FOR THE TOD CLOCK COMPARATOR @V2B4320 00935000 XC 0(TRQBSIZE*8,R1),0(R1) @V2B4320 00936000 ST R11,TRQBUSER SET THE VMBLOK POINTER @V2B4320 00937000 L R2,=A(DMKTMRCK) INTERRUPT RETURN ADDRESS @V2B4320 00938000 ST R2,TRQBIRA . . . @V2B4320 00939000 OI VMPSTAT,VMV370R ECMODE IS NOW ALLOWED @V2B4320 00940000 EXIT , RETURN TO THE CALLER @V2B4320 00941000 DROP R1,R10 @V2B4320 00942000 EJECT 00943000 HALFTIME DC X'3FFFFFFFFFFFF000' HALF OF VMTTIME @V4M0203 00943100 LTORG 00944000 EJECT 00945000 PSA , @V306638 00946000 COPY CORE @V306638 00947000 COPY DEVTYPES @V306638 00948000 COPY EQU @V306638 00949000 COPY MICBLOK @V306638 00950000 COPY NETWORK @V306638 00951000 COPY RBLOKS @V306638 00952000 COPY SAVE @V306638 00953000 SYSLOCS , @V306638 00954000 COPY VMBLOK @V306638 00955000 EJECT 00956000 COPY TIMER @V2B4320 00957000 SPACE 2 00958000 END 00959000