TITLE 'IEAVELKR-SETLOCK REPAIR ROUTINE' 00050002 * /* START OF SPECIFICATIONS **** 00052002 * MODULE NAME= 00100002 * IEAVELKR 00101002 * CSECT NAME= 00102002 * IEAVELKR 00103002 * DESCRIPTIVE NAME= SETLOCK REPAIR ROUTINE-FRR ROUTINE 00104002 * 00105002 * COPYRIGHT= NONE 00106002 * 00107002 * STATUS= VERSION 1 00108002 * 00109002 * FUNCTION= 00110002 * THE SETLOCK REPAIR ROUTINE CORRELATES THE LOCKING 00111002 * HIERARCHY MASK TO THE LOCKWORDS AND WITH THE ASSUMP- 00112002 * TION THAT A DOUBLE ERROR HAS NOT OCCURRED(I.E. THE 00113002 * LOCKWORD AND THE HIERARCHY MASK ARE BOTH NOT INVALID), 00114002 * WILL ASSURE THAT A VALID HIERARCHY MASK, AND MATCHED 00115002 * AGAINST THE LOCKWORDS, DOES EXIST. IF AN INVALID STATE 00116002 * IS DETECTED, THERE ARE CASES WHERE THE HIERARCHY MASK 00117002 * WILL BE ALTERED WHILE IN OTHERS A LOCKWORD MAY BE COR- 00118002 * RECTED. IN CERTAIN EXTREME CASES A LOCK WILL BE STOLEN 00119002 * IN ORDER TO ALLOW THE SYSTEM TO CONTINUE. THE CMS LOCK 00120002 * WILL BE STOLEN IF EITHER A DAT ERROR OCCURRES WHILE THE 00121002 * CMS LOCK OWNER IS SUSPENDED, OR A RESTART INTERRUPT 00122002 * OCCURRES WHILE THE CMS LOCK OWNER IS SUSPENDED AND THE 00123002 * SYSTEM IS IN A WAIT SITUATION. IN CERTAIN CASES, A LOCK 00124002 * WILL NOT BE CORRECTED EVEN THOUGH AN INVALID VALUE MAY 00125002 * BE IN THE LOCK. IN THIS CASE RATHER THAN STEALING A 00126002 * RESOURCE AWAY FROM A POSSIBLE OWNER, THE LOCK WILL 00127002 * NO LONGER BE AVAILABLE FOR USE UNTIL ALL CPUS INVOLVED 00128002 * ARE WAITING(OR SPINNING) ON THE LOCKWORD. AT THIS TIME 00129002 * DEPRESSING THE RESTART KEY IS AN APPROPRIATE ACTION 00130002 * WHICH ENABLES THIS ROUTINE TO CLEAR THE UNAVAILABLE 00131002 * LOCK. IF SETLOCK WAS IN CONTROL AT TIME OF ERROR, THIS 00132002 * ROUTINE WILL DO A SETFRR TO ESTABLISH A RECOVERY ROUTINE 00133002 * FOR SETLOCK TO FREE ITS OWN RESOURCES. 00134002 * 00135002 * THE SETLOCK FRR ROUTINE WILL WITH 2 EXCEPTIONS ALWAYS 00136002 * INDICATE CONTINUE WITH RECOVERY IF IT IS ENTERED. IT 00137002 * WILL DETERMINE IF LOCKS WERE DYNAMICALLY OBTAINED FOR 00138002 * SETLOCK PURPOSES AND IF SO INDICATE THE FREEING OF THOSE 00139002 * LOCKS. IT WILL CORRECT ITS SUSPEND QUEUES, IF THEY WERE 00140002 * IN THE PROCESS OF BEING UPDATED. IT WILL REMOVE ALL 00141002 * ELEMENTS FROM ITS CMS LOCK SUSPEND QUEUE AND ITS LOCAL 00142040 * @Z40FPXJ 00142340 * LOCK SUSPEND QUEUE. IT WILL CLEAR ALL INDICATORS 00142640 * @Z40FPXJ 00143040 * THAT MAY HAVE BEEN SET IN THE MAINLINE. THE 2 EXCEPTION 00144002 * CASES ARE: 1. IF A RESTART INTERRUPTION OCCURRES DURING 00145002 * A VALID SETLOCK SPIN,THIS ROUTINE WILL INDICATE VAL SPIN 00146040 * @Z40FPXJ 00146540 * AND INDICATE TO RTM THE VALUE OF THE LOCKWORD IT IS 00147002 * SPINNING ON. 00148040 * 2. IF NO LOCKS ARE HELD, NO SUPER BITS ARE ON, @ZA27996 00148840 * AND SYSTEM IS NOT IN TCB OR SRB MODE, @ZA27996 00149640 * RETRY WILL BE DONE AT IEA0DS. @ZA27996 00150440 * 00153002 * OPERATION= SEE FUNCTION 00154040 * 00204040 * 00313902 * DEPENDENCIES= 00314202 * RTM: 00314502 * 1. REGISTER INPUT THE SAME AS AT ENTRY TO RTM1. 00314802 * 2. SETLOCK'S FRR MUST ALWAYS RECEIVE CONTROL IF 00315102 * IT IS ON THE RECOVERY STACK. 00315402 * 3. RTM MUST NOT DEPEND ON ANY LOCKS THAT MAY HAVE 00315702 * BEEN INDICATED AS HELD ON ENTRY TO THIS ROUTINE. 00316002 * 4. IF A DAT ERROR HAS OCCURRED, RTM CAN NOT DEPEND 00316302 * ON ANY FURTHER DISPATCHING IN THE CURRENT MEMORY. 00316602 * SETLOCK: 00316902 * 1. DEPENDENT ON THE VS2/2 IMPLMENTATION OF SETLOCK. 00317202 * ASVT RECONSTRUCT(IEAVEVRR): 00317302 * 1. NO SETRPS MAY BE ISSUED. 00317402 * 2. REGISTER 1 MUST BE PRESERVED. 00317802 * 00320802 * CHARACTER CODE DEPENDENCIES= 00321202 * MUST BE REASSEMBLED IF CHARACTER SET OTHER THAN 00321602 * EBCIDC. 00322002 * 00322402 * RESTRICTIONS= 00322802 * NONE 00323202 * 00323602 * REGISTER CONVENTIONS= 00324002 * REFERENCE EQUATE SECTION OF MODULE 00324402 * 00324802 * MODULE TYPE= PROCEDURE 00325202 * 00325602 * PROCESSOR= ASSEMBLER 00326002 * 00326402 * MODULE SIZE= 00326802 * REFERENCE ESD LENGTH AT BEGINNING OF MODULE. 00327202 * 00327602 * ATTRIBUTES= 00328002 * NUCLEUS 00328402 * ZERO PROTECT KEY 00328802 * DISABLED 00329202 * REFRESHABLE 00329602 * SUPERVISOR MODE 00330002 * ANY LOCKS HELD(OR NO LOCKS) 00330402 * 00330802 * ENTRY POINT= 00331202 * IEAVELKR 00331602 * 00332002 * PURPOSE= 00332402 * TO VERIFY AND RECONSTRUCT LOCKS,LOCK TABLE, AND 00332802 * HIERARCHY MASK. ALSO TO SETFRR IF NECESSARY. 00333202 * 00333602 * LINKAGE= 00334002 * SEE INPUT SECTION BELOW. 00334402 * 00334802 * INPUT= 00335202 * ENVIRONMENT= 00335602 * SEE ATTRIBUTES 00336002 * DATA= 00336402 * ALL SYSTEM LOCKWORDS 00336802 * CPU LOCKS HELD TABLE 00337202 * LOCKS HIERARCHY MASK 00337602 * ERROR INFORMATION AS DEFINED BY RTM'S REGISTERS 00337802 * REGISTERS= 00338202 * 13-ADDRESS OF RTM'S SAVED REGISTERS 00338602 * 15-ENTRY POINT REGISTER 00339002 * ALL OTHERS IRRELEVANT 00339402 * THE FOLLOWING ARE RTM'S SAVED REGISTERS: 00340002 * 0-TYPE OF ENTRY(=2 IF RESTART,=4 IF DAT ERROR) 00340402 * 1-COMPLETION CODE(IN MID 12 BITS) 00340802 * 2- ADDRESS OF ERROR PSW 00341202 * 3-ADDRESS OF ILC AND INTERRUPT CODE 00341602 * 5-ADDRESS OF VARIABLE INFORMATION(ERROR 00342002 * DEPENDENT) 00342402 * 13-ADDRESS OF REGISTERS AT TIME OF ERROR 00342802 * 14-RETURN ADDRESS 00343202 * 15-ENTRY POINT ADDRESS 00343602 * 00344402 * OUTPUT= 00344802 * SEE EXIT-NORMAL 00345202 * 00345602 * EXIT-NORMAL= 00346002 * ASVT VERIFICATION ROUTINE(IEAVEVRR) 00346402 * 00346802 * CONDITIONS= 00347202 * EXIT IS ALWAYS TO IEAVEVRR 00347302 * 00348002 * OUTPUT= 00348402 * DATA= 00348802 * THE CORRELATION BETWEEN THE HIERARCHY MASK 00349202 * AND THE LOCKWORDS ARE CORRECT OR HAVE BEEN 00349602 * CORRECTED. IN THE CASE OF A DAT ERROR OR 00350002 * RESTART INTERRUPT THE CMS LOCK MAY HAVE BEEN 00350402 * STOLEN FROM ITS OWNER. IN THE CASE OF A 00350802 * RESTART INTERRUPT ALL SPIN LOCKWORDS HAVE 00351202 * VALID VALUES IN THEM. 00351602 * ALSO IF SETFRR HAS BEEN DONE THE HIGH ORDER BIT 00351702 * OF THE FIRST WORD OF THE FRR WORK AREA WILL BE 00351802 * SET ON. 00351902 * 00352002 * REGISTERS= 00352402 * 1-FRR PARM REGISTER(IF 0 NO SETFRR DONE, 00352802 * IF NON-0 THEN IS THE AD- 00353202 * DRESS OF THE FRR WORK AREA) 00353602 * 13-ADDRESS OF RTM'S SAVED REGISTERS 00354002 * 15-ENTRY POINT OF IEAVEVRR 00354402 * 00354802 * RETURN CODES= 00355202 * NONE 00355602 * 00356002 * ENTRY POINT= 00356402 * IEAVLKRR(INTERNAL ENTRY) 00356802 * 00357202 * PURPOSE= 00357602 * THIS IS THE REPAIR ROUTINE FRR. IT WILL DETERMINE IF 00358002 * SETLOCK RECOVERY IS TO BE INITIATED IF SO IT WILL 00358102 * DETERMINE IF IN A VALID SPIN, A RETRYABLE SITUATION 00358402 * OR A PERCOLATION CONDITION.SETLOCK SUSPEND QUEUES 00358802 * ARE ALSO CLEARED IN MANY CASES. 00359202 * IN ADDITION TO THIS IT WILL DETERMINE IF THE 00359302 * ASVT RECONSTRUCT ROUTINE 00359402 * IS TO BE GIVEN CONTROL AND IF SO GO THERE. 00359502 * 00359602 * LINKAGE= 00360002 * SEE INPUT SECTION BELOW 00360402 * INPUT= 00360802 * ENVIRONMENT= 00361202 * SEE ATTRIBUTES 00361602 * DATA= 00362002 * SETLOCK INDICATORS-LCCALOCK,LCCALKDP,LCCALKSA, 00362302 * LCCALKAQ,PSALOCK. 00362602 * SETLOCK TABLE OF LOCKWORD ADDRESS(ADDRESSES 00362902 * OF THE LOCKWORD ADDRESSES). 00363202 * SETLOCK SUSPEND QUEUES AND HEADER AND TRAILER 00363502 * ADDRESSES. 00363802 * SDWA CONTROL BLOCK INFORMATION. 00364102 * REGISTERS= 00364402 * 1-ADDRESS OF SDWA 00364702 * 14-RETURN ADDRESS 00365002 * 15-ENTRY POINT ADDRESS 00365302 * OUTPUT= 00366602 * SEE EXIT-NORMAL BELOW 00367002 * 00367402 * EXIT-NORMAL= 00367802 * BACK TO CALLER(VIA BR 14) 00368202 * 00368602 * CONDITIONS= 00369002 * EXIT IS ALWAYS VIA BR 14 00369402 * 00369802 * OUTPUT= 00370202 * DATA= 00370602 * FOR ALL CASES EXCEPT FOR A VALID SPIN CONDITION 00371002 * ALL SUSPEND QUEUES WILL BE CLEARED, @Z40FPXJ 00371440 * ALL INTERNAL INDICATORS CLEARED, AND @Z40FPXJ 00371640 * ANY SELF-OBTAINED LOCKS ARE FREED. @Z40FPXJ 00371840 * IN THE VARIABLE RECORDING AREA WILL BE PLACED 00372402 * THE ACRONYM C'RRRA' AND THE FIRST WORD OF THE 00372602 * RRRA(FRR WORK AREA) WHICH MAPS AS FOLLOWS: 00372702 * BIT0=1 MEANS SETLOCK WAS ENTERED, BIT1=1 MEANS 00372802 * ASVT RECONSTRUCT WAS ENTERED 00372902 * REGISTERS= 00373002 * 1-ADDRESS OF SDWA 00373202 * 14-RETURN ADDRESS 00373402 * 00373802 * RETURN CODES= 00374202 * NONE 00374602 * 00375002 * EXIT-ERROR= 00375402 * NONE 00375802 * 00376202 * EXTERNAL REFERENCES= 00376602 * 00377102 * ROUTINES= 00377602 * SETFRR ADD-INLINE MACRO EXPANSION. THE FRR THAT 00377902 * IS ADDED MUST ALWAYS RECEIVE CONTROL. 00378202 * ONLY THE WORKREGISTERS SPECIFIED ARE 00378602 * DESTROYED ACROSS THE MACRO CALL. 00378902 * SETFRR DELETE- DONE TO DELETE FRR IF IN VALID SPIN. 00379202 * SETLOCK RELEASE,TYPE=CMS-THE MACRO SETS UP ALL 00379602 * REQUIRED REGISTERS. REGISTERS 11-14 ARE DE- 00379902 * STROYED UPON RETURN. THE ENVIRONMENT RE- 00380202 * MAINS UNCHANGED. 00380602 * SETRP-INLINE MACRO EXPANSION. REGISTER 1 CONTAINS 00381102 * THE SDWA AS INPUT. NO REGISTERS ARE DESTROYED. 00381602 * SETLOCK WINDOW SPIN ROUTINE(IEAVELKW)= 00381902 * INPUTS= 00382202 * REGISTERS= 6 ENTRY ADDRESS 00382502 * 7 RETURN ADDRESS 00383002 * 8 LCCA ADDRESS 00383302 * 11 LOCK ADDRESS 00383602 * 12 DISP HIERARY MASK 00384102 * OUTPUTS= 00384602 * REGISTERS= 5-10 DESTROYED 00385102 * MEMTERM= 00385302 * INPUTS= 00385502 * REGISTERS= 1 COMPLETION CODE 00385702 * 13 SAVE AREA ADDRESS 00386102 * OUTPUTS= NONE 00386302 * 00386502 * 00386702 * 00386902 * 00387102 * DATA AREA= 00387402 * SEE INPUTS SECTION 00387702 * 00388002 * CONTROL BLOCKS= 00388302 * PSA R/W 00388802 * LCCA R/W 00389102 * ASCB R/W 00389402 * CVT R 00389802 * SDWA R/W 00390302 * CSD R 00390802 * 00391102 * TABLES= 00391402 * SETLOCK'S CPU LOCKS HELD TABLE USED 00391802 * SETLOCK'S ADDRESSES OF LOCK ADDRESSES TABLE USED 00392302 * 00392802 * MACROS= 00393202 * SETFRR A 00393602 * SETLOCK RELEASE,TYPE=CMS 00394002 * SETRP CPU=(CPUID) 00394102 * SETRP RETADDR=(R),RC=4 00394602 * SETRP FRELOCK=(DISP) 00395102 * SETRP FRELOCK=(SALLOC) 00395302 * SETRP COMPCOD=(X'074',SYSTEM) 00395502 * CALLRTM TYPE=MEMTERM 00395702 * 00396102 * SERIALIZATION= 00396602 * DISPATCHER LOCK/DISABLE 00397102 * 00397402 * CHANGE LEVEL= 00397740 * @ZA19968 00397840 * OZ27996--THIS ROUTINE'S FRR WOULD FORMERLY RETRY @ZA27996 00397940 * IN MANY SITUATIONS. NOW IT WILL RETRY @ZA27996 00398040 * ONLY IF NO LOCKS ARE HELD AND THE STATE @ZA27996 00398140 * CANNOT BE DETERMINED. @ZA27996 00398240 * OZ28255 -LOCK REPAIR WILL CHECK BOTH LOCK SUPER @ZA28255 00398340 * BITS AND THE LOCK MANAGER SALLOC LOCK @ZA28255 00398440 * BIT TO DETERMINE IF AN FRR SHOULD BE @ZA28255 00398540 * SET. IT WILL NOT BE SET IF THE LOCK @ZA28255 00398640 * SUSPEND SUPER BIT (PSAULCMS) AND THE @ZA28255 00398740 * LOCK MANAGER SALLOC LOCK BIT @ZA28255 00398840 * (LCCALKSA) ARE BOTH ON. @ZA28255 00398940 * THE SETLOCK FRR ROUTINE WILL PROCESS @ZA28255 00399040 * THE TWO SUPER BITS SEPARATELY. @ZA28255 00399140 * OZ32162 - NO CODE CHANGE. FIX COVER LETTER FOR SU51 00399440 * BECAUSE PREREQ MACRO IHAPSA IS IN SU51 00399540 * CORRECT. @ZA32162 00399640 * 00399740 * MESSAGES= 00399840 * NONE 00399940 * ABEND CODES= 00400040 * X'074'-GENERAL ERROR COMPLETION CODE 00400140 * 00400240 **** END OF SPECIFICATIONS ***/ 00400340 */*IEAVELKR: CHART SETLOCK RECOVERY */ 00400440 */* HEADER 00400602 */* 00401102 */* 00401402 */* 00401702 */* SECTION 3.1.7.14 00402102 */* SETLOCK RECOVERY 00402602 */* PAGE # */ 00403102 */*IEAVELKR: E BEGIN SETLOCK REPAIR ROUTINE */ 00403402 SPACE 2 00403702 IEAVELKR CSECT 00404102 USING LCCA,LCCAREG 00404602 USING PSA,0 00405102 USING SDWA,R1 00405402 * EQUATE SECTION 00405702 R0 EQU 0 REGISTER 0 00406102 R1 EQU 1 REGISTER 1 00406602 R2 EQU 2 REGISTER 2 00407102 STLRET EQU 2 STEAL ROUTINE RETURN REG 00407402 WORKREG3 EQU 3 WORK REGISTER @ZA19968 00407540 MASKREG EQU 3 MASK REGISTER 00407740 COUNTREG EQU 3 GENERAL COUNT REG 00408102 BASEREG2 EQU 4 ALTERNATE BASE REGISTER 00408402 TEMPSAVE EQU 4 TEMPORARY SAVE REG 00408702 TABLEREG EQU 4 TABLE INDEX REG 00409002 R5 EQU 5 REGISTER 5 00409302 JRNLREG EQU 5 JOURNAL REGISTER 00410002 TEMPPARM EQU 5 TEMPORARY SAVE REG 00410402 INDREG EQU 5 INDEX REGISTER 00410802 RETADD EQU 5 RETRY ADDRESS REG 00411202 R6 EQU 6 REGISTER 6 00411602 VALREG EQU 6 GENERAL VALUE REG 00412002 R7 EQU 7 REGISTER 7 00412440 LCCAREG EQU 8 LCCA ADDRESS REG 00413602 ALTWORK EQU 9 WORK REGISTER 00414002 BASEREG EQU 9 REPAIR ROUTINE BASE REG 00414402 WORKREG EQU 10 WORK REGISTER 00414802 LOCKREG EQU 11 LOCK ADDRESS REG 00415202 R13 EQU 13 REGISTER 13 00416002 R14 EQU 14 REGISTER 14 00416402 R15 EQU 15 REGISTER 15 00416802 * VALUE EQUATES 00417202 ZERO EQU 0 DISPLACEMENT VALUE 00417602 ONE EQU 1 DISPLACEMENT VALUE 00418002 THREE EQU 3 DISPLACEMENT VALUE 00418402 FOUR EQU 4 DISPLACEMENT VALUE 00418802 EIGHT EQU 8 DISPLACEMENT VALUE 00419202 WAITON EQU X'02' WAIT BIT IN PSW 00420002 COMPCOD EQU X'074' LOCK COMPCODE 00422002 CMSLOCHM EQU X'03' CMS-LOCAL HIERARCHY MASK 00422102 CMSHM EQU X'02' CMS HIERARCHY MASK 00426702 LOCHM EQU X'01' LOCAL HIERARCHY MASK 00428702 MAX EQU X'FF' AND HIGH MASK 00430702 SPACE 2 00430902 */* P ESTABLISH ADDRESSABILITY */ 00431102 SPACE 2 00431302 BALR BASEREG,R0 ESTABLISH 00431502 USING *,BASEREG ADDRESSABILITY 00436102 SPACE 2 00446102 */* P CLEAR FRR PARM REG */ 00456102 SPACE 2 00466102 SLR R1,R1 ZERO PARM REGISTER 00500002 * 00550002 * CHECK IS A SETFRR IS APPROPRIATE(SETLOCK IN CONTROL) 00600002 SPACE 2 00610002 */* D (NO,VERIFY,YES,) IS SETLOCK ACTIVE? */ 00620002 SPACE 2 00630002 TM PSASUP1,PSALOCK IS SETLOCK ACTIVE 00650002 BO SALOCKON SETLOCK IS ACTIVE @ZA28255 00700040 TM PSASUP3,PSAULCMS SETLOCK SUSPEND ACTIVE? @ZA28255 00702040 BZ VERIFY SETLOCK IS NOT ACTIVE @ZA28255 00704040 SALOCKON L LCCAREG,PSALCCAV GET THE LCCA ADDRESS @ZA28255 00706040 SPACE 2 00710002 */* D (NO,SETFRR,YES,) DID RESTART OCCURR? */ 00720002 SPACE 2 00730002 L R0,ZERO(R13) GET TYPE OF ENTRY VALUE 00750002 C R0,ADTWO DID A RESTART OCCUR 00800002 BNE SETFRR IF NOT, DO A SETFRR 00850002 SPACE 2 00860002 */* D (NO,SETFRR,YES,) IS SETLOCK SPINNING? */ 00870002 SPACE 2 00880002 TM LCCASPN1,LCCALOCK IS SETLOCK SPINNING 00950002 BNO SETFRR IF NOT, DO A SETFRR 01000002 * CHECK IF ERROR OCCURRED IN SETLOCK RANGE 01050002 SPACE 2 01060002 */* D (NO,VERIFY,YES,) IS ERROR PSW IN SETLOCK? */ 01070002 SPACE 2 01080002 L R2,EIGHT(R13) GET PSW ADDRESS 01100002 L R2,FOUR(R2) GET ADDRESS OF ERROR 01150002 C R2,LOCKSTRT IS ERROR LESS THAN START 01200002 BL VERIFY IF SO,CONTINUE PROCESSING 01250002 C R2,LOCKEND IS ERROR WITHIN LOCK 01300002 BH VERIFY IF NOT,CONTINUE PROCESSING 01350002 SPACE 2 01360002 */*SETFRR: L PERFORM A SETFRR ADD */ 01370002 */* P SET SETLOCK BIT IN FRR PARM AREA */ 01380002 SPACE 2 01390002 SETFRR TM PSASUP1,PSALOCK IS SETLOCK ACTIVE @ZA28255 01400040 BO SETFRR1 GO SET FRR IF ACTIVE @ZA28255 01408040 TM LCCALKFG,LCCALKSA IS SETLOCK SALLOC BIT ON@ZA28255 01416040 BO VERIFY FRR IS ALREADY SET @ZA28255 01424040 SETFRR1 SETFRR A,FRRAD=LOCKASVT,PARMAD=(1),WRKREGS=(2,3) @ZA28255 01432040 OI RRRAFLG1-RRRA(R1),RRRALOCK INDICATE SETLOCK FRR 01450002 * 01500002 * THE FOLLOWING ROUTINES RECONSTRUCT HIERARCHY MASK AND LOCKWORDS 01550002 SPACE 2 01560002 */*VERIFY: P CLEAR ALL UNUSED BITS IN HIERARCHY MASK */ 01570002 */* P SET UP TO SCAN LOCKWORDS AND LOCK TABLE */ 01580002 SPACE 2 01590002 VERIFY DS 0H 01600002 * SPIN LOCK RECONSTRUCTION 01650002 L MASKREG,HIGHHM GET HIGHEST HIERARCHY MASK VAL 01700002 LR WORKREG,MASKREG GET HIGH MASK VALUE 01708002 SLL WORKREG,ONE MULT BY 2 01716002 BCTR WORKREG,ZERO GET AND VALUE 01724002 N WORKREG,PSAHLHI CLEAR ALL HIGH BITS 01732002 ST WORKREG,PSAHLHI STORE GOOD HLHI 01740002 L TABLEREG,TABLEADD GET ADDRESS OF LOCK ADDRESS TAB 01750002 SLR INDREG,INDREG ZERO INDEX REG 01800002 SPACE 2 01810002 */*SPINLOOP: D (YES,ENDLOOP,NO,) IS LOCK ADDRESS ZERO? */ 01820002 SPACE 2 01830002 SPINLOOP L LOCKREG,ZERO(INDREG,TABLEREG) GET ADDRESS OF LOCK ADDR 01850002 L LOCKREG,ZERO(LOCKREG) GET ADDRESS OF LOCKWORD 01900002 LTR LOCKREG,LOCKREG IS LOCK ADDRESS ZERO(ONLY WHEN 01950002 * CLASS LOCK IS USED 02000002 BZ ENDLOOP IF SO,GET NEXT ENTRY 02050002 SPACE 2 02060002 */* D (NO,ENDLOOP,YES,) IS LOCK ADDRESS REFRENCABLE? */ 02070002 SPACE 2 02080002 LRA WORKREG,ZERO(LOCKREG) IS LOCK ADDRESS IN STORAGE 02100002 BNZ ENDLOOP IF NOT,GET NEXT ENTRY 02150002 SPACE 2 02160002 */* D (YES,SPINOWN,NO,) IS LOCK OWNED BY THIS CPU? */ 02170002 SPACE 2 02180002 L VALREG,ZERO(LOCKREG) GET VALUE FROM LOCKWORD 02200002 LH WORKREG,PSACPULA GET CPU ID 02250002 CR VALREG,WORKREG IS THE LOCK OWNED BY THIS CPU 02300002 BE SPINOWN IF SO INDICATE OWNED 02350002 SPACE 2 02420002 */* D (NO,ENDLOOP,YES,) DID RESTART OCCUR? */ 02490002 SPACE 2 02560002 L WORKREG,ZERO(R13) GET ERROR TYPE VALUE 02650002 C WORKREG,ADTWO DID RESTART OCCUR 02700002 BNE ENDLOOP IF NOT,END LOOP 02750002 SPACE 2 02760002 */* D (NO,ENDLOOP,YES,) IS LOCK OWNED AT ALL? */ 02770002 SPACE 2 02780002 LTR VALREG,VALREG LOCK OWNED 02800002 BZ ENDLOOP IF NOT,END LOOP 02850002 SPACE 2 02860002 */* D (YES,ENDLOOP,NO,) IS VALID CPUID IN LOCKWORD? */ 02870002 SPACE 2 02880002 C VALREG,AD40 IS LOCK VALUE LOWER THAN MIN. 02900002 BL SPNSTEAL IF SO,CLEAR LOCK 02950002 C VALREG,AD7F IS LOCK VALUE HIGHER THAN MAX. 03000002 BNH ENDLOOP IF NOT,END LOOP 03050002 SPACE 2 03060002 */*SPNSTEAL: P CLEAR LOCKWORD WITH CS INSTRUCTION */ 03070002 SPACE 2 03080002 SPNSTEAL SLR WORKREG,WORKREG ZERO CS REG 03100002 CS VALREG,WORKREG,ZERO(LOCKREG) CLEAR LOCKWORD(MAY NOT 03150002 * COMPARE) 03200002 SPACE 2 03240002 */*ENDLOOP: P CLEAR LOCK TABLE ENTRY */ 03280002 */* P CLEAR HIERARCHY MASK BIT */ 03320002 SPACE 2 03360002 ENDLOOP SLR WORKREG,WORKREG CLEAR WORKREG 03400002 ST WORKREG,PSACLHT(INDREG) ZERO CLHT ENTRY 03450002 LR WORKREG,MASKREG GET HIERARCHY MASK VALUE 03500002 X WORKREG,ALLON GET AND VALUE 03550002 N WORKREG,PSAHLHI CLEAR HIERARCHY MASK VALUE 03600002 ST WORKREG,PSAHLHI STORE CORRECT HIERARCHY MASK 03650002 SPACE 2 03670002 */*ENDLOOP2: D (YES,CMSCHECK,NO,) LAST SPIN DONE? */ 03690002 SPACE 2 03710002 ENDLOOP2 C MASKREG,LASTSPIN FINISHED 03750002 BE CMSCHECK IF SO,DO CMS CHECKING 03800002 SPACE 2 03805002 */* P (,SPINLOOP) SET UP FOR NEXT LOCK VERIFICATION */ 03810002 SPACE 2 03815002 SRL MASKREG,ONE GET LOWER HIERARCHY VALUE 03820002 LA INDREG,FOUR(INDREG) INCREMENT TABLE INDEX 03850002 B SPINLOOP CONTINUE LOOP 03900002 SPACE 2 03910002 */*SPINOWN: P (,ENDLOOP2) SET HIERARCHY MASK BIT ON */ 03920002 SPACE 2 03930002 SPINOWN L WORKREG,PSAHLHI GET CURRENT HIERARCHY MASK 03950002 OR WORKREG,MASKREG SET HIERARCHY MASK BIT 04000002 ST WORKREG,PSAHLHI STORE CORRECT HIERARCHY MASK 04050002 B ENDLOOP2 GO END LOOP 04100002 SPACE 2 04110002 */*CMSCHECK: D (YES,CMSCLEAR,NO,) IS CMS LOCK CLEAR? */ 04120002 SPACE 2 04130002 * CMS LOCK RECONSTRUCT ROUTINE 04150002 CMSCHECK DS 0H 04200002 L LOCKREG,CMSLOCK GET ADDRESS OF CMS LOCK 04250002 L LOCKREG,ZERO(LOCKREG) GET CMS LOCK VALUE 04300002 LTR LOCKREG,LOCKREG IS CMS LOCK CLEAR 04350002 BZ CMSCLEAR IF SO,FINISHED CMS CHECKS 04400002 SPACE 2 04410002 */* D (NO,CMSCHK2,YES,) DID RESTART OCCUR? */ 04420002 SPACE 2 04430002 L WORKREG,ZERO(R13) GET ERROR TYPE VALUE 04450002 C WORKREG,ADTWO DID RESTART OCCUR 04500002 BNE CMSCHK2 IF NOT, CHECK FURTHER 04550002 SPACE 2 04560002 */* D (NO,CMSCHK2,YES,) IS ERROR PSW IN WAIT? */ 04570002 SPACE 2 04580002 L WORKREG,EIGHT(R13) GET ERROR PSW ADDRESS 04600002 TM ONE(WORKREG),WAITON IS PSW IN WAIT 04650002 BNO CMSCHK2 IF NOT,CHECK FURTHER 04700002 SPACE 2 04710002 */* D (NO,CMSCHK2,YES,) IS CURRENT ASCB WAITASCB? */ 04720002 SPACE 2 04730002 L WORKREG,WAITASCB GET WAIT ASCB ADDRESS 04750002 C WORKREG,PSAAOLD IS WAIT CURRENT ASCB 04800002 BNE CMSCHK2 IF NOT,CHECK FURTHER 04850002 SPACE 2 04860002 */* D (NO,CMSCHK2,YES,) ARE ALL CPUS IN WAIT ASCB? */ 04870002 SPACE 2 04880002 L COUNTREG,FLCCVT GET CVT ADDRESS 04900002 L COUNTREG,CVTCSD-CVT(COUNTREG) GET CSO ADDRESS 04950002 LH COUNTREG,CSDCPUOL-CSD(COUNTREG) GET CPU ON-LINE COUNT 05000002 C COUNTREG,ASCBCPUS-ASCB(WORKREG) ALL CPUS IN WAIT ASCB 05050002 BNE CMSCHK2 IF NOT,CHECK FURTHER 05100002 SPACE 2 05110002 */* D (NO,CMSCHK2,YES,) IS CMS VALUE REFRENCABLE? */ 05120002 SPACE 2 05130002 LRA WORKREG,ZERO(LOCKREG) IS CMSLOCK VALUE REFERENCABLE 05150002 BNZ CMSCHK2 IF NOT,CHECK FURTHER 05200002 SPACE 2 05210002 */* D (NO,CMSCHK2,YES,) DOES CMSLOCK POINT TO REAL ASCB? */ 05220002 SPACE 2 05230002 L WORKREG,ZERO(LOCKREG) GET FIRST 4 BYTES OF ASCB OWNER 05250002 * @ZA06217 05270040 C WORKREG,CASCB IS IT A REAL ASCB @ZA06217 05300040 BNE CMSCHK2 IF NOT,CHECK FURTHER @ZA06217 05320040 SPACE 2 05360002 */* D (NO,CMSCHK2,YES,) IS OWNER OF CMS IN PAGE WAIT? */ 05370002 SPACE 2 05380002 L WORKREG,ASCBLOCK-ASCB(LOCKREG) GET VALUE OF LOCAL LOCK 05400002 * OF CMS OWNER 05450002 C WORKREG,SUSPID IS OWNER IN PAGE WAIT 05500002 BNE CMSCHK2 IF NOT, CHECK FURTHER 05550002 SPACE 2 05560002 */* P SET UP TO MEMTERM MEMORY THAT OWNS CMSLOCK */ 05570002 SPACE 2 05580002 * THE OWNER OF THE CMS LOCK WILL BE MEMTERMED AND CMS STOLEN 05600002 L LCCAREG,PSALCCAV GET LCCA ADDRESS 05650002 L WORKREG,LCCACPUS GET WSAC ADDRESS 05700002 LR TEMPSAVE,R13 SAVE SAVE AREA ADDRESS 05750002 LR TEMPPARM,R1 SAVE PARM REG VALUE 05800002 L R13,WSACABTM-WSAC(WORKREG) GET MEMTERM SAVE AREA ADDR 05850002 LA R1,COMPCOD GET MEMTERM CODE 05900002 SLR WORKREG,WORKREG CLEAR ASID REG 05950002 ICM WORKREG,THREE,ASCBASID-ASCB(LOCKREG) GET ASID VALUE 06000002 SPACE 2 06010002 */* L MEMTERM MEMORY */ 06020002 SPACE 2 06030002 CALLRTM TYPE=MEMTERM,COMPCOD=(1),ASID=(WORKREG) TERM MEMORY 06050002 NI ASCBFLG1-ASCB(LOCKREG),MAX-ASCBCMSH CLEAR CMS BIT 06070002 LR R13,TEMPSAVE RESTORE SAVE AREA 06100002 LR R1,TEMPPARM RESTORE PARM ADDRESS 06150002 SPACE 2 06160002 */* P SET UP TO STEAL CMSLOCK */ 06170002 SPACE 2 06180002 L WORKREG,PSAAOLD GET CURRENT ASCB ADDRESS 06200002 L LOCKREG,CMSLOCK GET CMS LOCK ADDRESS 06250002 ST WORKREG,ZERO(LOCKREG) REPLACE CMS VALUE WITH CURRENT 06300002 OI PSAHLHI+THREE,CMSLOCHM SET CMS AND LOCAL H M 06320002 SPACE 2 06327002 */* S CMSSTEAL:GO TO INTERNAL STEAL ROUTINE */ 06334002 SPACE 2 06341002 BAL STLRET,CMSSTEAL GO STEAL THE LOCK RELEASING 06350002 * SUSPENDED CMS REQUESTORS 06400002 SPACE 2 06410002 */*CMSCLEAR: P (,LOCALCHK) CLEAR CMS HIERARCHY AMSK BIT */ 06420002 SPACE 2 06430002 CMSCLEAR NI PSAHLHI+THREE,MAX-CMSHM CLEAR CMS HIERARCHY BIT 06450002 B LOCALCHK GO PERFORM LOCAL CHECKS 06500002 SPACE 2 06510002 */*CMSSTEAL: E CMS STEAL ROUTINE */ 06520002 SPACE 2 06530002 * THE FOLLOWING ROUTINE STEALS THE CMS LOCK 06550002 CMSSTEAL DS 0H 06600002 SPACE 2 06610002 */* D (NO,STEAL2,YES,) SETLOCK ACTIVE? */ 06620002 SPACE 2 06630002 TM PSASUP1,PSALOCK IS SETLOCK IN CONTROL 06650002 BO STEAL1 IT IS DONT USE SETLOCK @ZA28255 06700040 TM PSASUP3,PSAULCMS SETLOCK SUSPEND ACTIVE @ZA28255 06702040 BZ STEAL2 IS NOT, USE SETLOCK @ZA28255 06704040 STEAL1 DS 0H 06706040 SPACE 2 06710002 */* P (,FINSTEAL) STEAL CMSLOCK WITH CS INSTRUCTION */ 06720002 SPACE 2 06730002 SLR WORKREG,WORKREG CLEAR REG 06750002 L LOCKREG,CMSLOCK GET CMS LOCK ADDRESS 06800002 L VALREG,ZERO(LOCKREG) GET CMS VALUE 06850002 CS VALREG,WORKREG,ZERO(LOCKREG) CLEAR CMSLOCK 06900002 BR STLRET RETURN TO CALLER 06950002 SPACE 2 06960002 */*STEAL2: L REQUEST CMS LOCK TO BE FREED */ 06970002 SPACE 2 06980002 STEAL2 DS 0H 07000002 LR WORKREG,R13 SAVE REG 13 07020002 SETLOCK RELEASE,TYPE=CMS,RELATED=('STEALING CMS') 07050002 LR R13,WORKREG RESTORE REG 13 07070002 SPACE 2 07077002 */*FINSTEAL: R END CMSSTEAL ROUTINE-RETURN */ 07084002 SPACE 2 07091002 BR STLRET RETURN TO CALLER 07100002 SPACE 2 07110002 */*CMSCHK2: D (NO,CMSCLEAR,YES,) DOES CURRENT ASCB OWN CMSLOCK? */ 07120002 SPACE 2 07130002 * CONTINUE WITH CMS LOCK CHECKS 07150002 CMSCHK2 DS 0H 07200002 C LOCKREG,PSAAOLD DOES CURRENT ASCB OWN LOCK 07250002 BNE CMSCLEAR IF NOT,FINISHED 07300002 SPACE 2 07310002 */* D (YES,CMSLOCAL,NO,) IS CPUID IN LOCAL LOCK? */ 07320002 SPACE 2 07330002 L WORKREG,ASCBLOCK-ASCB(LOCKREG) GET LOCAL LOCK VALUE 07350002 LH VALREG,PSACPULA GET CPU ID 07400002 CR WORKREG,VALREG IS CPUID IN LOCAL LOCK 07450002 BE CMSLOCAL IF SO,CLEAN UP 07500002 SPACE 2 07510002 */* D (YES,CMSSUSP,NO,) IS SUSPEND ID IN LOCAL LOCK? */ 07520002 SPACE 2 07530002 C WORKREG,SUSPID IS SUSPEND ID IN LOCAL LOCK 07550002 BE CMSSUSP IF SO,CHECK FURTHER 07600002 SPACE 2 07610002 */* D (YES,CMSSUSP,NO,) IS INTERRUPT ID IN LOCAL LOCK? */ 07620002 SPACE 2 07630002 C WORKREG,INTID IS INTERRUPT ID IN LOCAL LOCK 07650002 BE CMSINT IF SO,CHECK FURTHER 07700002 SPACE 2 07710002 */* D (NO,LOCALCHK,YES,) IS LOCAL LOCK ZERO? */ 07720002 SPACE 2 07730002 LTR WORKREG,WORKREG IS LOCAL LOCK ZERO 07750002 BNZ LOCALCHK IF NOT,GO TO LOCAL CHECKS 07800002 SPACE 2 07804002 */* S CMSSTEAL:GO TO STEAL CMS LOCK */ 07808002 */* P (,CMSCLEAN) GO CLEAN UP INDICATORS */ 07812002 SPACE 2 07816002 OI PSAHLHI+THREE,CMSLOCHM SET CMS AND LOCAL H M 07820002 BAL STLRET,CMSSTEAL GO STEAL CMS LOCK 07850002 B CMSCLEAN CLEAN UP 07900002 SPACE 2 07910002 */*CMSSUSP: D (NO,CMSCLEAN,YES,) DID DATERROR OCCUR? */ 07920002 SPACE 2 07930002 CMSSUSP DS 0H 07950002 CMSINT DS 0H 08000002 OI ASCBFLG1-ASCB(LOCKREG),ASCBCMSH SET CMS HELD BIT 08050002 L WORKREG,ZERO(R13) GET ERROR ENTRY VALUE 08100002 C WORKREG,ADFOUR IS ERROR A DAT ERROR 08150002 BNE CMSCLEAN IF NOT,CLEAN UP 08200002 SPACE 2 08210002 */* P STOP FURTHER MEMORY DISPATCHING */ 08220002 */* S CMSSTEAL:STEAL CMS LOCK */ 08230002 SPACE 2 08240002 * CMSLOCK WILL BE STOLEN ON DAT ERROR 08250002 OI ASCBDSP1-ASCB(LOCKREG),ASCBFAIL STOP FURTHER MEMORY DISP 08300002 OI PSAHLHI+THREE,CMSLOCHM SET CMS AND LOCAL H M 08320002 BAL STLRET,CMSSTEAL GO STEAL CMS LOCK 08350002 SPACE 2 08360002 */* P (,CMSCLEAN) CLEAR ASCBCMSH BIT */ 08370002 SPACE 2 08380002 NI ASCBFLG1-ASCB(LOCKREG),MAX-ASCBCMSH CLEAR CMS HELD BIT 08400002 B CMSCLEAN FINISH CLEAN UP 08450002 SPACE 2 08460002 */*CMSLOCAL: D (YES,LOCALCHK,NO,) IS DISPATCHER IN CNTL? */ 08470002 SPACE 2 08480002 CMSLOCAL TM PSASUP1,PSADISP IS DISPATCHER IN CONTROL 08500002 BO LOCALCHK IF SO,GO TO LOCAL CHECKS 08550002 SPACE 2 08552002 */* P (,LOCALCHK) SET CMS AND LOCAL BITS */ 08554002 SPACE 2 08556002 OI PSAHLHI+THREE,CMSLOCHM SET CMS AND LOCAL H M 08560002 B LOCALCHK GO DO LOCAL PROCESS 08570002 SPACE 2 08577002 */*CMSCLEAN: P CLEAR CMS AND LOCAL BITS */ 08584002 SPACE 2 08591002 CMSCLEAN NI PSAHLHI+THREE,MAX-CMSLOCHM CLEAR CMS AND LOCAL HIER BITS 08600002 SPACE 2 08620002 */*LOCALCHK: D (YES,LOCALOWN,NO,) DOES THIS CPU OWN LOCAL LOCK? */ 08640002 SPACE 2 08660002 * THE FOLLOWING CONSTITUTES THE LOCAL LOCK CHECKS 08700002 LOCALCHK DS 0H 08750002 L WORKREG,PSAAOLD GET CURRENT ASCB ADDRESS 08800002 L LOCKREG,ASCBLOCK-ASCB(WORKREG) GET VALUE IN LOCALLOCK 08850002 L WORKREG,ZERO(WORKREG) FIRST 4 BYTES OF ASCB 08860040 C WORKREG,CASCB IS IT A REAL ASCB 08870040 BNE EXIT IF NOT, EXIT 08880040 LH VALREG,PSACPULA GET CPUID 08900002 CR LOCKREG,VALREG DOES THIS CPU OWN LOCALLOCK 08950002 BE LOCALOWN IF SO,CLEAN UP ACCORDINGLY 09000002 SPACE 2 09010002 */* D (YES,LOCALCLR,NO,) IS SUSPEND ID IN LOCK? */ 09020002 SPACE 2 09030002 C LOCKREG,SUSPID IS SUSPEND ID IN LOCK 09050002 BE LOCALCLR IF SO CLEAN UP 09100002 SPACE 2 09110002 */* D (YES,LOCALCLR,NO,) IS INTERRUPT ID IN LOCK? */ 09120002 SPACE 2 09130002 C LOCKREG,INTID IS INTERRUPT ID IN LOCK 09150002 BE LOCALCLR IF SO CLEAN UP 09200002 SPACE 2 09210002 */* D (YES,LOCALCLR,NO,) IS LOCAL LOCK CLEAR? */ 09220002 SPACE 2 09230002 LTR LOCKREG,LOCKREG IS LOCK VALUE ZERO 09250002 BZ LOCALCLR IF SO CLEAN UP 09300002 SPACE 2 09310002 */* D (YES,LOCHMCHK,NO,) IS INVALID VALUE IN LOCK? */ 09320002 SPACE 2 09330002 C LOCKREG,AD40 IS ID IN LOCK LOWER THAN MIN 09350002 BL LOCHMCHK IF SO,CHECK NEXT ACTION 09400002 C LOCKREG,AD7F IS ID IN LOCK HIGHER THAN MAX 09450002 BH LOCHMCHK IF SO,CHECK NEXT ACTION 09500002 SPACE 2 09510002 */*LOCALCLR: P CLEAR CMS AND LOCAL BITS */ 09520002 SPACE 2 09530002 LOCALCLR NI PSAHLHI+THREE,MAX-CMSLOCHM CLEAR CMS AND LOCAL HIERARCHY 09550002 SPACE 2 09560002 */*EXIT: P (,FINI) EXIT TO ASVT ROUTINE */ 09570002 SPACE 2 09580002 EXIT DS 0H 09600002 L R15,ASVTRTN GET EXIT ADDRESS 09650002 BR R15 GO TO ASVT ROUTINE 09700002 SPACE 2 09702002 */*LOCALOWN: D (YES,EXIT,NO,) IS DISPATCHER IN CNTL? */ 09704002 SPACE 2 09706002 LOCALOWN DS 0H 09710002 TM PSASUP1,PSADISP IS DISP IN CONTROL 09720002 BO EXIT IF SO EXIT 09730002 SPACE 2 09731002 */* P (,EXIT) CLEAR LOCAL HIERARCHY BIT */ 09732002 SPACE 2 09733002 OI PSAHLHI+THREE,LOCHM SET CMS AND LOCAL H M 09735002 B EXIT ELSE CLEAR BITS FIRST 09740002 SPACE 2 09742002 */*LOCHMCHK: D (YES,GETLOCAL,NO,) IS LOCAL HIERARCHY BIT ON? */ 09744002 SPACE 2 09746002 LOCHMCHK DS 0H 09750002 TM PSAHLHI+THREE,LOCHM IS HIERARCHY MASK BIT ON 09800002 BO GETLOCAL IF SO,ATTEMPT TO GET LOCK BACK 09850002 SPACE 2 09860002 */* P CLEAR LOCAL LOCK WITH CS INSTRUCTION */ 09870002 */* D (YES,LOCALCLR,NO,) DID CS FAIL? */ 09880002 SPACE 2 09890002 LH VALREG,PSACPULA GET CS VALUE 09900002 L WORKREG,PSAAOLD GET ASCB ADDRESS 09950002 CS LOCKREG,VALREG,ASCBLOCK-ASCB(WORKREG) CLEAR LOCAL LOCK 10000002 BNZ LOCALCLR IF CS FAILED,CLEAN UP 10050002 SPACE 2 10060002 */* D (NO,LOCFREE,YES,) DOES ASCB OWN CMSLOCK? */ 10070002 SPACE 2 10080002 L LOCKREG,CMSLOCK GET CMS LOCK ADDRESS 10100002 L LOCKREG,ZERO(LOCKREG) GET CMS LOCK VALUE 10150002 C LOCKREG,PSAAOLD DOES THIS ASCB OWN CMS LOCK 10200002 BNE LOCFREE IF NOT,CLEAN UP 10250002 SPACE 2 10255002 */* S CMSSTEAL:STEAL CMS LOCK */ 10260002 SPACE 2 10265002 OI PSAHLHI+THREE,CMSLOCHM SET CMS AND LOCAL H M 10270002 NI ASCBFLG1-ASCB(LOCKREG),MAX-ASCBCMSH CLEAR CMS BIT 10280002 BAL STLRET,CMSSTEAL IF SO,STEAL CMS LOCK 10300002 SPACE 2 10302002 */*LOCFREE: P (,LOCALCLR) GO CLEAN UP */ 10304002 SPACE 2 10306002 LOCFREE SLR VALREG,VALREG CLEAR REG 10310002 L WORKREG,PSAAOLD GET ASCB ADDRESS 10320002 ST VALREG,ASCBLOCK-ASCB(WORKREG) CLEAR LOCAL LOCK 10330002 B LOCALCLR CLEAN UP 10350002 SPACE 2 10360002 */*GETLOCAL: P TRY TO GET LOCAL WITH CS INSTRUCTION */ 10370002 */* D (NO,LOCALCLR,YES,) CS FAILED? */ 10380002 SPACE 2 10390002 GETLOCAL DS 0H 10400002 LH VALREG,PSACPULA GET CPUID 10450002 L WORKREG,PSAAOLD GET ASCB ADDRESS 10500002 CS LOCKREG,VALREG,ASCBLOCK-ASCB(WORKREG) GET LOCAL LOCK 10550002 BNZ LOCALCLR IF NOT GOTTEN CLEAN UP 10600002 SPACE 2 10600702 */* D (YES,CMSREOBT,NO,) CMS LOCK OWNED BY THIS ASCB? */ 10601402 SPACE 2 10602102 L LOCKREG,CMSLOCK GET CMS ADDRESS 10603002 C WORKREG,ZERO(LOCKREG) IS CMS OWNED BY THIS ASCB 10606002 BE CMSREOBT IF SO INDICATE 10609002 SPACE 2 10609702 */* P (,EXIT) CLEAR CMS HIERARCHY BIT */ 10610402 SPACE 2 10611102 NI PSAHLHI+THREE,MAX-CMSHM CLEAR CMS BIT 10612002 B EXIT FINISHED 10615002 SPACE 2 10616002 */*CMSREOBT: P (,EXIT) SET CMS AND LOCAL BITS */ 10617002 SPACE 2 10618002 CMSREOBT OI PSAHLHI+THREE,CMSLOCHM SET CMS AND LOCAL H M 10620002 B EXIT FINISHED 10650002 SPACE 2 10700002 */*FINI: R END SETLOCK REPAIR ROUTINE */ 10750002 TITLE 'IEAVELKR-SETLOCK FRR ROUTINE' 10770002 SPACE 2 10800002 */*IEAVLKRR: E SETLOCK FRR ROUTINE */ 10850002 SPACE 2 10900002 ENTRY IEAVLKRR 10950002 IEAVLKRR DS 0H 11000002 SPACE 2 11010002 */* P ESTABLISH ADDRESSABILITY */ 11020002 SPACE 2 11030002 BALR BASEREG2,R0 ESTABLISH 11050002 USING *,BASEREG2 ADDRESSABILITY 11100002 ADDRESS DS 0H LABEL FOR ADDRESSABILITY @YM06769 11105002 SPACE 2 11110002 */* P RECORD MODULE,CSECT NAME */ 11112002 SETRP RECPARM=IDFRR RECORD NAME PARMS @YM05105 11114002 SPACE 2 11116002 */* D (YES,LOCKFRR,NO,) IS SETLOCK FRR TO ACT? */ 11120002 SPACE 2 11130002 L WORKREG,SDWAPARM GET PARM AREA ADDRESS @YM06769 11150002 ST R0,RRRASAV0-RRRA(WORKREG) SAVE R0 VALUE 11200002 ST R14,RRRASA14-RRRA(WORKREG) SAVE RETURN ADDRESS 11250002 TM RRRAFLG1-RRRA(WORKREG),RRRALOCK IS SETLOCK TO BE ENTERED 11300002 BO LOCKFRR IF SO GO TO SETLOCK FRR 11350002 SPACE 2 11360002 */*ASVTCHK: P GET PARAMETER AREA ADDRESS TO CHECK FLAGS */ @ZA04120 11370040 SPACE 2 11380002 ASVTCHK BALR BASEREG2,R0 REESTABLISH ADDRESSABILITY 11400002 USING *,BASEREG2 11450002 L BASEREG2,ADDR RELOAD ORIGINAL BASE 11500002 USING ADDRESS,BASEREG2 11550002 L WORKREG,SDWAPARM GET PARM AREA ADDRESS 11600002 SPACE 2 @ZA04120 11610040 */*RTMRTN: P RECORD C'RRRA' AND FIRST WORD OF RRRA */ 11620040 SPACE 2 @ZA04120 11630040 L VALREG,CRRRA GET ACRONYM 11650040 ST VALREG,SDWAVRA PUT ACRONYM IN RECORD AREA 11654040 MVC SDWAVRA+FOUR(FOUR),RRRASTAT-RRRA(WORKREG) RECORD STATUS 11658040 * BITS 11662040 MVI SDWAURAL,EIGHT UPDATE USER LENGTH 11666040 L R0,RRRASAV0-RRRA(WORKREG) GET R0 VALUE 11670040 SPACE 2 @ZA04120 11674040 */* D (NO,,YES,ASVTFIX) IS ASVT FRR TO ACT ? */ @ZA04120 11678040 */* R RETURN TO RTM */ 11682040 SPACE 2 @ZA04120 11686040 L R14,RRRASA14-RRRA(WORKREG) RESTORE RETURN ADDR @ZA10781 11693040 TM RRRAFLG1-RRRA(WORKREG),RRRAASVT IS ASVT TO BE ENTERED 11700002 BNOR R14 EXIT TO RTM IF NOT @ZA04120 11750040 SPACE 2 11760002 */*ASVTFIX: L GO TO ASVT FRR ROUTINE (NO RETURN) */ @ZA04120 11770040 SPACE 2 11780002 ASVTFIX DS 0H @ZA04120 11786040 L R15,ASVTFRR GET ASVT FRR ADDRESS 11800002 BR R15 GO TO ASVT ROUTINE @ZA04120 11850040 SPACE 2 12020002 */*LOCKFRR: D (NO,NOSPIN,YES,) IS SETLOCK IN SPIN? */ 12040002 SPACE 2 12060002 LOCKFRR DS 0H LOCK FRR 12100002 L LCCAREG,PSALCCAV GET LCCA ADDRESS 12200002 TM LCCASPN1,LCCALOCK IS SETLOCK IN A SPIN 12250002 BNO NOSPIN IF NO,PROCESS NON-SPIN 12300002 SPACE 2 12310002 */* D (NO,PERC,YES,) DID RESTART OCCUR? */ 12320002 SPACE 2 12330002 TM SDWAERRA,SDWARKEY DID RESTART OCCUR 12350002 BNO NOSPIN IF NOT, CHECK THE QUEUES@ZA28255 12400040 SPACE 2 12410002 */* D (YES,PERC,NO,) IS LOCK ALREADY OWNED? */ 12420002 SPACE 2 12430002 LH VALREG,PSACPULA GET CPUID 12450002 L WORKREG,SDWAGR11 GET LOCK ADDRESS BEING OBTAINED 12500002 C VALREG,ZERO(WORKREG) IS LOCK ALREADY OWNED 12550002 BE NOSPIN IF SO, CHECK THE QUEUES @ZA28255 12600040 SPACE 2 12610002 */* D (YES,PERC,NO,) IS VALUE IN CPUID INVALID? */ 12620002 SPACE 2 12630002 L VALREG,ZERO(WORKREG) GET CPUID IN LOCK 12650002 C VALREG,AD40 IS CPUID LOW 12670002 BL NOSPIN IF SO, CHECK THE QUEUES @ZA28255 12690040 C VALREG,AD7F IS CPUID HIGH 12700040 BH NOSPIN IF SO, CHECK THE QUEUES @ZA28255 12710040 SPACE 2 12735002 */* L INDICATE VALID SPIN VIA SETRP */ 12740002 SPACE 2 12745002 * INDICATE VALID SPIN AND RECORD 12747002 SETRP CPU=(VALREG),RECORD=YES 12753002 USING SDWA,1 12760002 TM LCCALKFG,LCCALKSA IS SETLOCK SALLOC BIT ON@ZA28255 12761040 BZ NOSALLOC NO CONTINUE BUT NO RESET@ZA28255 12761640 NC PSAHLHI,UNSALLOC RESET THE SALLOC PSAHLHI@ZA28255 12762240 NOSALLOC DS 0H CONTINUE WITH PROCESS @ZA28255 12762840 SPACE 2 12764002 */* L DELETE REPAIR RTN FRR FROM STACK */ 12768002 */* P (,ASVTCHK) GO CHECK FOR ASVT */ 12772002 SPACE 2 12776002 SETFRR D,WRKREGS=(5,6) DELETE SETLOCK FRR 12780002 LA R14,ASVTCHK GET RETURN ADDRESS 12800002 BR R14 RETURN 12850002 SPACE 2 12860002 SPACE 2 13210002 */*PERC: P CLEAR ALL SETLOCK BITS */ 13220002 SPACE 2 13230002 PERC2 NI LCCALKFG,MAX-LCCALKSA-LCCALKDP CLEAR STAT BITS @ZA28255 13290040 NI LCCASPN1,MAX-LCCALOCK CLEAR SPIN BIT 13310040 NI PSASUP1,MAX-PSALOCK CLEAR SETLOCK BIT 13330040 NI PSASUP3,MAX-PSAULCMS CLEAR SETLOCK SUSPEND @ZA28255 13350040 SPACE 2 13400002 */* L INDICATE PERCOLATE WITH X'074' */ 13410002 */* P (,ASVTCHK) GO CHECK FOR ASVT FRR */ 13420002 SPACE 2 13430002 PERC1 DS 0H PERC WITHOUT RESET BITS @ZA28255 13440040 SETRP COMPCOD=(X'074',SYSTEM),RC=0,RECORD=YES PERCOLATE ERROR 13450002 USING SDWA,1 13460002 LA R14,ASVTCHK GET RETURN ADDRESS 13470002 BR R14 RETURN 13500002 SPACE 2 13510002 */*NOSPIN: P CLEAR SETLOCK BIT EARLY TO AVOID REC */ @Z40FPXJ 13511040 SPACE 2 @Z40FPXJ 13521040 NOSPIN DS 0H @Z40FPXJ 13531040 TM PSASUP1,PSALOCK IS SETLOCK ACTIVE @ZA28255 13541040 BZ TSTULCMS NOT ACTIVE CONTINUE @ZA28255 13542040 NI PSASUP1,MAX-PSALOCK CLEAR SETLOCK BIT @ZA28255 13543040 NI LCCASPN1,MAX-LCCALOCK CLEAR SPIN BIT @ZA28255 13543540 TM PSASUP3,PSAULCMS SETLOCK SUSPEND ACTIVE @ZA28255 13544040 BZ LOCALCMS NOT ACTIVE CONTINUE @ZA28255 13545040 B PERC1 BOTH ACTIVE DONT CLEAR @ZA28255 13546040 TSTULCMS TM PSASUP3,PSAULCMS SETLOCK SUSPEND ACTIVE @ZA28255 13546240 BZ LOCALCMS NOT ACTIVE CONTINUE @ZA28255 13546440 OI LCCALKFG,LCCALKSA TURN ON SETLOCK SALLOC @ZA28255 13546640 NI PSASUP3,MAX-PSAULCMS TURN OFF BEFORE QUE REL @ZA28255 13546840 LOCALCMS DS 0H 13547040 L ALTWORK,ACMSSQH GET CMS Q FWD PTR ADDR @Z40FPXJ 13551040 L ALTWORK,ZERO(ALTWORK) GET CMS Q FWD PTR @Z40FPXJ 13561040 LTR ALTWORK,ALTWORK IS Q EMPTY @Z40FPXJ 13571040 BNZ LKRRQREL NO GO TO QRELEASE @Z40FPXJ 13581040 SPACE 2 @Z40FPXJ 13591040 */* D (YES,,NO,LKRRQREL) IS CMS SUS Q EMPTY? */ @Z40FPXJ 13601040 SPACE 2 @Z40FPXJ 13611040 L INDREG,PSAAOLD GET ASCB PTR @Z40FPXJ 13621040 USING ASCB,INDREG @Z40FPXJ 13631040 L ALTWORK,ASCBLSQH GET LCL SUS Q HEADER @Z40FPXJ 13641040 LTR ALTWORK,ALTWORK IS Q EMPTY @Z40FPXJ 13651040 SPACE 2 @Z40FPXJ 13661040 */* D (NO,,YES,AQOK) IS LOCAL SUS Q EMPTY? */ @ZA27996 13671040 SPACE 2 @Z40FPXJ 13678040 BZ AQOK YES, CHECK FOR RETRY @ZA27996 13685040 LKRRQREL DS 0H @Z40FPXJ 13701040 SPACE 2 @Z40FPXJ 13711040 */*LKRRQREL: S QRELEASE */ @Z40FPXJ 13721040 SPACE 2 @Z40FPXJ 13731040 BAL STLRET,QRELEASE GO FREE SUS QUEUES @Z40FPXJ 13741040 SPACE 2 14710002 */*AQOK: D (YES,LKRRSALC,NO,) LOCKS HELD OR SUPER RTN? */ @ZA27996 14720040 SPACE 2 14728040 AQOK L WORKREG,PSASUPER OBTAIN SUPER FLAGS @ZA27996 14736040 N WORKREG,OFFSUPER TURN OFF SUPER BITS @ZA28255 14740040 O WORKREG,PSAHLHI CHECK HLHI FOR LOCKS @ZA27996 14744040 BNZ LKRRSALC PERCOLATE IF NON-ZERO @ZA27996 14752040 SPACE 2 14760040 */* D (YES,LKRRSALC,NO,) TASK MODE? */ @ZA27996 14768040 SPACE 2 14776040 C WORKREG,PSATOLD TASK MODE? @ZA27996 14784040 BNZ LKRRSALC YES, PERC WITH 074 @ZA27996 14792040 SPACE 2 14800040 */* D (YES,LKRRSALC,NO,) SRB MODE? */ @ZA27996 14808040 SPACE 2 14816040 TM LCCADSF2,LCCASRBM SRB MODE? @ZA27996 14824040 BO LKRRSALC YES, PERCOLATE WITH 074 @ZA27996 14832040 SPACE 2 14860002 */* P CLEAR ALL SETLOCK BITS */ 14970002 */* P SET DISP HIERARCHY MASK BIT */ 14980002 SPACE 2 14990002 NI LCCALKFG,MAX-LCCALKSA-LCCALKDP CLEAR STAT BITS @Z40FPXJ 15000040 NI LCCASPN1,MAX-LCCALOCK CLEAR SPIN BIT 15050002 L RETADD,AIEA0DS GET DISP ENTRY ADDRESS @Z40FPXJ 15200040 SPACE 2 15210002 */* L INDICATE RETRY FROM IEA0DS */ @Z40FPXJ 15220040 SPACE 2 15230002 SETRP RETADDR=(RETADD),RC=4,RECORD=YES INDICATE RETRY 15250002 USING SDWA,1 15260002 SPACE 2 15263002 */* P (,ASVTCHK) GO CHECK FOR ASVT FRR */ 15266002 SPACE 2 @Z40FPXJ 15268040 LA R14,ASVTCHK GET RETURN ADDRESS 15270002 BR R14 RETURN 15300002 SPACE 2 15305002 LKRRSALC DS 0H @Z40FPXJ 15307040 SPACE 2 15430002 */*LKRRSALC: D (NO,DISPREL,YES,) SALLOC OBTAINED BY SETLOCK? */@Z40FPXJ 15440040 SPACE 2 @Z40FPXJ 15450040 TM LCCALKFG,LCCALKSA SALLOC LOCK OBTAINED 15500040 BNO PERC2 IF NOT PERCOLATE @ZA28255 15510040 SPACE 2 15560002 */* L INDICATE SALLOC TO BE FREED */ 15570002 SPACE 2 15580002 SETRP FRELOCK=(SALLOC) INDICATE SALLOC TO BE FREED 15600002 B PERC2 DONT CHECK SUSPEND ACTV @ZA28255 15700540 SPACE 2 15760002 */*QRELEASE: E QUEUE RELEASE ROUTINE */ @Z40FPXJ 15760140 */* D (YES,,NO,LKRRCMSQ) ANY ELEMENTS ON LOCAL Q? */ @Z40FPXJ 15770140 */*LKRRNSRB: P DEQUE AND SCHEDULE SRB */ @Z40FPXJ 15780140 */* D (YES,LKRRNSRB,NO,) ANY MORE SRB'S ? */ @Z40FPXJ 15790140 SPACE 2 @Z40FPXJ 15800140 QRELEASE DS 0H @Z40FPXJ 15810140 L INDREG,PSAAOLD GET ASCB ADDR @Z40FPXJ 15820140 USING ASCB,INDREG @Z40FPXJ 15830140 L ALTWORK,ASCBLSQH GET LOCAL SUS Q HEADER @Z40FPXJ 15840140 USING SRBSECT,ALTWORK @Z40FPXJ 15850140 LR WORKREG3,R1 SAVE SDWA ADDRESS @ZA19968 15855140 LKRRGSQH DS 0H @Z40FPXJ 15860140 LTR ALTWORK,ALTWORK ANY ELEMENTS ON Q? @Z40FPXJ 15870140 BZ LKRRCMSQ NO CHECK CMS SUS Q @Z40FPXJ 15880140 SLR R6,R6 ZERO REG FOR CS @Z40FPXJ 15890140 CS ALTWORK,R6,ASCBLSQH REMOVE Q FROM HEADER @Z40FPXJ 15900140 BNZ LKRRGSQH UNABLE TO REMOVE QUE @Z40FPXJ 15910140 LKRRNSRB DS 0H @Z40FPXJ 15920140 LR INDREG,ALTWORK LOAD R5 FOR SCHED @Z40FPXJ 15930140 L ALTWORK,SRBFLNK GET NEXT ELE @Z40FPXJ 15940140 SCHEDULE SRB=(5) SCHEDULE SRB @Z40FPXJ 15950140 LTR ALTWORK,ALTWORK ANY MORE ELEMENTS @Z40FPXJ 15960140 BNZ LKRRNSRB YES SCHED NXT SRB @Z40FPXJ 15970140 SPACE 2 @Z40FPXJ 15980140 */*LKRRCMSQ: D (YES,LKRRCDL,NO,) IS CMS Q EMPTY */ @Z40FPXJ 15990140 */* D (YES,,NO,LKRRFCES) IS ELEMENT ASCB */ @Z40FPXJ 16000140 */* P (,LKRRCMSQ) PUT INT ID IN LOCAL LK & UPDATE TO NXT ELE*/@Z40FPXJ 16010140 */*LKRRFCES: P (,LKRRCMSQ) SCHEDULE SRB & UPDATE TO NXT ELE */ @Z40FPXJ 16020140 */*LKRRCDL: D (NO,,YES,QRELEXIT) DOES LK MGR OWN DISP LOCK */ @Z40FPXJ 16030140 SPACE 2 @Z40FPXJ 16040140 LKRRCMSQ DS 0H @Z40FPXJ 16050140 L ALTWORK,ACMSSQH GET CMS SUS Q HDR ADDR @Z40FPXJ 16060140 L WORKREG,ZERO(ALTWORK) GET CMS SUS Q HDR @Z40FPXJ 16070140 LKRRGFCE DS 0H @Z40FPXJ 16080140 LTR WORKREG,WORKREG IS Q EMPTY @Z40FPXJ 16090140 BZ LKRRCDL YES CHECK DISP LOCK @Z40FPXJ 16100140 SLR INDREG,INDREG ZERO FOR C.S. @Z40FPXJ 16110140 CS WORKREG,INDREG,ZERO(ALTWORK) DEQ ELE @Z40FPXJ 16120140 BNZ LKRRGFCE NOT SUCCESSFUL @Z40FPXJ 16126140 LKRRCNE DS 0H @Z40FPXJ 16140140 CLC CASCB,0(WORKREG) IS ELEMENT AN ASCB @Z40FPXJ 16150140 BNE LKRRFCES NO ELE IS SRB @Z40FPXJ 16160140 USING ASCB,WORKREG @Z40FPXJ 16170140 L INDREG,INTID GET INTERRUPT ID @Z40FPXJ 16180140 ST INDREG,ASCBLOCK STORE IT IN LOCK @Z40FPXJ 16190140 L WORKREG,ASCBCMSF GET NXT ELE PTR @Z40FPXJ 16200140 LTR WORKREG,WORKREG IS THERE ANOTHER @Z40FPXJ 16210140 BZ LKRRCDL EMPTY NOW @Z40FPXJ 16220140 B LKRRCNE CHECK NEXT ELE @Z40FPXJ 16230140 LKRRFCES DS 0H @Z40FPXJ 16240140 LR R1,WORKREG SAVE SSRB ADDRESS @Z40FPXJ 16243140 USING SRBSECT,WORKREG @Z40FPXJ 16250140 L WORKREG,SRBFLNK GET ADDRESS NEXT @Z40FPXJ 16253140 SCHEDULE SRB=(R1) SCHEDULE SSRB @Z40FPXJ 16260140 LTR WORKREG,WORKREG ANYMORE ELEMENTS @Z40FPXJ 16280140 BNZ LKRRCNE YES CHECK NEXT @Z40FPXJ 16290140 LKRRCDL DS 0H @Z40FPXJ 16300140 LR TEMPPARM,WORKREG3 SAVE SDWA ADDRESS @ZA28255 16305140 SLR R1,R1 INDICATE 0 ANEW VALUE 19450002 L R15,AMEMSW GET MEMORY SW ADDRESS 19500002 BALR R14,R15 GO TO MEMORY SWITCH 19550002 LR R1,TEMPPARM RESTORE SDWA ADDRESS 19600002 BR STLRET RETURN TO CALLER 19650002 SPACE 2 19660002 */*IEAVELKR: END END SETLOCK RECOVERY */ 20304002 SPACE 2 20306002 ADTWO DC F'2' RESTART ERROR CODE 20310002 ASVTFRR DC V(IEAVVFRR) ADDRESS OF ASVT FRR 20310402 AMEMSW DC V(IEAVEMS0) MEMORY SWITCH ENTRY 20312002 LOCKSTRT DC V(IEAVELK) SETLOCK CSECT ADDRESS 20320002 LOCKEND DC V(IEAVELKE) SETLOCK ENDING ADDRESS 20330002 TABLEADD DC V(IEAVELKT) SETLOCK LOCK TABLE ADRESS 20340002 CMSLOCK DC V(CMSLOCK) CMS LOCKWORD ADDRESS 20342002 WAITASCB DC V(IEAWASCB) WAIT ASCB ADDRESS 20344002 ASVTRTN DC V(IEAVEVRR) ASVT VERIFICATION RTN ADDR 20346002 AIEA0DS DC V(IEA0DS) DISPLATCHER ENTRY @Z40FPXJ 20348040 ACMSSQH DC V(CMSSQH) CMS SUSP Q HDR ADDRESS @Z40FPXJ 20349040 ADDR DC A(ADDRESS) ADDRESS OF ORIGINAL ADDR 20356202 LOCKASVT DC A(IEAVLKRR) SETLOCK FRR ADDRESS 20356602 ADFOUR DC F'4' DAT ERROR CODE 20359902 HIGHHM DC X'00001000' HIGHEST LOCK IN SYSTEM 20361902 AD40 DC X'00000040' LOWEST VALID CPUID 20363402 UNSALLOC DC X'FFFFFBFF' TURN OFF THE SALLOC LOCK@ZA28255 20364440 OFFSUPER DS 0F TURN OFF THE SUPER BITS @ZA28255 20365440 DC AL1(MAX-PSALOCK) SUPER1 LOCK MANAGER BIT @ZA28255 20365640 DC AL1(MAX) NON LOCK MANAGER SUPER @ZA28255 20365840 DC AL1(MAX-PSAULCMS) SUPER2 LOCK MANAGER BIT @ZA28255 20366040 DC AL1(MAX) NON LOCK MANAGER SUPER @ZA28255 20366240 AD7F DC X'0000007F' HIGHEST VALID CPUID 20366702 LASTSPIN DC X'00000004' LOWEST SPIN LOCK 20370002 CASCB DC C'ASCB' ACRONYM ASCB 20373302 CRRRA DC C'RRRA' ACRONYM RRRA 20374302 IDFRR DS 0H ID FOR SDWA @YM05105 20374702 DC CL8'IEAVELK ' MODULE NAME @YM05105 20375102 DC CL8'IEAVELK ' CSECT NAME @YM05105 20375502 DC CL8'IEAVLKRR' FRR ROUTINE NAME @YM05105 20375902 SUSPID DC X'7FFFFFFF' SUSPEND ID VALUE 20376602 ALLON EQU * ALL ONES WORD 20377602 INTID DC X'FFFFFFFF' INTERRUPT ID VALUE 20378602 IHAPSA 20383302 IHALCCA 20400002 IHASDWA 20410002 IHAFRRS 20420002 IHAASCB 20430002 IHASRB 20440002 IHAWSAVT DSECT=YES,CLASS=CPU 20442002 IHARRRA 20450002 IHACSD 20500002 CVT DSECT=YES 20550002 END 20600002