CKS TITLE 'DMKCKS (CP) VM/370 - RELEASE 6' 00001000
DMKCKS CSECT @V304235 00002000
* 00003000
* 00004000
* MODULE NAME - 00005000
* 00006000
* DMKCKS 00007000
* 00008000
* CONTENTS - 00009000
* 00010000
* DMKCKSPL - CHECKPOINT A CHANGE IN SPOOL FILE STATUS 00011000
* DMKCKSWM - RECOVER SPOOL FILE DATA AND ALLOCATION BLOCKS FROM 00012000
* THE CHECKPOINT RECORDS PREVIOUSLY RECORDED 00013000
* DMKCKSIN - INITIALIZE CHECKPOINT CYLINDER TO PRESENT STATUS 00014000
* 00015000
* DATA AREAS DEFINED AS ENTRY POINTS - 00016000
* 00017000
* DMKCKSMP - VIRTUAL ADDRESS IN SYSTEM VM SPACE OF MAP OF 00018000
* CHECKPOINT CYLINDER 00019000
* 00020000
EJECT 00021000
COPY OPTIONS @V304298 00022000
EJECT 00023000
ENTRY DMKCKSMP @V304298 00024000
EXTRN DMKSYSCH,DMKSYSCN,DMKQCNSY @V304235 00025000
EXTRN DMKPTRUL @V304298 00026000
EXTRN DMKLOCKQ,DMKLOCKD @V304298 00027000
EXTRN DMKPGTVR @V304298 00028000
EXTRN DMKPGTTU @V304298 00029000
EXTRN DMKSYSOW,DMKSYSOC @V304298 00030000
EXTRN DMKPGTVG,DMKSCNRU @V304298 00031000
EXTRN DMKRPAGT,DMKRPAPT @V304298 00032000
EXTRN DMKSCNRD @V304298 00033000
EXTRN DMKRSPID @V304298 00034000
EXTRN DMKRSPHQ @V304298 00035000
EXTRN DMKERMSG @V304298 00036000
EXTRN DMKLOCKT,DMKCVTBD @VM03200 00037000
EXTRN DMKQNTBL 3800 IMAGE LIBRARIES @V60B9BA 00037100
SPACE 4 00038000
USING PSA,R0 @V304298 00039000
USING SFBLOK,R7 @V304298 00040000
USING VMBLOK,R11 @V304298 00041000
USING SAVEAREA,R13 @V304298 00042000
EJECT 00043000
* 00044000
* SUBROUTINE NAME - 00045000
* 00046000
* DMKCKSPL 00047000
* 00048000
* FUNCTION - 00049000
* 00050000
* CHECKPOINT ANY ALTERATIONS IN THE SPOOL FILE SETUP SO THAT 00051000
* THE RECOVERY ROUTINE CAN GET THEM IF WARM START FAILS. 00052000
* 00053000
* ATTRIBUTES - 00054000
* 00055000
* SERIALLY REUSABLE, PAGEABLE, CALLED VIA SVC 00056000
* 00057000
* ENTRY POINTS - 00058000
* 00059000
* DMKCKSPL 00060000
* 00061000
* ENTRY CONDITIONS - 00062000
* 00063000
* GPR1 = ADDRESS OF SHQBLOK IF CHGSHQ IS ON 00064000
* GPR2 = PARM REGISTER SIGNIFYING THE OPTIONS DESIRED ON 00065000
* THIS CHECKPOINT CALL. THEY ARE: 00066000
* RDRCHN - THIS IS TO BE A READER SFBLOK 00067000
* PCHCHN - THIS IS TO BE A PUNCH SFBLOK 00068000
* PRTCHN - THIS IS TO BE A PRINT SFBLOK 00069000
* ADDSFB - CREATE A NEW SFBLOK ON THE CHECKPOINT CYL 00070000
* CHGSFB - CHANGE AN EXISTING SFBLOK'S STATUS 00071000
* DELSFB - DELETE AN SFBLOK FROM THE CHECKPOINT CYL 00072000
* OPNSFB - THIS IS AN OPEN CONSOLE FILE 00073000
* ACTSFB - IT IS CURRENTLY BEING PRINTED OR PUNCHED 00074000
* CHGRDV - CHANGE STATUS OF GIVEN RDEVBLOK 00075000
* CHGSHQ - CHANGE STATUS OF GIVEN SHQBLOK 00076000
* GPR7 = ADDRESS OF SFBLOK TO BE CHECKPOINTED 00077000
* GPR8 = ADDR OF RDEVBLOK IF ACTSFB OR CHGRDV IS ON 00078000
* GPR12 = BASE ADDRESS OF DMKCKSPL 00079000
* GPR13 = ADDRESS OF STANDARD SAVEAREA 00080000
* 00081000
* EXIT CONDITIONS - 00082000
* 00083000
* IF EVERYTHING SUCCEEDS, THEN RETURN IS MADE TO THE CALLER 00084000
* WITH CONDITION CODE 0 AND REGISTER 15 EQUAL TO 0. 00085000
* OTHERWISE, CHECKPOINTING IS STOPPED, THE CHECKPOINT 00086000
* CYLINDER INVALIDATED AND RETURN IS MADE TO THE CALLER 00087000
* AS IN THE NO ERROR SITUATION. 00088000
* 00089000
* CALLS TO OTHER ROUTINES - 00090000
* DMKLOCKQ - LOCK THE DMKCKSPL ROUTINE OR WAIT IF 00091000
* ALREADY LOCKED 00092000
* DMKSCNRU - FIND REAL DEVICE BLOCK OF IPL DEVICE 00093000
* DMKPTRAN - GET THE MAP IN CORE 00094000
* DMKPTRUL - UNLOCK THE MAP PAGE 00095000
* DMKLOCKD - UNLOCK THE DMKCKSPL ROUTINE 00096000
* DMKPGTVG - GET VIRTUAL ADDRESS FOR SLOT BUFFER 00097000
* DMKRPAGT - READ INTO CORE A SLOT PAGE 00098000
* DMKRPAPT - WRITE A SLOT PAGE TO DASD 00099000
* DMKPGTVR - RELEASE THE VIRTUAL PAGE FOR THE SLOT BUFFER 00100000
* 00101000
* 00102000
* EXTERNAL REFERENCES - 00103000
* 00104000
* SYSIPLDV - ADDRESS OF SYSTEM IPL DEVICE 00105000
* DMKRSPID - CURRENT SPOOL FILE ID NUMBER 00106000
* DMKRSPHQ - ADDRESS OF SHQBLOK CHAIN 00107000
* 00108000
* TABLES WORKAREAS - 00109000
* 00110000
* NONE 00111000
* 00112000
* REGISTER USAGE - 00113000
* 00114000
* GPR0 = DASD ADDRESS OF PAGE (CCPD FORM) 00115000
* GPR1 = VIRT ADDRESS OF PAGE BUFFER 00116000
* GPR2 = READ ADDRESS OF PAGE BUFFER (ALSO FILE ID) 00117000
* GPR3 = PAGE NUMBER OF SLOT FROM FINDSLOT 00118000
* GPR4 = DISP WITHIN PAGE OF SLOT FROM FINDSLOT 00119000
* GPR5 = POINTER TO MAP ENTRY FOR SLOT FROM FINDSLOT 00120000
* GPR6 = INTERNAL BAL REGISTER 00121000
* GPR7 = ADDRESS OF SFBLOK 00122000
* GPR8 = ADDR OF RDEVBLOK 00123000
* GPR9 = 00124000
* GPR10 = 00125000
* GPR11 = ADDRESS OF VMBLOK 00126000
* GPR12 = DMKCKS MODULE BASE 00127000
* GPR13 = ADDRESS OF STANDARD SAVE AREA 00128000
* GPR14 = BALR RETURN ADDRESS 00129000
* GPR15 = BALR BRANCH ADDRESS 00130000
* 00131000
* OPERATION - 00132000
* 00133000
* 1. IF CHECKPOINTING HAS TERMINATED RETURN TO CALLER. 00134000
* 00135000
* 2. FIND THE CCPD OF THE CHECKPOINT CYLINDERS AND THEN LOCK 00136000
* THE MAP OF THE CYLINDERS IN REAL CORE VIA TRANS. 00137000
* 00138000
* 2A. IF THE CHGSHQ FUNCTION IS SPECIFIED, THEN 00139000
* LOOK FOR SHQBLOK SLOTS (X'AAAA' IN MAP) AND TRY TO 00140000
* FIND THE ONE WITH THE GIVEN USERID. IF FOUND, 00141000
* CHANGE IT TO THE GIVEN ONE OR DELETE IT IF 00142000
* DELSFB IS SET. IF THE GIVEN SHQBLOK IS NOT FOUND, 00143000
* THEN GET AN EMPTY SLOT AND MOVE A NEW SHQBLOK INTO IT. 00144000
* IF THE DELSFB FUNCTION IS SPECIFIED AND THE SLOT 00145000
* IS NOT FOUND, IGNORE THE REQUEST. 00146000
* THEN GO TO STEP 6. 00147000
* 00148000
* 3. IF THE DELETE FUNCTION IS SPECIFIED, THEN FIND THE SLOT 00149000
* FROM THE MAP. IF NOT FOUND, THEN GO TO STEP 6. IF 00150000
* FOUND, PUT X'FFFF' INTO THE MAP ENTRY AND X'FFFFFFFF' 00151000
* INTO THE SLOT ITSELF. THEN WRITE THE SLOT PAGE 00152000
* TO DASD AND GO TO STEP 6. 00153000
* 00154000
* 4. IF THE CHANGE FUNCTION IS SPECIFIED, THEN FIND THE SLOT 00155000
* FROM THE MAP. IF NOT FOUND, THEN ABEND. IF 00156000
* FOUND THEN GET THE SLOT PAGE INTO REAL CORE 00157000
* AND UPDATE THE SFBLOK TO ITS NEW VALUES 00158000
* AND WRITE THE SLOT PAGE TO DASD AND GO TO STEP 6. 00159000
* 00160000
* 5. IF IT IS THE ADD FUNCTION,THEN 00161000
* FIND AN EMPTY SLOT FROM THE MAP, 00162000
* READ THE SLOT PAGE INTO REAL CORE, FILL THE SLOT WITH 00163000
* THE NEW SFBLOK, WRITE THE SLOT PAGE TO DASD AND 00164000
* GO TO STEP 6. 00165000
* 00166000
* 5A. IF IT IS THE CHGRDV FUNCTION, THEN FIND THE ENTRY FOR 00167000
* THAT DEVICE, OR IF THERE IS NONE, CREATE ONE, 00168000
* AND UPDATE THE RDEVSTAT,RDEVFLAG, AND 00169000
* RDEVCLAS FIELDS FOR THAT DEVICE. 00170000
* IF IT IS A 3800 PRINTER, THEN ALSO CHECKPOINT 00170100
* THE CURRENT IMAGE LIBRARY, CURRENT TRANSLATE 00170200
* TABLE TO USE FOR THE SEPARATOR PAGE AND CURRENT 00170300
* FCB TO USE FOR THE SEPARATOR PAGE. 00170400
* THEN GO TO STEP 6. 00171000
* 00172000
* 6. UNLOCK THE MAP PAGE VIA DMKPTRUL. 00173000
* 00174000
* 7. UNLOCK THIS ROUTINE SO OTHERS CAN USE IT 00175000
* 00176000
* 8. SET G15 TO 0 AND COND CODE TO 0 AND RETURN TO CALLER 00177000
* 00178000
* 00179000
EJECT 00180000
DC CL8'DMKCKS' @V304298 00181000
DMKCKSPL RELOC @V304298 00182000
CLI DMKCKSSW,CKPTSTOP ARE WE CHECKPOINTING @V304235 00183000
BE EXIT0 EXIT IF NOT @V304298 00184000
LA R1,CKSLOCK LOCK THE ROUTINE @V304298 00185000
CALL DMKLOCKQ OR WAIT UNTIL UNLOCKED @V304298 00186000
CLI DMKCKSSW,CKPTSTOP ARE WE STILL CHECKPOINTING @V304235 00187000
BE EXITA EXIT IF NOT @V304298 00188000
XC SAVEWRK1,SAVEWRK1 CLEAR WORK AREAS @V304298 00189000
XC SAVEWRK2(32),SAVEWRK2 SAME AS ABOVE @V304298 00190000
ICM R1,B'1111',DMKCKSMP DO WE HAVE A MAP ? @V304298 00191000
BZ CKSABN1 ABEND IF NOT @V304298 00192000
MVC CODSLOT(1),CKPTDVCD GET DEVICE CODE @VM02131 00193000
BAL R6,CKSINITM GET CHECKPOINT MAP ..... @VM02131 00194000
TM PARM1,CHGSHQ/256 IS IT A SHQBLOK CHANGE ? @V304235 00195000
BZ CKSPL1 XFER IF NOT @V304298 00196000
L R3,RADDMAP START AT BEGINNING OF MAP @V304298 00197000
LOOPSHQ LH R2,MAPSHQ CODE FOR SHQBLOK @V304235 00198000
DROP R7 @V304298 00199000
USING SHQBLOK,R7 @V304298 00200000
L R7,SAVER1 POINT TO SHQBLOK @V304298 00201000
BAL R6,FINDSLOT FIND A SHQBLOK @V304298 00202000
BZ SPLSHQ1 XFER IF FOUND @V304298 00203000
TM PARM2,DELSFB WAS IF DELETE ? @V304235 00204000
BO CKSEXIT EXIT IF SO @V304298 00205000
B SPLSHQ3 FIND AN EMPTY SLOT @V304298 00206000
SPLSHQ1 STC R3,PAGSLOT GET PAGE FOR THE SLOT @V304298 00207000
STCM R3,B'1100',CYLSLOT GET CYLINDER FOR SLOT @V304298 00208000
BAL R6,GETSLOT READ IT INTO CORE @V304298 00209000
AL R4,RADDSLOT POINT TO SLOT @V304298 00210000
CLC SHQUSER,SHQUSER-SHQBLOK(R4) DO THEY MATCH? @V304298 00211000
BE SPLSHQ2 XFER IF SO @V304298 00212000
BAL R6,PUTSLOT NEEDED FOR NORMAL SEQUENCE @V304298 00213000
LA R3,2(,R5) START AT NEXT SLOT @V304298 00214000
B LOOPSHQ AND TRY AGAIN @V304298 00215000
SPLSHQ2 TM PARM2,DELSFB IS IT A DELETE FUNCTION ? @V304235 00216000
BO CKSPLA XFER IF SO @V304298 00217000
MVC 4(SHQBSIZE*8-4,R4),SHQBLOK+4 MOVE IN THE NEW ONE@V304298 00218000
BAL R6,PUTSLOT WRITE IT OUT @V304298 00219000
B CKSEXIT AND EXIT @V304298 00220000
SPLSHQ3 LH R2,MAPFREE FIND AN EMPTY SLOT @V304235 00221000
BAL R6,FINDSLOT GO TO IT @V304298 00222000
BNZ MSG400I ERROR - IF CKPT AREA IS FULL @VM03037 00223000
STC R3,PAGSLOT SAVE ITS PAGE LOCATION @V304298 00224000
STCM R3,B'1100',CYLSLOT GET CYLINDER FOR SLOT @V304298 00225000
BAL R6,GETSLOT READ IT INTO CORE @V304298 00226000
AL R4,RADDSLOT POINT TO IT @V304298 00227000
MVC 0(L'SLOTSHQ,R4),SLOTSHQ CODE FOR SHQBLOK @V304235 00228000
MVC 4(SHQBSIZE*8-4,R4),SHQBLOK+4 MOVE IT IN @V304298 00229000
BAL R6,PUTSLOT WRITE IT OUT @V304298 00230000
MVC 0(L'MAPSHQ,R5),MAPSHQ SET UP THE MAP ENTRY @V304235 00231000
B CKSEXIT AND EXIT @V304298 00232000
DROP R7 @V304298 00233000
USING SFBLOK,R7 @V304298 00234000
SPACE 00235000
CKSPL1 DS 0H @V304298 00236000
TM PARM2,DELSFB IS IT THE DELETE FUNCTION ? @V304235 00237000
BZ CKSPL2 XFER IF NOT @V304298 00238000
LH R2,SFBFILID GET SPOOL FILE ID @V304298 00239000
BAL R6,FINDSLOT FIND THE SLOT FOR THIS SFBLOK @V304298 00240000
BNZ CKSEXIT FORGET IT IF NOT FOUND @V304298 00241000
STC R3,PAGSLOT SAVE THE PAGE NUMBER OF SLOT @V304298 00242000
STCM R3,B'1100',CYLSLOT GET CYLINDER FOR SLOT @V304298 00243000
BAL R6,GETSLOT BRING IT INTO CORE @V304298 00244000
AL R4,RADDSLOT POINT TO THE SLOT @V304298 00245000
CLC SFBFILID,SFBFILID-SFBLOK(R4) DO THEY MATCH ? @V304298 00246000
BNE CKSABN2 ABEND IF NOT @V304235 00247000
CKSPLA MVC 0(L'SLOTFREE,R4),SLOTFREE INVALIDATE THE SLOT@V304235 00248000
BAL R6,PUTSLOT WRITE AND RELEASE SLOT PAGE @V304298 00249000
MVC 0(L'MAPFREE,R5),MAPFREE MARK THE MAP AS EMPTY @V304235 00250000
L R15,=A(DMKSYSCN) @V304235 00251000
LH R2,0(R15) GET CURRENT MAP COUNT @V304235 00252000
BCTR R2,0 DECREMENT IT ............. @V304235 00253000
STH R2,0(R15) AND SAVE NEW VALUE @V304235 00254000
TM DMKCKSSW,MSG90ISU 90% MSG ISSUED YET ?? @V304235 00255000
BZ CKSEXIT IF NOT, NO NEED TO CHECK ON IT @V304235 00256000
CH R2,SLOT90R REACHED RESET VALUE YET ?? @V304235 00257000
BH CKSEXIT NO, NOTHING TO DO IN THAT CASE @V304235 00258000
NI DMKCKSSW,255-MSG90ISU ELSE RESET IT @V304235 00259000
B CKSEXIT RETURN TO CALLER @V304298 00260000
SPACE 2 00261000
CKSPL2 TM PARM2,CHGSFB REQUESTING A CHANGE FUNCTION ? @V304235 00262000
BZ CKSPL4 XFER IF NOT @V304298 00263000
LH R2,SFBFILID GET THE SPOOL FILE ID @V304298 00264000
BAL R6,FINDSLOT FIND SLOT FOR THIS SFBLOK @V304298 00265000
BNZ CKSPL4B ASSUME ADD FUNCTION IF NOT FOUND @V304235 00266000
STC R3,PAGSLOT SAVE PAGE NUMBER OF SLOT @V304298 00267000
STCM R3,B'1100',CYLSLOT GET CYLINDER FOR SLOT @V304298 00268000
BAL R6,GETSLOT BRING SLOT INTO CORE @V304298 00269000
AL R4,RADDSLOT POINT TO THE SLOT @V304298 00270000
CLC SFBFILID,SFBFILID-SFBLOK(R4) DO THEY MATCH ? @V304298 00271000
BNE CKSABN2 ABEND IF NOT @V304235 00272000
TM PARM2,RDRCHN+PRTCHN+PCHCHN HAS TYPE CHANGED ? @V304235 00273000
BZ CKSPL2A XFER IF NOT @V304298 00274000
MVC 0(1,R4),PARM2 MOVE IN THE TYPE @V304235 00275000
B CKSPL3 CONTINUE @V304298 00276000
CKSPL2A NI 0(R4),RDRCHN+PRTCHN+PCHCHN ISOLATE THE TYPE @V304298 00277000
OC 0(1,R4),PARM2 SAVE THE FILE STATUS @V304235 00278000
CKSPL3 MVC 4(SFBSIZE*8-4,R4),SFBLOK+4 MOVE IN THE SFBLOK @V304298 00279000
TM 0(R4),ACTSFB IS IT ACTIVE ON A REAL DEVICE ? @V304298 00280000
BZ CKSPL3A XFER IF NOT @V304298 00281000
USING RDEVBLOK,R8 @V304298 00282000
L R8,SAVER8 RESTORE CALLER'S RDEVBLOK @V304298 00283000
CALL DMKSCNRD GET ADDR OF DEVICE (CCU) @V304298 00284000
STH R1,2(,R4) SAVE IT IN SLOT @V304298 00285000
MVC SFBRECS-SFBLOK(4,R4),RDEVCLAS MOVE IN THE CLASS @V304298 00286000
DROP R8 @V304298 00287000
CKSPL3A DS 0H @V304298 00288000
BAL R6,PUTSLOT WRITE AND RELEASE SLOT PAGE @V304298 00289000
B CKSEXIT RETURN TO CALLER @V304298 00290000
SPACE 2 00291000
CKSPL4 TM PARM2,ADDSFB IS IT AN ADD FUNCTION @V304235 00292000
BZ CKSPL5 XFER IF NOT @V304298 00293000
CKSPL4A DS 0H @V304298 00294000
LH R2,SFBFILID GET THE SPOOL FILE ID @V304298 00295000
BAL R6,FINDSLOT ALREADY EXIST ? @V304298 00296000
BNZ CKSPL4B XFER IF NOT FOUND(NORMAL) @V304298 00297000
L R15,=A(DMKRSPID) GET CURRENT FILE ID @V304298 00298000
LH R6,0(R15) LOAD IT @V304298 00299000
STH R6,SFBFILID CHANGE THE ID OF THE CURRENT @V304298 00300000
* SFBLOK 00301000
LA R6,1(,R6) INCREMENT IT @V304298 00302000
C R6,MAXFILE GREATER THAN PERMISSABLE MAX ?? @V304235 00303000
BNH CKSPL4AA IF NOT, CONTINUE @V304235 00304000
LA R6,1 ELSE, RESET ID NUMBER TO 1 @V304235 00305000
CKSPL4AA STH R6,0(R15) AND SAVE IT FOR THE NEXT GUY @V304235 00306000
B CKSPL4A TRY AGAIN @V304298 00307000
CKSPL4B DS 0H @V304298 00308000
LH R2,MAPFREE FIND AN EMPTY MAP SLOT @V304235 00309000
BAL R6,FINDSLOT ... @V304298 00310000
BNZ MSG400I ERROR IF EMPTY SLOT NOT FOUND @VM03037 00311000
STC R3,PAGSLOT SAVE PAGE NUMBER OF SLOT @V304298 00312000
STCM R3,B'1100',CYLSLOT GET CYLINDER FOR SLOT @V304298 00313000
BAL R6,GETSLOT BRING IT INTO CORE @V304298 00314000
AL R4,RADDSLOT POINT TO THE SLOT @V304298 00315000
MVC 0(1,R4),PARM2 SAVE THE TYPE @V304235 00316000
MVC 4(SFBSIZE*8-4,R4),SFBLOK+4 MOVE IN THE SFBLOK @V304298 00317000
BAL R6,PUTSLOT WRITE AND RELEASE SLOT PAGE @V304298 00318000
MVC 0(2,R5),SFBFILID MOVE SPOOL ID INTO MAP @V304298 00319000
B CKSEXIT RETURN TO CALLER @V304298 00320000
SPACE 2 00321000
CKSPL5 TM PARM1,CHGRDV/256 IS IT REAL DEVICE CHANGE ? @V304235 00322000
BZ CKSABN3 ABEND IF NOT @V304235 00323000
USING RDEVBLOK,R8 @V304298 00324000
L R8,SAVER8 CALLER'S RDEVBLOK @V304298 00325000
CALL DMKSCNRD GET DEVICE ADDRESS (CCU) @V304298 00326000
LA R2,X'E00' GET MAP CODE FOR RDV ENTRY @V304298 00327000
SLL R2,4 GET IT IN POSITION @V304298 00328000
OR R2,R1 MOVE IN CCU @V304298 00329000
BAL R6,FINDSLOT FIND ITS SLOT @V304298 00330000
BZ CKSPL6 XFER IF FOUND @V304298 00331000
LR R9,R2 SAVE R2 @V304298 00332000
LH R2,MAPFREE GET AN EMPTY MAP SLOT @V304235 00333000
BAL R6,FINDSLOT GO TO IT @V304298 00334000
BNZ MSG400I ERROR IF EMPTY SLOT NOT FOUND @VM03037 00335000
LR R2,R9 RESTORE R2 @V304298 00336000
STH R2,0(,R5) PUT IN MAP ENTRY @V304298 00337000
CKSPL6 STC R3,PAGSLOT SAVE PAGE NUMBER OF SLOT @V304298 00338000
STCM R3,B'1100',CYLSLOT GET CYLINDER FOR SLOT @V304298 00339000
LR R9,R1 SAVE DEVICE ADDRESS @V304298 00340000
BAL R6,GETSLOT BRING IT IN @V304298 00341000
AL R4,RADDSLOT POINT TO THE SLOT @V304298 00342000
MVC 0(L'SLOTDEV,R4),SLOTDEV CODE FOR REAL DEVICE @V304235 00343000
STH R9,4(,R4) DEVICE ADDRESS @V304298 00344000
MVC 6(2,R4),RDEVSTAT SAVE RDEVSTAT & RDEVFLAG @V304298 00345000
MVC 8(4,R4),RDEVCLAS MOVE IN THE CLASS(ES) @V304298 00346000
CLI RDEVTYPE,TYP3800 IS IT A 3800 PRINTER ? @V60B9BA 00346500
BNE CKSPL6A XFER IF NOT @V60B9BA 00346600
MVC 12(8,R4),RDEVIMAG CKPT THE IMAGE LIBRARY @V60B9BA 00346700
MVC 20(4,R4),RDEVXSEP CKPT THE CHAR ARR TBL FOR SEP @V60B9BA 00346800
MVC 24(1,R4),RDEVFSEP CKPT THE FCB FOR SEP PAGE @V60B9BA 00346900
CKSPL6A BAL R6,PUTSLOT WRITE & RELEASE SLOT PAGE @V60B9BA 00347000
B CKSEXIT RETURN TO CALLER @V304298 00348000
SPACE 2 00349000
CKSEXIT L R2,RADDMAP GET REAL ADDRESS OF MAP @VA09218 00350500
CALL DMKPTRUL UNLOCK THE MAP PAGE @V304298 00351000
EXITA LA R1,CKSLOCK UNLOCK THE ROUTINE @V304298 00352000
CALL DMKLOCKD ... @V304298 00353000
EXIT0 SR R15,R15 GET R15=0 @V304298 00354000
LTR R15,R15 GET CC=0 @V304298 00355000
EXIT , RETURN @V304298 00356000
EJECT 00357000
CKSABN1 ABEND 1 MAP NOT ALLOCATED @V304298 00358000
CKSABN2 ABEND 2 SLOT AND MAP DO NOT MATCH @V304235 00359000
CKSABN3 ABEND 3 NO FUNCTION SPECIFIED @V304235 00360000
EJECT 00361000
* 00362000
* SUBROUTINE NAME - 00363000
* 00364000
* DMKCKSIN 00365000
* 00366000
* FUNCTION - 00367000
* 00368000
* INITIALIZE THE CHECKPOINT AFTER A SUCCESSFUL WARM START 00369000
* FROM THE STANDARD RECOVERY PROCEDURE OR 00370000
* AFTER A COLD START. 00371000
* 00372000
* ATTRIBUTES - 00373000
* 00374000
* SERIALLY REUSABLE, PAGEABLE, CALLED VIA SVC FROM DMKCPI 00375000
* 00376000
* ENTRY POINTS - 00377000
* 00378000
* DMKCKSIN 00379000
* 00380000
* ENTRY CONDITIONS - 00381000
* 00382000
* NONE 00383000
* 00384000
* EXIT CONDITIONS - 00385000
* 00386000
* THE CHECKPOINT CYLINDER HAS BEEN INITIALIZED. 00387000
* 00388000
* CALLS TO OTHER ROUTINES 00389000
* 00390000
* DMKPGTVG - GET A VIRTUAL PAGE FOR THE MAP OR SLOT PAGE 00391000
* DMKSCNRU - FIND DEVICE BLOCK FOR IPL DEVICE 00392000
* DMKPTRAN - GET VIRTUAL PAGES INTO REAL CORE 00393000
* DMKPTRUL - UNLOCK THE REAL PAGE FOR THE MAP 00394000
* 00395000
* EXTERNAL REFERENCES - 00396000
* 00397000
* SYSIPLDV - ADDRESS OF SYSTEM IPL DEVICE 00398000
* DMKRSPPR - ANCHOR FOR PRINTER FILE CHAIN 00399000
* DMKRSPPU - ANCHOR FOR PUNCH FILE CHAIN 00400000
* DMKRSPRD - ANCHOR FOR READER FILE CHAIN 00401000
* 00402000
* TABLES AND WORKAREAS - 00403000
* 00404000
* ANCHRTBL - TABLE OF SPOOL FILE CHAIN ANCHORS 00405000
* 00406000
* REGISTER USAGE - 00407000
* 00408000
* GPR0 = DASD ADDRESS OF PAGE IN CCPD FORM 00409000
* GPR1 = VIRTUAL ADDRESS OF PAGE BUFFER 00410000
* GPR2 = REAL ADDRESS OF PAGE BUFFER 00411000
* GPR3 = POINTER TO SLOT ON CHECKPOINT CYLINDER 00412000
* GPR4 = INCREMENT FOR LOOPING THRU SLOTS 00413000
* GPR5 = COMPARAND 00414000
* GPR6 = INTERNAL BAL REGISTER 00415000
* GPR7 = POINTER TO SFBLOK 00416000
* GPR8 = POINTER TO LIST OF SPOOL FILE CHAIN ANCHORS 00417000
* GPR9 = POINTER TO MAP ENTRY 00418000
* GPR10 = PAGE NUMBER BEING UPDATED 00419000
* GPR11 = ADDRESS OF VMBLOK 00420000
* GPR12 = DMKCKS MODULE BASE 00421000
* GPR13 = ADDRESS OF STANDARD SAVE AREA 00422000
* GPR14 = BALR RETURN REGISTER 00423000
* GPR15 = BALR BRANCH REGISTER 00424000
* 00425000
* OPERATION - 00426000
* 00427000
* 1. IF A MAP PAGE HAS BEEN ALLOCATED, THEN JUST EXIT SINCE 00428000
* DMKCKSWM HAS DONE THE INITIALIZATION PREVIOUSLY. 00429000
* IF NOT, THEN ALLOCATE ONE, LOCK IT IN REAL CORE, 00430000
* AND LOCATE THE CHECKPOINT CYLINDERS. 00431000
* 00432000
* 2. LOOP THROUGH EACH SLOT ON THE CHECKPOINT CYLINDERS 00433000
* AND FILL IN AN SFBLOK IF THERE ARE STILL SOME REMAINING, 00434000
* AND INVALIDATE THE REST. WHILE DOING THIS, FILL THE 00435000
* MAP ENTRIES WITH THE SPOOL FILE ID. WHEN FINISHED, 00436000
* INSERT A DELIMITER AFTER THE LAST VALID SFBLOK ENTRY. 00437000
* 00438000
* 3. UNLOCK THE MAP PAGE AND RETURN TO CALLER. 00439000
* 00440000
EJECT 00441000
DMKCKSIN RELOC @V304298 00442000
ICM R1,B'1111',DMKCKSMP DO WE HAVE A MAP YET ? @V304298 00443000
BNZ EXIT0 EXIT, DMKCKSWM HAS DONE IT ALL @V304298 00444000
LA R1,CKSLOCK LOCK ROUTINE @VM02131 00445000
CALL DMKLOCKQ (AS A FLAG IN CASE OF ERRORS) @VM02131 00446000
BAL R6,CKSINIT SET UP PROGRAM CONSTANTS @V304235 00447000
LR R9,R2 SAVE SLOT MAP ADDRESS @VM02131 00448000
MVC 0(L'MAPEND,R2),MAPEND FLAG END OF MAP @VM02131 00449000
CALL DMKPGTVG GET A VIRTUAL PAGE ADDRESS @VM02131 00450000
ST R1,VPAGSLOT AND SAVE IT ........ @VM02131 00451000
TRANS 2,1,OPT=(BRING,DEFER,LOCK,SYSTEM) @VM02131 00452000
ST R2,RADDSLOT SAVE REAL PAGE ADDRESS @VM02131 00453000
LR R3,R2 STARTING SLOT ADDRESS @VM02131 00454000
LH R4,ENTRYSIZ INCREMENT @VM02131 00455000
LA R5,36*SFBSIZE*8-1(,R3) COMPARAND @VA12674 00456100
CKSIN0 MVC 0(L'SLOTFREE,R3),SLOTFREE FLAG SLOT AS EMPTY @VM02131 00457000
BXLE R3,R4,CKSIN0 CONTINUE .......... @VM02131 00458000
LR R5,R9 MAP ADDRESS HERE FOR EXITING @VM02131 00459000
SPACE 00460000
CKSIN1 EQU * @VM02131 00461000
BAL R6,NEXTCYL GET NEXT RECORD @VM02131 00462000
B CKSIN2 XFER IF DONE @VM02131 00463000
LM R0,R1,CCPDSLOT GET CCPD FOR THIS PAGE @VM02131 00464000
CALL DMKRPAPT,PARM=SYSTEM WRITE IT OUT @VM02131 00465000
BZ CKSIN1 CONTINUE IF NO PROBLEMS @VM02131 00466000
B MSG915E OOPS ....... I/O ERROR @VM02131 00467000
EJECT 00468000
CKSIN2 EQU * @VM02131 00469000
L R2,RADDSLOT UNLOCK SLOT PAGE @VM02131 00470000
CALL DMKPTRUL @VM02131 00471000
BAL R6,PUTSLOT0 RELEASE VIRTUAL PAGE TOO ... @VM02131 00472000
B CKSEXIT AND EXIT POST-HASTE ....... @VM02131 00473000
EJECT 00474000
* SUBROUTINE NAME - 00475000
* 00476000
* DMKCKSWM 00477000
* 00478000
* FUNCTION - 00479000
* 00480000
* RECOVER SPOOL FILE INFORMATION FROM A PREVIOUSLY 00481000
* CHECKPOINTED SESSION. THIS INFORMATION INCLUDES ALL 00482000
* CLOSED PRINTER AND PUNCH FILES, AND OPENED READER FILES. 00483000
* 00484000
* ATTRIBUTES - 00485000
* 00486000
* SERIALLY REUSABLE, PAGEABLE, CALLED VIA SVC FROM DMKWRM 00487000
* 00488000
* ENTRY POINTS - 00489000
* 00490000
* DMKCKSWM 00491000
* 00492000
* ENTRY CONDITIONS - 00493000
* 00494000
* GPR2 = PARAMETER PASSED TO DMKWRM BY DMKCPI 00495000
* 00496000
* EXIT CONDITIONS - 00497000
* 00498000
* THE CHECKPOINTED SPOOL FILES HAVE BEEN QUEUED UP ON THEIR 00499000
* PROPER QUEUES AND THEIR SFBLOKS HAVE BEEN PROPERLY 00500000
* INITIALIZED FOR SUBSEQUENT OPERATION. 00501000
* 00502000
* CALLS TO OTHER ROUTINES - 00503000
* 00504000
* DMKFREE - GET CORE FOR AN SFBLOK 00505000
* DMKPGTVG - GET A VIRTUAL PAGE FOR THE MAP, SLOT, OR 00506000
* SPOOL FILE DASD BUFFER PAGE 00507000
* DMKPGTVR - RELEASE SYSTEM V.M. SPACE 00508000
* DMKSCNRU - FIND DEVICE BLOCK FOR IPL DEVICE 00509000
* DMKPTRAN - GET VIRTUAL PAGES INTO REAL CORE 00510000
* DMKPTRUL - UNLOCK THE VIRTUAL PAGES 00511000
* DMKRPAGT - READ IN A DASD BUFFER PAGE 00512000
* 00513000
* EXTERNAL REFERENCES - 00514000
* 00515000
* SYSIPLDV - ADDRESS OF SYSTEM IPL DEVICE 00516000
* DMKRSPPR - ANCHOR FOR PRINTER FILE CHAIN 00517000
* DMKRSPPU - ANCHOR FOR PUNCH FILE CHAIN 00518000
* DMKRSPRD - ANCHOR FOR READER FILE CHAIN 00519000
* DMKQNTBL - ANCHOR FOR 3800 IMAGE LIBRARIES 00519100
* 00520000
* TABLES AND WORKAREAS - 00521000
* 00522000
* ANCHRTBL - TABLE OF SPOOL FILE CHAIN ANCHORS 00523000
* 00524000
* REGISTER USAGE - 00525000
* 00526000
* GPR0 = DASD ADDRESS OF PAGE IN CCPD FORM 00527000
* GPR1 = VIRTUAL ADDRESS OF PAGE BUFFER 00528000
* GPR2 = REAL ADDRESS OF PAGE BUFFER 00529000
* GPR3 = POINTER TO SLOT ON CHECKPOINT CYLINDER 00530000
* GPR4 = INCREMENT FOR LOOPING THRU SLOTS 00531000
* GPR5 = COMPARAND 00532000
* GPR6 = INTERNAL BAL REGISTER 00533000
* GPR7 = POINTER TO SFBLOK 00534000
* GPR8 = ADDR OF FILE CHAIN ANCHORS 00535000
* GPR9 = POINTER TO MAP ENTRY 00536000
* GPR10 = PAGE NUMBER BEING UPDATED 00537000
* GPR11 = ADDRESS OF VMBLOK 00538000
* GPR12 = DMKCKS MODULE BASE 00539000
* GPR13 = ADDRESS OF STANDARD SAVE AREA 00540000
* GPR14 = BALR RETURN REGISTER 00541000
* GPR15 = BALR BRANCH REGISTER 00542000
* 00543000
* OPERATION - 00544000
* 00545000
* 1. IF THE MAP PAGE HAS ALREADY BEEN ALLOCATED, ABEND. 00546000
* OTHERWISE, GET A VIRTUAL PAGE FOR THE MAP AND 00547000
* SAVE IT IN DMKCKSMP. THEN ALLOCATE A VIRTUAL PAGE 00548000
* FOR THE CHECKPOINT PAGES AND FOR SPOOL FILE 00549000
* DASD BUFFERS AND LOCK ALL THESE PAGES IN REAL CORE 00550000
* 00551000
* 2. GET NEXT(OR FIRST) SLOT IN CORE. IF NO MORE SLOTS 00552000
* THEN GO TO STEP 9. OTHERWISE, CONTINUE. 00553000
* 00554000
* 3. IF THE SLOT IS EMPTY, REFLECT THIS IN THE MAP ENTRY FOR 00555000
* THE SLOT AND GO TO STEP 2. OTHERWISE, CONTINUE. 00556000
* 00556100
* 3A. IF IT IS A REAL DEVICE BLOCK ENTRY, UPDATE THE REAL 00556200
* DEVICE BLOCK WITH THE CURRENT STATUS. IN THE CASE 00556300
* OF A 3800 PRINTER, UPDATE THE IMAGE LIBRARY NAME, 00556400
* PARAMETERS FOR PRINTING THE SEPARATOR PAGE, AND THEN 00556500
* UPDATE THE ACTIVITY COUNT IN THE IMAGE LIBRARY 00556600
* NAMED SYSTEM ENTRY. 00556700
* 00557000
* 4. INITIALIZE THE SFBLOK IN THE SLOT ENTRY FOR CLOSED 00558000
* PRINTER AND PUNCH FILES, ALSO FOR OPENED READER FILES. 00559000
* 00560000
* 5. CALL DMKFREE TO GET SPACE FOR THE SFBLOK AND MOVE THE 00561000
* SFBLOK INTO IT AND THEN CHAIN IT TO THE PROPER CHAIN. 00562000
* 00563000
* 6. MARK THE MAP ENTRY WITH THE PROPER SPOOL FILE ID. 00564000
* 00565000
* 7. IF THE FILE HAD ONLY ONE DASD BUFFER PAGE, MARK THAT 00566000
* CCPD AS BEING ALLOCATED IN THE RECBLOK CHAIN, WRITE OUT 00567000
* SLOT PAGE AND GO TO STEP 2. 00568000
* OTHERWISE, CONTINUE. 00569000
* 00570000
* 8. READ IN EACH DASD BUFFER PAGE FOR THE FILE AND SET UP A 00571000
* RECBLOK ALLOCATION FOR EACH OF THESE PAGES. THE 00572000
* NEXT ONE IS GOTTEN FROM THE CHAIN IN THE PREVIOUS ONE. 00573000
* EACH ONE OF THESE DASD BUFFERS MUST BE VALIDATED BEFORE 00574000
* BEING USED. IF IT IS NOT VALID, TRUNCATE THE FILE AT 00575000
* THE PREVIOUS PAGE AND SO MARK SFBLAST IN THE SFBLOK. 00576000
* THEN GO TO STEP 2. 00577000
* 00578000
* 9. RELEASE ALL DASD AND VIRTUAL PAGES FOR THE SLOT PAGE 00579000
* AND THE DASD BUFFER PAGE. THEN UNLOCK THE MAP PAGE AND 00580000
* RETURN TO CALLER. 00581000
* 00582000
EJECT 00583000
DMKCKSWM RELOC @V304298 00584000
ICM R1,B'1111',DMKCKSMP IS THERE A MAP YET ? @V304298 00585000
BNZ CKSABN1 ABEND IF SO @V304298 00586000
BAL R6,CKSINIT SET UP PROGRAM CONSTANTS @V304235 00587000
CALL DMKPGTVG GET VIRTUAL PAGE FOR DASD BUFFER @V304298 00588000
ST R1,VPAGBUFF SAVE IT @V304298 00589000
L R9,RADDMAP MAP START @V304298 00590000
ST R9,TOPSLOT SAVE POSSIBLE LOC OF DELIMITER @V304298 00591000
SPACE 00592000
CKSWM1 EQU * @VM02131 00593000
BAL R6,NEXTCYL GET NEXT CYLINDER ADDRESS @VM02131 00594000
B CKSWM9 XFER IF END OF CHECKPOINT AREA @VM02131 00595000
BAL R6,GETSLOT GO TO IT @V304298 00596000
L R3,RADDSLOT SLOT ADDRESS @V304298 00597000
CLC CYLSLOT(2),CKSSTART FIRST CYLINDER ? @V304298 00598000
BNE CKSWM1A XFER IF NOT @V304298 00599000
CLI PAGSLOT,X'01' FIRST PAGE ? @V304298 00600000
BNE CKSWM1A XFER IF NOT @V304298 00601000
CLC 0(4,R3),ZEROES VALID CHECKPOINT DATA ? @V304298 00602000
BE MSG917E XFER IF NOT @V304298 00603000
CKSWM1A DS 0H @V304298 00604000
LH R4,ENTRYSIZ INCREMENT @V304298 00605000
LA R5,36*SFBSIZE*8-1(,R3) COMPARAND @VA12674 00606100
CKSWM2 CLC 0(L'SLOTFREE,R3),SLOTFREE INVALID SLOT ? @V304235 00607000
BNE CKSWM2B XFER IF NOT @V304298 00608000
MVC 0(L'MAPFREE,R9),MAPFREE MARK INVALID IN THE MAP @V304235 00609000
LA R9,2(,R9) NEXT ENTRY @V304298 00610000
CKSWM2A LR R15,R9 SEE IF BEYOND END @V304298 00611000
SL R15,RADDMAP GET DISPLACEMENT @V304298 00612000
C R15,=F'4094' INTO NEXT PAGE ? @V304298 00613000
BL CKSWM7 NO @V408246 00614100
BAL R6,PUTSLOT YES, OUTPUT PAGE @V408246 00614600
B CKSWM9 AND FINISH @V408246 00615100
EJECT 00616000
* HERE WE PROCESS REAL DEVICE CHANGE ENTRIES 00617000
CKSWM2B DS 0H @V304298 00618000
L R15,=A(DMKSYSCN) @V304235 00619000
LH R14,0(R15) GET CURRENT MAP ENTRY COUNT @V304235 00620000
LA R14,1(,R14) ADD ONE TO IT ..... @V304235 00621000
STH R14,0(R15) AND SAVE UPDATED VALUE @V304235 00622000
USING RDEVBLOK,R8 @V304298 00623000
CLC 0(L'SLOTDEV,R3),SLOTDEV IS IT A REAL DEVICE @V304235 00624000
* STATUS ? 00625000
BNE CKSWM2G XFER IF NOT @V304298 00626000
LH R1,4(,R3) GET REAL DEVICE BLOK OF @V304298 00627000
CALL DMKSCNRU SPOOLING DEVICE @V304298 00628000
BZ CKSWM2B1 XFER IF IT IS STILL THERE @V304298 00629000
CKSWM2B0 MVC 0(L'SLOTFREE,R3),SLOTFREE MAKE THE SLOT INVALID @VM02131 00630000
L R15,=A(DMKSYSCN) ADJUST CURRENT MAP @V304235 00631000
LH R14,0(R15) COUNT ...... @V304235 00632000
BCTR R14,0 ........ @V304235 00633000
STH R14,0(R15) AND SAVE IT @V304235 00634000
B CKSWM2 FINISH PROCESSING INVALID SLOT @V304298 00635000
CKSWM2B1 DS 0H @V304298 00636000
SWITCH MAKE SURE WE ARE ON THE IO PROCESSOR @V4075A0 00636100
TM 6(R3),RDEVDISA DEVICE OFFLINE ? @V304298 00637000
BZ CKSWM2C XFER IF NOT @V304298 00638000
OI RDEVSTAT,RDEVDISA SO MARK IT @V304298 00639000
CKSWM2C MVC RDEVCLAS(4),8(R3) MOVE IN THE DEVICE CLASS(ES) @V304298 00640000
TM 7(R3),RDEVDRAN DEVICE DRAINED ? @V304298 00641000
BNZ CKSWM2D XFER IF SO (DEFAULT IS DRAIN) @V304298 00642000
TM PARM2,DRAIN WAS DRAIN REQUESTED ? @V304235 00643000
BO CKSWM2D XFER IF SO @V304298 00644000
NI RDEVFLAG,255-RDEVDRAN MARK IT NOT DRAINED @V304298 00645000
CKSWM2D DS 0H @V304298 00646000
CLI RDEVTYPE,TYP3800 IS IT A 3800 PRINTER ? @V60B9BA 00646325
BNE CKSWM2E XFER IF NOT @V60B9BA 00646350
MVC RDEVIMAG,12(R3) GET THE CURRENT IMAGE LIBRARY@V60B9BA 00646375
MVC RDEVXSEP,20(R3) GET THE CURRENT CHAR ARR TBL @V60B9BA 00646400
MVC RDEVFSEP,24(R3) GET FCB FOR SEP PAGE @V60B9BA 00646425
TM RDEVFLAG,RDEVDRAN IS THE 3800 DRAINED ? @V60B9BA 00646450
BO CKSWM2E XFER IF SO @V60B9BA 00646475
L R1,=A(DMKQNTBL) START OF 3800 IMAGE LIBS @V60B9BA 00646500
LTR R1,R1 ARE THERE ANY ? @V60B9BA 00646525
BZ CKSWM2D2 DRAIN THE DEVICE IF NOT @V60B9BA 00646550
TRANS 2,1,OPT=(BRING,DEFER,SYSTEM) GET IT IN @V60B9BA 00646575
LR R14,R2 POINT TO EACH SYSTEM ENTRY @V60B9BA 00646600
USING NPRTBL,R14 ADDRESSIBILITY @V60B9BA 00646625
CKSWM2D0 CLC RDEVIMAG,NPRNAME IS THIS THE ONE ? @V60B9BA 00646650
BNE CKSWM2D1 XFER IF NOT @V60B9BA 00646675
SR R15,R15 ZERO IT @VA10616 00646700
IC R15,NPRCNT CURRENT COUNT @V60B9BA 00646725
LA R15,1(R15) PLUS ONE @V60B9BA 00646750
STC R15,NPRCNT SAVE THE NEW COUNT @V60B9BA 00646775
B CKSWM2E CONTINUE ONWARD @V60B9BA 00646800
CKSWM2D1 AL R14,NPRPNT NEXT ONE @V60B9BA 00646825
CLC NPRPNT,ZEROES IS THIS DUMMY LAST ENTRY? @V60B9BA 00646850
BNE CKSWM2D0 XFER IF NOT @V60B9BA 00646875
CKSWM2D2 OI RDEVFLAG,RDEVDRAN MARK DEVICE DRAINED SINCE @V60B9BA 00646900
* WE CAN'T FIND THE IMG LIB @V60B9BA 00646925
DROP R14 NO LONGER NEEDED @V60B9BA 00646950
SPACE 00646975
CKSWM2E MVC 0(2,R9),4(R3) FILL IN THE MAP ENTRY @V60B9BA 00647000
OI 0(R9),X'E0' SPECIAL CODE @V304298 00648000
B CKSWM2H ADVANCE TO NEXT ENTRY @VM02131 00649000
SPACE 3 00650000
* HERE WE PROCESS CHECKPOINTED SPOOL HOLD QUEUE BLOCKS 00651000
CKSWM2G DS 0H @V304298 00652000
CLC 0(L'SLOTSHQ,R3),SLOTSHQ IS IT A SHQBLOK ? @V304235 00653000
BNE CKSWM3 XFER IF NOT @V304298 00654000
LA R0,SHQBSIZE GET CORE FOR SHQBLOK @V304298 00655000
CALL DMKFREE GO TO IT @V304298 00656000
MVC 4(SHQBSIZE*8-4,R1),4(R3) MOVE IT IN @V304298 00657000
L R7,=A(DMKRSPHQ) GET ANCHOR FOR SHQ CHAIN @V304298 00658000
MVC 0(4,R1),0(R7) WE POINT TO PREVIOUS FIRST @V304298 00659000
ST R1,0(R7) WE ARE NOW FIRST @V304298 00660000
MVC 0(L'MAPSHQ,R9),MAPSHQ FILL IN THE MAP ENTRY @V304235 00661000
CKSWM2H LA R9,2(,R9) ADVANCE TO NEXT MAP ENTRY @VA04454 00662000
ST R9,TOPSLOT NEW POSSIBLE DELIMITER @V304298 00663000
B CKSWM2A TEST FOR END @V304298 00664000
EJECT 00665000
* HERE WE PROCESS THE CHECKPOINTED SFBLOK 00666000
CKSWM3 DS 0H @V304298 00667000
DROP R7 TEMPORARILY @V304298 00668000
USING SFBLOK,R3 JUST FOR THE TIME BEING @V304298 00669000
NI SFBFLAG,X'FF'-(SFBINUSE+SFBEOF+SFBOPEN) @V304298 00670000
* RESET THE FILE STATUS 00671000
TM 0(R3),ACTSFB WAS IT BEING PRINTED ? @V304298 00672000
BNZ CKSWM3C XFER IF SO @V304298 00673000
CKSWM3A TM 0(R3),OPNSFB WAS IT AN OPEN CONSOLE FILE ? @VM02131 00674000
BZ CKSWM3B XFER IF NOT @V304298 00675000
TM SFBFLAG2,SFBMON IS THIS A MONITOR SFB @VA07888 00675100
BZ CKSWM3A1 NO, ONLY MONITOR AND CONSOLE @VA07888 00675200
* FILES ARE CHECKPOINTED 'OPEN' 00675300
MVC SFBDIST(8),=C' ' YES CLEAN UP DIST CODE @VA07888 00675400
* SINCE DMKCKP DIDNT GET A CHANCE 00675500
B CKSWM3B AND SKIP USER HOLD SETTING @VA07888 00675600
CKSWM3A1 EQU * @VA07888 00675700
OI SFBFLAG,SFBUHOLD PUT IT IN USER HOLD @V304298 00676000
CKSWM3B XC SFBRECS,SFBRECS CLEAR THE FIELD @V304298 00677000
CKSWM3C LA R0,SFBSIZE GET SIZE OF SFBLOK @V304298 00678000
CALL DMKFREE GET CORE FOR ONE SFBLOK @V304298 00679000
LR R7,R1 SAVE ITS ADDRESS @V304298 00680000
DROP R3 WE NEED IT NO LONGER @V304298 00681000
USING SFBLOK,R7 BACK TO NORMAL @V304298 00682000
MVC SFBLOK(SFBSIZE*8),0(R3) MOVE IN THE DATA @V304298 00683000
TM 0(R3),ACTSFB WAS IT ACTIVE ? @V304298 00684000
BZ CKSWM3D XFER IF NOT @V304298 00685000
LH R1,2(,R3) GET DEVICE ADDRESS @V304298 00686000
LR R2,R7 SAVE IT ACROSS CALL @V304298 00687000
CALL DMKSCNRU GET RDEVBLOK @V304298 00688000
LR R7,R2 RESTORE R7 @V304298 00689000
BZ CKSWM3C1 XFER IF DEVICE STILL THERE @V304298 00690000
OI SFBFLAG,SFBRECER ALLOCATION INCOMPLETE @V304298 00691000
B CKSWM3D CHAIN THE SFBLOK @V304298 00692000
CKSWM3C1 DS 0H @V304298 00693000
SWITCH MAKE SURE WE ARE ON THE IO PROCESSOR @V4075A0 00693100
MVC RDEVCLAS(4),SFBRECS GET THE DEVICE CLASS @V304298 00694000
OI SFBFLAG,SFBRECER INDICATE ALLOC INCOMPLETE @V304298 00695000
OI SFBFLAG2,SFBRSTRT INDICATE RESTARTED @V304298 00696000
TM RDEVSTAT,RDEVDISA DEVICE OFFLINE ? @V304298 00697000
BO CKSWM3D CHAIN IT IF SO @V304298 00698000
TM RDEVFLAG,RDEVDRAN BEING DRAINED ? @V304298 00699000
BO CKSWM3D CHAIN IT IF SO @V304298 00700000
ST R7,RDEVSPL STORE IN RDEVBLOK @V304298 00701000
MVI 0(R7),X'FF' INDICATE SFBLOK @V304298 00702000
XC SFBRECS,SFBRECS CLEAR FIELD @V304298 00703000
B CKSWM4A CONTINUE @V304298 00704000
CKSWM3D XC SFBRECS,SFBRECS CLEAR FIELD @V304298 00705000
TM 0(R3),OPNSFB WAS IT OPEN? @V304298 00706000
BZ CKSWM3F XFER IF NOT @V304298 00707000
MVC SFBCOPY,F1+2 MAKE IT ONE COPY @V304298 00708000
CKSWM3F DS 0H @V304298 00709000
DROP R8 @V304298 00710000
EJECT 00711000
* NOW CHAIN IT TO THE PROPER ANCHOR 00712000
L R8,ARSPPR ASSUME PRINTER FILE @V304298 00713000
TM 0(R3),PRTCHN IS IT A PRINT FILE ? @V304298 00714000
BO CKSWM4 XFER IF SO @V304298 00715000
L R8,ARSPPU ASSUME PUNCH FILE @V304298 00716000
TM 0(R3),PCHCHN IS IT A PUNCH FILE ? @V304298 00717000
BO CKSWM4 XFER IF SO @V304298 00718000
L R8,ARSPRD IT IS A READER FILE @V304298 00719000
CKSWM4 MVC SFBPNT,0(R8) PUT NEW ONE AT @V304298 00720000
ST R7,0(,R8) TOP OF CHAIN @V304298 00721000
SPACE 2 00722000
* AT THIS POINT WE START ALLOCATING THE DASD BUFFERS 00723000
CKSWM4A TM SFBFLAG,SFBDUMP SYSTEM DUMP ? @V304298 00724000
BNO CKSWM4AA NO...SKIP VMDUMP CHECK @V67CAH7 00725000
CLI SFBMISC1+1,C'V' YES...IS IT A VMDUMP @V67CAH7 00725200
BNE CKSWM6E SPECIAL HANDLING FOR CPDUMP @V67CAH7 00725400
CKSWM4AA DS 0H @V67CAH7 00725600
MVC CCPDBUFF(4),SFBSTART INITIALIZE TO FIRST PAGE @V304298 00726000
MVC PREVBUFF(4),ZEROES INITIALIZE @VA07106 00726050
CKSWM5P TM 0(R3),OPNSFB OPEN SPOOL OR MONITOR FILE @VA07888 00734200
BZ CKSWM5 NO, WON'T RECOUNT RCDS @VA07888 00734400
XC SFBRECNO,SFBRECNO CLEAR OLD CNT BEFORE START @VA07888 00734600
CKSWM5 LM R0,R1,CCPDBUFF GET THE NEXT BUFFER IN CORE @V304298 00735000
CALL DMKRPAGT,PARM=SYSTEM+BRING+LOCK GO TO IT @V304298 00736000
BNZ MSG916E XFER IF BAD IO @V304298 00737000
ST R2,RADDBUFF SAVE ITS REAL ADDRESS @V304298 00738000
TM 0(R3),OPNSFB WAS IT AN OPEN FILE ? @V304298 00739000
BO CKSWM5B XFER IF SO @V304298 00740000
L R1,CCPDBUFF ALLOCATE THE PAGE @V304298 00741000
USING SPLINK,R2 ADDRESSABILITY @VA07106 00741050
CLC PREVBUFF(4),SPPREPAG BACK POINTER O.K. ?? @VA07106 00741150
BNE CKSWM6A1 NO, DELETE THIS FILE @VA07106 00741250
ST R1,PREVBUFF REMEMBER FOR NEXT DASD PAGE @VA07106 00741350
BAL R6,ALOCIT GO TO IT @V304298 00742000
L R2,RADDBUFF POINT TO BUFFER @V304298 00744000
* WITH BOTH ACTIVE AND INACTIVE FILES, SPNXTPAG FOR THE LAST 00745000
* PAGE TO BE ALLOCATED POINTS TO SFBSTART. 00746000
* WHEN THIS PAGE HAS BEEN ALLOCATED, WE ARE DONE. 00747000
TM SFBFLAG2,SFBMON IS THIS A MONITOR FILE? @V50A2B5 00747100
BNO CKSWM5AA NO, CONTINUE @V50A2B5 00747200
CLC CCPDBUFF(4),SFBLAST IS THIS THE LAST PAGE @V50A2B5 00747300
BE CKSWM6C YES, CONTINUE @V50A2B5 00747400
CKSWM5AA EQU * @V50A2B5 00747500
CLC SPNXTPAG(4),SFBSTART ARE WE DONE ? @V304298 00748000
BE CKSWM6C XFER IF SO @V304298 00749000
CKSWM5A MVC CCPDBUFF(4),SPNXTPAG READ IN THE NEXT PAGE @V304298 00750000
B CKSWM5 AND GO TO IT @V304298 00751000
EJECT 00752000
* AN OPEN FILE MUST BE CHECKED MORE CAREFULLY 00753000
CKSWM5B L R2,RADDBUFF POINT TO THE DASD BUFFER @V304298 00754000
CLC SFBFILID,SPFILID FILE ID OK AS CHECKPOINTED ? @V60B9BA 00755000
BNE CKSWM6 XFER IF NOT @V304298 00756000
CLC SFBTIME(6),SPTIME OTHER FIELD MATCH UP ? @V60B9BA 00757000
BNE CKSWM6 XFER IF NOT @V304298 00758000
SPACE 2 00759000
* THE PAGE IS VALID 00760000
L R1,CCPDBUFF ALLOCATE THIS DASD PAGE @V304298 00761000
CLC PREVBUFF(4),SPPREPAG BACK POINT O.K. ?? @VA07106 00761050
BNE CKSWM6A1 NO, DELETE THE FILE @VA07106 00761150
ST R1,PREVBUFF SAVE FOR POSSIBLE LAST BUFFER @V304298 00762000
BAL R6,ALOCIT GO TO IT @V304298 00763000
* CALCULATE NUMBER OF RECORDS IN OPEN SPOOL FILE 00764000
L R15,SFBRECNO LOAD PRESENT VALUE @V304298 00765000
AL R15,SPRECNUM INCREMENT NUM IN BUFFER @V304298 00766000
ST R15,SFBRECNO SAVE THE NEW VALUE @V304298 00767000
* CONSOLE FILE WILL CYCLE BACK TO FIRST PAGE EVEN THOUGH OPEN. 00768000
CLC SPNXTPAG(4),SFBSTART IS THIS THE LAST PAGE @V304298 00769000
* OF A CONSOLE FILE ? 00770000
BNE CKSWM5C XFER IF NOT @V304298 00771000
MVC SFBLAST(4),CCPDBUFF SET UP THE LAST PAGE @V304298 00772000
B CKSWM6C AND TRY NEXT SLOT @V304298 00773000
CKSWM5C DS 0H @V304298 00774000
MVC CCPDBUFF(4),SPNXTPAG SET UP FOR NEXT PAGE @V304298 00775000
CLC SPNXTPAG,ZEROES IS THERE ONE ? @V304298 00776000
BNE CKSWM5 YES, SO READ IT IN @V304298 00777000
SPACE 2 00778000
* WE GOT TO AN INVALID PAGE 00779000
CKSWM6 MVC SFBLAST(4),PREVBUFF PREVIOUS ONE IS THE END @V304298 00780000
* WE NOW READ THAT LAST PAGE BACK IN SO THAT WE CAN UPDATE ITS 00781000
* SPNXTPAG AND THEN WRITE IT BACK OUT. 00782000
* BUT FIRST CHECK IF THE INVALID PAGE WAS THE FIRST PAGE 00783000
* IF SO, THEN THE FILE IS NO GOOD AND MUST BE DELETED 00784000
CLC CCPDBUFF(4),SFBSTART WAS IT THE FIRST ONE ? @V304298 00785000
BNE CKSWM6B XFER IF NOT @V304298 00786000
CKSWM6A1 L R8,ARSPPR ASSUME IT'S ON THE PRINT CHAIN @V304298 00787000
C R7,0(R8) IS IT ? @V304298 00788000
BE CKSWM6A XFER IF SO @V304298 00789000
L R8,ARSPPU ASSUME THE PUNCH CHAIN @V304298 00790000
C R7,0(R8) IS IT ? @V304298 00791000
BE CKSWM6A XFER IF SO @V304298 00792000
L R8,ARSPRD ASSUME READER CHAIN @V304298 00793000
C R7,0(R8) IS IT ? @V304298 00794000
BE CKSWM6A XFER IF SO @V304298 00795000
ABEND 4 SOMETHING IS WRONG @V304235 00796000
EJECT 00797000
CKSWM6A MVC 0(4,R8),SFBPNT DELETE FROM THE CHAIN @V304298 00798000
LA R0,SFBSIZE SIZE OF THE SFBLOK @V304298 00799000
LR R1,R7 ADDRESS OF SFBLOK @V304298 00800000
CALL DMKFRET FRET ITS CORE @V304298 00801000
B CKSWM2B0 ADJUST CURRENT MAP ETC ..... @VM02131 00802000
EJECT 00803000
CKSWM6B DS 0H @V304298 00804000
MVC CCPDBUFF(4),SFBLAST THE PAGE TO READ IN @V304298 00805000
LM R0,R1,CCPDBUFF GET LAST PAGE INTO CORE @V304298 00806000
CALL DMKRPAGT,PARM=SYSTEM+BRING+LOCK GO TO IT @V304298 00807000
BNZ MSG916E XFER IF BAD IO @V304298 00808000
ST R2,RADDBUFF SAVE ITS REAL ADDRESS @V304298 00809000
MVC SPNXTPAG(4),SFBSTART MOVE IN THE NEW VALUE @V304298 00810000
CALL DMKRPAPT,PARM=SYSTEM WRITE IT OUT @V304298 00811000
BNZ MSG916E XFER IF BAD IO @V304298 00812000
CKSWM6C DS 0H @VA14548 00813100
CLC CCPDBUFF(4),SFBLAST IS THIS REALLY A COMPLETE @VA14548 00813200
* FILE? 00813300
BNE CKSWM6A1 NOT COMPLETE DELETE THIS FILE. @VA14548 00813400
CLC SPNXTPAG(4),SFBSTART DOUBLE CHECK COMPLETE @VA14548 00813500
* FILE FOR SAFETY. 00813600
BNE CKSWM6A1 NOT COMPLETE DELETE THIS FILE. @VA14548 00813700
DROP R2 00813800
NI 0(R3),X'FF'-(OPNSFB+ACTSFB) CLEAR THESE FLAGS @VA14548 00813900
* CLEAR THESE FLAGS 00815000
MVC 4(SFBSIZE*8-4,R3),SFBLOK+4 REINITIALIZE THE @V304298 00816000
* CHECKPOINTED SFBLOK 00817000
MVC 0(2,R9),SFBFILID SET UP THE MAP @V304298 00818000
LA R9,2(,R9) NEXT SLOT ENTRY @V304298 00819000
ST R9,TOPSLOT NEW POSSIBLE DELIMITER @V304298 00820000
* MAINTAIN HIGHEST SPOOL FILE ID 00821000
CLC SPOOLID,SFBFILID IS NEW ONE HIGHER ? @V304298 00822000
BH CKSWM6D XFER IF NOT @V304298 00823000
MVC SPOOLID,SFBFILID MOVE IN NEW HIGHEST @V304298 00824000
CKSWM6D DS 0H @V304298 00825000
B CKSWM2A TEST FOR END @V304298 00826000
EJECT 00827000
* CODE FOR ALLOCATING THE BUFFERS OF A DUMP SPOOL FILE 00828000
* SINCE THESE ARE NOT CHAINED TOGETHER AS IS NORMAL, BUT 00829000
* ARE CONTIGUOUS FROM FIRST PAGE TO LAST PAGE, THE ALLOCATION 00830000
* OF DASD BUFFERS MUST BE HANDLED AS A SPECIAL CASE. 00831000
CKSWM6E L R1,SFBSTART GET STARTING CCPD @V304298 00832000
LR R15,R1 SET UP THE COMPARAND @V304298 00833000
LA R8,X'FF' MASK FOR DEVICE CODE @V304298 00834000
N R8,SFBSTART ISOLATE DEVICE CODE @V304298 00835000
L R1,=A(DMKSYSOC) GET NUMBER OF OWNED DEVICES @VA07295 00835050
CL R8,0(R1) WITHIN RANGE ? @VA07295 00835150
BNL MSG916E NO,BAD DEVICE CODE @VA07295 00835250
LR R1,R15 RESTORE R1 WITH COMPARAND @VA07295 00835350
SLL R8,3 GET DEV CODE TIMES 8 @V304298 00836000
A R8,=A(DMKSYSOW) POINT TO OWNED LIST ENTRY @V304298 00837000
LA R0,OWNDVSER-OWNDLIST(,R8) POINT TO VOLID @V304298 00838000
LH R8,OWNDRDEV-OWNDLIST(,R8) POINT TO RDEVBLOK @V304298 00839000
LTR R8,R8 IS VOLUME MOUNTED? @V304298 00840000
BM MSG912W ERROR DMKCKS912W @V305435 00841000
SLL R8,3 CONVERT TO BYTE INDEX @V304298 00842000
A R8,ARIODV REALLY GET THE RDEVBLOK @V304298 00843000
USING RDEVBLOK,R8 @V304298 00844000
TM RDEVFLAG,RDEVPREF PAGING ONLY VOLUME ? @VA07295 00844050
BO MSG916E YES,MUST BE BAD DEVICE CODE @VA07295 00844150
ICM R15,B'0010',=AL1(57) PAGES FOR A 3330 @V304298 00845000
CLI RDEVTYPE,TYP3330 IS IT A 3330 ? @V304298 00846000
BE CKSWM6E1 XFER IF SO @V304298 00847000
ICM R15,B'0010',=AL1(120) PAGES FOR A 3350 @V304498 00848000
CLI RDEVTYPE,TYP3350 IS IT A 3350 ? @V304498 00849000
BE CKSWM6E1 XFER IF SO @V304498 00850000
ICM R15,B'0010',=AL1(96) Pages for a 3375 HRC106DK 00850100
CLI RDEVTYPE,TYP3375 Is it a 3375 ? HRC106DK 00850200
BE CKSWM6E1 Xfer if so HRC106DK 00850300
ICM R15,B'0010',=AL1(150) Pages for a 3380 HRC106DK 00850400
CLI RDEVTYPE,TYP3380 Is it a 3380 ? HRC106DK 00850500
BE CKSWM6E1 Xfer if so HRC106DK 00850600
ICM R15,B'0010',=AL1(32) PAGES FOR A 2314 @V304298 00851000
CLI RDEVTYPE,TYP2314 IS IT A 2314 ? @V304298 00852000
BE CKSWM6E1 XFER IF SO @V304298 00853000
ICM R15,B'0010',=AL1(24) THEN IT'S A 2305 OR 3340 @V304298 00854000
CKSWM6E1 DS 0H @V304298 00855000
LA R14,X'100' INCREMENT ONE PAGE AT A TIME @V304298 00856000
LOOP6E STM R14,R15,HOLDR14 SAVE ACROSS CALL @V304298 00857000
BAL R6,ALOCIT GO ALLOCATE THE PAGE @V304298 00858000
LM R14,R15,HOLDR14 RESTORE REGS @V304298 00859000
CL R1,SFBLAST IS THIS THE END ? @V304298 00860000
BNL CKSWM6C TRY NEXT SLOT IF SO @V304298 00861000
BXLE R1,R14,LOOP6E ALLOCATE NEXT PAGE @V304298 00862000
SRL R1,16 CYL NUM TO LOW ORDER @V304298 00863000
LA R1,1(,R1) GO TO NEXT CYL @V304298 00864000
SLL R1,8 GET READY FOR @V304298 00865000
LA R1,1(,R1) .. PAGE 1 ON THE CYLINDER @V304298 00866000
SLL R1,8 MAKE ROOM FOR DEVICE CODE @V304298 00867000
IC R1,SFBSTART+3 SAME DEV CODE AS BEFORE @V304298 00868000
LR R15,R1 SET UP THE COMPARAND @V304298 00869000
LA R8,X'FF' MASK FOR DEVICE CODE @V304298 00870000
N R8,SFBSTART ISOLATE DEVICE CODE @V304298 00871000
SLL R8,3 GET DEV CODE TIMES 8 @V304298 00872000
A R8,=A(DMKSYSOW) POINT TO OWNED LIST ENTRY @V304298 00873000
LA R0,OWNDVSER-OWNDLIST(,R8) POINT TO VOLID @V304298 00874000
LH R8,OWNDRDEV-OWNDLIST(,R8) POINT TO RDEVBLOK @V304298 00875000
LTR R8,R8 IS VOLUME MOUNTED? @V304298 00876000
BM MSG912W ERROR IF NOT @V305435 00877000
SLL R8,3 CONVERT TO BYTE INDEX @V304298 00878000
A R8,ARIODV REALLY GET THE RDEVBLOK @V304298 00879000
USING RDEVBLOK,R8 @V304298 00880000
ICM R15,B'0010',=AL1(57) PAGES FOR A 3330 @V304298 00881000
CLI RDEVTYPE,TYP3330 IS IT A 3330 ? @V304298 00882000
BE CKSWM6E2 XFER IF SO @V304298 00883000
ICM R15,B'0010',=AL1(120) PAGES FOR A 3350 @V304498 00884000
CLI RDEVTYPE,TYP3350 IS IT 3350 ? @V304498 00885000
BE CKSWM6E2 XFER IF SO @V304498 00886000
ICM R15,B'0010',=AL1(96) Pages for a 3375 HRC106DK 00886100
CLI RDEVTYPE,TYP3375 Is it 3375 ? HRC106DK 00886200
BE CKSWM6E2 Xfer if so HRC106DK 00886300
ICM R15,B'0010',=AL1(150) Pages for a 3380 HRC106DK 00886400
CLI RDEVTYPE,TYP3380 Is it 3380 ? HRC106DK 00886500
BE CKSWM6E2 Xfer if so HRC106DK 00886600
ICM R15,B'0010',=AL1(32) PAGES FOR A 2314 @V304298 00887000
CLI RDEVTYPE,TYP2314 IS IT A 2314 ? @V304298 00888000
BE CKSWM6E2 XFER IF SO @V304298 00889000
ICM R15,B'0010',=AL1(24) THEN IT'S A 2305 OR 3340 @V304298 00890000
CKSWM6E2 DS 0H @V304298 00891000
B LOOP6E GO DO THE NEXT CYLINDER @V304298 00892000
SPACE 2 00893000
CKSWM7 BXLE R3,R4,CKSWM2 TRY NEXT SLOT @V304298 00894000
CKSWM8 BAL R6,PUTSLOT WRITE & RELEASE SLOT PAGE @V304298 00895000
B CKSWM1 EXAMINE NEXT CHECKPOINT PAGE @V304298 00896000
SPACE 3 00897000
CKSWM9 L R9,TOPSLOT GET DELIMITER LOCATION @V304298 00898000
MVC 0(L'MAPEND,R9),MAPEND DELIMIT MAP ....... @VM02131 00899000
LM R0,R1,CCPDBUFF GET DASD AND VIRT ADDR @V304298 00900000
SR R0,R0 CLEAR PARM REGISTER @V304298 00901000
CALL DMKRPAGT,PARM=SYSTEM RELEASE STORAGE PAGE @V304298 00902000
CALL DMKPGTVR RELEASE VIRT PAGE FOR DASD BUFFER@V304298 00903000
LR R2,R9 RADD OF MAP PAGE @V304298 00904000
CALL DMKPTRUL UNLOCK THE MAP PAGE @V304298 00905000
L R15,=A(DMKRSPID) ADDR OF NEW SPOOL FILE ID @V304298 00906000
LH R14,SPOOLID GET OUR HIGHEST @V304298 00907000
LA R14,1(,R14) ADD ONE TO IT @V304298 00908000
CH R14,=H'9900' MAX SPOOL FILE ID ? @VA07575 00908100
BNH *+8 NO - OK ! @VA07575 00908200
LA R14,1 RESET TO ONE @VA07575 00908300
STH R14,0(R15) MAKE THAT THE NEW ONE @V304298 00909000
L R15,=A(DMKSYSCN) .. @V304235 00910000
LH R14,0(R15) GET COUNT OF SLOTS IN USE @V304235 00911000
CH R14,SLOT90P 90 % FULL ?? @V304235 00912000
BL EXIT0 RETURN TO CALLER IF NOT @V304235 00913000
BAL R6,MSG401I ELSE, LET OPERATOR KNOW .... @V304235 00914000
B EXIT0 RETURN TO CALLER @V304298 00915000
EJECT 00916000
*********************************************************************** 00917000
* 00918000
* GETSLOT - 00919000
* BRING THE SLOT SPECIFIED BY CCPDSLOT INTO CORE AND LOCK IT 00920000
* 00921000
*********************************************************************** 00922000
SPACE 00923000
GETSLOT CALL DMKPGTVG GET VIRT ADDR FOR SLOT @V304298 00924000
ST R1,VPAGSLOT SAVE IT @V304298 00925000
LM R0,R1,CCPDSLOT GET DASD AND VIRT ADDR @V304298 00926000
CALL DMKRPAGT,PARM=BRING+SYSTEM+LOCK @V304298 00927000
BNZ MSG915E PERM IO ERROR @V304298 00928000
ST R2,RADDSLOT SAVE REAL ADDRESS @V304298 00929000
CLI FFS,X'FF' SET CC=0 @V304298 00930000
BR R6 RETURN @V304298 00931000
SPACE 3 00932000
*********************************************************************** 00933000
* 00934000
* PUTSLOT - 00935000
* WRITE AND RELEASE THE SLOT PAGE JUST GOTTEN 00936000
* 00937000
*********************************************************************** 00938000
SPACE 00939000
PUTSLOT LM R0,R1,CCPDSLOT GET DASD AND VIRT ADDR @V304298 00940000
CALL DMKRPAPT,PARM=SYSTEM WRITE IT OUT @V304298 00941000
BNZ MSG915E PERMANENT IO ERROR @V304298 00942000
PUTSLOT0 SR R0,R0 CLEAR PARM REG @VM02131 00943000
CALL DMKRPAGT,PARM=SYSTEM RELEASE STORAGE PAGE @V304298 00944000
CALL DMKPGTVR RELEASE VIRTUAL PAGE @V304298 00945000
CLI FFS,X'FF' SET CC=0 @V304298 00946000
BR R6 RETURN @V304298 00947000
EJECT 00948000
*********************************************************************** 00949000
* 00950000
* FINDSLOT - 00951000
* THIS ROUTINE TAKES AS INPUT A SPOOL FILE ID AND RETURNS 00952000
* THE CYLINDER AND PAGE NUMBER AND DISPLACEMENT OF 00953000
* THE SPECIFIED SLOT. 00954000
* INPUT - 00955000
* GPR2 = SPOOL FILE ID 00956000
* = -1 IF WE WANT FIRST EMPTY SLOT 00957000
* OUTPUT - 00958000
* GPR3 = CYLINDER AND PAGE NUMBER OF SLOT (CCCCPPPP) 00959000
* GPR4 = DISPLACEMENT OF SLOT WITHIN PAGE 00960000
* GPR5 = POINTER TO MAP ENTRY FOR THE SLOT 00961000
* CC = 0 IF SLOT FOUND 00962000
* CC = 1 IF SLOT NOT FOUND(GPR 3,4,5 UNPREDICTABLE) 00963000
* GPR15 IS ALWAYS UNPREDICTABLE 00964000
* 00965000
*********************************************************************** 00966000
SPACE 00967000
FINDSLOT DS 0H @V304298 00968000
LA R4,2 INCREMENT @V304298 00969000
CLM R2,B'0011',MAPSHQ LOOKING FOR SHQBLOK ? @V304235 00970000
BE FSL2 XFER IF SO @V304298 00971000
L R3,RADDMAP SLOT ENTRY @V304298 00972000
FSL2 LA R5,4092(R3) COMPARAND @V304298 00973000
GETENTRY CLM R2,B'0011',0(R3) DO WE HAVE A MATCH ? @V304298 00974000
BE FNDSLOT XFER IF SO @V304298 00975000
CLC 0(L'MAPEND,R3),MAPEND IS IT THE END ? @V304235 00976000
BE ATEND XFER IF SO @V304298 00977000
BXLE R3,R4,GETENTRY TRY NEXT @V304298 00978000
ATEND CLM R2,B'0011',MAPFREE REQUEST FOR EMPTY MAP SLOT ? @V304235 00979000
BNE FSLOTRT1 RETURN CC=1 IF NOT @V304298 00980000
CR R3,R5 AT PHYSICAL END OF MAP ? @V304298 00981000
BH FSLOTRT1 IF SO, RETURN CC=1 @V304298 00982000
MVC 0(L'MAPFREE,R3),MAPFREE MARK MAP SLOT EMPTY @V304235 00983000
MVC 2(L'MAPEND,R3),MAPEND FLAG NEW END OF MAP @V304235 00984000
FNDSLOT DS 0H IF HERE, WE FOUND THE SLOT @V304298 00985000
CLM R2,B'0011',MAPFREE LOOKING FOR EMPTY SLOT ?? @V304235 00986000
BNE FNDSLOT1 NO, CONTINUE @V304235 00987000
L R15,=A(DMKSYSCN) @V304235 00988000
LH R4,0(R15) GET CURRENT MAP COUNT @V304235 00989000
LA R4,1(,R4) ADD 1 TO IT @V304235 00990000
STH R4,0(R15) AND SAVE UPDATED VALUE @V304235 00991000
TM DMKCKSSW,MSG90ISU 90 % MSG ISSUED YET ?? @V304235 00992000
BO FNDSLOT1 YES, NO NEED TO CHECK ON IT NOW @V304235 00993000
CH R4,SLOT90P HIT 90% MARK YET ?? @V304235 00994000
BL FNDSLOT1 NO, CONTINUE @V304235 00995000
ST R6,SAVREG SAVE R6 OVER CALL @V304235 00996000
BAL R6,MSG401I LET OPER KNOW WE ARE 90% FULL @V304235 00997000
L R6,SAVREG RESTORE REG 6 @V304235 00998000
FNDSLOT1 DS 0H @V304235 00999000
LR R15,R3 SET UP PTR TO MAP ENTRY(TEMP) @V304298 01000000
SL R3,RADDMAP GET THE SLOT NUMBER - 1 @V304298 01001000
SRL R3,1 ... @V304298 01002000
LR R5,R3 ... @V304298 01003000
C R5,MAXSLOTS BIGGER THAN MAXIMUM ? @V304298 01004000
BNL FSLOTRT1 IF SO, RETURN CC=1 @V304298 01005000
SR R4,R4 GET PAGE AND @V304298 01006000
D R4,SLOTPPAG ... DISPLACEMENT @V304298 01007000
MH R4,ENTRYSIZ DISPLACEMENT IN PAGE @V304298 01008000
ST R4,SAVREG SAVE IT TEMPORARILY @V304235 01009000
SR R4,R4 ZERO IT FOR THE NEXT DIVIDE @V304298 01010000
D R4,PAGPCYL GET CYL AND PAGE @V304298 01011000
LR R3,R5 CYLINDER NUMBER @V304298 01012000
AH R3,CKSSTART GET ABSOLUTE CYLINDER NUMBER @V304298 01013000
SLL R3,16 GET IT IN POSITION @V304298 01014000
OR R3,R4 PAGE NUMBER - 1 @V304298 01015000
AL R3,F1 INCREMENT PG NUMBER, LEAVE CYL @VA05106 01016100
L R4,SAVREG RESTORE DISPLACEMENT @V304235 01017000
LR R5,R15 PUT IT IN PERMANENT PLACE @V304298 01018000
TM FNDSLOT,0 SET CC=0 @V304298 01019000
BR R6 RETURN @V304298 01020000
FSLOTRT1 TM *,X'FF' SET CC=1 @V304298 01021000
BR R6 RETURN @V304298 01022000
EJECT 01023000
*********************************************************************** 01024000
* 01025000
* CKSINIT - 01026000
* THIS ROUTINE GETS A VIRTUAL PAGE ADDRESS FOR AND BRINGS 01027000
* IN THE CHECKPOINT SLOT MAP. THE FOLLOWING PROGRAM 01028000
* CONSTANTS ARE ALSO DEVELOPED HERE: 01029000
* 01030000
* MAXSLOTS - MAX NUMBER OF SLOTS AVAILABLE FOR CHECKPOINT 01031000
* USE 01032000
* SLOT90P - NUMBER OF SLOTS WHICH MUST BE IN USE BEFORE 01033000
* ISSUING DMKCKS401I (CHECKPOINT CYL 90% FULL) 01034000
* SLOT90R - NUMBER OF SLOTS WHICH MUST BE AVAILABLE AFTER 01035000
* DMKCKS401I HAS BEEN ISSUED BEFORE ISSUING IT 01036000
* AGAIN < C(SLOT90P)-24 > 01037000
* R10 - INTIALIZED TO 1ST CHECKPOINT RECORD FOR CALLS 01038000
* TO ROUTINE 'NEXTCYL'. 01039000
* 01040000
* THIS SUBROUTINE IS CALLLED BY DMKCKSIN AND DMKCKSWM. 01041000
* NO ERROR CONDITIONS ARE RETRUN BY THIS ROUTINE. 01042000
* 01043000
* CKSINITM - 01044000
* ROUTINE TO READ IN AND LOCK THE CHECKPOINT SLOT MAP. 01045000
* THIS ROUTINE IS CAALED BY DMKCKSPL. 01046000
* 01047000
**************************************************************** 01048000
SPACE 01049000
CKSINIT DS 0H @V304235 01050000
XC SAVEWRK2(32),SAVEWRK2 CLEAR WORK AREAS @V304235 01051000
CALL DMKPGTVG GET VIRTUAL PAGE FOR MAP @V304235 01052000
ST R1,DMKCKSMP SAVE IT FOR EVERYBODY @V304235 01053000
L R1,=A(DMKSYSCH) ADDRESS OF CHECKPOINT CYLINDER @V304235 01054000
MVC CKSSTART(4),0(R1) SAVE CHECKPOINT CYLINDERS @V304235 01055000
ST R6,SAVREG SAVE RETURN ADDRESS OVER CALL @V304235 01056000
LH R1,4(,R1) Get CUU of CKP area volume HRC075DK 01057000
CALL DMKSCNRU LOCATE RDEVBLOK @V304235 01058000
L R6,SAVREG RESTORE RETURN ADDRESS @V304235 01059000
USING RDEVBLOK,R8 @V304235 01060000
MVC CODSLOT(1),RDEVCODE+1 MOVE IN DEVICE CODE @V304235 01061000
MVC CKPTDVCD(1),RDEVCODE+1 SAVE IT @VM02131 01062000
LA R15,57 ASSUME IT IS A 3330 @V304235 01063000
CLI RDEVTYPE,TYP3330 IS IT ? @V304235 01064000
BE CSLOT0 XFER IF SO @V304235 01065000
LA R15,120 ASSUME IT IS A 3350 @V304498 01066000
CLI RDEVTYPE,TYP3350 IS IT ? @V304498 01067000
BE CSLOT0 XFER IF SO @V304498 01068000
LA R15,96 Assume it is a 3375 HRC106DK 01068100
CLI RDEVTYPE,TYP3375 Is it ? HRC106DK 01068200
BE CSLOT0 Xfer if so HRC106DK 01068300
LA R15,150 Assume it is a 3380 HRC106DK 01068400
CLI RDEVTYPE,TYP3380 Is it ? HRC106DK 01068500
BE CSLOT0 Xfer if so HRC106DK 01068600
LA R15,32 ASSUME IT IS A 2314 @V304235 01069000
CLI RDEVTYPE,TYP2314 IS IT ? @V304235 01070000
BE CSLOT0 XFER IF SO @V304235 01071000
LA R15,24 THEN IT IS A 2305 OR 3340 @V304235 01072000
CSLOT0 ST R15,PAGPCYL PAGES PER CYL FOR IPL DEVICE @V304235 01073000
LH R1,CKSEND ENDING CHECKPOINT CYLINDER @V304235 01074000
SH R1,CKSSTART STARTING CYLINDER @V304235 01075000
LA R1,1(,R1) NUMBER OF CHECKPOINT CYLS @V304235 01076000
MR R14,R1 NUMBER OF PAGES OF CHECKPOINT @V304235 01077000
ST R15,MAXPAG SAVE IT @V304235 01078000
MH R15,SLOTPPAG+2 GET MAXIMUM NUM OF SLOTS @V304235 01079000
C R15,MAXSLOTS GT PERMISSABLE MAX ? @V304235 01080000
BNL CSLOT1 IF SO, WE ALREADY HAVE MAX VALUE @V304235 01081000
ST R15,MAXSLOTS SAVE NEW MAX SLOT VALUE @V304235 01082000
L R15,MAXSLOTS GET MAXIMUM NUM OF SLOTS @V304235 01083000
SR R14,R14 CALC 90% VALUE @V304235 01084000
D R14,F10 . @V304235 01085000
L R14,MAXSLOTS .. @V304235 01086000
SR R14,R15 ... @V304235 01087000
STH R14,SLOT90P .... @V304235 01088000
S R14,F24 VALUE WE MUST REACH BEFORE @V304235 01089000
STH R14,SLOT90R RE-ISSUING 90% MSG @V304235 01090000
CSLOT1 L R2,=A(DMKSYSCN) @ OF SLOT MAP USAGE COUNT @V304235 01091000
XC 0(2,R2),0(R2) ZERO IT OUT TO BE SURE @V304235 01092000
DROP R8 @V304235 01093000
SR R10,R10 STARTING PAGE NUMBER - 1 @VM02131 01094000
ICM R10,B'1100',CKSSTART STARTING CYLINDER @VM02131 01095000
SPACE 01096000
CKSINITM EQU * @VM02131 01097000
L R1,DMKCKSMP GET MAP @V304235 01098000
TRANS 2,1,OPT=(BRING,DEFER,LOCK,SYSTEM) @V304235 01099000
ST R2,RADDMAP SAVE ITS REAL ADDRESS @V304235 01100000
BR R6 RETURN TO CALLER @V304235 01101000
EJECT 01102000
*********************************************************************** 01103000
* 01104000
* NEXTCYL - 01105000
* THIS ROUTINE UPDATES THE 'CCPD' TO THE NEXT LOGICAL 01106000
* CHECKPOINT RECORD. 01107000
* 01108000
* INPUT - R10=CCPP 01109000
* CC = CURRENT CYLINDER NUMBER 01110000
* PP = CURRENT PAGE NUMBER 01111000
* 01112000
* OUTPUT - R10 -> NEXT LOGICAL RECORD 01113000
* LOCATIONS CYLSLOT & PAGSLOT UPDATED 01114000
* 01115000
* EXIT CONDITIONS - 01116000
* R6+4 - NEXT RECORD VALID 01117000
* R6+0 - NEXT RECORD INVALID 01118000
* (OUT OF RANGE OF CHECKPOINT CYL) 01119000
* 01120000
*********************************************************************** 01121000
SPACE 01122000
NEXTCYL DS 0H @VM02131 01123000
NEXTCYL0 AL R10,F1 NEXT PAGE @VM02131 01124000
CLM R10,B'0011',PAGPCYL+2 FINISHED THIS CYLINDER? @VM02131 01125000
BNH NEXTCYL1 XFER IF NOT @VM02131 01126000
SRL R10,16 CYL NUM IN LOW ORDER @VM02131 01127000
LA R10,1(,R10) GO TO NEXT CYL @VM02131 01128000
CH R10,CKSEND ARE WE PAST THE LAST CYL? @VM02131 01129000
BHR R6 EXIT IF SO @VM02131 01130000
SLL R10,16 GET IT BACK IN POSITION @VM02131 01131000
B NEXTCYL0 START LOOP AGAIN @VM02131 01132000
SPACE 01133000
NEXTCYL1 EQU * @VM02131 01134000
STC R10,PAGSLOT GET THE PAGE IN CORE @VM02131 01135000
STCM R10,B'1100',CYLSLOT GET CYLINDER NUMBER @VM02131 01136000
B 4(R6) RETURN @VM02131 01137000
EJECT 01138000
*********************************************************************** 01139000
* 01140000
* ALOCIT - 01141000
* THIS SUBROUTINE SETS UP THE ALLOCATION BLOCKS FOR ALL 01142000
* SPOOL FILE DASD BUFFERS. 01143000
* INPUT - 01144000
* GPR1 = CCPD FOR THE PAGE TO BE ALLOCATED 01145000
* OUTPUT - 01146000
* THE GIVEN PAGE HAS ITS ALLOCATION BLOCKS SET UP 01147000
* NOTES - 01148000
* REGISTERS 0, 8, 14 AND 15 ARE USED BY THIS ROUTINE 01149000
* AS IS SAVEWRK1. 01150000
*********************************************************************** 01151000
ALOCIT LA R8,X'FF' MASK TO STRIP ALL BUT DEVICE CODE@V304298 01152000
NR R8,R1 DEVICE CODE IN REG 8 @V304298 01153000
ST R1,SAVEWRK1 SAVE IT FOR LATER @VA07295 01153050
L R1,=A(DMKSYSOC) GET NUMBER OF OWNED DEVICES @VA07295 01153150
CL R8,0(R1) WITHIN RANGE ? @VA07295 01153250
BNL MSG916E NO,BAD DEVICE CODE @VA07295 01153350
SLL R8,3 DEVICE CODE TIMES 8 @V304298 01154000
A R8,=A(DMKSYSOW) POINT TO OWNED LIST ENTRY @V304298 01155000
LA R0,OWNDVSER-OWNDLIST(,R8) POINT TO VOLID @V304298 01156000
LH R8,OWNDRDEV-OWNDLIST(,R8) POINT TO RDEVBLOK @V304298 01157000
LTR R8,R8 IS THE VOLUME MOUNTED ? @V304298 01158000
BM MSG912W ERROR IF NOT @V305435 01159000
SLL R8,3 CONVERT TO BYTE INDEX @V304298 01160000
A R8,ARIODV REALLY POINT TO IT @V304298 01161000
* WE NOW HAVE THE RDEVBLOK 01162000
L R1,SAVEWRK1 RESTORE R1 @VA07295 01163050
USING RDEVBLOK,R8 @V304298 01164000
TM RDEVFLAG,RDEVPREF PAGING ONLY VOLUME ? @VA07295 01164050
BO MSG916E YES,MUST BE BAD DEVICE CODE @VA07295 01164150
USING RECBLOK,R14 @V304298 01165000
L R14,RDEVRECS GET THE RECBLOK CHAIN @V304298 01166000
LOOPREC LTR R14,R14 IS THERE ANOTHER RECBLOK ? @V304298 01167000
BZ NEWCYL MUST ALLOCATE ANOTHER CYL NOW @V304298 01168000
CLM R1,B'1100',RECCYL IS IT FOR THIS CYLINDER ? @V304298 01169000
BE ALOCPAG GO ALLOCATE THE PAGE @V304298 01170000
L R14,RECPNT GET NEXT RECBLOK @V304298 01171000
B LOOPREC SEE IF THIS IS THE ONE @V304298 01172000
DROP R14 @V304298 01173000
SPACE 3 01174000
* IF WE GET HERE, THEN A NEW RECBLOK MUST BE CREATED FOR A 01175000
* NEWLY ALLOCATED CYLINDER, GPR 8 HAS THE RDEVBLOK 01176000
* RDEVALLN HAS ADDR OF ALLOCATION RECD CREATED BY DMKCPI 01177000
* +----+--+--+--+--+--+--+--+--+ 01178000
* |CYLS|00|01|02|03|04|- |- |FF| 01179000
* +----+--+--+--+--+--+--+--+--+ 01180000
SPACE 01181000
NEWCYL LA R0,RDEVSER POINT TO VOLID @VM03200 01182000
L R15,RDEVALLN POINTER TO ALLOCATION RECORD @VM03200 01183000
LTR R15,R15 ANY ALLOCATION DATA ? @V304298 01184000
BZ MSG912W PROBABLY NOT MOUNTED @V305435 01185000
SRL R1,16 SHIFT CYL NUM TO LOW ORDER @V304298 01186000
CH R1,0(R15) CYL NUMBER VALID ( < MAXCYL) ? @VA08528 01186100
BH MSG916E NO, BAD CYLINDER NUMBER @VA08528 01186200
LA R14,2(R1,R15) POINT TO CORRECT CYLINDER BYTE @V304298 01187000
CLI 0(R14),0 IS IS ALREADY ALLOCATED ? @V304298 01188000
BE TMPALLOC NO, MARK TEMP IN USE @VM00019 01189000
CLI 0(R14),TEMP IS IT ALREADY ALLOCATED? @VM00019 01189100
BNE MSG903E NO GOOD IF ALREADY ALLOCATED @VM00019 01189200
TMPALLOC MVI 0(R14),ALLOC MARK AS TEMP ALLOCATED @VM00019 01189300
SPACE 2 01191000
* BUILD A RECBLOK FOR THE NEWLY ALLOCATED CYLINDER 01192000
LA R0,RECSIZE LENGTH OF RECBLOK @V304298 01193000
CALL DMKFREE GET STORAGE @V304298 01194000
USING RECBLOK,R1 TEMPORARILY @V304298 01195000
ST R8,RECPNT SAVE R8 TEMPORARILY @V304298 01196000
MVC RECCYL,SAVEWRK1 MOVE IN THE CYL NUMBER @V304298 01197000
MVI RECUSED,X'00' NO PAGES IN USE YET @V304298 01198000
LA R15,57 ASSUME A 3330 @V304298 01199000
CLI RDEVTYPE,TYP3330 IS IT ? @V304298 01200000
BE NEWRECB XFER IF SO @V304298 01201000
LA R15,120 ASSUME A 3350 @V304498 01202000
CLI RDEVTYPE,TYP3350 IS IT A 3350 ? @V304498 01203000
BE NEWRECB XFER IF SO @V304498 01204000
LA R15,96 Assume a 3375 HRC106DK 01204100
CLI RDEVTYPE,TYP3375 Is it a 3375 ? HRC106DK 01204200
BE NEWRECB Xfer if so HRC106DK 01204300
LA R15,150 Assume a 3380 HRC106DK 01204400
CLI RDEVTYPE,TYP3380 Is it a 3380 ? HRC106DK 01204500
BE NEWRECB Xfer if so HRC106DK 01204600
LA R15,32 ASSUME A 2314 @V304298 01205000
CLI RDEVTYPE,TYP2314 IS IT ? @V304298 01206000
BE NEWRECB XFER IF SO @V304298 01207000
LA R15,24 THEN IT IS A 2305 OR 3340 @V304298 01208000
NEWRECB DS 0H @V304298 01209000
STC R15,RECMAX MAX NUMBER OF PAGES @V304298 01210000
LR R8,R15 SAVE NUMBER OF PAGES @V304498 01212000
LM R14,R15,FFS SET UP BIT MAP @V304498 01213000
CH R8,=H'64' 'Small' no. of pages per cyl.? HRC106DK 01214100
BL SMALLPPC Use the beginning of RECMAP HRC106DK 01214600
CH R8,=H'128' 'Medium' no. of pages per cyl.? HRC106DK 01215100
BL MIDPPC Use the middle of RECMAP HRC106DK 01215600
SH R8,=H'128' Get rid of bits accounted for HRC106DK 01216100
XC RECMAP(16),RECMAP Clear start, middle of RECMAP HRC106DK 01216600
SRDL R14,0(R8) Insert one zero per avail. page HRC106DK 01217100
STM R14,R15,RECMAP+16 Set up end of RECMAP HRC106DK 01217600
B MAPFIN RECMAP completely set up HRC106DK 01218100
MIDPPC SH R8,=H'64' Get rid of bits accounted for HRC106DK 01218600
STM R14,R15,RECMAP+16 Set all bits at end of RECMAP HRC106DK 01219100
SRDL R14,0(R8) Insert one zero per avail. page HRC106DK 01219600
STM R14,R15,RECMAP+8 Set up middle of RECMAP HRC106DK 01220100
XC RECMAP(8),RECMAP Clear beginning of RECMAP HRC106DK 01220600
B MAPFIN RECMAP completely set up HRC106DK 01221100
SMALLPPC STM R14,R15,RECMAP+16 Set all bits at end of RECMAP HRC106DK 01221600
STM R14,R15,RECMAP+8 Set all bits in RECMAP middle HRC106DK 01222100
SRDL R14,0(R8) Insert one zero per avail. page HRC106DK 01222600
STM R14,R15,RECMAP Set up beginning of RECMAP HRC106DK 01223100
MAPFIN EQU * @V304498 01226000
L R8,RECPNT RESTORE REG 8 @V304298 01227000
L R14,=A(DMKPGTTU) INCREMENT TOTAL CYLS IN USE @V304298 01228000
L R15,0(,R14) GET IT @V304298 01229000
LA R15,1(R15) INCREMENT IT @V304298 01230000
ST R15,0(,R14) STORE IT @V304298 01231000
SPACE 2 01232000
* NOW CHAIN THE RECBLOK INTO THE RDEVRECS CHAIN 01233000
DROP R1 @V304298 01234000
USING RECBLOK,R14 BACK TO NORMAL @V304298 01235000
LR R14,R1 SAVE RECBLOK ADDRESS @V304298 01236000
SR R1,R1 CLEAR IT @V304298 01237000
CH R1,RECCYL ALLOCATING ON CYL 0 ? @V304298 01238000
BNE CHAINIT NO --WE'RE ALL SET THEN @V304298 01239000
IC R1,RECMAX GET NUMBER OF RECORDS PER TRACK @V304498 01240000
CLI RECMAX,64 Is this a 'large' device? HRC106DK 01241100
BNH OTHERDEV Reserve only three pages HRC106DK 01242100
MVI RECMAP,B'11110000' MARK PAGES AS ALLOCATED @V304498 01243000
SL R1,F4 ADJUST THE RECORD COUNT @V304498 01244000
B SAVETOT SAVE NEW RECORD COUNT @V304498 01245000
OTHERDEV MVI RECMAP,B'11100000' MARK FIRST 3 PAGES ALLOCATED @V304498 01246000
SL R1,F3 ADJUST THE RECORD COUNT @V304498 01247000
SAVETOT STC R1,RECMAX STORE THE NEW COUNT @V304498 01248000
SPACE 2 01249000
* CHAIN THIS RECBLOK INTO THE RDEVRECS CHAIN IN PROPER ORDER. 01250000
* THIS ORDER IS BASED ON DISTANCE OF CYLINDER FROM 01251000
* CENTER OF DISK. 01252000
CHAINIT L R1,RDEVALLN GET ALOCBLOK @V304298 01253000
LH R0,0(,R1) NUMBER OF CYLINDERS @V304298 01254000
SRL R0,1 GET MIDDLE CYLINDER @V304298 01255000
STH R0,MIDCYL SAVE IT @V304298 01256000
SH R0,RECCYL GET CURRENT DISPLACEMENT @V304298 01257000
LPR R0,R0 MAKE IT POSITIVE @V304298 01258000
STH R0,CURDISP SAVE IT @V304298 01259000
LA R1,RDEVRECS PREVIOUS RECBLOK @V304298 01260000
L R15,RDEVRECS POINT TO FIRST RECBLOK @V304298 01261000
B LOOPIT6 MAKE THE TEST @V304298 01262000
LOOPIT5 LH R0,RECCYL-RECBLOK(,R15) GET DISP OF THIS RECBLOK@V304298 01263000
SH R0,MIDCYL SUBTRACT MIDDLE CYLINDER @V304298 01264000
LPR R0,R0 MAKE IT POSITIVE @V304298 01265000
CH R0,CURDISP IS IT BIGGER THAN OURS ? @V304298 01266000
BH CHAINT IF SO, GO CHAIN IT @V304298 01267000
LR R1,R15 NEW PREVIOUS RECBLOK @V304298 01268000
L R15,RECPNT-RECBLOK(,R15) NEXT RECBLOK ON CHAIN @V304298 01269000
LOOPIT6 LTR R15,R15 ARE WE AT THE END YET ? @V304298 01270000
BNZ LOOPIT5 XFER IF NOT @V304298 01271000
SPACE 01272000
CHAINT ST R15,RECPNT WE POINT TO NEXT RECBLOK @V304298 01273000
ST R14,RECPNT-RECBLOK(,R1) PREVIOUS POINTS TO US @V304298 01274000
L R1,SAVEWRK1 RESTORE CCPD TO REG 1 @V304298 01275000
SPACE 4 01276000
* NOW WE ALLOCATE THE PAGE ON THE GIVEN CYLINDER 01277000
* AT THIS POINT GPR 14 POINTS TO THE RECBLOK IN QUESTION 01278000
* IN ADDITION, REGISTER 1 HAS THE CCPD TO BE ALLOCATED 01279000
ALOCPAG DS 0H @V304298 01280000
SR R15,R15 CLEAR WORKL REGISTER @V304298 01281000
IC R15,RECUSED GET NUMB OF RECDS IN USE @V304298 01282000
CLC RECUSED(1),RECMAX ARE WE AT MAXIMUM OR ABOVE @V304298 01283000
* IT ? 01284000
BNL MSG916E SOMETHING WRONG IF SO @V304298 01285000
LA R15,1(,R15) INCREMENT RECS IN USE @V304298 01286000
STC R15,RECUSED SAVE IT @V304298 01287000
SPACE 2 01288000
* GET THE PAGE NUMBER ISOLATED 01289000
SRL R1,8 PAGE IN LOW ORDER OF R1 @V304298 01290000
N R1,F255 GET RID OF CYLINDER @V304298 01291000
BCTR R1,0 PAGE NUMBER RELATIVE TO ZERO @V304298 01292000
LR R0,R1 INTO REG 0 FOR SHIFTING @V304298 01293000
SRDL R0,3 DIVIDE BY 8 @V304298 01294000
SRL R1,29 GET REMAINDER @V304298 01295000
IC R1,ALLOCTBL(R1) GET BIT MASK TO ALLOCATE @V304298 01296000
LA R15,RECMAP START OF PAGE MAP @V304298 01297000
ALR R15,R0 POINT TO BYTE CONTAINING BIT @V304298 01298000
EX R1,TEST ALREADY ALLOCATED ? @V304298 01299000
BNZ MSG916E SOMETHING WRONG IF SO @V304298 01300000
EX R1,ALLOCATE ALLOCATE THE PAGE @V304298 01301000
L R1,SAVEWRK1 RESTORE REGISTER 1 @V304298 01302000
BR R6 RETURN WITH PAGE ALLOCATED @V304298 01303000
EJECT 01304000
* 01305000
* ERROR MESSAGES AND WAIT STATES 01306000
* 01307000
SPACE 2 01308000
MSG400I EQU * CHECKPOINT AREA IS FULL @VM03037 01309000
MVI DMKCKSSW,CKPTSTOP STOP CHECKPOINTING @VA08189 01309500
LA R2,400 ERROR CODE .... @V304235 01310000
LA R1,CKPTTXT @ VARIABLE TEXT @V304235 01311000
LA R0,CKPTMSGL LENGTH OF VARIABLE TEXT @V304235 01312000
BAL R15,PUTMSGI DISPLAY ERROR MESSAGE @VM03037 01313000
* NOW INVALIDATE THE CHECKPOINT CYLINDER 01314000
SPACE 01315000
STOP1 MVI DMKCKSSW,CKPTSTOP STOP CHECKPOINTING @VM02131 01316000
MVC CYLSLOT(2),CKSSTART FIRST CYLINDER @V304235 01317000
MVI PAGSLOT,X'01' FIRST PAGE @V304235 01318000
BAL R6,GETSLOT BRING IT INTO CORE @V304235 01319000
L R4,RADDSLOT ADDRESSIBILITY @V304235 01320000
MVC 0(4,R4),ZEROES INVALIDATE IT @V304235 01321000
BAL R6,PUTSLOT WRITE IT BACK TO DASD @V304235 01322000
B MSG919E @V304235 01323000
SPACE 01324000
MSG401I EQU * CHECKPOINT SPACE 90 % FULL @V304235 01325000
LA R2,401 ERROR CODE @V304235 01326000
LA R1,CKPTTXT VARIABLE PORTION OF TEXT @V304235 01327000
LA R0,CKPTMSGL LENGTH OF VARIABLE PORTION @V304235 01328000
BAL R15,PUTMSGI DISPLAY MSG ... @V304235 01329000
OI DMKCKSSW,MSG90ISU IND 90% MSG ISSUED @VM02131 01330000
BR R6 RETURN TO CALLER @V304235 01331000
SPACE 01332000
MSG903E EQU * ALLOC ON NON-TEMP CYLINDER @V304235 01333000
LA R2,903 ERROR CODE @V304235 01334000
XC SAVEWRK7(L'SAVEWRK7*3),SAVEWRK7 MSG AREA @VM03200 01335000
LR R15,R0 ADDRESS OF VOLID @VM03200 01336000
MVC SAVEWRK7(L'RDEVSER),RDEVSER-RDEVSER(R15) VOLID @VM03200 01337000
CALL DMKCVTBD CONVERT CYL. NUMBER TO DECIMAL @VM03200 01338000
STCM R1,7,SAVEWRK9 SAVE CYLINDER NUMBER @VM03200 01339000
LA R1,SAVEWRK7 ADDRESS OF ERROR MESSAGE @VM03200 01340000
LA R0,L'SAVEWRK7*3 AND ITS LENGTH @VM03200 01341000
BAL R15,PUTMSGW DISPLAY MSG @V304235 01342000
B CNSWAIT @V304235 01343000
SPACE 01344000
MSG912W EQU * VOLUME NOT MOUNTED FOR ALLOC @V304235 01345000
LA R2,912 ERROR CODE @V304235 01346000
XC SAVEWRK7(L'SAVEWRK7*2),SAVEWRK7 CLEAR MSG AREA @V304298 01347000
LR R15,R0 ADDRESS OF VOLID @VM03200 01348000
MVC SAVEWRK7(L'RDEVSER),RDEVSER-RDEVSER(R15) SV VOLI@V304298 01349000
LA R1,SAVEWRK7 ADDRESS OF VARIABLE DATA @VM03200 01350000
LA R0,L'RDEVSER LENGTH OF MESSAGE @VM03200 01351000
BAL R15,PUTMSGW DISPLAY MSG @V304235 01352000
B CNSWAIT @V304235 01353000
EJECT 01354000
SPACE 01355000
MSG915E EQU * PERM I/O ERROR ON CKPT CYL @V304235 01356000
BAL R6,PUTSLOT0 FREE UP VM SPACE AND CCPD @VM02131 01357000
LA R2,915 ERROR CODE @V304235 01358000
SR R1,R1 @V304235 01359000
BAL R15,PUTMSGE @V304235 01360000
LA R1,CKSLOCK ADDRESS OF ROUTINE LOCK @V304235 01361000
CALL DMKLOCKT IS THE LOCK ON ? @V304235 01362000
BZ STOP2 WE ARE RECOVERING IF NOT @V304235 01363000
CLI DMKCKSSW,CKPTSTOP TRYING TO INVALIDATE CKPT @VM02131 01364000
BE MSG919E CYL ?, IF SO, JUST SEND MESSAGE @VM02131 01365000
B STOP1 ELSE, INVALIDATE CKPT CYL FIRST @VM02131 01366000
STOP2 TM PARM2,CKPT IS IT 'CKPT' OPTION ? @VM02131 01367000
BO CNSWAIT NO - LOAD DISABLE WAIT STATE PSW @VM03268 01368000
* WE ARE ONLY CALLED FROM GETSLOT AND PUTSLOT 01369000
* SET CC¬=0 AND RETURN VIA GPR 6 01370000
CLI PAGSLOT,X'01' ERROR OCCURRING ON FIRST PAGE ? @VM02131 01371000
BNE CKSWM1 NO ..., CONTINUE WITH "FORCE" @VM02131 01372000
CLC CYLSLOT(2),CKSSTART WAS IT RECORD 1 ?? @VM02131 01373000
BNE CKSWM1 NO ..., CONTINUE WITH "FORCE" @VM02131 01374000
B CNSWAIT ELSE, END IT ALL ............. @VM02131 01375000
SPACE 01376000
MSG916E EQU * ERROR ALLOCATING A FILE @V304235 01377000
LA R2,916 ERROR CODE @V304235 01378000
SR R1,R1 @V304235 01379000
BAL R15,PUTMSGE DISPLAY MSG @V304235 01380000
MVI DMKCKSSW,CKPTSTOP STOP CHECKPOINTING @V304235 01381000
TM PARM2,FORCE IS IT A FORCE ? @V304235 01382000
BO CKSWM6A1 DELETE THE FILE IF SO @V304235 01383000
B CNSWAIT OTHERWISE, LOAD DISABLE PSW @V303250 01384000
SPACE 01385000
MSG917E EQU * CHECKPOINT CYL INVALID @V304235 01386000
LA R2,917 ERROR CODE @V304235 01387000
SR R1,R1 @V304235 01388000
BAL R15,PUTMSGE DISPLAY MSG @V304235 01389000
CALL DMKQCNSY WAIT FOR OUPUT TO COMPLETE HRC035DK 01390190
LA R2,8 HRC035DK 01390380
ST R2,SAVER2 HRC035DK 01390570
B CKSEXIT HRC035DK 01390760
SPACE 01391000
MSG919E EQU * CHECKPOINT TERMINATED @V304235 01392000
LA R2,919 ERROR CODE @V304235 01393000
SR R1,R1 @V304235 01394000
BAL R15,PUTMSGE DISPLAY MSG @V304235 01395000
B CKSEXIT EXIT TO CALLER @V304235 01396000
SPACE 01397000
CNSWAIT EQU * @V304235 01398000
CALL DMKQCNSY WAIT FOR OUPUT TO COMPLETE @V304235 01399000
LPSW PSW00E DISABLE WAIT STATE @VM03268 01400000
EJECT 01401000
PUTMSGE O R2,MSGTYPE SET PARMS FOR 'E' TYPE MSG @V304235 01402000
B PUTMSG @V304235 01403000
PUTMSGW O R2,MSGTYPW SET PARMS FOR 'W' TYPE MSG @V304235 01404000
B PUTMSG @V304235 01405000
PUTMSGI O R2,MSGTYPI SET PARMS FOR 'I' TYPE MSG @V304235 01406000
SPACE 01407000
PUTMSG ICM R0,B'1110',DMKCKS+3 MODULE ID @V304235 01408000
ST R15,SAVREG15 SAVE RETURN @ @V304235 01409000
CALL DMKERMSG @V304235 01410000
L R15,SAVREG15 RESTORE RETURN @ @V304235 01411000
BR R15 RETURN @V304235 01412000
SPACE 01413000
PSW00E DS 0D @V304298 01414000
DC X'000A00000000000E' WAIT STATE CODE E @V304298 01415000
EJECT 01416000
COPY SAVE @V304298 01417000
DMKCKS CSECT , @V304298 01418000
EJECT 01419000
*********************************************************************** 01420000
* 01421000
* CONSTANTS AND WORK AREAS 01422000
* 01423000
*********************************************************************** 01424000
SPACE 01425000
RADDMAP EQU SAVEWRK2 REAL ADDR OF MAP BUFFER @V304298 01426000
PARM1 EQU SAVER2+2 PARMS PASSED BY CALLER @V304235 01427000
PARM2 EQU SAVER2+3 PARMS PASSED BY CALLER @V304235 01428000
SPACE 1 01429000
* ADDITIONAL BITS DEFINED IN 'PARM2' 01430000
FORCE EQU X'40' 'FORCE' A CHECKPOINT/RESTART @V304235 01431000
CKPT EQU X'20' RESTART FROM CHECKPOINT CYLINDER @V304235 01432000
WARMAUTO EQU X'10' AUTOMATIC WARM START RECOVERY @V304235 01433000
SHUTDOWN EQU X'08' SHUTDOWN THE SYSTEM @V304235 01434000
DRAIN EQU X'04' 'DRAIN' THE SPOOLING DEVICES @V304235 01435000
WARM EQU X'02' 'WARM' GIVEN FROM IPL'D FROM @V304235 01436000
* OPERATOR 01437000
COLD EQU X'01' CLEAR THE WARM/CHECKPOINT @V304235 01438000
* CYLINDERS 01439000
TEMP EQU X'08' TEMP SPACE @VM00019 01439100
ALLOC EQU X'80' ALLOCATE TEMPORARILY @VM00019 01439200
SPACE 1 01440000
SPACE 01441000
CCPDSLOT EQU SAVEWRK3 SLOT DASD ADDRESS @V304298 01442000
CYLSLOT EQU SAVEWRK3 CHECKPOINT CYLINDER NUMBER @V304298 01443000
PAGSLOT EQU SAVEWRK3+2 PAGE NUMBER OF SLOT @V304298 01444000
CODSLOT EQU SAVEWRK3+3 DEVICE CODE FOR SLOT @V304298 01445000
VPAGSLOT EQU SAVEWRK4 VIRT ADDR OF SLOT BUFFER @V304298 01446000
RADDSLOT EQU SAVEWRK5 REAL ADDR OF SLOT BUFFER @V304298 01447000
CCPDBUFF EQU SAVEWRK6 BUFFER DASD ADDRESS @V304298 01448000
CYLBUFF EQU SAVEWRK6 CHECKPOINT CYLINDER NUMBER @V304298 01449000
PAGBUFF EQU SAVEWRK6+2 PAGE NUMBER FOR BUFFER @V304298 01450000
CODBUFF EQU SAVEWRK6+3 DEVICE CODE FOR BUFFER @V304298 01451000
VPAGBUFF EQU SAVEWRK7 VIRT ADDR OF BUFFER @V304298 01452000
RADDBUFF EQU SAVEWRK8 READ ADDR OF BUFFER @V304298 01453000
SAVREG EQU SAVEWRK8 TEMP REG SAVE AREA FOR FINDSLOT @V304235 01454000
TOPSLOT EQU SAVEWRK9 LOCATION OF DELIMITER @V304298 01455000
SPACE 1 01456000
DS 0H @VM02131 01457000
MAPFREE DS 0XL2 MAP ENTRY HAS NOT BEEN ALLOCATED @VM02131 01458000
SLOTFREE DC X'FFFFFFFF' DASD SLOT ENTRY NOT ALLOCATED @VM02131 01459000
SLOTDEV DC X'EEEEEEEE' DASD SLOT CONTAINS REAL DEVICE @VM02131 01460000
MAPSHQ DS 0XL2 MAP USED FOR SPOOL HOLD QUEUE @VM02131 01461000
* INFO. 01462000
SLOTSHQ DC X'AAAAAAAA' DASD SLOT CONTAINS SPOOL HOLD @VM02131 01463000
* QUEUE BLOK 01464000
MAPEND DC X'FEFE' LAST MAP ENTRY ALLOCATED (END @VM02131 01465000
* OF LIST) 01466000
EJECT 01467000
CKPTSTOP EQU X'FF' TERMINATE RECORDING OF @V304235 01468000
CKPTTXT DC C'CHECKPOINT' VARIABLE PORTION OF MSG 400 & 401@V304235 01469000
CKPTMSGL EQU *-CKPTTXT @V304235 01470000
DS 0F @V304235 01471000
MSGTYPE DC X'B8C50000' - E TYPE MSG PARM FOR DMKERM @V304235 01472000
MSGTYPW DC X'B8E60000' - W TYPE MSG PARM FOR DMKERM @V304235 01473000
MSGTYPI DC X'B8C90000' - I TYPE MSG PARM FOR DMKERM @V304235 01474000
SAVREG15 DS F - REG SAVE AREA FOR PUTMSG @V304235 01475000
* CHECKPOINT RECORDS 01476000
MSG90ISU EQU X'F0' 90% FULL MSG ISSUED FLAG @V304235 01477000
SPACE 01478000
DMKCKSMP DC A(0) VADDR OF CKPNT CYL MAP @V304298 01479000
CKSSTART DC H'0' STARTING CHECKPOINT CYLINDER @V304298 01480000
CKSEND DC H'0' ENDING CHECKPOINT CYLINDER @V304298 01481000
PAGPCYL DC F'0' PAGES PER CYL FOR IPL DEVICE @V304298 01482000
SLOTPPAG DC F'36' SFBLOKS PER PAGE @VA12674 01483100
MAXPAG DC F'57' MAXIMUM PAGES FOR SLOTS @V304298 01484000
MAXSLOTS DC F'2048' MAX SFBLOKS THAT CAN BE STORED @V304298 01485000
ENTRYSIZ DC H'104' SFBSIZE*8 (SFBLOK IN BYTES) @VA12674 01486100
CYLNO DC H'202' CHECKPOINT CYLINDER NUMBER @V304298 01487000
CKSLOCK DC CL8'<SPLCHK>' LOCK FOR THIS ROUTINE @V304298 01488000
MAXFILE DC F'9900' - MAX SPOOL FILE ID NUMBER @V304235 01489000
SLOT90P DC AL2(2048-(2048/10)) 90% OF MAX NUMBER OF SLOTS @V304235 01490000
SLOT90R DC AL2(2048-(2048/10)-24) 90% MSG GRACE VALUE .. @V304235 01491000
* THE ABOVE FIGURE IS THE NUMBER OF SLOTS THAT 01492000
* MUST BE REACHED AFTER A 90% FULL CONDITION IS 01493000
* REACHED BEFORE WE WILL AGAIN ISSUE DMKCKS401I. 01494000
* THIS SHOULD PREVENT THE OPERATOR FROM BEING 01495000
* INUNDATED WITH MESSAGES WHILE SPOOL FILE 01496000
* ACTIVITY IS OCCURING AROUND THE 90% MARK. 01497000
PREVBUFF DS F CCPD OF PREVIOUS VALID DASD @V304298 01498000
* BUFFER FOR OPEN SPOOL FILE 01499000
HOLDR14 DS F TEMP SAVE FOR REGS 14 & 15 @V304298 01500000
HOLDR15 DS F ACROSS CALL TO ALOCIT FOR DUMP @V304298 01501000
SPOOLID DC H'0' MAINTAIN HIGHEST ID HERE @V304298 01502000
MIDCYL DS H SAVE THE MIDDLE CYLINDER FOR @V304298 01503000
* ALOCIT 01504000
CURDISP DS H SAVE CURR. DISPL. FOR ALOCIT @V304298 01505000
EJECT 01506000
SPACE 4 01507000
ALLOCTBL EQU * BIT MAP WHOSE ENTRIES ARE LOCATED@V304298 01508000
* BY INDEXING FROM THE REMAINDER AFTER 01509000
* GETTING THE BYTE DISPLACEMENT INTO 01510000
* ALOCMAP FOR THE CYLINDER TO BE 01511000
* ALLOCATED 01512000
DC X'8040201008040201' @V304298 01513000
SPACE 01514000
TEST TM 0(R15),0 EXECUTED TO TEST IF PAGE @V304298 01515000
* HAS BEEN ALLOCATED PREMATURELY 01516000
SPACE 01517000
ALLOCATE OI 0(R15),0 EXECUTED TO MARK A PAGE @V304298 01518000
* AS ALLOCATED 01519000
SPACE 5 01520000
ENTRY DMKCKSSW @VM02131 01521000
DMKCKSSW DC X'00' SWITCH FOR CHECKPOINTING @VM02131 01522000
CKPTDVCD DC X'00' DEVICE CODE FOR CHECKPOINT CYL @VM02131 01523000
EJECT 01524000
SPACE 1 01525000
LTORG @VM03038 01526000
EJECT 01527000
SPACE 3 01528000
PSA @V304298 01529000
COPY SPOOL @V304298 01530000
COPY NPRTBL @V60B9BA 01530100
COPY VMBLOK @V304298 01531000
COPY EQU @V304298 01532000
COPY RBLOKS @V304298 01533000
COPY ALLOC @V304298 01534000
COPY DEVTYPES @V304298 01535000
END 01536000