TRK TITLE 'DMKTRK (CP) VM/370 - RELEASE 6' 00001000 ISEQ 73,80 VALIDATE INPUT SERIALIZATION @V56BDA8 00002000 *. 00003000 * 00004000 * MODULE NAME : 00005000 * 00006000 * DMKTRK 00007000 * 00008000 * CONTENTS : 00009000 * 00010000 * DMKTRKIN - TREAT INTERRUPTS CAUSED BY ALTERNATE TRACKS 00011000 * DMKTRKFP - EXAMINE COMMAND REJECTS FOR VIRTUAL SIO IO 00012000 * DMKTRKVA - VERIFY ALTERNATE TRACK ADDRESS FOR DMKCCW 00013000 * 00014000 * OPERATION : 00015000 * 00016000 * SEE INDIVIDUAL SECTIONS 00017000 * 00018000 * ERROR MESSAGES: 00019000 * 00020000 * NONE 00021000 *. 00022000 COPY OPTIONS @V56BDA8 00023000 DMKTRK CSECT @V56BDA8 00024000 SPACE 00025000 EXTRN DMKIOSQR,DMKIOSQV @V56BDA8 00026000 EXTRN DMKCCWSB TO COPY CONTROL INFORMATION @V56BDA8 00027000 EXTRN DMKUNTRN @V56BDA8 00028000 USING SAVEAREA,R13 @V56BDA8 00029000 USING PSA,R0 @V56BDA8 00030000 USING IOERBLOK,R7 ADDRESSABILITY FOR IOERBLOK @V56BDA8 00031000 USING RDEVBLOK,R8 @V56BDA8 00032000 USING IOBLOK,R10 @V56BDA8 00033000 USING VMBLOK,R11 @V56BDA8 00034000 USING DMKTRK,R12 COMMON ADDRESSABILITY @V56BDA8 00035000 EJECT 00036000 *. 00037000 * 00038000 * ENTRY POINT : DMKTRKIN 00039000 * 00040000 * 00041000 * 00042000 * FUNCTION : TO HANDLE TRACK CONDITION CHECKS FOR CP AND DIAGNOSE 00043000 * INITIATED IO. 00044000 * 00045000 * 00046000 * ATTRIBUTES : REENTRANT,RESIDENT,CALLED VIA SVC. 00047000 * 00048000 * 00049000 * ENTRY CONDITIONS : GPR3=ADDRESS OF SECOND IOERBLOK (OR 0) 00050000 * GPR7=ADDRESS OF PRIMARY IOERBLOK 00051000 * GPR8=ADDRESS OF RDEVBLOK 00052000 * GPR10=ADDRESS OF IOBLOK 00053000 * GPR12=BASE ADDRESS 00054000 * GPR13=ADDRESS OF SAVE AREA 00055000 * 00056000 * 00057000 * EXIT CONDITIONS : 00058000 * 00059000 * R1 SPECIFIES RETURN VECTOR FOR DMKDASER (SEE BELOW) 00060000 * 00061000 * 00062000 * CALLS TO OTHER ROUTINES : 00063000 * 1. DMKFREE - TO OBTAIN STORAGE FOR RECOVERY 00064000 * WORKAREAS. 00065000 * 2. DMKFRET - TO RETURN STORAGE OBTAINED BY 00066000 * DMKFRET. 00067000 * 3. DMKCCWSB - TO COPY CONTROL INFORMATION 00068000 * 4. DMKUNTRN - TO LOCATE ADDRESS OF FAILING CCW 00069000 * 00070000 * 00071000 * EXTERNAL REFERENCES : NONE 00072000 * 00073000 * 00074000 * TABLES AND WORKAREAS : 00075000 * IOBLOK 00076000 * IOERBLOK 00077000 * RCWTASK 00078000 * 00079000 * REGISTER USAGE : 00080000 * GPR 3=USED FOR TESTING RE-OCCURRING ERROR'S 00081000 * GPR 4=SCRATCH 00082000 * GPR 5=GENERAL USAGE IS FOR BAL REGISTER 00083000 * GPR 6=SCRATCH 00084000 * GPR 7=IOERBLOK ADDRESS 00085000 * GPR 8=RDEVBLOK ADDRESS. 00086000 * GPR 9=RECOVERY WORKAREA 00087000 * GPR 10=IOBLOK ADDRESS. 00088000 * GPR 11=VMBLOK ADDRESS. 00089000 * GPR 12=BASE ADDRESS. 00090000 * GPR 13=SAVE AREA ADDRESS. 00091000 * GPR 14=EXTERNAL LINKAGE REGISTER. 00092000 * GPR 15=EXTERNAL LINKAGE REGISTER. 00093000 * 00094000 * 00095000 * NOTES : NONE. 00096000 * 00097000 * 00098000 * 00099000 * OPERATION : A. IF FIRST TIME IN, GET FILE MASK AND CHANGE SEEK 00100000 * HEADS TO X'FF'S, THEN GOTO STEP C. 00101000 * B. IF GOOD COMPLETION, CLEAN UP AND EXIT. 00102000 * C. IF ERROR OCCURRED (POSSIBLY DURING RETRY): 00103000 * 1. IF IN OUR CCWS, EXIT WITH RECOVERY ERROR. 00104000 * 2. IF NOT TRACK CONDITION CHECK OR COMMAND REJECT 00105000 * ON A MODIFIED SEEK HEAD, EXIT TO DMKDASER. 00106000 * D. TEST FOR THE SPECIFIC TYPE OF ERROR. 00107000 * 1. COMMAND REJECT ON MODIFIED SEEK HEAD: 00108000 * I) IF USER FILEMASK WILL NOT ALLOW A HEAD SWITCH 00109000 * REFLECT A FILE PROTECT EXCEPTION. 00110000 * II) READ HOME ADDRESS AND RECORD 0 00111000 * III) IF USER CCW WILL NOT BE THE LAST, DO A FULL 00112000 * SEEK, SFM, AND TIC TO THE NEXT USER CCW. 00113000 * IV) IF USER CCW WILL TERMINATE THE CHAIN, RESTORE 00114000 * THE SEEK HEAD OPCODE,THEN DO A FULL SEEK, 00115000 * SFM , AND TIC TO THE USER CCW. 00116000 * 2. TRACK CONDITION CHECK: 00117000 * I) READ HOME ADDRESS AND RECORD 0. 00118000 * II) IF CURRENT TRACK IS PRIMARY, SET SEEK TO 00119000 * ALTERNATE TRACK (FROM R0). GO TO STEP V. 00120000 * III) IF USER FILEMASK WILL NOT ALLOW A HEAD SWITCH 00121000 * REFLECT A FILE PROTECT EXCEPTION. 00122000 * IV) IF CURRENT TRACK IS ALTERNATE, SET SEEK TO 00123000 * DEFECTIVE TRACK + 1 (FROM R0). IF NEW TRACK 00124000 * WOULD BE ON NEXT CYLINDER, SIMULATE AN END 00125000 * OF CYLINDER CONDITION AND EXIT. IF USER FILE 00126000 * MASK DOES NOT ALLOW HEAD SWITCHING, SIMULATE 00127000 * FILE PROTECT CONDITION AND EXIT. 00128000 * V) FINISH SETTING UP RETRY CCWS: 00129000 * SEEK 00130000 * SFM USER MASK 00131000 * SET SECTOR 0 00132000 * READ HOME ADDRESS (SKIP DATA TRANSER) 00133000 * TIC (CSW-8) 00134000 * VI) RETURN TO DMKDASER WITH RETRY CODE. 00135000 * 00136000 *. 00137000 SPACE 1 00138000 ENTRY DMKTRKIN @V56BDA8 00139000 DMKTRKIN ENTER , HANDLE ALTERNATE TRACK INTERRUPTS@V56BDA8 00140000 SPACE 1 00141000 L R11,IOBUSER ENSURE VMBLOK POINTER @V56BDA8 00142000 TM IOERFLG3,IOERALTR+IOERRDR0 ALREADY GOING? @V56BDA8 00143000 BZ VERFMSK NO, MUST BE FRESH TRACK CONDITION@V56BDA8 00144000 TM IOERFLG3,IOERRDR0 READ R0 IN PROGRESS? @V56BDA8 00145000 BO ALTHAR0 YES, CHECK OUT ENDING STATUS @V56BDA8 00146000 NI IOERFLG3,255-IOERALTR UNFLAG ALT RETRY @V56BDA8 00147000 LTR R3,R3 DO WE HAVE A SECOND ERROR? @V56BDA8 00148000 BNZ ALT2ERRS YES, MAKE SURE NOT IN OUR CCWS @V56BDA8 00149000 * ****** BAL R5,FRETWORK FREE RETRY CCWS (NO, LET DMKDAS). 00150000 FINIS OI IOERFLG2,IOERCEMD SUPPRESS ERROR RECORDING. @V56BDA8 00151000 LA R2,FINISALT SET RETURN VECTOR @V56BDA8 00152000 RETDASER MVI IOBMISC2,0 RESET IOBMISC2 FOR USER @V56BDA8 00153000 ALTREXIT ST R2,SAVER1 PUT IN CALLER'S GPR1 @V56BDA8 00154000 EXIT AND EXIT GRACEFULLY @V56BDA8 00155000 SPACE 1 00156000 ALT2ERRS LH R0,IOERDW DBLEWRDS IN CCW AREA @V56BDA8 00157000 SLL R0,3 NUMBER OF BYTES @V56BDA8 00158000 L R1,IOERLOC START OF AREA @V56BDA8 00159000 AR R0,R1 JUST PAST END @V56BDA8 00160000 CLM R1,7,IOERCSW+1-IOERBLOK(R3) BELOW AREA? @V56BDA8 00161000 BNL NOALTERR YES, NOT OUR CCW. @V56BDA8 00162000 CLM R0,7,IOERCSW+1-IOERBLOK(R3) ABOVE IT? @V56BDA8 00163000 BL NOALTERR YES, NOT OUR CCW . @V56BDA8 00164000 RCVRYERR LA R2,RECFAIL SET RETURN VECTOR @V56BDA8 00165000 B RETDASER TREAT AS RECOVERY FAILURE @V56BDA8 00166000 SPACE 1 00167000 NOALTERR BAL R5,FRETWORK FREE WORK AREA @V56BDA8 00168000 LR R1,R7 ADDRESS FOR FRETIOER @V56BDA8 00169000 LR R7,R3 POINT TO CURRENT IOERBLOK @V56BDA8 00170000 SWITCH , USE I/O CPU TO MODIFY RDEVBLOK. @V56BDA8 00171000 ST R7,RDEVIOER NEW BECOMES THE ORIGINAL @V56BDA8 00172000 ST R7,SAVER7 FOR DMKDASER ALSO @V56BDA8 00173000 MVC IOERPNT-IOERBLOK(L4,R7),IOERPNT-IOERBLOK(R1) @V56BDA8 00174000 * KEEPS PTR TO POSSIBLE CHAIN OF SDR BLOCKS 00175000 BAL R5,FRETIOEZ FRET IT. @V56BDA8 00176000 NI IOBFLAG,255-IOBRSTRT JUST IN CASE @V56BDA8 00177000 LH R0,IOBRCNT ERROR COUNT @V56BDA8 00178000 BCTR R0,0 SUCCESSFUL RECOVERY MEANS @V56BDA8 00179000 STH R0,IOBRCNT ONE LESS ERROR @V56BDA8 00180000 TM IOERCSW+5,255-PCI-IL ANY BADDIES? @V56BDA8 00181000 BNZ RECURERR YES, DONT PROCESS IT @V56BDA8 00182000 TM IOERCSW+4,UC UNIT CHECK CONDITION? @V56BDA8 00183000 BZ FINIS ALL DONE (MAYBE UNIT EXCEPTION) @V56BDA8 00184000 CHECKIT TM IOERDATA,X'02' TRACK CONDITION CHECK? @V56BDA8 00185000 BO TRKCHK YES, GO DO IT @V56BDA8 00186000 TM IOERDATA,X'80' COMMAND REJECT? @V56BDA8 00187000 BO MAYBSKHD YES, MAYBE A MODIFIED SEEK HEAD. @V56BDA8 00188000 B RECURERR ELSE, LET DMKDASER HANDLE IT @V56BDA8 00189000 SPACE 2 00190000 TRKCHK BAL R5,ISITALT IS IT PRIMARY OR ALTERNATE? @V56BDA8 00191000 NOP 0 NO RETURN HERE FROM ISITALT @V56BDA8 00192000 B TRKCHKA ALTERNATE @V56BDA8 00193000 B TRKCHKP PRIMARY @V56BDA8 00194000 TRKCHKA TM IOBMISC2,X'18' DOES USER ALLOW HEAD SWITCHING? @V56BDA8 00195000 BO VFILPROT NO, FILE PROTECT CONDITION @V56BDA8 00196000 TRKCHKP TM IOERDATA+1,X'01' WEED OUT OPERATION INCOMPLETE. @V56BDA8 00197000 BO BDTRK KEEP OUT OF TROUBLE @V56BDA8 00198000 SPACE 1 00199000 GETHAR0 LA R0,ALT1SIZE SIZE OF CCW WORKAREA. @V56BDA8 00200000 BAL R5,GETWORK GET A RECOVERY WORKAREA @V56BDA8 00201000 MVC 0(READHARZ-READHAR0,R1),READHAR0 CCWS READ HA,R0@V56BDA8 00202000 BAL R5,SETUPSK SET UP THE SEEK ADDRESS @V56BDA8 00203000 USING ALT1SECT,R1 @VMG0005 00204000 LA R0,ALT1HA PUT FCCHH THERE @VMG0005 00205000 STCM R0,7,READHA+1-READHAR0(R1) ADDR IN READ HA CCW @VMG0005 00206000 LA R0,ALT1R0 PUT CCHH (R0) THERE @VMG0005 00207000 STCM R0,7,READR0+1-READHAR0(R1) ADDR IN READ RO CCW @VMG0005 00208000 NI ALT1FLAG,255-ALT1PASS READING HA & R0 1ST TIME.@VMG0005 00209000 DROP R1 @V56BDA8 00210000 ST R1,IOBRCAW RESTART CAW TO BE USED @V56BDA8 00211000 GOREADR0 OI IOERFLG3,IOERRDR0 FLAG RO READ IN PROGRESS. @VMG0005 00212000 RETRY LA R2,RETRYALT RETRY RETURN VECTOR @V56BDA8 00213000 B ALTREXIT GO DO IT @V56BDA8 00214000 SPACE 2 00215000 ALTHAR0 NI IOERFLG3,255-IOERRDR0 CLEAR OUR FLAG @V56BDA8 00216000 LTR R3,R3 ERROR IN OUR CCWS? @V56BDA8 00217000 BNZ RCVRYERR YES, ABANDON RECOVERY EFFORTS @V56BDA8 00218000 L R9,IOERLOC POINT TO OUR WORKAREA @V56BDA8 00219000 USING ALT1SECT,R9 @V56BDA8 00220000 TM ALT1FLAG,ALT1PASS 1ST READ OF HA & R0 OR 2ND? @VMG0005 00221000 BNZ ALTHAR02 BRANCH IF JUST NOW DID 2ND READ. @VMG0005 00222000 MVC IOERWRK(L'IOERWRK+L'IOERADR),ALT1HA SAVE HA & R0@VMG0005 00223000 DC 0S(ALT1R0) XREFS HIDDEN REFERENCE TO ALT1R0 @VMG0005 00224000 * IN THE ABOVE MVC. 00225000 TM IOERDATA,X'80' WAS THIS COMMAND REJECT? @V56BDA8 00226000 BO RESEEKHD YES, MUST BE SEEK HEAD PATH @V56BDA8 00227000 * AND WE MUST BE ON AN ALTERNATE, 00228000 * OTHERWISE FOR SEEK HEAD WE WOULD 00229000 * NOT BE READING R0. NO NEED TO 00230000 * CHECK R0 POINTERS NOW, THAT WOULD 00231000 * HAVE BEEN DONE EARLIER WHEN WE 00232000 * GOT ONTO THE ALTERNATE. 00233000 TM ALT1HA,DEFTRK+ALTTRK CHECK FLAGS IN HA FLAG BYTE@VMG0005 00234000 BNM RCVRYERR ONE OR THE OTHER OF THE FLAGS @VMG0005 00235000 * SHOULD BE ON. ERROR IF NOT. 00236000 CLC ALT1R0(L4),ALT1SKAD+2 R0 SHOULD NOT POINT SELF.@VMG0005 00237000 BE RCVRYERR BRANCH IF R0 POINTS TO ITSELF. @VMG0005 00238000 TM IOBFLAG,IOBCP CP CHANNEL PROGRAM? @VMG0005 00239000 BO ENDR0CHK DON'T BOTHER CHECKING R0 POINTERS@VMG0005 00240000 * BOTH WAYS, DISK WAS CHECKED WHEN 00241000 * IT WAS FORMATTED. 00242000 TM ALT1HA,ALTTRK ALREADY POSITIONED ON THE ALT? @VMG0005 00243000 BO ENDR0CHK NO NEED TO CHECK POINTERS AGAIN, @VMG0005 00244000 * IT WAS DONE BEFORE COMING TO ALT. 00245000 * USE CHANNEL PROGRAM STILL IN WORK AREA TO READ HA & R0 FROM 00246000 * OPPOSITE TRACK OF THE PAIR. HAVE TO CHANGE SEEK ADDR THOUGH. 00247000 MVC ALT1SKSV(L4),ALT1SKAD+2 SAVE CCHH OF PRESENT TRK@VMG0005 00248000 MVC ALT1SKAD+2(L4),ALT1R0 NEW SEEK ADDR IS FROM @VMG0005 00249000 * R0 OF PRESENT TRACK. 00250000 OI ALT1FLAG,ALT1PASS FLAG MEANS STARTING 2ND READ.@VMG0005 00251000 B GOREADR0 GO READ HA & R0 OF OPPOSITE TRK. @VMG0005 00252000 SPACE 00253000 ALTHAR02 DS 0H CHECK RESULT OF 2ND READ OF HA,R0@VMG0005 00254000 XC ALT1HA(L1),IOERWRK COMBINE 1ST TRK HA FLAGS @VMG0005 00255000 * WITH 2ND TRK HA FLAGS. 00256000 TM ALT1HA,DEFTRK+ALTTRK NOW BOTH BITS SHOULD BE 1.@VMG0005 00257000 BNO RCVRYERR BRANCH IF IMPROPER FLAGS IN HA. @VMG0005 00258000 CLC ALT1R0(L4),ALT1SKSV R0 POINTS BACK TO 1ST TRK? @VMG0005 00259000 BNE RCVRYERR TRKS DO NOT POINT TO EACH OTHER. @VMG0005 00260000 ENDR0CHK DS 0H @VMG0005 00261000 BAL R5,SETUPALT SET UP CCWS @V56BDA8 00262000 L R1,IOERADR+4 LOGICAL CCHH (FROM R0) @V56BDA8 00263000 TM IOERWRK,ALTTRK ON ALTERNATE TRACK? @V56BDA8 00264000 BZ SETSEEK NO, MUST BE A DEFECTIVE PRIMARY @V56BDA8 00265000 A R1,F1 SKIP TO NEXT HEAD @V56BDA8 00266000 CLM R1,3,=H'11' PAST LAST HEAD? @V56BDA8 00267000 BNH SETSEEK NO, RESTART USER @V56BDA8 00268000 OI IOERDATA+1,X'20' FAKE END OF CYLINDER @V56BDA8 00269000 LA R2,EOCERR SET RETURN VECTOR @V56BDA8 00270000 SIMULERR NI IOERDATA,255-X'02' TURN OFF TRACK CONDITION @V56BDA8 00271000 * CHECK 00272000 BAL R5,UPALTSNS RELOCATE CCHH IN SENSE @V56BDA8 00273000 B RETDASER TREAT AS EOC OR AS FILE PROTECT. @V56BDA8 00274000 SPACE 1 00275000 VFILPROT OI IOERDATA+1,X'04' SET FILE PROTECT @V56BDA8 00276000 LA R2,FILPROT SET RETURN VECTOR @V56BDA8 00277000 B SIMULERR SIMULATE THE ERROR @V56BDA8 00278000 SPACE 1 00279000 SETSEEK STCM R1,15,ALT1SKAD+2 SET SEEK ADDRESS @V56BDA8 00280000 LA R1,ALT1SEEK ->START OF CHANNEL PROGRAM @V56BDA8 00281000 ST R1,IOBRCAW PUT IN RESTART CAW @V56BDA8 00282000 MVC IOBRCAW(L1),IOBCAW SET PROTECT KEY. @V56BDA8 00283000 ALTRSTRT OI IOERFLG3,IOERALTR FLAG ALTERNATE RETRY @V56BDA8 00284000 B RETRY RETRY THE OPERATION @V56BDA8 00285000 DROP R9 @V56BDA8 00286000 SPACE 2 00287000 MAYBSKHD BAL R5,CHKSKHD SEE IF USERS FAULT @V56BDA8 00288000 B CRJCT COMMAND REJECT - USER ERROR @V56BDA8 00289000 B SKHDALT SEEK HD OCCURRED WHILE ON ALT TRK@V56BDA8 00290000 LA R0,ALT2SIZE GET A SHORT RESTART AREA @V56BDA8 00291000 BAL R5,GETWORK GET A RECOVERY WORKAREA @V56BDA8 00292000 JOINSKHD BAL R5,SETUSKHD SET IT UP @V56BDA8 00293000 B ALTRSTRT RESTART HIS IO @V56BDA8 00294000 SPACE 1 00295000 RESEEKHD LH R6,IOERADR+4 POSITION TO PRIMARY CYLINDER @V56BDA8 00296000 MVN IOERDATA+6(L1),IOERADR+7 SET PRIMARY HEAD (OLD) @V56BDA8 00297000 B JOINSKHD JOIN NORMAL RESTART CASE @V56BDA8 00298000 SPACE 1 00299000 * A SEEK HEAD OCCURRED WHILE WE WERE POSITIONED ON AN ALTERNATE. 00300000 * THE QUESTION NOW IS WHETHER OR NOT THE USER KNOWS HE IS ON 00301000 * AN ALTERNATE. HE KNOWS HE IS THERE IF HE SEEKED DIRECTLY 00302000 * TO IT. HE DOESN'T KNOW ABOUT IT IF WE TOOK HIM HERE AS 00303000 * PART OF ERROR RECOVERY. IF HE IS UNAWARE OF IT, THEN HE 00304000 * INTENDS THE SEEK HEAD TO OPERATE IN THE ASSOCIATED PRIMARY 00305000 * CYLINDER. BUT IF HE IS AWARE OF BEING IN THE ALTERNATE 00306000 * CYLINDER, THEN THE INTENT OF HIS SEEK HEAD IS UNCLEAR, BUT 00307000 * COULD BE INTENDED TO GET TO SOMEONE ELSES ALTERNATE TRACK; 00308000 * SO WE GIVE HIM COMMAND REJECT. NOTE THAT WE ARE STILL NOT 00309000 * CERTAIN THAT IT WAS HIS SEEK AND NOT OUR ERROR RECOVERY THAT 00310000 * GOT US TO THIS PARTICULAR ALTERNATE TRACK, BUT THE IOBALTSK 00311000 * FLAG SAYS THERE WAS A POSSIBILITY THAT IT WAS HIM; FURTHER 00312000 * CHECKING MIGHT SHOW WHO WAS RESPONSIBLE IN SOME CASES, BUT 00313000 * NOT IN EVERY CASE SINCE THE ORDER OF EXECUTION OF CHANNEL 00314000 * COMMANDS CANNOT IN GENERAL BE DETERMINED. HOWEVER, WE WILL 00315000 * ASSERT THAT HIS MIXING OF SEEK HEADS WITH A DIRECT SEEK TO 00316000 * AN ALTERNATE IS A SUFFICIENT REASON FOR KICKING HIM OUT. BUT 00317000 * SOMETIMES WE LET HIM GET AWAY WITH SUCH CHANNEL PROGRAMS: WHEN 00318000 * THE SEEK HEADS ALL HAPPEN TO OCCUR IN PRIMARY CYLINDERS. 00319000 SKHDALT TM IOBSTAT,IOBALTSK HIS CHNL PRG HAS SEEK TO ALT? @V56BDA8 00320000 BZ GETHAR0 NO. ERROR RECOVERY PUT HIM ON @V56BDA8 00321000 * ALT TRK, SO NOW ERROR RECOVERY MUST 00322000 * TAKE HIM BACK TO HIS PRIMARY CYLINDER. 00323000 CRJCT LA R2,COMRJCT COMMAND REJECT VECTOR @V56BDA8 00324000 B RETDASER RETURN TO DMKDASER @V56BDA8 00325000 SPACE 1 00326000 BDTRK LA R2,BADTRACK TRACK CONDITION CHECK @V56BDA8 00327000 B RETDASER @V56BDA8 00328000 SPACE 1 00329000 RECURERR LA R2,RECURALT RECURSIVE ERROR VECTOR @V56BDA8 00330000 B RETDASER RETURN TO DMKDASER @V56BDA8 00331000 SPACE 2 00332000 VERFMSK MVI IOBMISC2,0 CLEAR FILE MASK @V56BDA8 00333000 TM IOBFLAG,IOBCP CP OPERATION? @V56BDA8 00334000 BO TRKCHK YES, MASK IS ZERO AND NO SEEK @V56BDA8 00335000 * HEADS 00336000 BAL R5,FINDMASK FIND FILEMASK AND FIX SEEK HEADS @V56BDA8 00337000 B CHECKIT GO PROCESS THE ERROR @V56BDA8 00338000 SPACE 2 00339000 FINDMASK SR R14,R14 CLEAR R14 @V56BDA8 00340000 ICM R14,7,IOBCAW+1 -->RCWCCW @V56BDA8 00341000 LA R15,RCWCCW-RCWTASK LENGTH OF RCWTASK HEADER. @V56BDA8 00342000 SR R14,R15 BACK UP OVER HEADER TO BEGINNING.@V56BDA8 00343000 USING RCWTASK,R14 @V56BDA8 00344000 MASKLOOP LH R0,RCWRCNT NUMBER OF REAL CCWS IN TASK @V56BDA8 00345000 LA R15,RCWCCW POINT TO FIRST CCW @V56BDA8 00346000 USING RCWCCW,R15 @V56BDA8 00347000 MASKCHK CLI RCWCOMND,X'1F' SFM? @V56BDA8 00348000 BE GOTASFM YES, FOUND ONE @V56BDA8 00349000 CLI RCWCOMND,X'1B' SEEK HEAD? @V56BDA8 00350000 BNE MASKCONT NO, LOOK AT NEXT CCW @V56BDA8 00351000 MVI RCWCOMND,X'FF' FORCE COMMAND REJECT @V56BDA8 00352000 MASKCONT LA R15,8(,R15) NEXT CCW @V56BDA8 00353000 BCT R0,MASKCHK CHECK IT OUT @V56BDA8 00354000 ICM R14,7,RCWPNT+1 GET NEXT RCWTASK @V56BDA8 00355000 BNZ MASKLOOP SCAN CCWS @V56BDA8 00356000 BR R5 SFM COPIED IF FOUND, SEEKS ZAPPED@V56BDA8 00357000 SPACE 1 00358000 GOTASFM ST R15,SAVEWRK1 PRESERVE R15 FOR A MOMENT. @V56BDA8 00359000 L R15,RCWADDR GET FILE MASK POINTER. @V56BDA8 00360000 MVC IOBMISC2(L1),0(R15) COPY INTO IOBLOK. @V56BDA8 00361000 L R15,SAVEWRK1 RESTORE R15. @V56BDA8 00362000 B MASKCONT CONTINUE SCAN @V56BDA8 00363000 DROP R14,R15 @V56BDA8 00364000 SPACE 2 00365000 USING ALT1SECT,R9 @V56BDA8 00366000 SETUPSK MVC ALT1SKAD,ZEROES CLEAR OUT SEEK ADDRESS @V56BDA8 00367000 IC R0,IOERDATA+6 GET HIGH CYLINDER BYTE @V56BDA8 00368000 SRL R0,5 SHIFT RIGHT 5 @V56BDA8 00369000 STC R0,ALT1SKAD+2 STORE HIGH CYL SEEK DATA @V56BDA8 00370000 NI ALT1SKAD+2,X'03' CLEAR BITS 0 - 5 @V56BDA8 00371000 MVC ALT1SKAD+3(1),IOERDATA+5 MOVE LOW CYL SEEK DATA @V56BDA8 00372000 MVN ALT1SKAD+5(1),IOERDATA+6 MOVE HEAD ADDRESS @V56BDA8 00373000 LA R0,ALT1SKAD ->SEEK ARGUMENT @V56BDA8 00374000 STCM R0,7,ALT1SEEK+1 STORE INTO CCW @V56BDA8 00375000 BR R5 RETURN TO CALLER @V56BDA8 00376000 SPACE 2 00377000 SETUPALT MVC ALT1SECT(ALT1CLEN),ALT1CCWS INITIALIZE @V56BDA8 00378000 MVC ALT1SKAD,ZEROES CLEAR SEEK ADDRESS @V56BDA8 00379000 LA R1,ALT1SKAD ->SEEK ADDRESS @V56BDA8 00380000 STCM R1,7,ALT1SEEK+1 STORE IN SEEK CCW @V56BDA8 00381000 LA R1,ALT1FMSK ->FILEMASK @V56BDA8 00382000 STCM R1,7,ALT1SFM+1 STORE IN CCW @V56BDA8 00383000 MVC ALT1FMSK,IOBMISC2 SET USERS FILE MASK @V56BDA8 00384000 L R1,IOERCSW FAILING CCW + 8 @V56BDA8 00385000 S R1,F8 BACK UP TO FAILING CCW @V56BDA8 00386000 STCM R1,7,ALT1TICA+1 PROBABLE RESTART ADDRESS @V56BDA8 00387000 BR R5 RETURN TO CALLER @V56BDA8 00388000 DROP R9 @V56BDA8 00389000 SPACE 2 00390000 UPALTSNS MVC IOERDATA+5(1),IOERADR+5 LOW ORDER CC @V56BDA8 00391000 IC R1,IOERADR+4 HIGH ORDER CC @V56BDA8 00392000 N R1,F3 LEAVE C512 AND C256 BITS @V56BDA8 00393000 SLL R1,5 GET 0CC00000 BIT PATTERN @V56BDA8 00394000 STC R1,IOERDATA+6 STORE INTO 0CCXHHHH BYTE IN SENSE@V56BDA8 00395000 MVN IOERDATA+6(1),IOERADR+7 COPY LOW ORDER HEAD @V56BDA8 00396000 * DIGIT 00397000 BR R5 RETURN @V56BDA8 00398000 SPACE 2 00399000 GETWORK STH R0,IOERDW SAVE IN IOERBLOK @V56BDA8 00400000 CALL DMKFREE GET A WORKAREA @V56BDA8 00401000 ST R1,IOERLOC SAVE IN IOERBLOK @V56BDA8 00402000 LR R9,R1 WORKAREA ADDRESSING @V56BDA8 00403000 BR R5 RETURN TO CALLER @V56BDA8 00404000 SPACE 1 00405000 FRETWORK LH R0,IOERDW LOAD REG.0 WITH CT OF DW'S @V56BDA8 00406000 L R1,IOERLOC LOAD REG.1 OF ADDR. OF STORAGE @V56BDA8 00407000 * OBTAINED 00408000 MVC IOERDW,ZEROES CLEAR OLD DATA. @V56BDA8 00409000 MVC IOERLOC,ZEROES CLEAR OLD DATA. @V56BDA8 00410000 CALL DMKFRET FREE CORE @V56BDA8 00411000 BR R5 RETURN TO CALLER @V56BDA8 00412000 SPACE 1 00413000 FRETIOER L R1,IOBIOER GET ADDRESS OF IOERBLOK @V56BDA8 00414000 FRETIOEZ MVC IOBIOER,ZEROES CLEAN OUT POINTER. @V56BDA8 00415000 LA R0,IOERSIZE LOAD IOERBLOK SIZE. @V56BDA8 00416000 AH R0,IOEREXT-IOERBLOK(,R1) INCLUDE EXTRA SIZE @V56BDA8 00417000 * (IF ANY) 00418000 CALL DMKFRET @V56BDA8 00419000 BR R5 RETURN TO CALLER. @V56BDA8 00420000 SPACE 2 00421000 USING ALT2SECT,R9 @V56BDA8 00422000 SETUSKHD MVC ALT2SEEK(LEN2CCW),ALT1CCWS SEEK, SFM @V56BDA8 00423000 XC ALT2TICA(ALT2SIZE*8-LEN2CCW),ALT2TICA ZERO THE @V56BDA8 00424000 * REST. 00425000 MVI ALT2SEEK+5,RCWGEN+RCWREL GOOD FLAGS @V56BDA8 00426000 MVI ALT2SFM+5,RCWGEN+RCWREL FLAG SFM CP GENERATED @V56BDA8 00427000 MVI ALT2TICA+5,RCWGEN TIC TOO @V56BDA8 00428000 LA R1,ALT2SKAD -->BBCCHH AREA @V56BDA8 00429000 STCM R1,7,ALT2SEEK+1 STORE ADDRESS IN SEEK @V56BDA8 00430000 STH R6,ALT2SKAD+2 SET UP CC @V56BDA8 00431000 MVN ALT2SKAD+5(L1),IOERDATA+6 COPY HEAD ADDRESS @V56BDA8 00432000 LA R1,ALT2FMSK PUT FILEMASK IN SAME WORD @V56BDA8 00433000 STCM R1,7,ALT2SFM+1 POINT CCW TO IT @V56BDA8 00434000 MVC ALT2FMSK,IOBMISC2 SET UP FILE MASK @V56BDA8 00435000 L R4,IOERCSW GET POINTER TO CCW @V56BDA8 00436000 S R4,F8 BACKUP TO FAILING CCW @V56BDA8 00437000 STCM R4,7,ALT2TICA+1 TO RESTART ON HIS CCW @V56BDA8 00438000 USING RCWCCW,R4 @V56BDA8 00439000 MVI ALT2TICA,8 MAKE IT A TIC @V56BDA8 00440000 LH R15,RCWCNT GET COUNT @V56BDA8 00441000 CHKDATCH TM RCWFLAG,CD CHAIN DATA? @V56BDA8 00442000 BZ CHKCMDCH NO, CHECK FOR COMMAND CHAINING @V56BDA8 00443000 BAL R14,NEXTCCW GET NEXT CCW @V56BDA8 00444000 AH R15,RCWCNT ACCUMULATE COUNT @V56BDA8 00445000 B CHKDATCH SEE IF END OF DATA CHAINING @V56BDA8 00446000 CHKCMDCH TM RCWFLAG,CC COMMAND CHAINING? @V56BDA8 00447000 BZ USEHIS NO, USE HIS CCW @V56BDA8 00448000 N R15,XRIGHT16 CLEAR MEANINGLESS BITS @V56BDA8 00449000 C R15,F6 CHECK OUT THE COUNT @V56BDA8 00450000 BL USEHIS HE WILL GET COMMAND REJECT @V56BDA8 00451000 BE FINDNXT JUST RIGHT @V56BDA8 00452000 TM RCWFLAG,SILI SUPPRESS LENGTH ERROR? @V56BDA8 00453000 BZ USEHIS WILL GET ILI @V56BDA8 00454000 FINDNXT BAL R14,NEXTCCW GET ADDRESS OF NEXT (NON-TIC) CCW@V56BDA8 00455000 L R1,ALT2TICA MODIFIED SEEK HEAD @V56BDA8 00456000 TM IOBFLAG,IOBCP CP CHANNEL PROGRAM? @V56BDA8 00457000 BO CPSKHD YES, NICE SIMPLE (REAL) CASE @V56BDA8 00458000 LA R8,SAVEWRK4-(VDEVCSW-VDEVBLOK) FAKE A VDEVBLOK @V56BDA8 00459000 ST R1,SAVEWRK4 STORE ADDRESS FOR CCWSB @V56BDA8 00460000 CALL DMKUNTRN FIND VIRTUAL CCW ADDRESS @V56BDA8 00461000 L R8,SAVER8 RESTORE REG8 @V56BDA8 00462000 L R1,SAVEWRK4 POINT TO VIRTUAL CCW @V56BDA8 00463000 LA R1,0(,R1) CLEAN IT UP @V56BDA8 00464000 TRANS 2,1,OPT=(BRING,DEFER) GET USERS CCW @V56BDA8 00465000 MVC SAVEWRK4(L8),0(R2) @V56BDA8 00466000 DC 0AL4(SAVEWRK5) PUT SYMB IN XREF FOR ABOVE INSTR @V56BDA8 00467000 LA R1,SAVEWRK4 POINT TO USER CCW @V56BDA8 00468000 LA R0,6-1 LENGTH OF BBCCHH SEEK ADDR @V56BDA8 00469000 LA R2,SAVEWRK2 COPY BBCCHH HERE. @V56BDA8 00470000 DC 0AL4(SAVEWRK3) PUT SYMB IN XREF FOR ABOVE INSTR @V56BDA8 00471000 CALL DMKCCWSB COPY CONTROL INFORMATION @V56BDA8 00472000 BNZ USEHIS @V56BDA8 00473000 CHKHDADD CLC =H'11',SAVEWRK2+4 IS HEAD ADDRESS OK? @V56BDA8 00474000 BL USEHIS NO, END WITH HIS CCW @V56BDA8 00475000 MVC ALT2SKAD+4(L2),SAVEWRK2+4 COPY HEAD ADDRESS @V56BDA8 00476000 STCM R4,7,ALT2TICA+1 PUT ADDRESS IN OUR TIC @V56BDA8 00477000 B USERSTRT RESTART USER @V56BDA8 00478000 USEHIS L R4,ALT2TICA POINT TO USER CCW @V56BDA8 00479000 MVI 0(R4),X'1B' RECONVERT TO A SEEK @V56BDA8 00480000 USERSTRT TM IOBFLAG,IOBCP+IOBHVC CP OR DIAGNOSE I/O? @VMG0006 00481000 BZ USERSIO NO, RESTART FOR USER SIO @VMG0006 00482000 ST R9,IOBRCAW STORE RESTART ADDRESS @VMG0006 00483000 MVC IOBRCAW(L1),IOBCAW COPY PROTECT KEY @V56BDA8 00484000 OI IOBFLAG,IOBRSTRT INDICATE RESTART @V56BDA8 00485000 BR R5 RETURN TO CALLER @V56BDA8 00486000 USERSIO L R1,FFS STORE IOBRCAW = X'FFFFFFFF' @VMG0006 00487000 ST R1,IOBRCAW ... @VMG0006 00488000 STCM R9,7,IOBCAW+1 RESTRT CAW BECOMES IOBCAW FOR SIO@VMG0006 00489000 BR R5 RETURN TO CALLER @VMG0006 00490000 SPACE 1 00491000 CPSKHD L R1,0(,R1) GET SEEK ARGUMENT ADDRESS @V56BDA8 00492000 MVC SAVEWRK2+4(L2),4(R1) COPY HEAD ADDRESS. @V56BDA8 00493000 B CHKHDADD REJOIN VIRTUAL CASE @V56BDA8 00494000 DROP R9 @V56BDA8 00495000 SPACE 2 00496000 NEXTCCW LA R0,2 BCT COUNTER @V56BDA8 00497000 LA R4,RCWCCW+8 ADVANCE TO NEXT CCW @V56BDA8 00498000 NEXTCCW1 TM IOBFLAG,IOBCP RCWTASK? @V56BDA8 00499000 BO NEXTCCW2 NO RCWFLAG @V56BDA8 00500000 TM RCWCTL,RCWINVL BAD CCW? @V56BDA8 00501000 BO USEHIS YES, USE HIS @V56BDA8 00502000 NEXTCCW2 TM RCWCOMND,X'07' IS IT A TIC? @V56BDA8 00503000 BNZR R14 NO, RETURN NOW @V56BDA8 00504000 TM RCWADDR+3,X'07' IS IT ON A DBLEWORD? @V56BDA8 00505000 BNZ USEHIS NO, ERROR @V56BDA8 00506000 L R4,RCWADDR FOLLOW TIC @V56BDA8 00507000 BCT R0,NEXTCCW1 VERIFY RCWINVL IF APPROPRIATE @V56BDA8 00508000 B USEHIS TIC TO TIC ERROR @V56BDA8 00509000 SPACE 1 00510000 CHKSKHD TM IOERDATA,X'80' COMMAND REJECT? @V56BDA8 00511000 BZR R5 NO, NOT OUR ERROR @V56BDA8 00512000 L R4,IOERCSW GET FAILING CCW ADDRESS @V56BDA8 00513000 S R4,F8 -->FAILING CCW @V56BDA8 00514000 CLI RCWCOMND,X'FF' OUR OP CODE? @V56BDA8 00515000 BNER R5 NO, USER ERROR @V56BDA8 00516000 TM IOBFLAG,IOBCP IS A CP PRODUCTION? @V56BDA8 00517000 BO ISITALT YES, NO RCWTASK AND 0 FILEMASK @V56BDA8 00518000 TM RCWCTL,RCWINVL REAL INVALID OP-CODE? @V56BDA8 00519000 BOR R5 YES, USER ERROR @V56BDA8 00520000 TM IOBMISC2,X'18' HEAD SWITCHING PERMITTED? @V56BDA8 00521000 BNO ISITALT YES, CAN BE RESTARTED @V56BDA8 00522000 NI IOERDATA,255-X'80' TURN OFF COMMAND REJECT @V56BDA8 00523000 OI IOERDATA+1,X'04' TURN ON FILE PROTECT @V56BDA8 00524000 BR R5 TREAT AS USER ERROR @V56BDA8 00525000 ISITALT IC R6,IOERDATA+6 HIGH ORDER CC + H @V56BDA8 00526000 N R6,=A(B'01100000') CLEAR UNUSED BITS @V56BDA8 00527000 SLL R6,3 PUT HIGH ORDER BITS IN HIGH BYTE @V56BDA8 00528000 IC R6,IOERDATA+5 INSERT LOW C @V56BDA8 00529000 LA R15,696 FIRST 70MB ALTERNATE @V56BDA8 00530000 TM IOERDATA+2,X'01' 70MB MODULE? @V56BDA8 00531000 BZ CYLTYP NO, MUST BE 35MB @V56BDA8 00532000 LA R15,348 35MB ALTERNATE CYLINDER @V56BDA8 00533000 CYLTYP CR R6,R15 ALTERNATE CYLINDER? @V56BDA8 00534000 BNL 4(,R5) YES, GET OUT @V56BDA8 00535000 B 8(,R5) NO, IT IS A PRIMARY @V56BDA8 00536000 DROP R4 @V56BDA8 00537000 EJECT 00538000 *. 00539000 * 00540000 * ENTRY POINT : DMKTRKFP 00541000 * 00542000 * 00543000 * 00544000 * FUNCTION : TO HANDLE COMMAND REJECTS FOR CHANNEL PROGRAMS 00545000 * INITIATED BY VIRTUAL MACHINE SIO WHICH INCLUDE 00546000 * SEEKS TO ALTERNATE TRACKS WHICH LIE BEYOND THE 00547000 * NORMAL EXTENTS OF THE MINI-DISK. THIS IS NEEDED 00548000 * AS IN THAT CASE ALL SEEK HEAD OP-CODES HAVE BEEN 00549000 * CHANGED TO INVALID OPERATION CODES. 00550000 * 00551000 * 00552000 * ATTRIBUTES : REENTRANT,RESIDENT,CALLED VIA SVC. 00553000 * 00554000 * 00555000 * ENTRY CONDITIONS : GPR8=ADDRESS OF VDEVBLOK 00556000 * GPR10=ADDRESS OF IOBLOK 00557000 * GPR11=ADDRESS OF VMBLOK 00558000 * GPR12=BASE ADDRESS 00559000 * GPR13=ADDRESS OF SAVE AREA 00560000 * 00561000 * 00562000 * EXIT CONDITIONS : 00563000 * 00564000 * ON COMPLETION, EXIT TO CALLER WITH IOBALTSK REMOVED. 00565000 * FOR RETRY, CALL DMKIOSQV AND FREE CALLER SAVEAREA, THEN 00566000 * EXIT TO DISPATCHER. 00567000 * 00568000 * 00569000 * CALLS TO OTHER ROUTINES : 00570000 * 1. DMKIOSQV - TO RESTART USER CHANNEL PROGRAM. 00571000 * 2. SAME AS FOR DMKTRKIN. 00572000 * 00573000 * 00574000 * EXTERNAL REFERENCES : NONE 00575000 * 00576000 * 00577000 * TABLES AND WORKAREAS : 00578000 * IOBLOK 00579000 * IOERBLOK 00580000 * RCWTASK 00581000 * 00582000 * REGISTER USAGE : 00583000 * GPR 4=SCRATCH 00584000 * GPR 5=GENERAL USAGE IS FOR BAL REGISTER 00585000 * GPR 6=SCRATCH 00586000 * GPR 7=IOERBLOK ADDRESS 00587000 * GPR 8=RDEVBLOK ADDRESS. 00588000 * GPR 9=RECOVERY WORKAREA (IN RCWTASK) 00589000 * GPR 10=IOBLOK ADDRESS. 00590000 * GPR 11=VMBLOK ADDRESS. 00591000 * GPR 12=BASE ADDRESS. 00592000 * GPR 13=SAVE AREA ADDRESS. 00593000 * GPR 14=EXTERNAL LINKAGE REGISTER. 00594000 * GPR 15=EXTERNAL LINKAGE REGISTER. 00595000 * 00596000 * 00597000 * NOTES : NONE. 00598000 * 00599000 * 00600000 * 00601000 * OPERATION : E. AS IN DMKTRKIN.D.1 ABOVE, EXCEPT: 00602000 * 1. AN RCWTASK IS USED TO HOLD RESTART CCWS. 00603000 * 2. TO RESTART, IOBSIOF IS SET TO AVOID MODIFICATION 00604000 * OF SIOWAIT CONDITIONS, AND DMKIOSQV IS USED. 00605000 * 3. IOBALTSK IS REMOVED BEFORE RETURNING TO CALLER. 00606000 * 4. RESTART IS NOT PERFORMED IF ARM IS POSITIONED AT 00607000 * AN ALTERNATE TRACK (OUR RAISON D'ETRE) 00608000 * 00609000 *. 00610000 DMKTRKFP RELOC , ANALYSE FILE PROTECT ERRORS. @V56BDA8 00611000 ICM R7,15,IOBIOER IOERBLOK? @V56BDA8 00612000 BZ FPEXIT NO, ALL OK @V56BDA8 00613000 L R9,FFS IOBRCAW = X'FFFFFFFF' IF WE @VMG0006 00614000 CL R9,IOBRCAW HAVE RESTARTED BEFORE @VMG0006 00615000 BNE FPFIRST NO, FIRST ENTRY @VMG0006 00616000 TM IOBFLAG,IOBCC3 BAD START FOR RETRY? @V56BDA8 00617000 BNZ FPERROR YES, HIDE OUR ERROR @V56BDA8 00618000 L R9,IOBCAW POINT TO OUR CCWS @VMG0006 00619000 USING ALT2SECT,R9 @V56BDA8 00620000 CLM R9,7,IOERCSW+1 OUR CCWS ARE ABOVE THE ERROR? @VMG0006 00621000 BNL FPCHECK YES, ERROR NOT IN OUR CCWS. @VMG0006 00622000 LA R15,ALT2NCCW*8(,R9) POINT BEYOND LAST CCW @V56BDA8 00623000 CLM R15,7,IOERCSW+1 OUR CCWS ARE BELOW THE ERROR? @VMG0006 00624000 BL FPCHECK YES, OUR CCWS ARE BELOW ERROR @VMG0006 00625000 FPERROR NI IOBFLAG,255-IOBCC3 TREAT AS INTERRUPT @V56BDA8 00626000 MVC IOBCSW+1(L3),ALT2TICA+1 RESTORE ORIGINAL ADDRESS@V56BDA8 00627000 B FPEXIT AND EXIT QUICKLY @V56BDA8 00628000 DROP R9 @V56BDA8 00629000 SPACE 1 00630000 FPFIRST TM IOBFLAG,IOBCC3 INTERRUPT ENTRY? @V56BDA8 00631000 BNZ FPEXIT NO, NOT OUR PROBLEM @V56BDA8 00632000 BAL R5,FINDMASK FIND USER FILEMASK @V56BDA8 00633000 FPCHECK TM IOERCSW+5,255-IL-PCI BAD ERROR? @V56BDA8 00634000 BNZ FPEXIT YES, NOT OUR PROBLEM @V56BDA8 00635000 TM IOERCSW+4,UC IS THERE A UNIT CHECK? @V56BDA8 00636000 BZ FPEXIT NO, NOT OUR ERROR @V56BDA8 00637000 BAL R5,CHKSKHD SEE IF A GOOD FUDGED SEEK HEAD @V56BDA8 00638000 B FPEXIT USER ERROR, GET OUT @V56BDA8 00639000 B FPEXIT ALTERNATE, TREAT AS COMMAND @V56BDA8 00640000 * REJECT 00641000 SPACE 2 00642000 BAL R5,GETRCTSK CHAIN IN A DUMMY RCWTASK @V56BDA8 00643000 BAL R5,SETUSKHD SET UP SEEK HEAD RESTART @V56BDA8 00644000 SPACE 1 00645000 BAL R5,FRETIOER FRET IT @V56BDA8 00646000 SPACE 1 00647000 OI IOBSPEC,IOBSIOF PREVENT REMOVAL OF SIOWAIT @V56BDA8 00648000 CALL DMKIOSQV REQUEUE THE IO @V56BDA8 00649000 SVC 16 RETURN DMKVIOIN SAVEAREA @V56BDA8 00650000 GOTO DMKDSPCH EXIT GRACEFULLY @V56BDA8 00651000 SPACE 2 00652000 FPEXIT NI IOBSTAT,255-IOBALTSK PREVENT RECURSION @V56BDA8 00653000 MVI IOBMISC2,0 JUST TO BE SURE @V56BDA8 00654000 EXIT RETURN TO DMKVIOIN OR DMKUNTIS @V56BDA8 00655000 SPACE 6 00656000 GETRCTSK L R1,FFS HAVE WE ALREADY ACQUIRED RCWTASK @VMG0006 00657000 CL R1,IOBRCAW RCWTASK?? @VMG0006 00658000 BER R5 YES, LEAVE QUICKLY @VMG0006 00659000 LA R0,(RCWCCW-RCWTASK)/8+ALT2SIZE SIZE @V56BDA8 00660000 CALL DMKFREE GET AN RCWTASK @V56BDA8 00661000 USING RCWTASK,R1 @V56BDA8 00662000 LA R9,RCWCCW LET US USE ALT1SECT @V56BDA8 00663000 MVC RCWTASK(RCWCCW-RCWTASK),ZEROES CLEAR OUT RCWTASK@V56BDA8 00664000 MVI RCWRCNT+1,ALT2NCCW NUMBER OF REAL CCWS @V56BDA8 00665000 MVC RCWHEAD,FFS RCW BACKSTOP FIELD @V56BDA8 00666000 MVI RCWCCNT+1,(RCWCCW-RCWTASK)/8+ALT2SIZE # DBLWDS. @V56BDA8 00667000 SR R14,R14 CLEAR R14 @V56BDA8 00668000 ICM R14,7,IOBCAW+1 -->FIRST RCWCCW @V56BDA8 00669000 LA R15,RCWCCW-RCWTASK LENGTH OF RCWTASK HEADER. @V56BDA8 00670000 SR R14,R15 BACK UP OVER HEADER TO BEGINNING.@V56BDA8 00671000 STCM R14,7,RCWPNT+1-RCWTASK(R1) MAKE OUR RCWTASK FST @VMG0006 00672000 BR R5 RETURN TO CALLER @V56BDA8 00673000 DROP R1 @V56BDA8 00674000 EJECT 00675000 *. 00676000 * 00677000 * ENTRY POINT : DMKTRKVA 00678000 * 00679000 * 00680000 * 00681000 * FUNCTION: TO RETURN ADDRESS OF DEFECTIVE TRACK FOR WHICH A GIVEN 00682000 * ALTERNATE TRACK IS ASSIGNED. 00683000 * 00684000 * 00685000 * ATTRIBUTES : REENTRANT,RESIDENT,CALLED VIA SVC. 00686000 * 00687000 * 00688000 * ENTRY CONDITIONS : GPR7=ADDRESS BBCCHH IN USER SEEK 00689000 * GPR8=ADDRESS OF VDEVBLOK 00690000 * GPR11=ADDRESS OF VMBLOK 00691000 * GPR12=BASE ADDRESS 00692000 * GPR13=ADDRESS OF SAVE AREA 00693000 * 00694000 * 00695000 * EXIT CONDITIONS : 00696000 * 00697000 * R1 = CYLINDER ADDRESS OR -1 IF ERROR CONDITION 00698000 * 00699000 * 00700000 * CALLS TO OTHER ROUTINES : 00701000 * 1. DMKFREE - TO OBTAIN IOBLOK. 00702000 * 2. DMKFRET - TO RETURN IOBLOK. 00703000 * 3. DMKIOSQR - INITIATE IO OPERATIONS. 00704000 * 00705000 * 00706000 * EXTERNAL REFERENCES : 00707000 * DMKIOSQR 00708000 * 00709000 * 00710000 * TABLES AND WORKAREAS : IOBLOK 00711000 * 00712000 * 00713000 * REGISTER USAGE : 00714000 * GPR 0-2 SCRATCH 00715000 * GPR 10=IOBLOK ADDRESS. 00716000 * GPR 11=VMBLOK ADDRESS. 00717000 * GPR 12=BASE ADDRESS. 00718000 * GPR 13=SAVE AREA ADDRESS. 00719000 * GPR 14=EXTERNAL LINKAGE REGISTER. 00720000 * GPR 15=EXTERNAL LINKAGE REGISTER. 00721000 * 00722000 * 00723000 * NOTES : NONE. 00724000 * 00725000 * 00726000 * 00727000 * OPERATION : F. IF GIVEN ADDRESS IS NOT AN ALTERNATE, EXIT. 00728000 * G. BUILD IOBLOK AND CALL DMKIOSQR TO READ R0. 00729000 * H. RETURN CYLINDER FROM R0 TO CALLER. 00730000 * 00731000 *. 00732000 USING VDEVBLOK,R8 @V56BDA8 00733000 SPACE 1 00734000 DMKTRKVA RELOC , GIVEN ALT TRK, FINDS DEF CYL ADDR@V56BDA8 00735000 L R8,VDEVREAL GET RDEVBLOK ADDRESS @V56BDA8 00736000 L R2,FFS IN CASE OF ERROR @V56BDA8 00737000 LA R0,IOBSIZE SIZE OF AN IOBLOK @V56BDA8 00738000 CALL DMKFREE GET ONE @V56BDA8 00739000 XC 0(IOBSIZE*8,R1),0(R1) CLEAR IT OUT @V56BDA8 00740000 LR R10,R1 PUT IN STANDARD REGISTER @V56BDA8 00741000 ST R13,IOBMISC2 SAVE SAVEAREA POINTER @V56BDA8 00742000 ST R11,IOBUSER PUT VMBLOK IN IOBLOK @V56BDA8 00743000 MVC SAVEWRK2(READHARZ-READHAR0),READHAR0 MOVE CCWS. @V56BDA8 00744000 DC 0AL4(SAVEWRK3,SAVEWRK4,SAVEWRK5,SAVEWRK6,SAVEWRK7,SAVEWR*00745000 K8,SAVEWRK9) THIS XREFS SYMBOLS MVC'D TO ABOVE 00746000 STCM R7,7,SAVEWRK2+1 MAKE SEEK POINT TO BBCCHH. @V56BDA8 00747000 LA R1,SAVEWRK1 PUT AS MUCH OF HA HERE AS FITS. @V56BDA8 00748000 STCM R1,7,SAVEWRK6+1 MAKE 'READ HA' POINT THERE. @V56BDA8 00749000 MVI SAVEWRK7+3,4 REDUCE HA COUNT; SAVEWRK1 = FCCH.@V56BDA8 00750000 LA R1,SAVER1 PUT R0 HERE (CCHH). @V56BDA8 00751000 STCM R1,7,SAVEWRK8+1 PUT ADDRESS IN CCW @V56BDA8 00752000 LA R1,SAVEWRK2 ->CHANNEL PROGRAM @V56BDA8 00753000 ST R1,IOBCAW SET CAW ADDRESS IN IOBLOK @V56BDA8 00754000 LA R1,HAR0RTN GET INTERRUPT RETURN ADDRESS AND @V56BDA8 00755000 ST R1,IOBIRA STORE IT IN THE IOBLOK @V56BDA8 00756000 CALL DMKIOSQR CALL IOS TO SCHEDULE READ @V56BDA8 00757000 GOTO DMKDSPCH WAIT FOR I/O TO COMPLETE @V56BDA8 00758000 SPACE 00759000 HAR0RTN DS 0H CONNECTOR @V56BDA8 00760000 USING *,R12 @V56BDA8 00761000 S R12,=A(HAR0RTN-DMKTRK) RELOCATE R12. @V56BDA8 00762000 USING DMKTRK,R12 @V56BDA8 00763000 L R13,IOBMISC2 RESTORE ADDRESS OF SAVEAREA @V56BDA8 00764000 L R2,FFS POSSIBLE IO ERROR CODE @V56BDA8 00765000 TM IOBSTAT,IOBFATAL+IOBCC3 WAS THERE AN ERROR @V56BDA8 00766000 * CONDITION 00767000 BNZ EXITVA2 IF YES, EXIT WITH ERROR CODE @V56BDA8 00768000 NI SAVEWRK1,X'03' CLEAR UNWANTED BITS FROM HA FLAG.@V56BDA8 00769000 CLI SAVEWRK1,1 POSSIBLE BIT VALUES: 00,01,10,11.@V56BDA8 00770000 BNE EXITVA2 ALL BUT 01 INDICATE INVALID ALT. @V56BDA8 00771000 LH R2,SAVER1 GET CC OF DEF TRK POINTED TO. @V56BDA8 00772000 EXITVA2 LA R0,IOBSIZE @V56BDA8 00773000 LR R1,R10 PUT ADDRESS OF IOB IN R1 @V56BDA8 00774000 CALL DMKFRET FREE IOB @V56BDA8 00775000 EXITVA ST R2,SAVER1 RETURN CC IN CALLERS GPR1 @V56BDA8 00776000 EXIT RETURN TO CALLER @V56BDA8 00777000 DROP R8 @V56BDA8 00778000 EJECT 00779000 *** 00780000 * RETURN VECTORS FOR DMKDASER 00781000 *** 00782000 FINISALT EQU 0 ALL FINISHED @V56BDA8 00783000 RETRYALT EQU 4 RETRY FROM IOBRSTRT @V56BDA8 00784000 EOCERR EQU 8 END OF CYLINDER CONDITION @V56BDA8 00785000 RECURALT EQU 12 SECOND ERROR - ANALYSE IT @V56BDA8 00786000 RECFAIL EQU 16 RECOVERY FAILURE @V56BDA8 00787000 FILPROT EQU 20 FILE PROTECTION EXCEPTION @V56BDA8 00788000 BADTRACK EQU 24 VERY DEFECTIVE TRACK @V56BDA8 00789000 COMRJCT EQU 28 COMMAND REJECT @V56BDA8 00790000 *** 00791000 SPACE 2 00792000 LEN2CCW EQU 2*8 REPRESENTS LENGTH OF 2 CCWS. @V56BDA8 00793000 L1 EQU 1 FOR USE AS SYMBOLIC LENGTH @V56BDA8 00794000 L2 EQU 2 FOR USE AS SYMBOLIC LENGTH @V56BDA8 00795000 L3 EQU 3 FOR USE AS SYMBOLIC LENGTH @V56BDA8 00796000 L4 EQU 4 FOR USE AS SYMBOLIC LENGTH. @V56BDA8 00797000 L8 EQU 8 FOR USE AS SYMBOLIC LENGTH @V56BDA8 00798000 SPACE 3 00799000 READHAR0 CCW 7,*-*,CC,6 SEEK @V56BDA8 00800000 CCW 35,ZEROES-PSA,CC+SILI,1 SET SECTOR 0 @V56BDA8 00801000 READHA CCW 26,*-*,CC+SILI,5 READ HA (FCCHH) @V56BDA8 00802000 READR0 CCW 22,*-*,SILI,4 READ R0 (CCHH) @V56BDA8 00803000 READHARZ EQU * MARKS END OF READHAR0 CHNL PROG. @V56BDA8 00804000 SPACE 1 00805000 ALT1CCWS CCW 7,*-*,CC,6 SEEK @V56BDA8 00806000 CCW 31,*-*,CC+SILI,1 SET FILE MASK @V56BDA8 00807000 CCW 35,ZEROES-PSA,CC+SILI,1 SET SECTOR 0 @V56BDA8 00808000 CCW 26,0,CC+SKIP+SILI,5 READ HA (NO DATA TRANSFER) @V56BDA8 00809000 CCW 8,*-*,0,0 TIC @V56BDA8 00810000 SPACE 2 00811000 LTORG @V56BDA8 00812000 SPACE 3 00813000 ALT1SECT DSECT , RECOVERY WORKAREA @V56BDA8 00814000 ALT1SEEK CCW 7,ALT1SKAD,CC,6 SEEK @V56BDA8 00815000 ALT1SFM CCW 31,ALT1FMSK,CC+SILI,1 SET FILE MASK @VMG0005 00816000 ALT1SCT0 CCW 35,ZEROES,CC+SILI,1 SET SECTOR 0 OR SRCHEQ R1 @V56BDA8 00817000 ALT1RHA CCW 26,0,SKIP+SILI+CC,5 DUMMY RHA OR TIC *-8 @V56BDA8 00818000 ALT1TICA CCW 8,*-*,0,0 TIC TO USER CCW OR TO SEARCH @V56BDA8 00819000 ALT1CLEN EQU *-ALT1SECT LENGTH OF USUAL CCWS @V56BDA8 00820000 ALT1SKAD DS XL6 SEEK ADDRESS @VMG0005 00821000 ALT1FMSK DS XL1 FILE MASK FOR RESTART @VMG0005 00822000 ALT1HA DS XL5 'READHA' READS HA INTO HERE. @VMG0005 00823000 ALT1R0 DS XL4 'READR0' READS R0 COUNT INTO HERE@VMG0005 00824000 ALT1SKSV DS XL4 SAVES 1ST SEEK ADDR (CCHH) DURING@VMG0005 00825000 * 2ND READ HA & R0. 00826000 ALT1FLAG DS XL1 FLAG BITS. EQUATE(S) FOLLOW. @VMG0005 00827000 ALT1PASS EQU X'01' BIT INDICATES 1ST OR 2ND READ OF @VMG0005 00828000 * HA & R0 WHEN CHECKING R0 POINTERS BOTH 00829000 * WAYS. 0 = 1ST TIME, 1 = 2ND TIME. 00830000 ALT1SIZE EQU (*-ALT1SECT+7)/8 NUMBER OF DBLEWRDS @V56BDA8 00831000 SPACE 1 00832000 ALT2SECT DSECT , RECOVERY WORKAREA @V56BDA8 00833000 ALT2SEEK CCW 7,ALT2SKAD,CC,6 SEEK @V56BDA8 00834000 ALT2SFM CCW 31,ALT2FMSK,CC+SILI,1 SET FILE MASK @V56BDA8 00835000 ALT2TICA CCW 8,*-*,0,0 TIC TO USER PROGRAM @V56BDA8 00836000 ALT2NCCW EQU (*-ALT2SEEK)/8 NUMBER OF CCWS. @V56BDA8 00837000 ALT2SKAD DC XL6'0' SEEK ADDRESS @V56BDA8 00838000 ALT2RECN DC XL1'0' RECORD NUMBER FOR SEARCH @V56BDA8 00839000 ALT2FMSK DC XL1'0' FILE MASK FOR RESTART @V56BDA8 00840000 ALT2SIZE EQU (*-ALT2SECT+7)/8 NUMBER OF DBLEWRDS @V56BDA8 00841000 SPACE 00842000 ALTSZCHK EQU ALT1SIZE-ALT2SIZE WHEN GOING THRU THE PATH FROM @VMG0005 00843000 * 'ALTHAR0' TO 'RESEEKHD' TO 'SETUSKHD', 00844000 * ALT1SECT AND ALT2SECT BOTH USE SAME 00845000 * WORK AREA (AT DIFFERENT TIMES). THIS 00846000 * EQU SIMPLY CHECKS TO SEE THAT ALT2 00847000 * WILL FIT IN WORK AREA ALLOCATED FOR 00848000 * ALT1 AND GIVES ASSEMBLY ERROR IF IT 00849000 * DOES NOT FIT. 00850000 SPACE 3 00851000 ALTTRK EQU X'01' ALTERNATE TRACK @V56BDA8 00852000 DEFTRK EQU X'02' DEFECTIVE TRACK @V56BDA8 00853000 EJECT 00854000 COPY RBLOKS @V56BDA8 00855000 COPY VBLOKS @V56BDA8 00856000 COPY IOBLOKS @V56BDA8 00857000 COPY DEVTYPES @V56BDA8 00858000 COPY EQU @V56BDA8 00859000 COPY SAVE @V56BDA8 00860000 COPY IOER @V56BDA8 00861000 COPY VMBLOK @V56BDA8 00862000 PSA @V56BDA8 00863000 END DMKTRK 00864000