TITLE 'BUILD QUICKCELL POOL MODULE --- IEAVBLDP' 00110102 * /* START OF SPECIFICATIONS **** 00120102 * 00130102 *01* MODULE-NAME = IEAVBLDP 00150102 * 00300102 *02* CSECT-NAME = IEAVBLDP 00350102 * 00400102 *01* DESCRIPTIVE-NAME = BUILD QUICKCELL POOL 00500102 * 00560102 *01* COPYRIGHT = NONE 00570102 *01* STATUS = LEVEL 02.02 -- 1/31/74 00596102 * 00598502 *01* FUNCTION = CREATE, EXTEND OR RECOVER (REFORMAT) A QUICK-CELL 00598902 * POOL. 00599302 * 00599702 *02* OPERATION = THE STORAGE PASSED BY THE CALLER (ADDRESS OF 00599802 * STORAGE IN REGISTER 1) IS FORMATTED INTO A POOL OF CONTIGUOUS 00609802 * CELLS. IF THE POOL IDENTIFIER (PASSED IN REGISTER 0) IS FOUND 00619802 * TO INDICATE THAT SUCH A POOL ALREADY EXISTS, THE EXISTING POOL 00621802 * IS EXTENDED BY THE ADDITION OF A NEW SEGMENT (EXTENT), WHICH 00623802 * IS CREATED FROM THE STORAGE SUPPLIED. IF NO SUCH POOL ALREADY 00625802 * EXISTS, THE NEW POOL IS SIMILARLY CREATED. IF NO ADDRESS IS 00627802 * SUPPLIED IN REGISTER 1, THE POOL WHOSE IDENTIFIER IS IN 00628202 * REGISTER 0 IS REFORMATTED, REGARDLESS OF THE CURRENT 00628302 * ALLOCATION STATUS OF THE POOL. UPON COMPLETION, THE POOL 00628402 * CONSISTS OF AS MANY EVEN-SIZED CELLS AS WILL FIT IN THE SPACE 00628502 * PASSED. EACH CELL WILL ADDRESS ITS SUCCESSOR CELL THROUGH AN 00632902 * ADDRESS IN THE LAST WORD OF THE CELL. THIS WORD IS ADDED TO 00634902 * THE USER-SPECIFIED CELL LENGTH. THE LAST CELL IN THE SEGMENT 00636902 * WILL CONTAIN A ZERO IN THIS FIELD. THE FIRST OF THESE CELLS IN 00637302 * THE EXTENT WILL BE ADDRESSED BY THE 'CPABFACP' FIELD IN THE 00638602 * CELL POOL ANCHOR BLOCK (CPAB) FOR THIS POOL SEGMENT (EXTENT). 00640602 * 00641502 *01* NOTES = STANDARD LINKAGE CONVENTIONS 00642802 * 00646202 *02* DEPENDENCIES = 370R-MULTIPROCESSOR INSTRUCTION SET 00650602 * 00655002 *03* CHARACTER-CODE-DEPENDENCIES = NONE 00659402 *02* RESTRICTIONS = NONE 00663802 *02* REGISTER-CONVENTIONS = SEE REGISTER EQUATES FOLLOWING CSECT 00668202 * STATEMENT 00670202 * 00671402 *02* PATCH-LABEL = NUCLEUS PATCH AREA 00671802 * 00672102 *01* MODULE-TYPE = MACRO-INVOKED PROCESSING SUBROUTINE 00676702 * 00680702 *02* PROCESSOR = ASSEMBLER-370R 00681102 * 00690402 *02* MODULE-SIZE = 650 BYTES 00690502 * 00702502 *02* ATTRIBUTES = REFRESHABLE , NUCLEUS RESIDENT 00712502 * 00726302 *01* ENTRY-POINT = IEAVBLDP 00728302 * 00748502 *02* PURPOSE = CREATION, EXTENSION OR REFORMATTING OF A QUICK-CELL 00758502 * POOL. 00758602 * 00758702 *02* LINKAGE = ENTERED VIA A BALR 14,15 ... SHOULD BE INVOKED BY 00762102 * THE BLDCPOOL MACRO-INSTRUCTION. 00764102 * REG 0 = CPID OF THE POOL OR 0 FOR DYNAMIC POOL 00765302 * CREATION. 00767302 * REG 1 = ADDRESS OF THE STORAGE TO BE FORMATTED INTO 00768702 * THE POOL EXTENSION OR 0 FOR RECOVERY OF AN ENTIRE 00769002 * POOL. 00769402 * 00770502 *02* INPUT = THE FIRST 32 BYTES OF THE EXTENT AREA (ADDRESSED BY 00770802 * REG. 1) IS FORMATTED INTO A MODEL CPAB (CELL POOL ANCHOR 00772802 * BLOCK) BY THE BLDCPOOL MACRO EXPANSION. THE FOLLOWING FIELDS 00773202 * IN THIS MODEL CPAB CONTAIN INPUT INFORMATION: CPABCPID, 00773602 * CPABCSZE, CPABSPID, AND CPABENAD (THE LENGTH OF THE EXTENT). 00773702 * ... ALL OTHER FIELDS ARE SET TO ZERO. 00773802 * 00774002 *02* OUTPUT = THE EXTENT IS FORMATTED INTO A QUICK-CELL POOL, AND 00775002 * THE CPAB IDENTIFYING IT IS ENQUEUED INTO THE CHAIN OF CPABS 00775402 * FOR THE POOL. 00775802 * 00777002 *02* REGISTERS-SAVED = THIS ROUTINE SAVES NO REGISTERS, THE MACRO 00778002 * SAVES REGS. 2 THROUGH 12 INCLUSIVE. 00778402 * 00780002 *02* REGISTER-USAGE = SEE COMMENTS ON REGISTER EQUATES. 00781002 * 00783002 *02* REGISTERS-RESTORED = NONE ... SEE REGISTERS SAVED. 00784002 * 00786002 *01* EXIT-NORMAL = EXIT 00787002 * 00791002 *02* CONDITIONS = SUCCESSFUL FORMATTING OF THE EXTENT OR THE POOL 00792002 * (RECOVER). 00792402 * 00794002 *02* OUTPUT = THE CPAB DESCRIBING THE EXTENT IS FULLY INITIALIZED 00795002 * AND THE EXTENT IS FORMATTED INTO A QUEUE OF CELLS. 00797002 * 00800002 *02* RETURN-CODES = 0 00808202 * 00814602 *01* EXIT-ERROR = BLDERR08 00815002 * 00837502 *02* CONDITIONS = INVALID CPID OR UNFORMATTED POOL. 00847502 * 00851502 *02* OUTPUT = RETURN CODE. 00851902 * REG 0 CONTAINS EXTENT SUBPOOL NUMBER AND LENGTH OF THE EXTENT 00853902 * REG 1 CONTAINS EXTENT ADDRESS. 00861902 * NOTE: THESE PARAMETERS ARE SET UP FOR AN R-FORM FREEMAIN. 00863902 * 00865902 *02* RETURN-CODES = 8 00867902 * 00879902 *01* EXIT-ERROR = BLDERR12 00880302 * 00880702 *02* CONDITIONS = INVALID SUBPOOL ... NON-GLOBAL ONE FOR PERMANENT 00881102 * CPID OR NON-MATCHING ONE FOR EXTENSION OF ANY EXISTING POOL. 00881202 * 00881502 *02* OUTPUT = RETURN CODE. 00881602 * REG 0 CONTAINS EXTENT SUBPOOL NUMBER AND LENGTH OF THE EXTENT 00883602 * REG 1 CONTAINS EXTENT ADDRESS. 00884002 * NOTE: THESE PARAMETERS ARE SET UP FOR AN R-FORM FREEMAIN. 00884602 * 00885802 *02* RETURN-CODES = 12 00886402 * 00887402 *01* EXIT-ERROR = BLDERR16 00889402 * 00891402 *02* CONDITIONS = INVALID CELL SIZE ... NON-MATCHING SIZE ON POOL 00891802 * EXTEND OPERATION OR CELL SIZE GREATER THAN POOL SIZE ON ANY 00891902 * OPERATION. 00892002 * 00892202 *02* OUTPUT = RETURN CODE. 00892602 * REG 0 CONTAINS EXTENT SUBPOOL NUMBER AND LENGTH OF THE EXTENT 00893702 * REG 1 CONTAINS EXTENT ADDRESS. 00894102 * NOTE: THESE PARAMETERS ARE SET UP FOR AN R-FORM FREEMAIN. 00894502 * 00895802 *02* RETURN-CODES = 16 00896202 * 00896602 *01* EXIT-ERROR = BLDERR20 00897002 * 00897402 *02* CONDITIONS = INCOMPATABLE CONCURRENT REQUEST ... A DELETE 00899102 * (DELCPOOL) WAS IN PROCESS FOR THIS POOL, CAUSING THE EXTENT TO 00899202 * WHICH THE NEW EXTENT WAS TO BE ENQUEUED TO BECOME DELETED, BUT 00901202 * THE DELETE HAD NOT COMPLETED BY THE TIME THIS ROUTINE HAD 00903202 * RE-SEARCHED THE QUEUE TO FIND THE END THE FIFTH TIME. 00905202 * 00908802 *02* OUTPUT = RETURN CODE. 00910802 * REG 0 CONTAINS EXTENT SUBPOOL NUMBER AND LENGTH OF THE EXTENT 00914402 * REG 1 CONTAINS EXTENT ADDRESS. 00914502 * NOTE: THESE PARAMETERS ARE SET UP FOR AN R-FORM FREEMAIN. 00914602 * 00914802 *02* RETURN-CODES = 20 00916802 * 00917202 *01* EXTERNAL-REFERENCES = CVT, GDA, AND CPAB. 00918102 * 00927002 *02* ROUTINES = NONE 00935902 *02* CONTROL-BLOCKS = CVT AND GDA (READ ONLY). CPAB (READ AND 00944802 * WRITE). 00946802 * 00949702 *01* TABLES = NONE 00949802 *01* MACROS = FREEMAIN 00958102 *02* SERIALIZATION = THE 'CPABFLGW' FIELD IS USED TO SERIALIZE ALL 00968102 * OPERATIONS ON ANY SINGLE POOL EXTENT, REGARDLESS OF THE TYPE 00970102 * OF OPERATION. THIS FIELD IS MANIPULATED WITH THE 'CS' (COMPARE 00972102 * AND SWAP) INSTRUCTION. ONE BIT IN THIS FIELD, 'DELETELK', IS 00974102 * USED TO INDICATE THAT THE EXTENT IS BEING DELETED FROM THE 00974502 * POOL. IF A DELETE IS OCCURING (THE BIT IS 'ON'), ALL OTHER 00974602 * OPERATIONS ARE PROHIBITED ON THE EXTENT BEING DELETED. IF NO 00979102 * DELETE IS OCCURRING, THE USE COUNT 'CPABUSE#' IS USED TO 00981102 * PREVENT A DELETE FROM STARTING IN THE MIDDLE OF SOME OTHER 00983102 * PROCESS. A NON-ZERO VALUE FOR 'CPABUSE#' WILL PREVENT AN 00983502 * EXTENT FROM BEING DELETED. ONCE THE EXTENT HAS BEEN LOCKED 00983602 * AGAINST DELETES, THE DOUBLE-WORD FIELD CONSISTING OF 00983702 * 'CPABDEQC' AND 'CPABFACP' IS USED TO SERIALIZE THE ACQUISITION 00984802 * AND RELEASE OF CELLS IN THE SINGLE EXTENT. THIS DOUBLE-WORD 00986802 * FIELD IS MANIPULATED WITH THE 'CDS' (COMPARE DOUBLE AND SWAP) 00986902 * INSTRUCTION. 00987002 * 00987102 *01* CHANGE-ACTIVITY = NEW FOR OS/VS2 RELEASE 2. 00987202 * LEVEL 02.00 ... CONTAINS FULL ERROR RETURN SUPPORT, 00988302 * AND M-P INSTRUCTIONS FOR INTERNAL LOCKING OF THE POOL. 00992802 * LEVEL 2.01 CONTAINS DCRR 23108...SUPPORT FOR BOUNDARY 00993802 * ALIGNMENT. 00994802 *01* MESSAGES = NONE 00997302 *01* ABEND-CODES = NONE 01001802 **** END OF SPECIFICATIONS ***/ 01006302 EJECT 01056302 */*BLDCPOOL: CHART (AMODE) */ 08050002 */* HEADER 08060002 */*DYNAMIC QUICKCELL 08070002 */* BUILD CELL POOL ROUTINE 08080002 */* 08090002 */* PAGE # */ 08092402 */*IEAVBLDP:1A2 E (,%RND) BRANCH ENTRY */ 08100002 */*%RND: P (,CONTINUE) ROUND CELL SIZE TO A MULTIPLE OF 4 08110002 */*(IF NECESSARY) */ 08120002 */*CONTINUE: D (YES,PERMCPID,NO,%D2) PERMANENT CPID? */ 08150002 */*PERMCPID: P (,%PINIT) CALCULATE INDEX INTO CPAB TABLE */ 08200002 */*%PINIT: D (NO,%PRCV,YES,CPIDTEST) IS THE POOL FORMATTED ? */ 08210002 */*%PRCV: D (YES,BLDERR08,NO,%D3) RECOVER REQUEST ? */ 08220002 */*%D3:1D2 D (NO,BLDERR12,YES,MOVEMODL) GLOBAL SUBPOOL? */ 08250002 */*MOVEMODL: P (,EXTEND) INITIALIZE ORIGINAL PERMANENT CPAB */ 08310002 */*%D2:1B3 D (NO,DYNAMOLD,YES,%DYN) NULL CPID (CREATE)? */ 08350002 */*%DYN: D (YES,BLDERR08,NO,%DYNER) CPADDR = 0? (RECOVER?) */ 08410002 */*%DYNER:1B4 P (,NOCPIDCK) CREATE DYNAMIC CPID (CPADDR/4)*/ 08450002 */*DYNAMOLD: P (,CPIDTEST) CALCULATE CPAB ADDR (CPID*4)*/ 08500002 */*CPIDTEST: D (NO,BLDERR08,YES,%D5) CPID'S MATCH? */ 08550002 */*%D5:1F3 D (NO,%SPCHK,YES,RECOVER) RECOVER REQUEST? */ 08552002 */*%SPCHK:1G2 D (NO,BLDERR12,YES,%D7) SUBPOOL NUMBERS MATCH? */ 08552402 */*%D7:1H2 D (NO,BLDERR16,YES,%SEXT) CSIZES MATCH? */ 08552802 */*%SEXT: P (,NOCPIDCK) SET EXTENT BIT ON IN CPAB */ 08552902 */*NOCPIDCK: P (,EXTEND) SET UP LIMIT ADDRESSES IN CPAB */ 08553002 */*EXTEND: S (,FINDLOOP) POOLFORM: FORMAT THE EXTENT */ 08553702 */*FINDLOOP: P (,%CHN) LOOP UNTIL LAST CPAB FOUND */ 08553802 */*%CHN: M (,%CHN1) LOCK OUT DELETE (RAISE USE COUNT) */ 08566302 */*%CHN1: D (YES,%CHN2,NO,BLDERR20) DID I GET THE THE LOCK ? */ 08576302 */*%CHN2:1J1 M (,%RUSE) CHAIN CPABE TO CPAB(E) USING 'CS'. */ 08591502 */*%RUSE: P (,EXIT) UNLOCK THE EXTENT (LOWER THE USE COUNT) */ 08604002 */*EXIT: R RC = 0 */ 09150002 */*RECOVER: M (,RCVRLOOP) SET BUILD IN PROCESS FLAG FOR POOL*/ 09160002 */*RCVRLOOP: P (,%PLFC) SET DELETE LOCK FOR EXTENT */ 09170002 */*%PLFC: S (,%RSTLK) POOLFORM: FORMAT THE EXTENT */ 09180002 */*%RSTLK: P (,%RCVD) RESET DELETE LOCK FOR THE EXTENT */ 09190002 */*%RCVD: D (YES,RCVRLOOP,NO,EXIT) ANY MORE EXTENTS? */ 09192002 */*BLDERR08: P (,ERREXIT) SET RETURN CODE TO 8 */ 09200002 */*BLDERR12: P (,ERREXIT) SET RETURN CODE TO 12 */ 09250002 */*BLDERR16: P (,ERREXIT) SET RETURN CODE TO 16 */ 09300002 */*BLDERR20: P (,ERREXIT) SET RETURN CODE TO 20 */ 09302002 */*OK2EXIT: R RETURN, PASS PRESET RETURN CODE */ 09340002 */*ERREXIT: P (,OK2EXIT) SET UP REGS 0 & 1 WITH SP#, LENGTH AND 09342002 */*ADDRESS OF STORAGE AREA */ 09344002 */*BLDCPOOL: END */ 09350002 */*POOLFOR: CHART (AMODE) */ 09400002 */* HEADER 09410002 */*DYNAMIC QUICKCELL 09420002 */* BUILD-POOL FORMATTING SUBROUTINE 09430002 */* 09440002 */* # */ 09442002 */*POOLFORM: E (,%PF1) BALR TYPE ENTRY */ 09450002 */*%PF1: P (,%PREP) COMPUTE NUMBER OF CELLS IN EXTENT */ 09600002 */*%PREP: M (,%TCNT) SET UP LOOP COUNT FROM NUMBER */ 09650002 */*%FAVL: P (,LOOPFORM) STORE FIRST FREE CELL ADDRESS IN CPAB */ 09660002 */*%TCNT: D (YES,BLDERR16,NO,%FAVL) COUNT = ZERO? */ 09700002 */*LOOPFORM: P (,%NXT) CHAIN CELL TO NEXT CELL (FORCE BOUNDARY 09800002 */* ALIGNMENT IF NECESSARY)*/ 09820002 */*%NXT: M (,%FRM) REDUCE CELL COUNT */ 09850002 */*%FRM: D (YES,LASTCELL,NO,LOOPFORM) ZERO CELLS REMAINING? */ 09900002 */*LASTCELL: P (,%RCP0) STORE 0 IN THE CELL LINK FIELD OF THE LAST 09910002 */*CELL */ 09920002 */*%RCP0: R RETURN */ 09950002 */*BLDERR16: R RC=16 */ 09960002 */*POOLFOR: END */ 10000002 EJECT 10060002 IEAVBLDP CSECT 10100002 CELLLINK EQU 0 CELL LINKAGE POINTER 10150002 R0 EQU 0 CPID -- INPUT PARAMETER 10200002 R1 EQU 1 POOL AREA ADDRESS -- INPUT PARAMETER 10250002 R2 EQU 2 SCRATCH REGISTER 10300002 R3 EQU 3 SCRATCH REGISTER 10350002 * ON INPUT, R3 CONTAINS CVT ADDRESS 10400002 R4 EQU 4 CPAB ADDRESS (CALCULATED) 10450002 R5 EQU 5 SCRATCH REGISTER 10460002 R6 EQU 6 NEXT CELL ADDRESS (DURING FORMATTING) 10466002 R7 EQU 7 LOOP CONTROL REGISTER (DURING FORMATTING) 10472002 R8 EQU 8 ADDRESS OF CPAB (DURING FORMATTING) 10478002 R9 EQU 9 CELL LENGTH (DURING FORMATTING) 10484002 R10 EQU 10 *** UNUSED *** 10490002 R11 EQU 11 INTERNAL LINKAGE TO THE POOLFORM ROUTINE 10496002 R12 EQU 12 CONTAINS POOL AREA ADDRESS FOR ERR RETURN 10498002 R13 EQU 13 (DO NOT USE) CALLER SAVE AREA ADDRESS 10498402 R14 EQU 14 RETURN ADDRESS 10500002 R15 EQU 15 ENTRY POINT ADDRESS (BASE REGISTER) 10550002 EJECT 10560002 USING IEAVBLDP,R15 10600002 MODID BR=YES 10600402 *********************************************************************** 10602002 * TEST THE VALUE OF THE CELL SIZE FOUND IN THE MODEL CPAB 10610002 * WHICH IS PASSED BY THE MACRO INVOKATION IN THE FIRST 10620002 * 32 BYTES OF THE USER'S POOL AREA (POINTED TO BY 10630002 * REGISTER 1). IF THE CELL SIZE IS NOT A MULTIPLE OF FOUR, 10640002 * ROUND IT. 10640802 *********************************************************************** 10641202 USING CPAB,R1 10642002 LTR R12,R1 SAVE POOL AREA ADDRESS FOR ERROR EXITS 10642402 BZ TESTCPID IF RECOVER OPTION, SKIP LENGTH CHECK 10651402 TM CPABCSZE+L'CPABCSZE-1,3 IS THE LENGTH A MULTIPLE OF 4? 10660402 BZ CONTINUE YES, LENGTH IS MULTIPLE OF 4, CONTINUE 10664802 L R2,CPABCSZE NOT A MULTIPLE OF FOUR, GET LENGTH 10669202 LA R2,4(R2) AND INCREASE IT BY 4. THEN RETURN IT 10673602 ST R2,CPABCSZE TO THE CPAB AND TURN OFF ANY ODD BITS 10677602 NI CPABCSZE+L'CPABCSZE-1,X'FF'-3 IN THE LENGTH (<4). 10681602 CONTINUE EQU * 10691202 TM CPABFLGS,BLDDWORD DOUBLE WORD CELL ALIGNMENT REQUIRED? 10692002 BZ TESTCPID NO, LEAVE SIZE UNCHANGED. 10692802 TM CPABCSZE+L'CPABCSZE-1,X'04' YES, IF CELL SIZE IS ALREADY 10693602 BO TESTCPID DOUBLE-WORD MULTIPLE, THEN IT MUST 10694402 LA R2,4 BE ADJUSTED BY 4 TO FORCE THE 10695602 A R2,CPABCSZE REQUIRED DOUBLE WORD ALIGNMENT, 10704602 ST R2,CPABCSZE INCLUDING THE LINK POINTER LENGTH. 10713602 TESTCPID EQU * 10722602 DROP R1 10726602 LTR R4,R0 TEST CPID VALUE (& PREPARE CPAB BASE) 10731602 BM PERMCPID NEGATIVE, PERMANENT (SYSTEM) CPID 10740602 BNZ DYNAMOLD POSITIVE, OLD DYNAMIC POOL ID 10750002 SPACE 3 10760002 *********************************************************************** 10762002 * THE CPID HAS BEEN FOUND TO BE NULL. THIS MEANS THAT A NEW 10770002 * DYNAMIC CELL POOL IS TO BE CREATED. THE NEW ID IS CREATED 10790002 * BY DIVIDING THE ADDRESS OF THE CPAB (IN REG. 1) BY 4. 10792002 *********************************************************************** 10792402 USING CPAB,R4 10794002 LTR R0,R1 NEW CPID = CPADDR 10796002 BZ BLDERR08 ERROR, NULL CPADDR - (RECOVER REQUEST) 10796402 LR R4,R1 SET UP CPAB BASE ADDRESSING AREA PASSED 10796802 SRL R0,2 CPID = CPADDR / 4 10798002 ST R0,CPABCPID STORE THE NEW ID IN THE CPAB 10798102 B NOCPIDCK BRANCH TO MAINLINE 10798402 EJECT 10798802 *********************************************************************** 10848802 * A PERMANENT (SYSTEM) CPID HAS BEEN PASSED, THE CPAB 11150002 * ADDRESS IS FOUND BY USING THE LOW-ORDER BYTE OF THE 11200002 * ID AS AN INDEX INTO A TABLE OF CPAB'S. THE TABLE IS 11250002 * FOUND FROM THE GLOBAL DATA AREA (GDA), WHOSE ADDRESS 11300002 * IS FOUND IN THE CVT. 11350002 *********************************************************************** 11360002 PERMCPID EQU * 11400002 USING CVTMAP,R3 11450002 L R3,CVTGDA GDA ADDRESS 11500002 USING GDA,R3 11550002 * THE CELL POOL ANCHOR BLOCK (CPAB) ADDRESS = CPID 11650002 N R4,F255 // 256 (MODULO DIVISION) 11700002 SLL R4,5 * 32 (CPAB LENGTH) 11750002 A R4,PFSTCPAB + CPAB TABLE ADDRESS 11800002 ***** NOTE THAT THE PREVIOUS CALCULATION IS DEPENDENT UPON THE 11802002 ***** LENGTH OF THE CPAB BEING A POWER OF 2 (32). 11806002 L R3,CPABSTAD GET POOL START ADDRESS TO TEST: 11810002 LTR R3,R3 HAS THE POOL BEEN INITIALIZED? 11812002 BNZ CPIDTEST YES, GO CHECK FOR CPID MATCH 11820002 LTR R1,R1 NO, IS IT A RECOVER REQUEST? 11822002 BZ BLDERR08 YES, ERROR - RECOVERING AN UN-BUILT POOL 11824002 C R0,CPABCPID IS THIS THE CORRECT CPAB? 11824402 BNE BLDERR08 NO, THE CPIDS DO NOT MATCH, ERROR. 11824802 CLI CPABSPID-CPAB(R1),GSP1 IS THIS A GLOBAL SUBPOOL? 11826002 BE MOVEMODL YES, GO INITIALIZE THE ANCHOR BLOCK 11828402 CLI CPABSPID-CPAB(R1),GSP2 IS THIS A GLOBAL SUBPOOL? 11828802 BE MOVEMODL YES, GO INITIALIZE THE ANCHOR BLOCK 11829202 CLI CPABSPID-CPAB(R1),GSP3 IS THIS A GLOBAL SUBPOOL? 11829602 BE MOVEMODL YES, GO INITIALIZE THE ANCHOR BLOCK 11829702 CLI CPABSPID-CPAB(R1),GSP4 IS THIS A GLOBAL SUBPOOL? 11829802 BE MOVEMODL YES, GO INITIALIZE THE ANCHOR BLOCK 11829902 B BLDERR12 ERROR, NON-GLOBAL SUBPOOL 11833202 MOVEMODL EQU * 11835202 MVC CPAB(CPABLEN),0(R1) MOVE MODEL CPAB FROM USER CORE 11836702 L R2,CPABENAD SET UP POOL START AND END ADDRESSES IN 11840002 AR R2,R1 THE NEW CPAB. ADD START ADDRESS TO 11842002 STM R1,R2,CPABSTAD THE LENGTH AND STORE THE TWO POINTERS 11844002 LR R1,R4 SET UP ADDRESS OF ORIGINAL CPAB 11844402 B EXTEND CONTINUE WITH MAINLINE 11846002 SPACE 11846402 *********************************************************************** 11846502 * THESE REPRESENT THE LEGITIMATE GLOBAL SUBPOOLS IN WHICH 11846602 * A PERMANENT POOL CAN EXIST. IF THE DESIGN IS CHANGED, THESE 11849202 * WILL HAVE TO BE HANDLED ACCORDINGLY. 11851602 *********************************************************************** 11852002 GSP1 EQU 231 COMMON SERVICE AREA (CSA) 11852502 GSP2 EQU 239 GLOBAL FIXED STORAGE 11854502 GSP3 EQU 241 COMMON SERVICE AREA (CSA) 11856502 GSP4 EQU 245 SYSTEM QUEUE AREA (SQA) 11858502 EJECT 11862502 *********************************************************************** 11865002 * THE CPID HAS BEEN FOUND TO BE A DYNAMIC POOL ID AND 11867502 * THE ADDRESS OF THE FIRST CPAB IS FOUND FROM THE CPID 11870002 * BY MULTIPLYING IT BY 4. 11880002 *********************************************************************** 11880402 DYNAMOLD EQU * 11882002 * REGISTER 4 ALREADY CONTAINS THE CPID, 11890002 SLL R4,2 MULTIPLY BY 4 TO GET CPAB ADDRESS. 11892002 SPACE 3 11894002 *********************************************************************** 11896002 * COMMON PATH******** AFTER FINDING THE CPAB FOR THE 11900002 * ID GIVEN, CHECK FOR MATCHING CPID'S, UNFORMATTED 11950002 * POOLS, AND RECOVER REQUESTS. 12000002 *********************************************************************** 12010002 CPIDTEST EQU * 12050002 C R0,CPABCPID CPID'S MATCH ? 12150002 BNE BLDERR08 NO, ERROR CONDITION 12200002 LTR R1,R1 IS THIS A RECOVER REQUEST? 12210002 BZ RECOVER YES, GO TO RECOVER ROUTINE 12220002 CLC CPABCSZE,CPABCSZE-CPAB(R1) CELL SIZES MATCH? 12220402 BNE BLDERR16 NO, ERROR CONDITION 12220802 CLC CPABSPID,CPABSPID-CPAB(R1) SUBPOOLS MATCH? 12221202 BNE BLDERR12 NO, ERROR CONDITION 12221602 OI CPABFLGS-CPAB(R1),CPABEXTN SET CPAB EXTENSION FLAG 12222002 ST R4,CPABCPID-CPAB(R1) LINK NEW CPAB TO ORIGINAL CPAB 12224002 NOCPIDCK EQU * 12230002 L R2,CPABENAD-CPAB(R1) GET POOL LENGTH FROM MODEL CPAB 12250002 AR R2,R1 ADD POOL LENGTH TO GET POOL END 12310002 ST R2,CPABENAD-CPAB(R1) ADDR. AND STORE IT IN THE CPAB. 12360002 LA R2,CPABNXTP-CPAB+L'CPABNXTP(R1) R2 = START ADDRESS OF 12410002 ST R2,CPABSTAD-CPAB(R1) THE POOL, STORE IT IN THE CPAB. 12460002 B EXTEND GO TO THE POOL EXTEND ROUTINE. 12470002 EJECT 12510002 *********************************************************************** 13170002 * A RECOVER REQUEST HAS BEEN ISSUED, THIS ROUTINE CONTROLS THE 13210002 * SUCCESSIVE INVOKATION OF THE POOL FORMATTING ROUTINE AS EACH 13260002 * EXTENT BECOMES RE-FORMATTED. 13310002 * THIS ROUTINE IS ALSO RESPONSIBLE FOR THE SERIALIZATION OF ALL 13360002 * OPERATIONS AND ASSURANCE THAT NO OTHER QUICK-CELL OPERATION 13410002 * BEGINS WHILE THE EXTENT IS BEING RECOVERED. 13460002 *********************************************************************** 13470002 RECOVER EQU * 13510002 RCVRLOOP EQU * 13660002 LR R8,R4 SET UP CPAB ADDRESS AS PARM FOR THE 13710002 * FORMATTING ROUTINE. 13760002 RCVRLOCK EQU * 13810002 L R2,CPABFLGW GET THE LOCKS FOR THIS EXTENT 13860002 RCVRLOC2 EQU * 13880002 LR R3,R2 COPY THEM AND SET THE DELETE LOCK BIT 13910002 O R3,DELETEON ON FOR THIS EXTENT. STORE THE 13920002 CS R2,R3,CPABFLGW LOCKS IN ORDER TO INHIBIT ALL 13930002 BNE RCVRLOC2 CONCURRENT GETS AND FREES DURING RECOVERY 13940002 BAL R11,POOLFORM LINK TO THE POOL FORMATTING ROUTINE. 13960002 RCVRUNLK EQU * 14010002 L R2,CPABFLGW GET THE LOCKS FOR THIS EXTENT 14060002 RCVRUNL2 EQU * 14065002 LR R3,R2 COPY THEM AND SET THE DELETE LOCK BIT 14070002 N R3,DELETOFF OFF FOR THIS EXTENT. STORE THE 14080002 CS R2,R3,CPABFLGW LOCKS IN ORDER TO ALLOW ALL 14090002 BNE RCVRUNL2 GETS AND FREES FOLLOWING RECOVERY 14100002 L R4,CPABNXTP GET NEXT CPAB POINTER 14110002 LTR R4,R4 IS IT NULL (=0), END OF CHAIN?? 14160002 BNZ RCVRLOOP NO, CONTINUE THE RECOVERY 14210002 LR R4,R8 YES, RESTORE THE LAST CPAB ADDRESS 14260002 B BLDEXIT0 THE POOL IS FULLY RECOVERED, RETURN. 14460002 EJECT 14510002 *********************************************************************** 14520002 * THIS ROUTINE EXTENDS THE POOL BY INVOKING THE FORMAT ROUTINE 14560002 * FOR THE NEW POOL EXTENT AND ENQUEUEING THE NEW EXTENT ON THE 14660002 * LAST ONE IN THE POOL. SINCE THE ENQUEUEING OPERATION IS NOT 14760002 * ACCOMPLISHED UNTIL THE NEW EXTENT HAS BEEN FORMATTED, THERE 14810002 * IS NO SERIALIZATION PROBLEM UNTIL THE ENQUEUE OCCURS. THE USE 14860002 * COUNT OF THE LAST CPAB IS INCREMENTED TO PREVENT IT FROM 14910002 * BEING DELETED BEFORE THE NEW EXTENT CAN BE ADDED. 14960002 *********************************************************************** 14970002 EXTEND EQU * 15010002 LR R8,R1 PASS CPAB ADDRESS TO POOL FORMAT ROUTINE 15040002 BAL R11,POOLFORM LINK TO THE FORMATTING ROUTINE 15210002 CR R4,R1 IS THIS THE FIRST CPAB FOR THE POOL? 15260002 BE EXIT YES, SKIP THE ENQUEUE PROCESS 15310002 *********************************************************************** 15320002 * FIND THE LAST CPAB IN THE CHAIN AND LOCK IT, SO THAT THE NEW 15340002 * EXTENT CAN BE ENQUEUED ON THE END OF THE CHAIN. 15350002 * THIS LOCK WILL PROHIBIT CONFLICTING OPERATIONS BY PREVENTING 15352002 * ANY DELETIONS FROM TAKING PLACE ON THIS EXTENT 15354002 * CONCURRENT WITH THIS BUILD, WHILE GETS AND FREES OF CELLS MAY 15356002 * STILL BE CARRIED OUT ON THE PREVIOUSLY EXISTING EXTENTS. 15358002 *********************************************************************** 15358402 LA R11,5 SET UP TO RETRY IF DELETION IS IN 15370002 * PROCESS FOR THE LAST EXTENT. THIS 15380002 * SHOULD GIVE THE DELETE TIME TO FINISH. 15390002 FINDLOOP EQU * 15409802 L R5,CPABNXTP GET NEXT CPAB ADDRESS 15409902 LTR R5,R5 IS IT NULL? (=0) 15426602 BZ RETRYLK YES, THE LAST CPAB HAS BEEN FOUND 15436602 LR R4,R5 NO, CONTINUE THE LOOP 15446602 B FINDLOOP UNTIL THE LAST CPAB IS FOUND. 15456602 SPACE 15458602 RETRYLK EQU * 15459002 L R2,CPABFLGW GET THE LOCKS FOR THIS EXTENT 15459402 RETRYLK2 EQU * 15459602 LR R3,R2 COPY THEM AND TEST THEM FOR THE 15459802 N R3,DELETOFF PRESENCE OF THE DELETE LOCK. IF 15459902 CR R3,R2 THEY ARE THE SAME, THE EXTENT IS NOT 15476602 BE NOTLOCKD NOT BEING DELETED, CONTINUE. 15486602 BCT R11,TRYAGAIN THE EXTENT IS BEING DELETED, 15496602 * SEARCH THE QUEUE AGAIN, TO FIND THE 15506602 * NEW LAST EXTENT AND TO ALLOW THE 15508602 * DELETE TO FINISH. 15509002 B BLDERR20 THE DELETE DID NOT COMPLETE AFTER 15509402 * THE NECESSARY RETRIES, ERROR RETURN 15509802 EJECT 15509902 TRYAGAIN EQU * 15510002 TM CPABFLGS,CPABEXTN IF THIS IS THE ONLY POOL SEGMENT 15515402 BZ BLDERR20 ERROR RETURN, THE WHOLE POOL IS 15517402 L R4,CPABCPID BEING DELETED. OTHERWISE, GET THE 15519402 B FINDLOOP FIRST CPAB ADDRESS AND RETRY. 15519802 NOTLOCKD EQU * 15521102 A R3,F1 THIS EXTENT IS NOT DEING DELETED, 15526602 CS R2,R3,CPABFLGW LOCK DELETE OUT BY RAISING THE 15536602 BNE RETRYLK2 USE COUNT OF THE EXTENT. REPEAT 15546602 * THE TEST IF THE LOCK WORD HAS CHANGED. 15556602 L R5,CPABNXTP THE EXTENT IS NOW MINE, NOW 15558602 LTR R5,R5 ENQUEUE THE CPAB, IF THE EXTENT 15559002 BNZ NEXTCPAB IS STILL THE LAST ONE --- IF IT IS NO 15559402 * LONGER THE LAST ONE, FIND THE LAST ONE. 15559802 CS R5,R1,CPABNXTP STILL LAST, ENQUEUE THE NEW EXTENT 15559902 BE EXITUNL2 IF SUCCESSFUL, EXIT 15576602 NEXTCPAB EQU * 15586602 L R2,CPABFLGW UNLOCK THIS PRESENT EXTENT BY 15596602 NEXTCPA2 EQU * 15601602 LR R3,R2 REDUCING THE USE COUNT AND 15606602 S R3,F1 STORING IT BACK IN THE EXTENT 15608602 CS R2,R3,CPABFLGW TO ALLOW CONCURRENT GETS AND 15609002 BNE NEXTCPA2 FREES. IF THE LOCK PICTURE CHANGES, 15609402 * CONTINUE UNTIL IT CAN BE STORED. 15609802 B TRYAGAIN LOCK CHANGED, FIND THE NEW QUEUE END. 15609902 SPACE 2 15660002 *********************************************************************** 15670002 * EXIT ROUTINE FOR SUCCESSFUL OPERATIONS, THIS ROUTINE 15680002 * UNLOCKS THE EXTENT (IF REQUIRED) PRIOR TO EXIT. 15710002 *********************************************************************** 15712002 EXIT EQU * 15720002 TM CPABFLGS,CPABEXTN IF THIS IS NOT AN EXTENT, NO 15760002 BZ FIRSTONE UNLOCKING OF THE PRIOR EXTENT REQUIRED 15810002 EXITUNLK EQU * 15870002 L R2,CPABFLGW UNLOCK THIS PRESENT EXTENT BY 15880002 EXITUNL2 EQU * 15885002 LR R3,R2 REDUCING THE USE COUNT AND 15890002 S R3,F1 STORING IT BACK IN THE CPAB 15900002 CS R2,R3,CPABFLGW TO ALLOW CONCURRENT GETS AND 15902002 BNE EXITUNL2 FREES. 15904002 FIRSTONE EQU * 15910002 BLDEXIT0 EQU * 15960002 SR R15,R15 RETURN TO CALLER RC=0 16010002 BR R14 16020002 EJECT 16060002 *********************************************************************** 16070002 * THIS SUBROUTINE PERFORMS THE POOL FORMATTING OPERATION. 16110002 * ON ENTRY, REG 8 CONTAINS THE ADDRESS OF THE CPAB FOR THE 16160002 * EXTENT TO BE FORMATTED. REG 11 CONTAINS THE RETURN POINT 16210002 * TO THE CALLER. 16260002 *********************************************************************** 16270002 POOLFORM EQU * 16310002 DROP R4 16360002 USING CPAB,R8 16410002 L R7,CPABENAD POOL END ADDRESS 16460002 S R7,CPABSTAD MINUS POOL START ADDRESS 16510002 BNP BLDERR16 EQUALS LENGTH, IF LENGTH <= 0 , ERROR. 16560002 L R5,CPABCSZE GET CELL SIZE 16610002 LA R9,4(R5) ADD LINK POINTER SIZE TO 16660002 SR R6,R6 OBTAIN THE TRUE INTERNAL CELL LENGTH. 16710002 DR R6,R9 DIVIDE POOL SIZE BY CELL SIZE. 16760002 LTR R7,R7 TEST NUMBER OF CELLS THAT WILL FIT 16810002 BNP BLDERR16 LESS THAN OR EQUAL TO ZERO, ERROR. 16860002 L R3,CPABSTAD GET POOL START ADDRESS 16910002 ST R3,CPABFACP STORE FIRST AVAILABLE POINTER IN CPAB 16920002 BCT R7,LOOPFORM IF ONLY ONE CELL GO TO LAST CELL 16960002 B LASTCELL PROCESSING IMMEDIATELY. 17010002 SPACE 2 17060002 *********************************************************************** 17070002 * THIS LOOP FORMATS THE POOL EXTENT. EACH CELL HAS THE 17110002 * ADDRESS OF ITS HIGH NEIGHBOR PLACED IN ITS LINKAGE POINTER, 17210002 * WHICH IS FOUND IN ITS LAST WORD. 17260002 *********************************************************************** 17270002 LOOPFORM EQU * 17310002 LA R6,4(R3,R5) CREATE ADDRESS OF ADJACENT NEIGHBOR CELL 17360002 ST R6,0(R3,R5) AND STORE IT INTO LINKAGE POINTER. 17410002 LR R3,R6 GET THE ADDRESS OF THE NEXT CELL. 17460002 BCT R7,LOOPFORM AND CONTINUE TO LAST CELL 17510002 LASTCELL EQU * 17560002 SR R9,R9 LINK ADDRESS IN LAST CELL GETS SET 17610002 ST R9,CELLLINK(R3,R5) TO ZERO 17660002 ST R9,CPABDEQC ZERO THE ALLOCATED CELL COUNT AND 17670002 BR R11 RETURN TO CALLER 17710002 DROP R8 17760002 EJECT 17810002 *********************************************************************** 17820002 * ERROR CONDITIONS FOR A RETURN CODE OF EIGHT: 17860002 * ..CPID IN THE CPAB DOES NOT MATCH THE CPID PASSED. 17960002 * ..THE CPID PASSED DOES NOT DEFINE A RECOGNIZABLE POOL. 18010002 * ..THE POOL TO BE RECOVERED HAS NEVER BEEN FORMATTED. 18020002 *********************************************************************** 18030002 BLDERR08 EQU * 18060002 LA R11,8 18110002 B ERREXIT TAKE ERROR EXIT 18160002 SPACE 3 18210002 *********************************************************************** 18210402 * THE SUBPOOL FOR A PERMANENT POOL WAS NOT A GLOBAL ONE 18220002 * OR THE SUBPOOL PASSED DID NOT MATCH THE ORIGINAL ONE FOR THE POOL 18230002 *********************************************************************** 18240002 BLDERR12 EQU * 18260002 LA R11,12 18310002 B ERREXIT 18360002 SPACE 2 18410002 *********************************************************************** 18412002 * EXTEND OPERATION ONLY - THE CELLSIZE PASSED DOES NOT MATCH THE 18420002 * CELL SIZE IN THE ORIGINAL POOL CPAB 18430002 * OR ANY OPERATION - THE CELLSIZE IS TOO LARGE TO ALLOW EVEN ONE 18440002 * CELL TO FIT IN THE POOL SPACE PASSED. 18450002 ****NOTE: IF THIS CONDITION OCCURS ON RECOVER OPERATIONS, THE EXTENT 18450402 * WILL BE LOCKED AND IT MAY BE NECESSARY TO ADD CODE TO UNLOCK 18450802 * THE EXTENT. HOWEVER, SINCE THIS ERROR INDICATES THAT THE 18451602 * CPAB FOR THE EXTENT HAS BEEN DESTROYED, THE EXTENT WILL NOT 18451702 * BE EITHER USEABLE OR RECOVERABLE, SO IT MAY AS WELL REMAIN 18451802 * LOCKED. 18451902 *********************************************************************** 18452002 BLDERR16 EQU * 18460002 LA R11,16 18510002 B ERREXIT 18560002 SPACE 2 18610002 *********************************************************************** 18612002 * A CONFLICTING CONCURRENT REQUEST HAS PRECEEDED THIS ONE AND 18620002 * IS STILL IN PROGRESS. THE CONFLICTING REQUEST WILL BE 18630002 * A DELETE REQUEST ON THE EXTENT TO WHICH THE NEW POOL EXTENT 18640002 * WOULD BE ENQUEUED. 18650802 *********************************************************************** 18652002 BLDERR20 EQU * 18660002 LA R11,20 18710002 B ERREXIT 18760002 EJECT 18770002 *********************************************************************** 18772002 * SO THAT A FREEMAIN MAY BE ISSUED BY THE CALLER ON ANY ERRORS, 18780002 * THIS ROUTINE WILL PASS BACK REGISTERS 0 AND 1 IN SUCH A WAY 18790002 * THAT THEY ARE SUFFICIENT FOR EXECUTION OF A FREEMAIN (R-FORM). 18800002 * REGISTER 0 = SUBPOOL NUMBER .. POOL SIZE IN BYTES 18802002 * REGISTER 1 = POOL ADDRESS 18804002 *********************************************************************** 18808402 ERREXIT EQU * 18810002 LTR R1,R12 PICK UP AREA ADDRESS 18820002 BZ RCVRERR IF RECOVER OPERATION, CLEAR REG 0 AND 1 18822002 USING CPAB,R1 18830002 IC R0,CPABSPID GET THE SUBPOOL NUMBER 18840002 SLL R0,24 SHIFTED INTO THE HIGH-ORDER BYTE. 18850002 L R2,CPABENAD PICK UP THE ORIGINAL POOL SIZE 18852002 L R3,CPABSTAD GET STARTING ADDRESS AND 18852402 LTR R3,R3 TEST TO SEE IF IT HAS BEEN SET UP YET. 18852802 BZ VALISOK NO, CPABENAD CONTAINS ONLY LENGTH 18853202 SR R2,R3 YES, GET LENGTH BY SUBTRACTING START *18853602 ADDRESS FROM END ADDRESS 18853702 TM CPABFLGS,CPABEXTN IF THIS IS AN EXTENT, 18855702 BO ADDCPABL THE CPAB LENGTH MUST BE ADDED BACK. 18857702 L R5,CPABCPID OR IF THIS IS A DYNAMIC POOL (CPID>0), 18859702 LTR R5,R5 THE CPAB LENGTH MUST BE ADDED BACK 18859802 BNM ADDCPABL 18859902 B VALISOK PERMANENT POOL FIRST EXTENT, SKIP 18862402 ADDCPABL EQU * 18864402 LA R2,CPABLEN(R2) INCLUDE CPAB LENGTH IN THE POOL LENGTH. 18866402 VALISOK EQU * 18867502 LA R2,0(R2) REMOVE HIGH-ORDER BYTE 18870002 OR R0,R2 CATENATE THE TWO FIELDS (SP# & LENGTH) 18875002 RCVRERR EQU * 18877002 *********************************************************************** 18877402 * ON RECOVER ERRORS, DO NOT RETURN THE FREEMAIN PARAMETERS 18880402 *********************************************************************** 18880502 OK2EXIT EQU * 18886902 LR R15,R11 PASS THE RETURN CODE 18890002 BR R14 18910002 EJECT 18920002 *********************************************************************** 19007402 * CONSTANTS REQUIRED BY THE BUILD CELL POOL PROGRAM 19010002 *********************************************************************** 19020002 F255 DC F'255' CONSTANT USED FOR MODULO DIVIDE BY 256 19060002 F1 DC F'1' CONSTANT USED TO BUMP/DECREMENT USE COUNT 19140002 * THE FOLLOWING MASKS ARE USED TO TURN THE DELETE LOCK BIT 19140402 * ON/OFF IN A REGISTER. 19140602 DELETEON DC X'00',AL1(DELETELK),2X'00' TURN THE FLAG ON 19140802 DELETOFF DC X'FF',AL1(X'FF'-DELETELK),2X'FF' TURN THE FLAG OFF 19141402 EJECT 19142002 CVT DSECT=YES 19160002 EJECT 19210002 IHAGDA DSECT=YES 19260002 EJECT 19270002 IHACPAB DSECT=YES 19310002 END 19410002