         << LINES .001/.009 ARE RESERVED FOR SYSTEMS INTEGRATION >>     00000001
         NPFLD     =( 9:7) #, << VM PAGES ALLOCATED: 8 BITS >> <<S9977>>00560000
         SBL   = CON %20104, %12#,                             <<*9385>>00980000
         PMBCFIRMWARE = ABS(%1220).(14:1)#;                    <<*9385>>00981000
EQUATE CSTXP = 1;  <<POINTER TO CURRENT RUNNING PROGRAM BLOCK>><<S1932>>02476000
<<** If a CSTBLOCK has been deallocated and the CSTBLOCK   **>><<S1932>>02820500
<<** table has been adjusted then the pointer to the       **>><<S1932>>02820600
<<** current running program block, ABSOLUTE(1), need to be**>><<S1932>>02820700
<<** updated right away.                                   **>><<S1932>>02820800
                                                               <<S1932>>02820900
IF ABS(CSTXP) - ABS(DSTB) > LOGICAL (CSTX) THEN                <<S1932>>02821000
ABS(CSTXP) := ABS(CSTXP) - N;                                  <<S1932>>02821100
                                                               <<S1932>>02821200
IF EN <= %73 THEN SUDDENDEATH(124);  <<TRYING TO REL SYS DST>> <<R9354>>03260000
IF TYPE=CSTB THEN       <<CHECK FOR SEG SIZE, BANK AND BASE>>  <<R9125>>03355000
BEGIN                                                          <<R9125>>03355100
  COMMENT: The purpose of the following code is to cover up    <<R9125>>03355200
           a problem where LOADER tries to UNLOAD a code seg.  <<R9125>>03355300
           which has all zeros in the four words entry. When   <<R9125>>03355400
           this happen, the even will be loged via SOFT'DEATH  <<R9125>>03355500
           then RETURNENTRY will be called to put this entry   <<R9125>>03355600
           into the free list;                                 <<R9125>>03355700
  IF  DSTI'(DESCSTINX).CODESIZEFIELD = 0  OR                   <<R9125>>03356000
  (DSTI'(DESCSTINX+2) = 0 LAND DSTI'(DESCSTINX+3) = 0) THEN    <<R9125>>03357000
  BEGIN SOFT'DEATH(636); GOTO RELENTRY; END;                   <<R9125>>03358000
END;                                                           <<R9125>>03359000
RELENTRY:                                                      <<R9125>>03621000
$EDIT VOID=03775000                                            <<.1509>>03745000
COMMENT                                                        <<.1509>>03746100
**BEGIN_IS*****************************************************<<.1509>>03746200
*                                                             *<<.1509>>03746300
* PROCEDURE GETDATASEG(MEMSIZE,VDSIZEI)                       *<<.1509>>03746400
*                                                             *<<.1509>>03746500
* PURPOSE:  GETDATASEG IS A FUNCTION CALLED TO CREATE AN      *<<.1509>>03746600
*           EXTRA DATA SEGMENT OR A STACK.  IF ENTRY IS MADE  *<<.1509>>03746700
*           AT GETDATASEG, THEN AN EXTRA DATA SEGMENT IS      *<<.1509>>03746800
*           CREATED.  IF ENTRY IS MADE AT GET STACK, THEN A   *<<.1509>>03746900
*           STACK IS CREATED.  IF ENTRY IS MADE AT            *<<.1509>>03747000
*           GETDATASEGC, THEN AN EXTRA DATA SEGMENT IS        *<<.1509>>03747100
*           CREATED AND THE CONTENTS CLEARED.                 *<<.1509>>03747200
*                                                             *<<.1509>>03747300
*           IF ENTRY IS MADE AT GETDATASEG, THEN THE DEFAULT  *<<.1509>>03747400
*           VALUES IN THE FLAG VARIABLES ARE VALID, SO JUMP   *<<.1509>>03747500
*           TO LABEL START.  IF ENTRY IS MADE AT GETSTACK,    *<<.1509>>03747600
*           FLAG THAT THIS IS A STACK REQUEST AND SET UP THE  *<<.1509>>03747700
*           PAD VARIBLE EXTRA.  IF ENTRY IS MADE AT           *<<.1509>>03747800
*           GETDATASEGC, THEN FLAG THAT THE EXTRA DATA        *<<.1509>>03747900
*           SEGMENT CREATED IS TO BE CLEARED TO ZEROES.       *<<.1509>>03748000
*           START BY ROUNDING UP MEMSIZE TO INCREMENTS OF 4   *<<.1509>>03748100
*           WORDS AND USING THE LARGER OF EITHER THE MEMSIZE  *<<.1509>>03748200
*           OR VDSIZE VALUE AND CALL SETCRITICAL TO           *<<.1509>>03748300
*           TEMPORARILY PREVENT ABORTION.  GET A DST ENTRY    *<<.1509>>03748400
*           FOR THIS STACK OR EXTRA DATA SEGMENT AND RETURN   *<<.1509>>03748500
*           CCG CONDITION CODE IF NONE ARE AVAILABLE.  GET A  *<<.1509>>03748600
*           SWAP REGION OUT ON DISC AND RETURN CCL CONDITION  *<<.1509>>03748700
*           CODE IF NONE ARE AVAILABLE.  FILL IN THE DST      *<<.1509>>03748800
*           ENTRY BY INSERTING THE SIZE (IN 4 WORD            *<<.1509>>03748900
*           INCREMENTS), FLAGGING THAT IT IS ABSENT FROM      *<<.1509>>03749000
*           MEMORY SO IT WILL BE BROUGHT IN, INSERTING THE    *<<.1509>>03749100
*           HODA/LODA WORDS AND FLAGGING THAT THE DISC COPY   *<<.1509>>03749200
*           IS VALID.  THEN RETURN THE ADDRESS OF THE DST     *<<.1509>>03749300
*           ENTRY BACK TO THE CALLER AND IF THIS IS A STACK,  *<<.1509>>03749400
*           THEN FLAG THIS IN THE DST ENTRY.  LOG IN THE      *<<.1509>>03749500
*           MONITOR TABLE THAT THE EXTRA DATA SEGMENT HAS     *<<.1509>>03749600
*           BEEN ALLOCATED AND IF THE EXTRA DATA SEGMENT IS   *<<.1509>>03749700
*           TO BE CLEARED, CALCULATE THE WORD SIZE (MAKING    *<<.1509>>03749800
*           SURE THAT THE VALUE IS NOT NEGATIVE, WHICH MEANS  *<<.1509>>03749900
*           BYTE COUNT TO ATTACHIO) AND CALLING ATTACHIO TO   *<<.1509>>03750000
*           HAVE THE EXTRA DATA SEGMENT ZEROED.  IF ATTACHIO  *<<.1509>>03750100
*           CANNOT CLEAR THE EXTRA DATA SEGMENT, THEN         *<<.1509>>03750200
*           SUDDENDEATH WITH A 680.  FINALLY, PASS BACK THE   *<<.1509>>03750300
*           CONDITION CODE, RESET CRITICAL SO THE CALLER CAN  *<<.1509>>03750400
*           BE ABORTED AND RETURN.                            *<<.1509>>03750500
*                                                             *<<.1509>>03750600
* ENTRY:    MEMSIZE=MEMORY SIZE OF THE STACK/EXTRA DATA       *<<.1509>>03750700
*                     SEGMENT (WORDS)                         *<<.1509>>03750800
*                                                             *<<.1509>>03750900
*           VDSIZEI=VIRTUAL DISC DOMAIN SIZE (WORDS)          *<<.1509>>03751000
*                                                             *<<.1509>>03751100
* EXIT:     GETDATASEG    =ADDRESS OF DST ENTRY OF THIS NEWLY *<<.1509>>03751200
*                            CREATED EXTRA DATA SEGMENT OR    *<<.1509>>03751300
*                            STACK                            *<<.1509>>03751400
*                                                             *<<.1509>>03751500
*           CONDITION CODE=CCL IF NO SWAP REGION WAS          *<<.1509>>03751600
*                            AVAILABLE                        *<<.1509>>03751700
*                         =CCE IF NO ERRORS                   *<<.1509>>03751800
*                         =CCG IF NO DST ENTRY IS AVAILABLE   *<<.1509>>03751900
*                                                             *<<.1509>>03752000
***************************************************************<<.1509>>03752100
;                                                              <<.1509>>03752200
INTEGER SWREGSIZE;                                             <<.1509>>03846000
                                                               <<.1509>>03856000
COMMENT---------------------                                   <<.1509>>03857000
| ENTRY POINT:  GETDATASEG |                                   <<.1509>>03858000
---------------------------;                                   <<.1509>>03859000
COMMENT-------------------                                     <<.1509>>03866000
| ENTRY POINT:  GETSTACK |                                     <<.1509>>03867000
-------------------------;                                     <<.1509>>03868000
COMMENT----------------------                                  <<.1509>>03881000
| ENTRY POINT:  GETDATASEGC |                                  <<.1509>>03882000
----------------------------;                                  <<.1509>>03883000
                                                               <<.1509>>03886000
$EDIT VOID=03915000                                            <<.1509>>03895000
                                                               <<.1509>>03896000
!  ROUND UP MEMSIZE TO INCREMENTS OF 4                         <<.1509>>03897000
!  -----------------------------------                         <<.1509>>03898000
                                                               <<.1509>>03936000
!  USE LARGER OF MEMSIZE OR VDSIZE & CALL SETCRITICAL          <<.1509>>03937000
!  --------------------------------------------------          <<.1509>>03938000
$EDIT VOID=03985000                                            <<.1509>>03980000
!  GET A DST ENTRY FOR THE EXTRA DATA SEGMENT                  <<.1509>>03991000
!  ------------------------------------------                  <<.1509>>03992000
$EDIT                                                          <<.1509>>04035000
!  GET A SWAP REGION FOR THE DATA SEGMENT                      <<.1509>>04041000
!  --------------------------------------                      <<.1509>>04042000
$EDIT VOID=04095000                                            <<.1509>>04090000
!  FILL IN THE DST TABLE ENTRY FOR THE DATA SEGMENT            <<.1509>>04101000
!  ------------------------------------------------            <<.1509>>04102000
IF clear or stack then  <<only set the absent bit>>            <<V1774>>04108000
DSTI'(X) := LOGICAL(MEMSIZE&LSR(2)) LOR %100000 ELSE           <<V1774>>04109000
<<Set all 3 bits (0:3) of the first word of the DST entry to >><<V1774>>04109010
<<signal FETCHOBJECT that this is the newly created DATA seg >><<V1774>>04109020
<<so a read from disc will not be initiated. >>                <<V1774>>04109030
dsti'(x) := logical(memsize&LSR(2)) LOR %160000;               <<V1774>>04110000
                                                               <<.1509>>04136000
                                                               <<.1509>>04161000
!  LOG IN MONITOR TABLE THAT XDS HAS BEEN ALLOCATED            <<.1509>>04162000
!  ------------------------------------------------            <<.1509>>04163000
$EDIT                                                          <<.1509>>04215000
                                                               <<.1509>>04216000
!  ZERO OUT SWAP REGION ON DISC IF REQUIRED                    <<.1509>>04217000
!  ----------------------------------------                    <<.1509>>04218000
$EDIT VOID=04240000                                            <<.1509>>04230000
   SWREGSIZE:=LOGICAL(DSTI'(EN&LSL(2)+1)).VMALLOC*VMPAGESIZE;  <<.1509>>04231000
   IF SWREGSIZE<0 THEN SWREGSIZE:=%077777;                     <<.1509>>04232000
   TOS:=ATTACHIO(DA1.LDEVNFIELD,0,0,0,ZEROFILL,                <<.1509>>04233000
                 SWREGSIZE,DA1.HODAFIELD,DA2,BLOCKED);         <<.1509>>04234000
                                                               <<.1509>>04246000
!  SUDDENDEATH IF ATTACHIO CANNOT ZERO OUT THE XDS             <<.1509>>04247000
!  -----------------------------------------------             <<.1509>>04248000
$EDIT                                                          <<.1509>>04255000
                                                               <<.1509>>04261000
!  PASS BACK CONDITION CODE AND RETURN                         <<.1509>>04262000
!  -----------------------------------                         <<.1509>>04263000
DISABLE;                                                       <<c1408>>04675100
$EDIT VOID=4725000                                             <<c1408>>04725000
$EDIT VOID=4745000                                             <<c1408>>04745000
ENABLE;                                                        <<c1408>>04805000
   << Change the ROUND UP logic for computing the new size >>  <<S9977>>05397100
   << to prevent it from being overflowed when the size is >>  <<S9977>>05397200
   << greater than %77000 words. >>                            <<S9977>>05397300
   TOS := ( (NS-1)/INTEGER(VMPAGESIZE) ) + 1;                  <<S9977>>05397400
                                                               <<S9977>>05397500
$edit                                                          <<S9977>>05400000
IF PMBCFIRMWARE THEN                                           <<*9385>>05850000
                                                               <<*9385>>05855000
  BEGIN                                                        <<*9385>>05865000
$PAGE "SET SERVER BIT IN PCB PROCEDURE"                        <<S9742>>10028000
COMMENT                                                        <<S9742>>10028250
                                                               <<S9742>>10028500
   SETSERVERBIT is called to have the process specified        <<S9742>>10028750
   by the PIN, flagged as a server by turning on the           <<S9742>>10029000
   SERVER bit in the Process Control Block (PCB).  This        <<S9742>>10029250
   allows the server process to be aborted even though         <<S9742>>10029500
   the process is a system process.                            <<S9742>>10029750
                                                               <<S9742>>10030000
;                                                              <<S9742>>10030250
PROCEDURE SETSERVERBIT(PIN);                                   <<S9742>>10030500
                                                               <<S9742>>10030750
   VALUE PIN;                                                  <<S9742>>10031000
   INTEGER PIN;              !PROCESS ID NUMBER                <<S9742>>10031250
                                                               <<S9742>>10031500
   OPTION UNCALLABLE, PRIVILEGED;                              <<S9742>>10031750
                                                               <<S9742>>10032000
BEGIN                                                          <<S9742>>10032250
   INTEGER PCBIDX;           !INDEX TO PCB ENTRY               <<S9742>>10032500
                                                               <<S9742>>10032750
   PCBIDX:=PIN*PCBSIZE+PIINFOWORDNUM;                          <<S9742>>10033000
   PCB(PCBIDX).SERVERFLAG:=1                                   <<S9742>>10033250
END;                                                           <<S9742>>10033500
              << Change the ROUND UP logic for computing   >>  <<S9977>>12874000
              << the new size. >>                              <<S9977>>12874100
       IF (((SIZE+INC-1)/INTEGER(VMPAGESIZE))+1) > VDSSIZE THEN<<S9977>>12875000
