+-----------------------------------------------+
		  | +-------------------------------------------+ |
		  | |						| |
		  | |						| |
		  | |						| |
		  | |						| |
		  | |	      WHAT MOTHER NEVER TOLD YOU	| |
		  | |						| |
		  | |		   ABOUT VM SERVICE		| |
		  | |						| |
		  | |						| |
		  | |						| |
		  | |						| |
		  | |		      A Tutorial		| |
		  | |						| |
		  | |						| |
		  | |						| |
		  | |						| |
		  | |						| |
		  | |						| |
		  | |						| |
		  | |						| |
		  | |						| |
		  | |						| |
		  | |		  Melinda W. Varian		| |
		  | |						| |
		  | |						| |
		  | |		 Princeton University		| |
		  | |		   Computer Center		| |
		  | |						| |
		  | |						| |
		  | |						| |
		  | |		     March, 1983		| |
		  | |						| |
		  | |						| |
		  | |						| |
		  | |						| |
		  | +-------------------------------------------+ |
		  +-----------------------------------------------+







		     WHAT MOTHER NEVER TOLD YOU ABOUT VM SERVICE

				     A Tutorial


				  Melinda W. Varian

			Princeton University Computer Center
				 87 Prospect Avenue
				Princeton, NJ  08544



				    Introduction


     In talking with a number of new VM  users over the past year,  I have found
     that although they are often able to use VMSERV successfully to install the
     service from the VM PUTs (the preventive service tapes), they start getting
     into trouble when they must apply corrective service,  even just taking the
     steps  prescribed in  the	PUT error  bucket.    My  impression from  these
     conversations  has been  that  the  source of  the  problem  is a	lack  of
     understanding  of the  basic  VM  service installation  processes.    These
     processes are not difficult to understand,   but the VM education available
     to new  users in  recent years  has unfortunately	encouraged them  to view
     service installation  as "magic",	as something  which must be left  in its
     black box.    I have  never been  very happy  having to  use magic  myself,
     especially unreliable magic.  IBM's VM service magic falls into that class.

     I was very fortunate when I was a new user,  four years ago,  to be able to
     sit down with  a very kind and  knowledgeable lady who took  me through the
     entire service installation process, explaining it step by step.	So, what
     I am proposing to	do here today is to go	through the service installation
     process with you, using, as she did, only the most primitive of our service
     primitives,  in the hope  of giving you a firm understanding  of the entire
     process.	Once you understand what is really going on,  then it is fine to
     stuff it back into a black box.   Indeed, you will almost certainly want to
     automate substantial  portions of	the process,  using  either your  own or
     IBM's EXECs.   (As I go along,  I	will mention the higher-level tools that
     are available to be used in the various steps.)

     I will be	presenting you with what  I hope is a  simple,	coherent service
     strategy, down to the detail of disk layouts and file names.  This strategy
     is a distillation	of my own experience  and the experience of  a number of
     the VM old-timers I have talked to.   It is, I hope,  suitable to be picked
     up and used  as it is by  new installations.   I'll go  through the service
     process for  CP first  and later  describe the  differences in  the service
     installation process for CMS.   The important  point here is that there are
     almost no differences.   CMS service installation has a few more curlicues,
     but the philosophy and the mechanisms are the same.   I will be using VM/SP
     Release 1 in my examples, but it is easy to extrapolate to the base version
     of VM or to  BSEPP,  SEPP,  SP2,  or HPO;	the main  differences are in the
     naming conventions.   (There is an appendix  in the handout which discusses
     the differences between installing service on  SP and installing service on


									 PAGE ii

     other levels of  VM.)   I will touch  briefly on the subject  of installing
     service on  other source-based  VM products,   but,  once	you know  how to
     maintain CMS, you will have no trouble with these products.

     I will not  be discussing the installation of  service for non-source-based
     VM products, such as the CMS compilers, because there is nothing I can tell
     you that would prepare  you for doing that.   Every new  compiler tape is a
     new adventure  for all of	us;  there are no  guidelines.	 The best  I can
     suggest is that VMSHARE, the network used by members of the SHARE VM Group,
     usually contains detailed	instructions on how to fix up  each new compiler
     tape within a couple of weeks of its appearance in the field.

     The  older  VM installations  have  evolved  service procedures  which  are
     remarkably similar from site to site.*  There are, of course, varying views
     on some of the steps in the service process.  I will try to point these out
     as I go and explain the cause of the differences.	 You will see, too, that
     there are a  few areas in which  the old users disagree  with IBM's service
     installation recommendations.   I will try to explain those differences, as
     well.   Most of what IBM tells you about VM service is sound,  however,  so
     you should  be sure  that you are	familiar with  the "PSGIM",   the "Field
     Engineering Programming System General Information" manual, G229-2228,  and
     with the "sysgen manual", the "VM/SP Planning and System Generation Guide",
     SC19-6201.   The  best introduction  to VM service  installation that  I am
     aware of  is a primer written  by an IBM  SE,  Bob Benham,  which	has been
     published	by  the Washington  Systems  Center  under the	title,	 "VM/370
     Maintenance Made Simple", GG22-9277.





				--------------------

     * Although some  of the more outrageous  views expressed in this  paper are
     strictly my own,  the paper as a whole is the result of a community effort.
     I set  out to collect and	record the folklore  of the VM community  on the
     subject of service installation.	(See VMSHARE MEMO MAINT.)  I was touched
     and  pleased  by  the  generosity	with  which  members  of  the  community
     responded.   I am	indebted to many VMers	for taking the time  to describe
     their service  installation techniques for  me,  especially  Bruce Marshall
     (ADE).   I also wish to thank Kirk Alexander (PU), John Alvord (AMD), Terry
     Baughman (CGS), Nancy Benjamin (TD), Jim Best (PWC), Bob Cowles (CUN),  Sam
     Drake (WSA), Jim Forkner (PSU), Lyn Hadley (IBM), John Hartmann (IBM),  Pat
     Hennessy (HUG), Pete Jobusch (SNO),  Arny Krueger (ANG),  Joe Morris (UNT),
     Henry  Nussbacher (CNY),	Rich Paymer  (TYM),  Dick  Rawson (TYM),   Chuck
     Rodenberger (IBM), Carey Schug (CIK), Nancy Schiffmann (NII),  Chris Thomas
     (UR),  Lee Varian (PU),  John Wagner (PU),  Donna Walker (PY),  Fred Webber
     (IBM),  and Tom Wilson (SNO)  for	reviewing the manuscript and making many
     valuable suggestions.   I	am particularly grateful to  Manos Maneyas (IBM)
     and Pat Ryall (AMD),   who devoted many hours to trying  to prevent me from
     leading new CMS system programmers astray,  and to Jean Olenick (RCH),  who
     taught  me to  be a  VM  system programmer  in  the first	place.	 In  all
     fairness,	 I must  also  thank the  authors of  ZORK  for their  unwitting
     contribution to this project.  --MWV


									PAGE iii

				  Table of Contents


     I. The Use Of Control Files . . . . . . . . . . . . . . . . . . . . . .   1

	A. CMS UPDATE  . . . . . . . . . . . . . . . . . . . . . . . . . . .   1
	B. VMFASM  . . . . . . . . . . . . . . . . . . . . . . . . . . . . .   3
	C. VMFLOAD . . . . . . . . . . . . . . . . . . . . . . . . . . . . .   3
	D. Recommended Control File  . . . . . . . . . . . . . . . . . . . .   4

     II. Service Minidisk Layouts  . . . . . . . . . . . . . . . . . . . . .   5

	A. IBM Recommendation  . . . . . . . . . . . . . . . . . . . . . . .   5
	B. My Recommendation . . . . . . . . . . . . . . . . . . . . . . . .   7
	C. Assumptions for this Presentation . . . . . . . . . . . . . . . .   9

     III. Installing Corrective Service for CP . . . . . . . . . . . . . . .  10

	A. Making a CP Module Resident . . . . . . . . . . . . . . . . . . .  10
	B. Removing a Bad Fix  . . . . . . . . . . . . . . . . . . . . . . .  13
	C. Applying a Fix  . . . . . . . . . . . . . . . . . . . . . . . . .  18

     IV. Installing Preventive Service for CP  . . . . . . . . . . . . . . .  23

	A. Ordering the PUT Bucket . . . . . . . . . . . . . . . . . . . . .  23
	B. The Paper Documentation . . . . . . . . . . . . . . . . . . . . .  23
	C. New Service Minidisks . . . . . . . . . . . . . . . . . . . . . .  23
	D. The Memoranda from the Tape . . . . . . . . . . . . . . . . . . .  23
	E. "Mapping" the PUT . . . . . . . . . . . . . . . . . . . . . . . .  24
	F. Loading the Service from the PUT  . . . . . . . . . . . . . . . .  26
	G. Carrying Forward Old Corrective Service . . . . . . . . . . . . .  27
	H. Taking the Actions Described in the PUT Bucket  . . . . . . . . .  31
	I. Carrying Forward Your Local Mods  . . . . . . . . . . . . . . . .  35
	J. Testing a New Version of CP . . . . . . . . . . . . . . . . . . .  36
	K. Putting a New Version of CP into Production . . . . . . . . . . .  36

     V. Converting to a New Release of CP  . . . . . . . . . . . . . . . . .  37

	A. Loading Up the Base Tape (and Possibly a Service Tape)  . . . . .  37
	B. Doing What the Bucket Says  . . . . . . . . . . . . . . . . . . .  37
	C. Carrying Forward Old Corrective Service . . . . . . . . . . . . .  38
	D. Carrying Forward Your Local Mods  . . . . . . . . . . . . . . . .  38
	E. Compatibility Problems  . . . . . . . . . . . . . . . . . . . . .  38

     VI. Advanced Nucleus Theory . . . . . . . . . . . . . . . . . . . . . .  39

	A. Building and Delivering a CP Nucleus  . . . . . . . . . . . . . .  39
	B. Defining A V=R Area: DMKSLC . . . . . . . . . . . . . . . . . . .  40
	C. Detecting Nucleus Overflow  . . . . . . . . . . . . . . . . . . .  41
	D. Backing Your Nucleus Up . . . . . . . . . . . . . . . . . . . . .  42
	E. Logging and Numbering Your Systems  . . . . . . . . . . . . . . .  43
	F. Archiving Your Load Maps  . . . . . . . . . . . . . . . . . . . .  43
	G. Unresolved References . . . . . . . . . . . . . . . . . . . . . .  44
	H. The Small CP Nucleus Option . . . . . . . . . . . . . . . . . . .  45


									 PAGE iv

	I. Alternate CP Nuclei . . . . . . . . . . . . . . . . . . . . . . .  46
	J. The Perils of SHUTDOWN  . . . . . . . . . . . . . . . . . . . . .  47

     VII. Maintaining Multiple Systems . . . . . . . . . . . . . . . . . . .  49

	A. A Test System . . . . . . . . . . . . . . . . . . . . . . . . . .  49
	B. The FRE013 Trap . . . . . . . . . . . . . . . . . . . . . . . . .  51
	C. Systems for Multiple CPUs . . . . . . . . . . . . . . . . . . . .  52
	D. Maintaining Distributed Systems . . . . . . . . . . . . . . . . .  53

     VIII. The Differences Between CMS Service and CP Service  . . . . . . .  55

	A. CMS Macro Update and Auxfile Names  . . . . . . . . . . . . . . .  55
	B. Another Maxim . . . . . . . . . . . . . . . . . . . . . . . . . .  55
	C. CMS Structure . . . . . . . . . . . . . . . . . . . . . . . . . .  56
	D. Recommended Control Files and Service Minidisks for CMS . . . . .  59

     IX. Installing Corrective Service for CMS . . . . . . . . . . . . . . .  62

	A. Regenerating a CMS Module . . . . . . . . . . . . . . . . . . . .  62
	B. Putting It on the S-disk (Or on the Y-disk) . . . . . . . . . . .  65
	C. A Digression on the Subject of Updating a Production CMS System .  67
	D. Updating a Shared Segment . . . . . . . . . . . . . . . . . . . .  70
	E. Updating an IPL Deck  . . . . . . . . . . . . . . . . . . . . . .  72
	F. Updating the CMS Nucleus  . . . . . . . . . . . . . . . . . . . .  73

     X. Installing Preventive Service for CMS  . . . . . . . . . . . . . . .  75

	A. New CMS Service Minidisks . . . . . . . . . . . . . . . . . . . .  75
	B. Loading the Service . . . . . . . . . . . . . . . . . . . . . . .  76
	C. Rebuilding the Assembler Auxiliary Directory  . . . . . . . . . .  77
	D. Building a Nucleus on the Alternate S-Disk  . . . . . . . . . . .  77
	E. Building Alternate Saved Systems  . . . . . . . . . . . . . . . .  78
	F. Making the Test CMS System Available to Your Users  . . . . . . .  79
	G. Putting a New Version of CMS Into Production  . . . . . . . . . .  79

     XI. Converting to a New Release of CMS  . . . . . . . . . . . . . . . .  80

     XII. Installing Service on Program Products . . . . . . . . . . . . . .  81

     XIII. Converting from SP1 CMS to SP2 CMS  . . . . . . . . . . . . . . .  82

	A. SP2 Changes that Affect CMS Installation and Service  . . . . . .  82
	B. Before the Tape Arrives . . . . . . . . . . . . . . . . . . . . .  84
	C. Loading Up SP2 CMS from the Distribution Tape and the PUT . . . .  86
	D. Building the CMS Nuclei and Saved Systems . . . . . . . . . . . .  87
	E. What To Do If You Don't Like the Default Shared Segment Locations  91
	F. What To Do If You Don't Like the Default Nucleus Location or Size  92
	G. Notes on Updating a Production SP2 CMS System . . . . . . . . . .  95
	H. Miscellaneous Caveats . . . . . . . . . . . . . . . . . . . . . .  96


									  PAGE v

				     Appendices

     A. Applying Service to Other Levels of VM . . . . . . . . . . . . . . .  97

	Naming Conventions for Current Levels of VM  . . . . . . . . . . . .  97
	Service Disk Layouts for "Delta" Systems . . . . . . . . . . . . . .  98
	Preferred Auxfiles . . . . . . . . . . . . . . . . . . . . . . . . .  99

     B. The FRE013 Trap  . . . . . . . . . . . . . . . . . . . . . . . . . . 100

     C. Mod to Resolve External References in Small CP Nucleus . . . . . . . 103

     D. Alternate Nucleus Mod, System Numbering Mod, and
	EXECs for Building and Installing CP . . . . . . . . . . . . . . . . 106

     E. IPLable System Which Decides Which SP2 CMS to IPL  . . . . . . . . . 124


									 PAGE vi


									  PAGE 1

			     I. The Use Of Control Files


     Time constraints  force me to  assume that  you have some	familiarity with
     CMS,  the CMS file system,  and the common CMS tools,  such as LISTFILE and
     EXEC.   I	think a  brief refresher  on control  files and  the CMS  UPDATE
     command,  as they are used in VM  service installation,  would be in order,
     though.


     A. CMS UPDATE

     CMS UPDATE is the tool that is used to apply fixes to VM.	 UPDATE is a lot
     like the OS utility IEBUPDTE.   It can  be used to insert statements into a
     file,  delete statements from a file,   or replace existing statements with
     new ones.	 UPDATE takes as input a base file, such as DMKSCH ASSEMBLE (the
     source for the CP scheduler), and update files, such as DMKSCH S12052DK:

     FILE: DMKSCH S12052DK

      ./ I 4040000 $ 4045000
	       NI    VMQLEVEL,255-VMCOMP  RESET COMPUTE BOUND	     @VA12052

     Note that UPDATE doesn't default to replacing the file it is updating.  Its
     normal mode of operation is to leave  the input file untouched and to build
     an output	file containing the updated  version of the input  file.   (This
     output file has the same name as the  input file,	but preceded by a dollar
     sign.)  The DMKSCH S12052DK update file simply specifies that a single line
     of code  is to  be inserted  into DMKSCH  ASSEMBLE after  the statement  at
     sequence number  04040000 and that  this line is  to be given  the sequence
     number 04045000.  DMKSCH S12052DK is the IBM fix for APAR VM12052.  This is
     the nomenclature  used for VM/SP  Release 1  service;  the filename  is the
     module or macro to which the fix applies, and the filetype is "S", followed
     by the 5-digit APAR number, followed by "DK" for CP or "DS" for CMS.

     UPDATE doesn't just apply one update and it doesn't just apply all existing
     updates.  It is much smarter than that.  What it does do is use information
     from  some other  files,  the  "control  file" and  the "auxiliary  control
     files",  to decide which of the  available updates are appropriate to apply
     to this particular system.   A typical IBM-supplied control file looks like
     DMKSPM CNTRL, the control file for MP systems:

     FILE: DMKSPM CNTRL

      TEXT MACS DMKSPM DMKSP DMKMAC DMSSP CMSLIB OSMACRO
      MP   UPDTMP
      AP   UPDTAP
      TEXT AUXSP12
      TEXT AUXSP11
      TEXT AUXSP

     The  first  field	in  each  of  these  statements  is  the  "update  level
     identifier",  which you  can think of as  a name field and  can ignore just
     now.    The  second  field  on each  control  file  statement  defines  the


									  PAGE 2

     statement's function.   There are three kinds of statements in this control
     file,  the  MACS statement,  two  statements which  specify the name  of an
     update  ("UPDT..."),  and	two  statements which  specify	the  name of  an
     auxiliary control	file ("AUX...").    The MACS  statement is  not used  by
     UPDATE.   The other statements in this control file tell UPDATE what update
     files should be applied, if they exist.   And the order of these statements
     specifies the order in which the specified updates should be applied.   One
     tricky thing you  must remember is that  in applying updates you  read both
     the control file and the auxiliary control files (the "auxfiles")	from the
     bottom upwards.

     Now,  if UPDATE is told to update	DMKSCH ASSEMBLE using the DMKSPM control
     file,  it	starts with the bottom-most  record in the control  file,  "TEXT
     AUXSP".   That "AUXSP" specifies the filetype  of an auxfile.   So,  UPDATE
     looks on all accessed disks for a file named DMKSCH AUXSP, which it finds:

     FILE: DMKSCH AUXSP D1

      S10790DK 106 UV04479 PERFORMANCE FIX FOR MAIN STORAGE OVERCOMMIT
      S12077DK 101 UV02615 RESET Q3 BIT AT Q-ADD
      S12052DK 101 UV02605 RESET COMPUTE BOUND BIT AT Q-ADD

     (Note that if there  were two such files,	the one on  the disk earliest in
     the disk  search order  is the one  that would  be used.)	  This auxiliary
     control file lists some updates that should be applied to DMKSCH, so UPDATE
     applies them,   starting with  the one  at the  bottom of	the auxfile  and
     working its way up.   Then, UPDATE steps up a notch in the control file, to
     the line  that says  "TEXT AUXSP11".   That  causes it  to look  around for
     another auxfile,  this  one named DMKSCH AUXSP11.	 It doesn't  find such a
     file, so it steps up to the next record in the DMKSPM control file, the one
     that says "TEXT  AUXSP12".   If it finds  a file named DMKSCH  AUXSP12,  it
     applies any updates listed in that file.  Then it steps up once more to the
     next record in the control file, the one that says "AP UPDTAP".   This is a
     slightly different  kind of control file  record.	 It doesn't  specify the
     name of an auxfile which specifies  updates;  instead it directly specifies
     the name  of an  update,  "UPDTAP".    (Think of  it as  being like  direct
     addressing vs.  indirect addressing.)  So UPDATE looks around for an update
     file named  DMKSCH UPDTAP	and applies it	if there is  one.   Up	one more
     notch, to the "MP UPDTMP" record,	and UPDATE looks for a file named DMKSCH
     UPDTMP, finds it, and applies it.	With that, it is all done.

     What the control file gives you, then, is a way to tailor your system.   If
     you have an MP system, you use an MP control file, which specifies that the
     base source for  the system is to be  updated with all the  APAR fixes plus
     all the  AP and MP  updates.   If you  have an AP	system,  you use  the AP
     control  file to  specify that  the  fixes and  the  AP updates  are to  be
     included, but the MP updates are not.   If you are running a UP,  you use a
     control file that lists  neither the AP nor the MP  updates,  but does list
     the APARs.   Control files can get to be much more elaborate than this one,
     but even the  most elaborate ones are easy,   once you get the  hang of it.
     The  important thing  for you  to understand  now	is that  the purpose  of
     control files is to allow you to tailor your system.


									  PAGE 3

     B. VMFASM

     If you have followed this much of the  process,  then you are almost one of
     the initiated.    There are just  two more bits of  arcane lore for  you to
     master.   First,  there is  a tool called VMFASM which is	an EXEC which is
     used to invoke UPDATE to apply updates  and then to invoke the assembler to
     assemble the updated source.  VMFASM uses the MACS statement in the control
     file to decide which maclibs to GLOBAL before doing an assembly.  (You will
     note that the MP  maclib,	DMKSPM,  is concatenated ahead of  all the other
     maclibs here,   since this is the	MP control file.)   When  VMFASM invokes
     UPDATE,  UPDATE  applies the  updates and	then passes  back to  VMFASM the
     "update level identifier" (the "name field" in the control file record)  of
     the highest update file  that it found.   Assuming in this  case that there
     was a  DMKSCH UPDTMP someplace  on the  accessed disks,  UPDATE  would tell
     VMFASM "MP".   If there  had not been a DMKSCH UPDTMP and	there had been a
     DMKSCH UPDTAP,  then UPDATE would have  told VMFASM "AP".	 But since there
     was an UPDTMP,  UPDATE tells VMFASM "MP",	and then,  after the assembly is
     done,  VMFASM names the textfile (that's an  "object deck" if you just came
     in from OS) DMKSCH TXTMP, rather than DMKSCH TEXT.   That is, if the update
     level identifier  of the  highest-level update that  was found  is anything
     other than "TEXT", VMFASM gives the textfile a filetype formed by appending
     the  update   level  identifier   to  the	 letters  "TXT",    as	"TXTMP".
     Incidentally,  if no  updates are found,  then the  update level identifier
     from the MACS statement  is used to name the textfile;   that would make it
     "TEXT" in this case.


     C. VMFLOAD

     Second piece of arcane lore:   there is a tool called VMFLOAD which is used
     to build system nuclei.   VMFLOAD uses the control file, too,  but it reads
     the control file from the top down (skipping the MACS record).   The reason
     VMFLOAD works this way is that it is designed to pick up the version of the
     textfile that is tailored to your system, i.e., the one that was built with
     your control file.   For example, if VMFLOAD is building a CP nucleus using
     this DMKSPM control file,	 when it is time to find  a textfile for DMKSCH,
     VMFLOAD picks  up the first update  level identifier in this  control file,
     "MP",  and scans all the accessed disks  for a file named DMKSCH TXTMP;  if
     that fails, VMFLOAD picks up the next update level identifier and scans for
     DMKSCH TXTAP;  and if that fails, it scans for DMKSCH TEXT.   The result of
     using VMFLOAD  with this  MP control file,   then,  will be  to build  a CP
     nucleus which contains all the MP-specific CP code.   Most CP modules don't
     have AP/MP updates; in those cases, VMFLOAD will use the TEXT textfile, but
     in the other cases, it will use the TXTAP or TXTMP textfile.

     So,  there  you have  it;	that  is the  control mechanism  for VM  service
     installation.    We use  one control  file per  component and  one or  more
     auxiliary control files (auxfiles)  for every module that has service.   We
     do not use  CDS's or FMID's or ++LMODIN  statements or any of  that sort of
     thing.  Instead, it is all done with a control file and some auxfiles.


									  PAGE 4

     D. Recommended Control File

     I am  going to  assume the  use of the  DMKSPLCL control  file for  CP (and
     parallel control  files for  CMS and  the other  products)  throughout  the
     remainder of this presentation:

     FILE: DMKSPLCL CNTRL A1

      TEXT MACS DKLCLMAC DKPTFMAC DMKSP DMKMAC DMSSP CMSLIB OSMACRO
      LCL  AUXLCL
      PTFS AUXPTFS			(Do not make the identifier here "PTF"!)
      TEXT AUXSP12
      TEXT AUXSP11
      TEXT AUXSP

     DMKSPLCL CNTRL is designed to be used  to install CP corrective service and
     local modifications on a VM/SP Release 1 system running on a uni-processor.
     Note that	this control  file would  have to be  modified for  an AP  or MP
     system.  The MACS statement concatenates two new  maclibs ahead of the IBM-
     supplied maclibs.	 One of the new maclibs, DKLCLMAC, contains local macros
     and locally-modified macros.   The other,	DKPTFMAC,  contains macros which
     have been updated	by corrective service.	 This control  file assumes that
     all updates,  both local and IBM-supplied,   will be listed in auxfiles and
     that local  mods and  locally-applied service  will be  listed in	auxfiles
     named AUXLCL and  AUXPTFS.   These two auxfiles  are placed above	the IBM-
     supplied auxfiles in  the control file so that any  corrective service will
     be applied  on top of  the preventive service from  the PUTs and  any local
     mods will be applied on top of all the IBM code.  (A note of warning, don't
     use "PTF",   rather than "PTFS"  as an  update level identifier;	"PTF" is
     treated as a special case by both UPDATE and VMFLOAD.)

     The philosophical basis for this control  file and for the service minidisk
     layout that I will be recommending is:

		      +---------------------------------------+
		      | 	   RULE NUMBER ONE	      |
		      +---------------------------------------+
		      |  NEVER CHANGE ANYTHING IBM SENDS YOU  |
		      +---------------------------------------+

     Actually,	"rule" is not a strong enough  word here;  "dogma" would be more
     appropriate for the way most of the old users feel about this maxim.  We do
     not change the files IBM sends us for  the very simple reasons that we have
     burned ourselves when we changed their files and we have confused ourselves
     when we changed their files.   By setting up your maintenance procedures so
     that you never alter any file you	get from IBM,  you protect yourself from
     your own blunders and you force some accountability on yourself.  No matter
     how badly you mess things up,  you can  always get back to a known base and
     you can always see what IBM did and what  you did.   If an IBM file must be
     changed,  then copy it to your own  disk and change the copy.   The changed
     copy will be picked up in preference  to the original (because of your disk
     search order),   but you can  always get back to  the original and  you can
     always see what the differences are.


									  PAGE 5

			    II. Service Minidisk Layouts


     A. IBM Recommendation

     The sysgen manual tells you to use this minidisk layout for CP service:

	      +------------+
	 191  |  WORKAREA  |
	      +------------+

	      +--------------------------------------------------------+
	 294  |  CP AUXFILES AND UPDATES,			       |
	      |  LOCAL MODS AND THE RESULTANT TEXTFILES,	       |
	      |  LOCALLY-APPLIED SERVICE AND THE RESULTANT TEXTFILES   |
	      +--------------------------------------------------------+

	      +-----------------------------+
	 194  |  CP TEXTFILES AND MACLIBS   |
	      +-----------------------------+

	      +--------------------------------------+
	 394  |  CP ASSEMBLE, COPY, AND MACRO FILES  |
	      +--------------------------------------+

     There are	two things  that I  find really  bad about  this recommendation.
     First,  mixing local  mods and locally-applied service with  the files from
     the  base tape  and the  PUTs on  the 294	disk is  just bound  to lead  to
     problems.	 It means that	you are going to have to have  write access to a
     disk that is full of files that you should not be changing (or accidentally
     erasing).	 It is also going to make  things messy and confusing going from
     PUT to PUT.

		      +---------------------------------------+
		      | 	   RULE NUMBER TWO	      |
		      +---------------------------------------+
		      |  KEEP YOUR STUFF SEPARATE FROM IBM'S  |
		      +---------------------------------------+

     Understand  that in  VM,  corrective  service  is yours,	not IBM's.    By
     "corrective service",  I mean locally-applied  service,  fixes you get from
     INFO/DATA or over the phone or through  the mail from the Support Center or
     from a PUT that you haven't yet installed.  I would strongly recommend that
     even if you decide to stick with the IBM service disk layout, you modify it
     to the  extent of keeping	all local files on  your 191 disk,   rather than
     mixing local  files with the  files that came on  the release tape  and the
     PUTs.  (This, incidentally, is also what the SIPO/E manual suggests.)


									  PAGE 6

     My second	problem with  the standard IBM	service disk  layout is  that it
     violates:

			    +---------------------------+
			    |	  RULE NUMBER THREE	|
			    +---------------------------+
			    |  DON'T EXPECT IT TO WORK	|
			    +---------------------------+

     When you load a  service tape with VMSERV and default  to the standard disk
     layout, all the CP textfiles, loadlists, and maclibs go onto your 194 disk,
     replacing textfiles,  loadlists,  and maclibs from the base system and from
     earlier PUTs.  If the new PUT turns out to be a dog, you have to go through
     considerable contortions to back it all off.  The typical old user, though,
     loads all the files for the CP base  onto a single minidisk and never again
     gets a write link to that disk for  the duration of that release.	 When he
     gets a PUT,  he loads  all of the CP files from the PUT  onto a single disk
     and never	again gets a write  link to that  disk for the duration  of that
     PUT.

				     +--------+
				     |	 PUT  |
				     +--------+
					  |
				     +--------+
				     |	BASE  |
				     +--------+

     The next time he decides to install a  PUT,  he gets himself a new minidisk
     and loads all  the CP files from that  PUT onto that disk.    (Note that VM
     PUTs are cumulative,  so the VM user can skip over PUTs and doesn't combine
     the files from PUT1 and PUT5 in this example.)

			    +--------+	      +--------+
			    |  PUT1  |	      |  PUT5  |
			    +--------+	      +--------+
				    \	       /
				     +--------+
				     |	BASE  |
				     +--------+

     With this minidisk layout,  the old user  has the capability of building CP
     systems at either of the two PUT levels,	by accessing one or the other of
     his two PUT disks,   followed by his base disk.   For  that matter,  he can
     still build himself a base system,  if  he wants to,  by accessing just the
     base disk.    For him,   backing out  of a bad  PUT is  simply a  matter of
     changing his PROFILE EXEC to access the  old PUT disk,  rather than the new
     one, and then rebuilding his CP nucleus.


									  PAGE 7

     B. My Recommendation

     I recommend the use of a service disk layout similar to this one for SP CP:

	       +-------------+				  +---------------+
       191 A   | LOCAL FILES |			      291 | ALTERNATE 191 |
	       +-------------+				  +---------------+

	       +-------------------------------+	  +---------------+
       194 C/A | ALL CP FILES FROM CURRENT PUT |      294 | ALTERNATE 194 |
	       +-------------------------------+	  +---------------+

	       +---------------------------------+
       195 D/A | ALL CP FILES FROM 1.1 BASE -or- |
	       | ALL CP FILES FROM PUT 8105 and  |
	       | ALL CP FILES FROM 1.0 BASE	 |
	       +---------------------------------+

     This layout is typical of those used by most of the older VM installations,
     although many of  their layouts have a  few more bells and  whistles.   The
     important points  about this layout are  these:   (1)  files from	the base
     release tape  are never  contaminated by  service (except	when there  is a
     "level set");  (2)  files	from the PUT are never	contaminated by locally-
     applied service or local mods;  and (3)  in going from PUT to PUT,  the PUT
     disk and the local disk are flip-flopped  with their alternates for ease of
     backout.	Note that in  this layout EVERYTHING from the PUT  goes onto the
     PUT disk; this includes even new ASSEMBLE files.	The idea is to allow you
     always to be  able to tell for  certain where a piece  of questionable code
     came from and always to be able to back it out cleanly and reliably.

     You may, of course,  need to tailor this disk layout for your installation.
     Obviously,  the virtual addresses you choose are not important,  so long as
     you have  an EXEC which  can remember them and  access them in  the correct
     order.  You may need a few more layers in the stack of disks.  You may need
     to apply other vendor mods to your system, for example,  in which case your
     other vendor  service disk  might be at  virtual address  193 and	would be
     accessed above the IBM PUT disk,	as B/A in this example.   (Incidentally,
     Rules Number One, Number Two,  and Number Three apply to other vendors,  as
     well as to IBM.  Never change their stuff; keep it separate from your stuff
     and from IBM's;  and don't expect	it to work either.)   Installations with
     lots of  local mods  frequently choose to	configure a  disk for  base mods
     below their A-disk (and above the PUT disk, of course)  and to keep updates
     to their  mods on	the A-disk.    Other installations  keep locally-applied
     service on a separate disk from local  mods;  this disk is positioned above
     the PUT disk and below the local mods disk.

     Note that if you can't afford to keep all the source online,  you can still
     use this sort of minidisk layout.	 What you  should do in that case is get
     yourself a small minidisk for just the  base source files that you actually
     need to use.  Any time you need to apply a fix or a mod to a CP module, you
     should load  the ASSEMBLE file for  that module from the  distribution tape
     onto your small source minidisk.  (You would probably then want to leave it
     there for the rest  of that release.)   You should access	this base source
     minidisk after all the other service minidisks.


									  PAGE 8

     The stack	of disks  can get  quite deep,	 if you  have modified	mods and
     multiple other vendor mods disks.	The depth of the stack is not a problem,
     though.   The same  principles continue to apply.	 Each disk  in the stack
     contains a given class of updates and the auxfiles which list those updates
     and the  textfiles which came  with them.	 The  stack is ordered	with the
     files from the IBM release tape on the bottom,  then the files from the IBM
     service tapes,  then the other vendor disk (or disks),  and then your stuff
     on top.  But, any textfiles you create go on your disks.	You will need an
     EXEC which accesses your service disks in the correct order.   You may also
     find it convenient  to leave mode B vacant  so that when you have	to get a
     TDISK to do a big assembly,  you can access  the TDISK as A and your 191 as
     B/A and not have to change any of the other accesses.

     I had better explain about that 195 disk before going any further, since it
     represents an  aberration in VM service  procedures.   VM PUTs  have always
     been cumulative.	Last year, however,  IBM decided to do a "level set" for
     VM, so we got the first non-cumulative VM PUT.  PUT 8105 was cumulative; it
     contained all the service since the SP Release 1.0 base.	PUT 8106 was not
     cumulative,  but  subsequent PUTs are cumulative,	 in the sense  that they
     contain all the service from 8106 on.   To get current,  then,  we have two
     options.	One is to build a system composed  of the SP 1.0 base,	plus PUT
     8105 and a current  PUT.	The other option is to install	a current PUT on
     top of the SP 1.1 base (which contains the 1.0 base merged with the service
     through PUT 8105).   Note	that there is no point in  migrating from 1.0 to
     1.1 unless your 8105 tape has gotten lost somehow.

     In the  standard IBM service disk	layout,  the non-cumulative PUT  did not
     cause much of a perturbation, because everything is always glopped together
     there anyhow.   You install 1.0;  you overlay  8105 on the same disks;  and
     then you overlay a current PUT on	the same disks.   The non-cumulative PUT
     did perturb the old  users,  though,  because there was no  clean place for
     8105 in their existing layouts.   So, most old users who were already on SP
     when 1.1 came out opted for keeping  8105 on a separate disk accessed above
     the  base and  below the  current PUT.    They took  this approach  because
     overlaying 8105 on top of their base disk would have been unclean,  and the
     alternative of loading up	8105 to the new PUT disk  before loading up each
     new PUT would have been a pain.  I keep 8105 on a separate disk myself, but
     we are now  far enough beyond 8105 that  the dust has settled,   so I think
     that it is not unreasonable to advise you to combine 8105 with 1.0,  if you
     aren't using 1.1.

     However,  IBM is about to do another level  set for SP Release 1.	 That is
     why  there is  an entry  "TEXT AUXSP12"  in the  recommended control  file.
     Level sets make no sense in a system which has cumulative PUTs, but some of
     the people planning VM service don't understand  VM service,  so we have to
     learn to cope with such things.  The level set PUT will be 8209.	When you
     are ready to  install a service level  beyond 8209,  you will  have to glop
     8209 on top of the other files on the  195 minidisk or put it on a separate
     disk which you access above the 195 and below the 194.   Alternatively, you
     could start over by loading the SP 1.2 base onto your 195 disk.

     One other	comment about disk  195:  if you  use CMSBATCH,  then  don't use
     virtual address 195 for a service	minidisk.   CMSBATCH erases 195,  so you
     risk absent-mindedly invoking CMSBATCH from MAINT and destroying your 195.


									  PAGE 9

     C. Assumptions for this Presentation

     With this introduction,   I am ready to start through  the service process.
     For pedagogic purposes,   I am going to assume  that you are from	a new VM
     installation.  Since this is supposed to be a talk on service installation,
     I am going to assume that you have somehow got the SP base installed.   And
     because I want to show you how to remove a bad fix, I will also assume that
     when you loaded the  base,  you also installed a PUT  with VMSERV.   I will
     assume at the start that you have applied no additional fixes to the system
     and no local mods.  You have an A-disk at virtual address 191 on your MAINT
     userid which  contains only your DMKSPLCL	control file and the  source and
     textfiles for your VM "sysgen" modules,   DMKRIO,	DMKSYS,  and DMKSNT (and
     possibly DMKFCB).	You have your SP CP base and service on other minidisks,
     either in the modified IBM layout or in my recommended old-user layout:

		       OLD USER 			 MODIFIED IBM

	      +-------------------------+	    +-------------------+
      191 A   | WORKAREA, LOCAL MODS &	|   191 A   |			|
	      | LOCALLY-APPLIED SERVICE |	    |	     SAME	|
	      | (updates, auxfiles,	|	    |			|
	      | textfiles, maclibs)	|	    |			|
	      +-------------------------+	    +-------------------+

	      +-------------------------+	    +-------------------+
      194 C/A | ALL CP FILES FROM THE	|   294 B/A | CP AUXFILES AND	|
	      | CURRENT PUT		|	    | UPDATES		|
	      +-------------------------+	    +-------------------+

	      +-------------------------+	    +-------------------+
      195 D/A | ALL CP FILES FROM BASE	|   194 C/A | CP TEXT FILES AND |
	      | TAPE AND PUT 8105	|	    | MACLIBS		|
	      +-------------------------+	    +-------------------+

						    +-------------------+
					    394 D/A | CP ASSEMBLE, COPY |
						    | AND MACRO FILES	|
						    +-------------------+

     My specific examples will	be using the old user layout  but should be easy
     to translate to the modified IBM layout.	Again, if you can't keep all the
     source online,  then build a small base source minidisk (or use a TDISK for
     source)  and access it after all the  other service disks,  as 196 E/A,  in
     this case.   All my  examples will expect the service disks  to be accessed
     either as read-only extensions of the A-disk,   as shown here,  or as read-
     only  extension of  themselves,   unless some  other  access is  explicitly
     stated.   (You may prefer not to make  the service disks extensions of your
     A-disk,  because COPYFILE behaves better if you don't.)   You want never to
     have write access to  your PUT and base disks except  when you are actually
     loading tapes onto them.	There are two reasons for this; it will keep you
     from  altering files  that  shouldn't be  altered,  and  it  will keep  the
     assembler from  playing strange tricks on	you and writing files  where you
     don't expect them to be written.


									 PAGE 10

		      III. Installing Corrective Service for CP


     A. Making a CP Module Resident

     You get the system into production and you go along for a while and then CP
     crashes with a  PRG006 abend.   You call  the Support Center and  tell them
     what happened and they tell you it's  a known problem.   The APAR number is
     VM12989.	There is no fix yet, but they tell you that the circumvention is
     to make the CP module DMKVMC resident.  They assume that you know how to do
     that.

     Here is  how it is  done.	 CP modules  are either permanently  resident or
     pageable.	 This is  determined by their position in  the "loadlist".   The
     loadlist is an EXEC  file which simply lists all CP  nucleus modules in the
     order in which they are to be placed in the nucleus.   IBM supplies several
     different load lists; you choose the one you need for your configuration:

       APLOAD	EXEC	 AP/MP systems
       AVLOAD	EXEC	 AP/MP systems with a V=R area
       CPLOAD	EXEC	 UP systems
       CPLOADSM EXEC	 Small UP systems
       VRLOAD	EXEC	 UP systems with a V=R area

     All the CP loadlists look something like this:

	     +----------------------------+
	     |	&CONTROL OFF		  |
	     |	&1 &2 &3 DMKLD00E LOADER  |
	     |	&1 &2 &3 DMKPSA 	  |
	     |	  .			  |
	     |	  .			  |
	     |	(other resident modules)  |
	     |	  .			  |
	     |	  .			  |
	     |	&1 &2 &3 DMKCPE 	  |
	     |	*			  |
	     |	*    END OF THE RESIDENT  |
	     |	*    VM/370 NUCLEUS	  |
	     |	*			  |
	     |	&1 &2 &3 DMKTAP 	  |
	     |	&1 &2 &3 DMKVMD 	  |
	     |	&1 &2 &3 DMKCFC 	  |
	     |	  .			  |
	     |	  .			  |
	     |	&1 &2 &3 DMKVMC 	  |
	     |	  .			  |
	     |	  .			  |
	     |	&1 &2 &3 DMKURS 	  |
	     |	&1 &2 &3 DMKCKP 	  |
	     |	&1 &2 &3 LDT	DMKSAVNC  |
	     +----------------------------+


									 PAGE 11

     As you can see, a loadlist is just a list of filenames and,  in some cases,
     filetypes.   The  VM loader  (DMKLD00E LOADER)   is the  first item  in the
     loadlist; both its filename and its filetype are specified.   The loader is
     followed by DMKPSA  (page zero of the  CP nucleus)  and the  other resident
     modules,  ending with  DMKCPE ("CP end").	 After DMKCPE  come the pageable
     modules.	The filetypes  are not specified for the  system modules because
     the loader uses  your control file to  decide what the filetypes  should be
     (TEXT, TXTPTFS, TXTLCL, etc.).   The last two items in the loadlist must be
     DMKCKP  (the checkpoint  module)  and  a  file named  LDT DMKSAVNC,   which
     contains one record, which says "LDT DMKSAVNC".  This is a LOADER TERMINATE
     statement which  defines the entry  point to  be DMKSAVNC,  the  code which
     actually writes the new nucleus out to the sysres volume.

     To make a pageable module resident,  all you do is move it from being after
     DMKCPE in the loadlist to being before  DMKCPE.   You could do this by just
     editing the loadlist EXEC that you are using.   That is fast and easy,  but
     it is  also slovenly,   and it  will get  you into  trouble someday.    The
     loadlists should be maintained with UPDATE and auxfiles.  Here is how it is
     done.   First,  create an update file to sequence the loadlist EXEC you are
     planning to use.	(This  is made necessary by the fact  that IBM maintains
     the loadlists  with the editor,   rather than  with UPDATE,  so  it doesn't
     sequence them.   You will be glad to know that not using UPDATE to maintain
     the loadlists gets THEM into trouble, too.)   To sequence CPLOAD EXEC,  for
     example, you would build an update file called CPLOAD SEQUENCE:

     FILE: CPLOAD SEQUENCE A1

      ./  S

     Now,  say	you are using  the CPLOAD loadlist and	you want to  make DMKVMC
     resident as the  circumvention for APAR VM12989.	Create	an auxfile named
     CPLOAD AUXPTFS which lists that APAR and your SEQUENCE update:

     FILE: CPLOAD AUXPTFS A1

      *$*$*$*$*$*$*$*$*$*$*$*$*$*$*$ AUXPTFS $*$*$*$*$*$*$*$*$*$*$*$*$*$*$*$*
      S12989DK - mm/dd/yy - MAKE DMKVMC RESIDENT TO CIRCUMVENT PROBLEM IN APAR
      * 	 VM12989 - PRG006 ABEND - DUMP PRB00001 - PER SUPPORT CENTER
      SEQUENCE - mm/dd/yy - SEQUENCE LOADLIST EXEC BECAUSE IBM WON'T

     Then invoke XEDIT with the CTL option:

      xedit cpload exec c ( ctl dmksplcl

     XEDIT will first use  your CPLOAD AUXPTFS file to update  CPLOAD EXEC.   It
     will pick up the bottom-most update, CPLOAD SEQUENCE, and apply that,  thus
     sequencing CPLOAD EXEC.   Then  it will look for the next	update listed in
     the auxfile,  CPLOAD S12989DK.   Since that doesn't yet exist and since you
     specified the CTL option, XEDIT will assume that what you really want to do
     in this XEDIT session is to create the update CPLOAD S12989DK.  It will put
     you into an  XEDIT session with the updated (sequenced)   CPLOAD EXEC.   In
     XEDIT,  you should  move the loadlist entry  for DMKVMC to just  before the
     entry for DMKCPE and then enter the XEDIT command "file".	This will create
     an update file named CPLOAD S12989DK:


									 PAGE 12


     FILE: CPLOAD S12989DK A1

      ./ I 00089000	      $ 89100 100
      &1 &2 &3 DMKVMC
      ./ D 00181000	      $

     Assuming that IBM's CPLOAD EXEC is on your C-disk,  which is accessed read-
     only, you build a modified CPLOAD EXEC on your A-disk with this command:

      update cpload exec c dmksplcl ( ctl rep

     The CTL option simply tells UPDATE that DMKSPLCL is a control file,  rather
     than an update file.  Literally, the REP option tells UPDATE to replace the
     file being updated; in this case, however, since UPDATE will be putting the
     updated file on your A-disk, it will not replace the original on your read-
     only C-disk,  but,   because you said REP,   it will name the  updated file
     CPLOAD EXEC, rather than $CPLOAD EXEC, so you don't have to rename it.

     When you build your CP nucleus,  VMFLOAD  will use this modified version of
     CPLOAD EXEC from your A-disk,  rather than the original one on your C-disk,
     because it  will find the one  on the A-disk  first.   So,  you will  get a
     nucleus which has DMKVMC resident, rather than pageable, and you should get
     fewer PRG006 abends.

     There are a number of different approaches  to building and delivering a CP
     nucleus.	IBM provides you with two  different EXECs for doing it,  VMSERV
     and GENERATE.   Of the two, GENERATE has more function and flexibility.   I
     will discuss the various theories of  CP nucleus delivery later,  but right
     now, let's do it a very simple (and not very safe) way,  by hand.	 You are
     logged onto MAINT with  a virtual machine size of at  least 512K;	you have
     your service minidisks  accessed in one of the standard  ways;  and MAINT's
     directory entry includes a write link to your system residence volume, with
     the  virtual address  the	same  as the  real  address.	You issue  these
     commands:

      close pun
      close rdr
      spool pun to * class n
      spool rdr class n

      vmfload cpload dmksplcl	     (CPLOAD might not be the loadlist you need)
      SYSTEM LOAD DECK COMPLETE
      PUN FILE 4444  TO  MAINT	  COPY 001   NOHOLD

      order rdr 4444

      ipl 00c clear
      NUCLEUS LOADED ON VMR901 --- STARTING CYL/BLK=004, LAST CYL/BLK USED=005
      CP ENTERED; DISABLED WAIT PSW '00020000 00000012'

      spool prt to ipcs 	(or whatever you call your dump-reading machine)
      close prt
      PRT FILE 4448  TO  IPCS	  COPY 001   NOHOLD


									 PAGE 13


     You spool your virtual punch to your  virtual reader and you tidy things up
     by closing your reader  and your punch and spooling them  both class N (for
     "nucleus").   You invoke VMFLOAD,	which  steps through your loadlist EXEC,
     punching a textfile ("object deck")  for each of the items in the loadlist.
     Because you  have your  virtual punch spooled  to yourself,   these virtual
     decks will end up	in your virtual reader.   When VMFLOAD	is done punching
     all the files in the loadlist,  it puts out the message,  "SYSTEM LOAD DECK
     COMPLETE".   You make sure that this system  load deck is the first file in
     your virtual reader and then you IPL your virtual reader, 00C.  This brings
     in the loader, which was the first item in the loadlist.	The loader reads
     in the textfiles which were behind it in the reader file, "link-edits" them
     into a CP nucleus, and passes control to DMKSAVNC, which writes the nucleus
     onto the volume described by the SYSRES statement in the DMKSYS textfile.

     The use  of a  "standalone" loader  and all  this punching  and reading  of
     virtual cards may strike  you as a rather quaint way  of building a system,
     but it works well	and quickly,  and you now have a new  CP nucleus on your
     sysres volume.   While  the loader was building your nucleus,   it was also
     creating a load map,   which it sent to your virtual  printer.   Since your
     virtual printer was spooled to your IPCS virtual machine, IPCS will be able
     to read  the loadmap from	its virtual reader  onto a minidisk.	This map
     should be archived for use in reading CP dumps.


     B. Removing a Bad Fix

     At some point, this new nucleus gets IPLed and you run fine for a couple of
     days, but then you notice that performance seems to be degrading.	 You ask
     SMART (the VM Real Time Monitor) if anything is wrong, and SMART points out
     that your system is "extended" 120 pages.	 This means that the real memory
     being used for CP control blocks has  grown 120 pages beyond the allocation
     you specified in the SYSCOR parameter in DMKSYS.	In other words, 120 page
     frames that should  be being used for  user pages are not	available to the
     users.   Not surprisingly,  the INDICATE LOAD  command shows that your page
     steal rate is way up.   Looking at SMART's log,  you see that the number of
     extended pages  has been increasing steadily  over the past couple  of days
     since your last IPL.   So, you call the Support Center.   Again,  they tell
     you that you have encountered a known problem.  The APAR is VM14782.  There
     is no fix yet,   so you ask to be put on the  "interested parties" list for
     VM14782,  so  that you will  be notified as soon  as the fix  is available.
     (They will not  send you the fix,	but  they will send you  a letter saying
     that the fix exists.   You might think that it would be more useful if they
     sent you the fix rather than the letter,  but those letters are potentially
     valuable.	 A proposal has been made that the SHARE VM Group should award a
     prize each  year to  the person receiving	the most  APAR-closing letters.)
     But,  in  the meantime,  you  need to  do something about	your performance
     degradation.  You ask them about that and they tell you that the problem is
     caused by a "PE", a "PTF in Error", a bad fix.  They suggest that you might
     want to remove this PE, APAR VM12684,  from your system.	They assume that
     you know how to do that.


									 PAGE 14

     Here is how you remove that PE.   The first thing to do is to find out what
     modules and macros were hit by VM12684:

      listfile * s12684dk *

      DMKMSG   S12684DK C1
      R;

     It turns  out that no  macros were updated by  VM12684 and only  one module
     was, DMKMSG.   This is good,  because it means you don't have to change any
     maclibs.  But you do want to change DMKMSG.

     One point that needs  to be made clear for the benefit of	those of you who
     have recently  come into VM  from VS is that  VM fixes are  never installed
     permanently until the  developers incorporate them in the source  for a new
     release of the system.  That is, in the jargon, VM has "fixed-base", rather
     than "moving-base",  maintenance.	 Therefore,  when we speak of removing a
     bad fix, what we are really talking about is not applying the bad fix.   In
     VM,  you remove a bad fix by using VMFASM to update a temporary copy of the
     base source file (the  ASSEMBLE file)  with all the updates  except the bad
     one and then assemble the updated copy.   The updated source file is erased
     as soon as  the new textfile has  been created,  thus leaving  the original
     source file unaltered.

     This PE is in your system because at some point IBM listed it in an auxfile
     for DMKMSG.   So, to get this PE out of your system,  all you have to do is
     take its name out of that auxfile,  reassemble DMKMSG,  and rebuild your CP
     nucleus, incorporating your new textfile for DMKMSG.  If you are running an
     SP Release 1.0 system,   you will have an IBM auxfile  called DMKMSG AUXSP.
     If you have also got some PUT beyond 8105 installed,  you will also have an
     auxfile called DMKMSG AUXSP11.  If you are running SP Release 1.1, you will
     have only DMKMSG  AUXSP11,  because the APARs listed in  the AUXSP auxfiles
     were merged  into the  Release 1.1 base.	 (They did  this to  make things
     simple for us.)  Anyhow,  use LISTFILE to find whatever DMKMSG auxfiles you
     have and  look to see if  you can find  one which specifies the  update for
     VM12684, which is called S12684DK,  of course.   It turns out that it is in
     the AUXSP11 auxfile for DMKMSG:

     FILE: DMKMSG AUXSP11 C1

      S13491DK 108 UV05121 CORRECT HANDLING OF START FIELDS IN MESSAGES
      S12594DK 108 UV04922 IMBEDDED LINEND CHARACTER HANDLED INCONSISTENTLY
      S12684DK 107 UV04645 DMKDGD RCWTASK DECREMENTED AS A TIMER VALUE.


									 PAGE 15

     Since what you want to do is take this entry out of the auxfile,  you could
     just edit the auxfile,  but that  would violate Rule Number One.	Instead,
     copy DMKMSG AUXSP11  from your C-disk to  your A-disk and edit  the copy on
     your A-disk.   Don't  delete the S12684DK line;  "comment"  it out instead;
     that is,  put some asterisks in position  1,  so that UPDATE will treat the
     entry as a comment, rather than as an update name.   And don't just comment
     it out;  add a comment under the entry telling when you did it, why you did
     it,  who told you	to do it,  what the APAR number  is,  what your incident
     number is,  what your dump number is,  what the name is of any VMSHARE file
     in which the problem is discussed,  and anything else you can think of that
     might jog your memory later on.

			      +-----------------------+
			      |   RULE NUMBER FOUR    |
			      +-----------------------+
			      |  ALWAYS LEAVE TRACKS  |
			      +-----------------------+

     A nice  little touch is to  add a "title" line  at the top of  the modified
     auxfile,  which will come out in your  assembly listing and make it clearer
     what is going on.

     FILE: DMKMSG AUXSP11 A1

      *$*$*$*$*$*$*$*$*$*$*$*$* MODIFIED AUXSP11 $*$*$*$*$*$*$*$*$*$*$*$*$*$*
      S13491DK 108 UV05121 CORRECT HANDLING OF START FIELDS IN MESSAGES
      S12594DK 108 UV04922 IMBEDDED LINEND CHARACTER HANDLED INCONSISTENTLY
      *** S12684DK 107 UV04645 DMKDGD RCWTASK DECREMENTED AS A TIMER VALUE.
      *** S12684DK REMOVED BECAUSE OF CORE CANCER - 12/01/81 - VM14782 - MWV
      ***	   PRB00002 - SEE VMSHARE 'PROB 1SP07'

     You will note  that I didn't hesitate to  tell you to remove  the PE,  even
     though the auxfile lists two other fixes which  are to be applied on top of
     this fix.	 It may be that the fix you're removing is a "pre-requisite" for
     one of those two  fixes,  in which case,  you've got  a problem.	However,
     experience has shown me that when I remove  a fix this way,  if I don't get
     sequence  error messages  from UPDATE  or	syntax error  messages from  the
     assembler,   then it  is  very unlikely  that  the fix  I'm  removing is  a
     functional  pre-requisite	for the  other	fixes  listed  above it  in  the
     auxfile.  This is one of the joys of  maintaining a system that has source-
     level service.  Some IBMers will advise you instead to remove all the fixes
     above the PE in  the auxfile,  but then you run the risk  of removing a fix
     you really need.	 There is,  of course,	 an exposure which ever  way you
     choose.  My advice, though, is to leave the other updates in the auxfile as
     long as  neither UPDATE nor ASSEMBLE  complains,  unless you  actually have
     some reason to believe that the PE really is a pre-requisite for them.   In
     either case, whenever you remove an APAR update from a module or macro,  be
     certain that you remove the corresponding	updates from all the modules and
     macros hit by the APAR.  Leaving half a fix in your system is a sure way to
     get into trouble.


									 PAGE 16

     You now have two files  named DMKMSG AUXSP11,  the original one  on your C-
     disk and the modified one on your A-disk.	 The one you want to use is,  of
     course, the one on your A-disk.  This will happen automatically, because of
     your disk search order.  To reassemble DMKMSG without incorporating the PE,
     you use VMFASM:

      vmfasm dmkmsg dmksplcl

      UPDATING 'DMKMSG ASSEMBLE D1'
      APPLYING 'DMKMSG S11690DK D1'
      APPLYING 'DMKMSG S11792DK D1'
      APPLYING 'DMKMSG S09531DK D1'
      APPLYING 'DMKMSG S13028DK D1'
      APPLYING 'DMKMSG S12594DK C1'
      APPLYING 'DMKMSG S13491DK C1'
      FILE 'DKLCLMAC MACLIB' NOT FOUND.
      FILE 'DKPTFMAC MACLIB' NOT FOUND.
      ASMBLING DMKMSG
      ASSEMBLER (XF) DONE
      NO STATEMENTS FLAGGED IN THIS ASSEMBLY
      DMKMSG TEXT CREATED
      R;

     This VMFASM command  causes a copy of  DMKMSG ASSEMBLE D1 (the  base source
     file)  to be updated with the four fixes  listed in DMKMSG AUXSP D1 and the
     two remaining  fixes listed in  DMKMSG AUXSP11  A1.   Note that  the update
     DMKMSG S12684DK doesn't get applied.   Fixes listed in DMKMSG AUXPTFS * and
     DMKMSG AUXLCL  * would also be  applied,  if those auxfiles  existed.   The
     updated file is assembled,  and an object deck named DMKMSG TEXT is written
     onto your	A-disk.   (The	updated ASSEMBLE  file is  erased before  VMFASM
     exits.)   Because of  your disk search order,   when you build your  new CP
     nucleus,  the DMKMSG TEXT from your A-disk  will get used,  rather than the
     bad DMKMSG TEXT that IBM sent you, which is on your C-disk.

     If you type or edit that DMKMSG textfile,	by the way,  you will see one of
     the really  sexy features of  VM service.	  The beginning of  this "object
     deck" lists precisely what fixes have  been applied and even includes those
     comments that  you put  into the auxfile.	  The point  here is  that every
     textfile in a VM system is  completely self-identifying.	To find out what
     fixes a given textfile contains, you need only type it:


									 PAGE 17

     FILE: DMKMSG TEXT A1

      S11690DK 101 UV02593 MSDVHDIR206E SMSG RC=01 AFTER APPLYING VM09994
      * 	DMKMSG	 S11690DK D1 MNT195  10/21/80	14:05:00
      S11792DK 101 UV02626 CANNOT FORCE USER OFF WHEN IN ECHO COMMAND
      * 	DMKMSG	 S11792DK D1 MNT195  10/21/80	14:05:00
      S09531DK 101 UV02701 ABENDLOK001 AFTER SWTCHVM MACRO FOR FRETTED VMBLOK
      * 	DMKMSG	 S09531DK D1 MNT195  10/24/80	15:33:00
      S13028DK 105 UV04184 VM10995 CREATES FUTURE EXPOSURE
      * 	DMKMSG	 S13028DK D1 MNT195  03/13/81	09:25:00
      *$*$*$*$*$*$*$*$*$*$*$*$* MODIFIED AUXSP11 $*$*$*$*$*$*$*$*$*$*$*$*$*$*
      *** S12684DK 107 UV04645 DMKDGD RCWTASK DECREMENTED AS A TIMER VALUE.
      *** S12684DK REMOVED BECAUSE OF CORE CANCER - 12/01/81 - VM14782 - MWV
      ***	   PRB00002 - SEE VMSHARE 'PROB 1SP07'
      S12594DK 108 UV04922 IMBEDDED LINEND CHARACTER HANDLED INCONSISTENTLY
      * 	DMKMSG	 S12594DK C1 MNT194  08/25/81	07:18:01
      S13491DK 108 UV05121 CORRECT HANDLING OF START FIELDS IN MESSAGES
      * 	DMKMSG	 S13491DK C1 MNT194  08/25/81	07:18:01
      * 	DMKSP	 MACLIB   A1 MNT194   8/31/81	10:45:01
      * 	DMKMAC	 MACLIB   A1 MNT194   7/14/81	10:46:59
      * 	DMSSP	 MACLIB   S2 CMS190   6/10/81	18:45:00
      * 	CMSLIB	 MACLIB   S2 CMS190   2/07/81	12:19:00
      * 	OSMACRO  MACLIB   S2 CMS190   3/18/81	13:32:56
      * 	DMKMSG	 ASSEMBLE A1 MNT195   7/31/80	19:45:00
       ESD	      DMKMSG	      DMKCVTDB	      DMKCVTBD
	.
	.
	.
       END			      15741SC103 020182003


     When the  loader loads  such  a  textfile,  it  strips  off  all this  non-
     executable commentary and puts it into the loadmap.

     I should point out that there is  another workable mechanism for removing a
     bad fix, other than commenting it out in a copy of IBM's auxfile.	 You can
     accomplish the  same thing by  building a dummy  update on your  A-disk and
     giving it the  same name as the bad  update you wish to  remove.	When you
     invoke VMFASM,  your dummy update will get picked up in preference to IBM's
     bad update, which is on a disk later in the search order.	For example, you
     could have removed VM12684 by creating  the dummy update DMKMSG S12684DK on
     your A-disk and reassembling DMKMSG:

     FILE: DMKMSG S12684DK A1

      ./ * DUMMY UPDATE TO REMOVE VM12684 BECAUSE OF CORE CANCER
      ./ * mm/dd/yy - VM14782 - PRB00002 - SEE VMSHARE 'PROB 1SP07'

     The only argument against	doing it this way is that you  don't end up with
     your comments about removing the fix in  the textfile and the loadmap.   If
     you look carefully at the textfile and the loadmap,  however,  you will see
     that the update came from your A-disk, rather than from one of IBM's disks.
     It is a matter of taste.  The important point is to leave tracks.


									 PAGE 18

     C. Applying a Fix

     You build and install another new CP nucleus, which now has DMKVMC resident
     AND has VM12684 removed.  Things go along smoothly for a few hours and then
     the director of your computer center comes looking for you to tell you that
     his terminal is hung up.	He can't do anything with it.	Thinking all you
     need to do is show him the CLEAR key, you go take a look, but you find that
     you can't do anything with it either.  So, you log onto a privileged userid
     and issue a FORCE command.   The system says it forced him, but he is still
     logged on, and his terminal is still hung up.  You have just met your first
     "hunguser",  the  first of  many.	 This particular  hunguser is  getting a
     trifle upset about  the report he is  trying to generate,	so  you tell the
     operators to take the system down with a dump.

     You try  looking at the  dump,  but DUMPSCAN will	not display most  of the
     things you want to look at; it keeps telling you that there is no page zero
     in the dump,  and,  of course,  all the pointers it needs are in page zero.
     After pounding your head  against the wall for a while,   you discover that
     the reason there is no page zero in the  dump is that someone had put it on
     the free list,  and pages on the free list don't get dumped.   You call the
     Support Center and open two incidents, one for page zero not getting dumped
     and one for  the hunguser problem.   Neither  of these seems to  be a known
     problem,  so you are asked to mail in  the dump and your nucleus loadmap on
     tape, which you do.   You wait a while and get three more hungusers, so you
     call back and raise the severity of the problem.  Then, despite your having
     sent them an almost useless dump,	one  of the guys at Second Level figures
     out that  your hunguser  problem is a  known problem and  is fixed  by APAR
     VM13318.	He calls you  and reads you updates to the  IOBLOKS copy section
     and DMKIOS.  He assumes you know what to do from there.

     Here is what you  do.   First,  you have to key in the  two update files he
     read you.	 That  is,  you have to key  in the two update	files unless you
     already have them in machine-readable on a  PUT which you have received but
     have not yet installed.   To find out whether the fix is on the latest PUT,
     you can either look  at the SP "Memo to Users" from that  PUT,  if you have
     already printed it off,   or you can simply mount the tape  and try to load
     the fix you need:

      vmfplc2 load * s13318dk ( eot

     Let's assume that you don't luck out;  it's  not on the PUT and it's not in
     INFO/DATA either,	 so you have  to key it in.    The two files  you create
     should be named IOBLOKS S13318DK and  DMKIOS S13318DK.   The updates should
     be marked	with an "update  identifier" field  somewhere on the  right hand
     side.   I find that  it is useful to make this field NOT  look just like it
     will when IBM sends the fix out on a PUT, so I always know at a glance that
     this is a fix that I keyed in and, thus, that it may very well be different
     from the final version of the fix.    I just put the five-digit APAR number
     in column 67:


									 PAGE 19

     FILE: IOBLOKS S13318DK A1

      ./ R 00400000 00400000 $ 00400000 1000				13318
      * 	     |	     IOBQDTO	     | I*9 |  IOBRSV4	     |	13318
      ./ R 00790000 00790000 $ 00790000 1000				13318
      IOBERCNT DS    1X        I*9  ERROR RETRY COUNT			13318
      IOBRSV4  DS    3X 	    RESERVED FOR FUTURE USE		13318

     FILE: DMKIOS S13318DK A1

      ./ R 15700000 15710000 $ 15700000 200				13318
	       BZ    IOSCCH	    NO LOGOUT PEND - CALL DMKCCH	13318
	       SLR   R1,R1	    CLEAR WORK REG			13318
	       IC    R1,IOBERCNT    LOGOUT PEND / CCC RETRY COUNT	13318
	       C     R1,F10	    RETRY COUNT EXCEED 10		13318
	       BH    IOSFATAL	    YES, REFLECT TO USER		13318
	       LA    R1,1(,R1)	    INCREMENT RETRY COUNT		13318
	       STC   R1,IOBERCNT    STORE IN IOBLOK			13318
	       B     IOSQBSY	    QUEUE OFF THE CHANNEL		13318
      IOSFATAL NI    RCHSTAT,255-RCHBUSY TURN OFF CHANNEL BUSY		13318
	       NI    RCUSTAT,255-RCUBUSY TURN OFF CONTROL UNIT BUSY	13318
	       NI    RDEVSTA4,255-RDEVBUZY DEVICE NO LONGER BUSY	13318
	       XC    RDEVAIOB,RDEVAIOB CLEAR ACTIVE IOBLOK		13318
	       XC    RDEVPROC,RDEVPROC CLEAR PROC ADDRESS		13318
	       OI    IOBSTAT,IOBFATAL FATAL I/O IF EXCEED 10 RETRIES	13318
	       CALL  DMKSTKIO	       STACK THE IOBLOK 		13318
	       B     IOSTEXIT	      EXIT TO CALLER			13318
      IOSCCH   NI    RDEVSTA4,255-RDEVBZCH RESET DEVICE BUSY ON CHAN	13318

     Next you need to create AUXPTFS auxfiles  for IOBLOKS and DMKIOS.	 Here is
     what they should look like:

     FILE: IOBLOKS AUXPTFS A1

      *$*$*$*$*$*$*$*$*$*$*$*$*$*$*$ AUXPTFS $*$*$*$*$*$*$*$*$*$*$*$*$*$*$*$*
      S13318DK - 10/06/81 - FROM G.B., LEVEL II, FOR PRB00003 - HUNGUSERS

     FILE: DMKIOS AUXPTFS A1

      *$*$*$*$*$*$*$*$*$*$*$*$*$*$*$ AUXPTFS $*$*$*$*$*$*$*$*$*$*$*$*$*$*$*$*
      S13318DK - 10/06/81 - FROM G.B., LEVEL II, FOR PRB00003 - HUNGUSERS

     This is the  first time you have had  to update a system macro,   so we had
     better talk some  about maclibs.	IBM provides two macro	libraries for SP
     CP,  DMKMAC MACLIB  and DMKSP MACLIB.   DMKMAC contains the  macro and copy
     sections which  are not "versioned" by  SP.   DMKSP contains the  macro and
     copy sections  which are "versioned" by  SP.   Nobody knows why  IBM didn't
     merge the macro libraries when they merged the source, but they didn't,  so
     you  need to  be  conscious  of the  fact	that  there are  two  libraries.
     (Similarly,  there are two CMS maclibs,  CMSLIB and DMSSP.)   There are two
     schools of thought  concerning the best way to apply  corrective service to
     system macros.   One acceptable approach is to  copy the IBM maclib to your
     A-disk and  replace the macro in  that copy.   Unfortunately,   IBM doesn't
     provide a nice primitive for doing that, though it would be easy enough for


									 PAGE 20

     you to write your own EXEC for this,   using VMFASM as a guide.   What your
     EXEC should do is	update the macro using UPDATE and  the specified control
     file,   replace the  macro in  the specified  maclib using  the MACLIB  REP
     command,  append the UPDATES file to  the maclib using COPYFILE,  and erase
     the updated macro, the UPDLOG file,  and the UPDATES file.   If you are not
     going to be  applying much corrective service  and you are not  going to be
     modifying the system much, then this would be the soundest approach for you
     to use in applying corrective service to macros.

     The second  approach is  to build	a separate  maclib for	macros and  copy
     sections which have corrective service applied to them.   A reasonable name
     might be PTFMAC MACLIB, but you may also want a service maclib for CMS,  so
     I would suggest DKPTFMAC and DSPTFMAC and parallel libraries for macros and
     copy  sections  which are	updated  by  local modifications  called,   say,
     DKLCLMAC and  DSLCLMAC.   Don't name your	own maclib NEWMAC;   VMFMAC uses
     NEWMAC MACLIB as  a temporary file.   Note  that if you are  going to build
     your own maclibs,	 you must include their  names in the MACS  statement in
     your control file,  as I did in the recommended control file.   Note,  too,
     that you can't list more than eight maclibs in a control file, because that
     is all that the GLOBAL MACLIB command can handle.

     You build a maclib  by creating an EXEC file whose filename  is the same as
     the filename of the maclib and whose contents  are a list of the macros and
     copy sections that you want included in the maclib.  You can take a look at
     DMKMAC EXEC to see how this is done.   In this case, since we have only one
     item to go into DKPTFMAC MACLIB, the maclib EXEC looks like this:

     FILE: DKPTFMAC EXEC

      &1 &2 IOBLOKS							13318

     Once you have  this EXEC built,  you  can build the maclib  with the VMFMAC
     command:

      vmfmac dkptfmac dmksplcl

      UPDATING 'IOBLOKS COPY D1'
      APPLYING 'IOBLOKS S11854DK D1'
      APPLYING 'IOBLOKS S12470DK D1'
      APPLYING 'IOBLOKS S12635DK C1'
      APPLYING 'IOBLOKS S13318DK A1'
      IOBLOKS COPY ADDED.
      DKPTFMAC COPY ADDED.

     VMFMAC is very similar to VMFASM and VMFLOAD.   It steps through the maclib
     EXEC,  putting  each of  the listed macros  or copy  sections into  the new
     maclib, after updating it as specified by the control file.


									 PAGE 21

     One drawback to  creating these additional maclibs,   rather than modifying
     the ones  you get	from IBM,  is  that some of  the installation  EXECs for
     program products know the names of the standard maclibs and will have to be
     changed to know about your new maclibs as well.   I find, however, that the
     program product installation  EXECs cannot be trusted to  have the standard
     maclib names right  anyhow,  so either way  you are going to  have to check
     them and possibly fix them up.

     Once you have your  PTF maclib built,  you are ready  to reassemble DMKIOS.
     You will  be using our  DMKSPLCL control file,   so VMFASM will  GLOBAL the
     maclibs  listed in  the  MACS  record in  that  control  file.   This  will
     concatenate DMKSP MACLIB and DMKMAC MACLIB  after your DKPTFMAC MACLIB,  so
     the assembler will use the updated version of IOBLOKS.

      vmfasm dmkios dmksplcl

      UPDATING 'DMKIOS ASSEMBLE D1'
      APPLYING 'DMKIOS S11399DK D1'
      APPLYING 'DMKIOS S11412DK D1'
      APPLYING 'DMKIOS S11946DK D1'
      APPLYING 'DMKIOS S11854DK D1'
      APPLYING 'DMKIOS S12022DK D1'
      APPLYING 'DMKIOS S12293DK D1'
      APPLYING 'DMKIOS S12174DK D1'
      APPLYING 'DMKIOS S12470DK D1'
      APPLYING 'DMKIOS S12127DK D1'
      APPLYING 'DMKIOS S12629DK D1'
      APPLYING 'DMKIOS S12947DK D1'
      APPLYING 'DMKIOS S12887DK D1'
      APPLYING 'DMKIOS S12984DK D1'
      APPLYING 'DMKIOS S13061DK D1'
      APPLYING 'DMKIOS S13169DK D1'
      APPLYING 'DMKIOS S13206DK D1'
      APPLYING 'DMKIOS S12963DK D1'
      APPLYING 'DMKIOS S13286DK C1'
      APPLYING 'DMKIOS S12941DK C1'
      APPLYING 'DMKIOS S13443DK C1'
      APPLYING 'DMKIOS S13318DK A1'
      FILE 'DKLCLMAC MACLIB' NOT FOUND.
      ASMBLING DMKIOS

      ASSEMBLER (XF) DONE
      NO STATEMENTS FLAGGED IN THIS ASSEMBLY
      FILE 'DMKIOS TEXT A1' NOT FOUND.
      DMKIOS TXTPTFS CREATED
      R;

     VMFASM will write the new textfile onto your A-disk and will name it DMKIOS
     TXTPTFS (because the  DMKSPLCL control file specified "PTFS"  as the update
     level identifier for  the highest-level update applied to	DMKIOS,  the one
     listed in your DMKIOS AUXPTFS auxfile.)  When you build your new CP nucleus
     later,  you will again use the DMKSPLCL  control file,  which will tell the
     loader to pick up a TXTPTFS file in preference to a TEXT file.


									 PAGE 22

     I should warn you that VMFASM quietly erases any TEXT textfile you may have
     on  your A-disk  for the  module you  are	assembling,  even  when the  new
     textfile name is going to be TXTPTFS or TXTLCL or TXTTST or whatever.  That
     is what that "DMKIOS TEXT A1 NOT FOUND" message is about;	it couldn't find
     a TEXT textfile to  erase this time.   This is done  to protect naive users
     from  leaving  around  obsolete textfiles	which  they  might  accidentally
     incorporate into a nucleus.  But, it can be a really sneaky problem for the
     user who is sophisticated enough to want to have more than one version of a
     textfile.	 Once you understand what's going  on with control files,  etc.,
     you should fix VMFASM  not to do this to you.*   Another danger from VMFASM
     is that it uses a file named 'modulename cntrlname' as a work file,  so if,
     in this case, you had a file named DMKIOS DMKSPLCL, it would be erased.

     You have been worrying about that dump without page zero in it, so you call
     the Support Center.  They haven't done anything about it yet, so you take a
     look at the code yourself.   You see that it would be trivial to fix DMKDMP
     always to dump page zero, so you produce a temporary local fix to use until
     you hear from IBM.  Because you are expecting this local fix to be replaced
     by an official fix from IBM, you list the update in an AUXPTFS file, rather
     than in  an AUXLCL  file.	 You name  it with  its five-digit  APAR number,
     "nnnnn",  if  it has been	assigned one.	Some  people make a  practice of
     naming local fixes in the form "LnnnnnDK", rather than "SnnnnnDK",  to make
     it obvious that it is a local fix.  I find it easier myself to use the name
     the fix will have	when it comes from IBM,  but I	always put comments into
     both the fix and the auxfile indicating  that this is strictly a local fix.
     If, as in this case,  you have not been given an APAR number yet,	use your
     incident number to name the temporary fix:

     FILE: DMKDMP X0328 A1

      ./ * TEMPORARY LOCAL FIX FOR PROBLEM OF PAGE ZERO NOT BEING	X0328
      ./ * DUMPED WHEN IT IS ON THE FREELIST				X0328
      ./ *								X0328
      ./  R  07110000 $ 07110100 100					X0328
	       LTR   R7,R3		 GET THIS PAGE NUMBER.		X0328
	       BZ    NXTPAG1		 WE ALWAYS WANT PAGE 0 DUMPED.	X0328

     FILE: DMKDMP AUXPTFS A1

      *$*$*$*$*$*$*$*$*$*$*$*$*$*$*$ AUXPTFS $*$*$*$*$*$*$*$*$*$*$*$*$*$*$*$*
      X0328 - 06/23/81 - TEMPORARY LOCAL FIX (DUMP PAGE 0 REGARDLESS) - MWV

     You reassemble DMKDMP with  VMFASM and you have the file  DMKDMP TXTPTFS on
     your A-disk ready	to be incorporated into your new  nucleus.   You rebuild
     your CP nucleus,  using VMFLOAD and the DMKSPLCL control file,  and you now
     have a  CP nucleus  which differs from  the original  one by  having DMKVMC
     resident, VM14782 removed, VM13318 applied, and your local fix for incident
     X0328 applied.

				--------------------

     * The fix is to comment out two lines from the end of the EXEC:
	  &IF &TEXT EQ TEXT &SKIP 1
	  ERASE &NAME TEXT A1


									 PAGE 23

		      IV. Installing Preventive Service for CP


     Things go along more smoothly now,  but you have decided that you have been
     encountering too many known problems.   Corrective service is getting to be
     a drag, so you decide to do some preventive service instead,  by installing
     that VM PUT that came in the mail last week.


     A. Ordering the PUT Bucket

     The first thing you should do is phone the Support Center and ask Level One
     to send you a copy of the "error bucket" for this PUT.  If you've just come
     into VM  from VS,	 you will  be dismayed to  learn that  you can't  get VM
     buckets through DATALINK;	in  fact,  there is no such thing  as a machine-
     readable bucket for VM.   Let me add that the VM old-timers do not consider
     this a  desirable state of affairs,   either.   The buckets  generally take
     about a week to arrive, so you need to plan ahead.


     B. The Paper Documentation

     When you get the PUT in the mail,	it is supposed to have a paper memo with
     it.  Find this and read it.  Sometimes it tells you about important changes
     either to the system or to the service installation process.


     C. New Service Minidisks

     You need  a new A-disk  for MAINT.   If you  have a 291  disk to use  as an
     alternate A-disk, then rename it to 191 and rename your old 191 to 291.  If
     you are using the old-user service disk philosophy, you will also use a new
     disk for the contents of the new PUT.  Just flip-flop the 194 and 294 disks
     from the recommended configuration.   If  you are using the IBM-recommended
     service disk layout, you will be loading the new service on top of the base
     and the earlier service, so you will need only the new A-disk.


     D. The PUT Memoranda

     For each product on the PUT,  there is a "Memo to Users" file.   You should
     always read the memoranda before you apply the service.   They may make for
     rather boring reading, but they tell you about changes to the product which
     may impact  you,  so time spent  reading them is generally  rewarded.   The
     memoranda are on the  second file of the tape and have  a filetype of MEMO.
     These commands will load all the memoranda and print the one for SP:

      attach cuu to maint as 181
      tape fsf
      vmfplc2 load * memo
      print 5664167 memo ( cc

     Of course,  you may  prefer simply to view the memoranda  on your terminal,
     rather than printing them.


									 PAGE 24

     E. "Mapping" the PUT

     The PUT  is in  the form of  one or two  physical tapes  containing several
     logical service tapes,  one for each PUT-supported product in your customer
     profile.	The first thing  you need to do is determine  the order of these
     logical tapes on the physical tape.   Even  VMSERV has to "map" the tape so
     that it knows the order of the  logical tapes.   There is an external label
     on the tape which will tell you what is where on the tape, but,  of course,
     that's on the tape and the tape is mounted on a tape drive.  If you want to
     load the service yourself, you can copy the external label before you mount
     the tape or you can map the tape yourself	or you can have VMSERV do it for
     you.  You can map the tape yourself with these commands:

      tape rewind
      vmfplc2 scan ( eot disk date

     This creates a  disk file called TAPE  MAP which lists the  contents of the
     tape.   This file is not very concise,  however,  so you might find the map
     that VMSERV builds to be more useful.   To map the tape with VMSERV, you do
     this:

      attach cuu to maint as 181
      vmfplc2 load		    (to load the VMSERV EXEC onto your 191 disk)
      access 191 c
      vmserv

     Strange as it seems,   you absolutely must run the VMSERV	EXEC from a disk
     that is accessed as mode C.   This disk  must NOT have a virtual address of
     194.   VMSERV will insist upon putting some  little files on your 194 disk,
     so if you	don't want your 194 written  on,  detach it and get  a 194 TDISK
     before invoking VMSERV.	VMSERV will also print PUT  DOCUMENT (the VMSERV
     documentation)  and all the memoranda,  if you reply "yes" when it asks you
     whether you want this done.   (Unfortunately,  VMSERV insists upon printing
     the  documentation in  pieces,  rather  than  as one  listing,  unless  you
     remember to  spool your printer continuous  before invoking it.)	 The map
     that VMSERV builds for you on your 191 looks something like this:


									 PAGE 25

     FILE: SERVICE DISKMAP A1

	+------------------------------------------------------------------+
	|  * *								   |
	|  * * VM SYSTEM PUT 8108					   |
	|  * * TAPE LAYOUT AND SERVICE STATUS				   |
	|  * *								   |
	|  * *								   |
	|  * *	   RELATIVE	PROGRAM  NUMBER   FIRST  SERVICE    COREQ  |
	|  * *	  TAPE - POS	NUMBER	 FILES	  FILE	   LEVEL    FLAG   |
	|  * *								   |
	|	   01	  01	5749010    37	   003	  062338    ---    |
	|	   01	  02	5664167    22	   040	  010923    ---    |
	|	   01	  03	5748XXC    04	   062	  010405    ---    |
	|	   01	  04	5748XXB    04	   066	  010505    ---    |
	|	   01	  05	5748RC1    07	   070	  010408    ---    |
	|	   01	  06	5748AP1    02	   077	  030203    ---    |
	|	   01	  07	5748FO3    02	   079	  010103    ---    |
	|	   01	  08	5734LM4    02	   081	  C40203    COREQ  |
	|	   01	  09	5734LM5    02	   083	  C40203    COREQ  |
	|	   01	  10	5734PL1    02	   085	  C40203    COREQ  |
	|  * *								   |
	|  * * END OF RELATIVE TAPE 01					   |
	|  * *								   |
	+------------------------------------------------------------------+

     This can be  very useful,	especially if you've memorized	all your product
     numbers.  I haven't done so, but I know that the logical tape with the most
     files in it is vanilla VM Release 6, that the other one with a lot of files
     must be SP, and that the one with the letters "RC" in its product number is
     PASSTHRU.	 The  other products,  whatever they  may be,  are  installed by
     someone else,  so	I don't have to worry  about the fact that  I don't know
     what they are.

     Some of my purist friends will object, but to show how open-minded I am,  I
     am going to recommend that you use VMSERV	to map the tape and to print the
     documentation.


									 PAGE 26

     F. Loading the Service from the PUT

     Now you  are ready to  load the service  for SP CP.    If you look  at your
     VMFPLC2 TAPE  MAP or at  VMSERV's SERVICE DISKMAP,   you will see	that the
     service for SP (5664-167) is in a logical tape containing twenty-two files,
     beginning (in my example) with file 40 of the PUT.   The number and content
     of these files changes from time to time,	 but if you examine the SP "Memo
     to Users" or  your VMFPLC2 TAPE MAP,  you	will see that the  layout of the
     files on this logical tape is something like this:

       1. SP installation EXEC		    10. CMS auxfiles
					    11. CMS updates
       2. CP auxfiles			    12. CMS macro auxfiles
       3. CP updates (PTFs)		    13. CMS macro updates
       4. CP macro auxfiles		    14. New CMS source
       5. CP macro updates		    15. CMS maclibs
       6. New CP source 		    16. CMS textfiles
       7. CP maclibs			    17. Standalone IPL decks
       8. CP textfiles			    18. LOADER and service EXECs
       9. CP loadlist EXECs		    19. CMS module files
					    20. HELP files and XEDIT EXECs
					    21. EREP txtlibs
					    22. IOCP

     The CP  service is  going to go  on your  194 disk,  if  you are  using our
     example disk layout,  so make sure that you are using your real 194 and not
     that TDISK.  The commands to load the CP service are simply:

      access 194 c
      tape rewind
      tape fsf 2		   <== skip PUT junk
      tape fsf 37		   <== skip VM Release 6 files
      tape fsf 1		   <== skip SP installation EXEC
      vmfplc2 load * * c ( eof 8

     In other words,  all  eight files of CP service from  the PUT (logical tape
     files 2 through 9) go onto one minidisk at address 194.

     If you are using the IBM disk layout, the same process is:

      access 194 a
      access 294 b
      access 394 c
      tape rewind
      tape fsf 40
      vmfplc2 load * * b ( eof 4
      vmfplc2 load * * c
      vmfplc2 load * * a ( eof 3

     Or,  of course,  in either case,  you could use VMSERV to load the service.
     It is usually fewer keystrokes to do it "by hand", however.

     That's all you have to do.   The service is loaded.   At this point,  again
     access your service disks read-only to avoid inadvertently changing them.


									 PAGE 27

     G. Carrying Forward Old Corrective Service

     The next  step in installing  a PUT is  to check  whether you have  any old
     corrective service which  needs to be carried forward.    You will probably
     find that	some of the  fixes you had to  apply on top  of the old  PUT are
     included in this  new PUT and that some  of them are not.	  You still need
     those that are not in the new PUT,   so you must apply them again.   If you
     had removed any bad fixes from the old PUT, you may find that the fixes for
     the bad fixes  are on the new PUT,   in which case you should  no longer be
     removing the bad fixes.   The fixes for the  bad fixes will do that for you
     and probably won't assemble unless the bad fixes are applied first.

     The fixes you  had applied on top of  your old PUT are on	your old A-disk,
     which is now called 291.  Access that at mode F and take a look at it:

      listfile * * f

      CPLOAD   AUXPTFS	F1
      CPLOAD   EXEC	F1
      CPLOAD   S12989DK F1
      DKPTFMAC EXEC	F1
      DKPTFMAC MACLIB	F1
      DMKDMP   AUXPTFS	F1
      DMKDMP   TXTPTFS	F1
      DMKDMP   X0328	F1
      DMKIOS   AUXPTFS	F1
      DMKIOS   S13318DK F1
      DMKIOS   TXTPTFS	F1
      DMKMSG   AUXSP11	F1
      DMKMSG   TEXT	F1
      DMKRIO   ASSEMBLE F1
      DMKRIO   TEXT	F1
      DMKSNT   ASSEMBLE F1
      DMKSNT   TEXT	F1
      DMKSPLCL CNTRL	F1
      DMKSYS   ASSEMBLE F1
      DMKSYS   TEXT	F1
      IOBLOKS  AUXPTFS	F1
      IOBLOKS  S13318DK F1
      R;

     You must examine each of those files to  decide whether you need to copy it
     to your new A-disk.


									 PAGE 28

     Control files almost never change except with a new release,  and the "Memo
     to Users"	will tell you  if they do.   So,   first thing,  copy  over your
     control file:

      copyfile dmksplcl cntrl f = = a ( olddate

     It is  worth mentioning  here that  you should  make a  habit of  using the
     OLDDATE option of COPYFILE; it's a very simple way to "leave tracks".   You
     should also make a habit of using	the REPLACE option as seldom as possible
     and of always using the TYPE option when you do.  At least you'll know then
     that you've just replaced something that you really wanted to keep.

     I would like to suggest that you not  copy any of the textfiles or maclibs.
     It is safer to rebuild them with new VMFASMs and VMFMACs.	 Start with your
     macro and copy section changes.   You have only one, in this case, that fix
     that hit IOBLOKS,	 VM13318.   If LISTFILE shows no S13318DK  files on your
     service disks, then you need to carry this fix forward and rebuild your PTF
     maclib:

      copyfile iobloks * f = = a ( olddate type
      COPY 'IOBLOKS AUXPTFS F1' to 'IOBLOKS AUXPTFS A1' (NEW FILE).
      COPY 'IOBLOKS S13318DK F1' to 'IOBLOKS S13318DK A1' (NEW FILE).

      copyfile dkptfmac exec f = = a ( olddate

      vmfmac dkptfmac dmksplcl

     This will incorporate any new fixes to IOBLOKS which are on the new PUT.

     Next, copy over the source for your sysgen modules and reassemble them:

      copyfile dmkrio assemble f = = a ( olddate
      copyfile dmksnt assemble f = = a ( olddate
      copyfile dmksys assemble f = = a ( olddate
      vmfasm dmkrio dmksplcl
      vmfasm dmksnt dmksplcl
      vmfasm dmksys dmksplcl

     The  documentation with  the PUT  is supposed  to	tell you  if these  need
     reassembly,  but unless you are very cycle-constrained,  it is better to be
     safe and  reassemble them.    I can remember  a couple  of times  when they
     didn't tell us to reassemble DMKSYS  when they should have.   The resulting
     system failures were remarkably obscure.

     Then, work your way through the rest of the fixes you had applied before to
     see if you still need them.  Of course, you still need the rest of VM13318,
     the part that applies to DMKIOS:

      copyfile dmkios s13318dk f = = a ( olddate
      copyfile dmkios auxptfs f = = a ( olddate
      vmfasm dmkios dmksplcl

     Again, this will pick up any new fixes to DMKIOS from the new PUT.


									 PAGE 29

     Looking at the new DMKMSG AUXSP11 file that was loaded up from the PUT, you
     see that  VM14782 is  on the  PUT.   That	is the	fix for  the PE  against
     VM12684,  so you no  longer need to remove 12684.	 If  you still needed to
     remove it, though,  you would not just copy DMKMSG AUXSP11 from your old A-
     disk.   The new  DMKMSG AUXSP11 that you  just loaded up from  the PUT very
     likely would  have some additional  fixes in it,  even  if it did	not have
     VM14782.  Therefore, the thing to do would be to copy that auxfile from the
     new PUT disk to your new A-disk and again comment out VM12684, as before.

     LISTFILE shows you that there is a  file DMKVMC S12989DK that was loaded up
     from the PUT,   so you no longer  need to apply the  circumvention for APAR
     VM12989, which, you will recall,  was to make DMKVMC resident.   If you did
     still need to apply the circumvention,  you would copy your CPLOAD S12989DK
     and CPLOAD  AUXPTFS files	from F to  A,  check that  the update  would fit
     properly in  the new version  of CPLOAD EXEC from	the PUT (which	might be
     different from earlier versions),	and update  CPLOAD EXEC from the new PUT
     disk onto your new A-disk, exactly as before.

     That takes care of everything on the old A-disk but X0328.  Just as you are
     about to carry  forward your temporary local  fix for X0328,  your  mail is
     delivered,  and  in it you  find a letter from  IBM informing you	that the
     problem has been closed as a suggestion.	So,  either you discard your fix
     and wait for IBM to implement your suggestion, or you convert your fix into
     a local modification.   While I don't want  to lead you into temptation,  I
     would suggest the latter,	if only to  give me a chance to illustrate local
     mods.

     If it is going to be a local mod, it should be listed in an AUXLCL auxfile,
     rather than in an AUXPTFS.   And, I would suggest naming it something other
     than X0328,  say,	"DMPZERO0".   There are  very many schools of thought on
     naming local mods.   Most of the old users seem to have developed elaborate
     numbering schemes	for their mods.   I  prefer something mnemonic,   with a
     single digit at  the end to indicate  the level of the  mod.   Whatever you
     name your mod, you should, as before, mark it with an update identifier:

     FILE: DMKDMP DMPZERO0 A1

      ./ * THIS MODIFICATION CAUSES PAGE ZERO TO BE INCLUDED IN      DMPZERO0
      ./ * THE DUMP DATASET EVEN IF IT IS ON THE FREELIST.	     DMPZERO0
      ./ *							     DMPZERO0
      ./  R  07110000 $ 07110100 100				     DMPZERO0
	       LTR   R7,R3		 GET THIS PAGE NUMBER.	     DMPZERO0
	       BZ    NXTPAG1		 ALWAYS WANT PAGE 0 DUMPED.  DMPZERO0

     FILE: DMKDMP AUXLCL A1

      *$*$*$*$*$*$*$*$*$*$*$*$*$*$*$ AUXLCL $*$*$*$*$*$*$*$*$*$*$*$*$*$*$*$*$
      DMPZERO0 - 06/23/81 - DUMP PAGE ZERO REGARDLESS - MWV

     You  use VMFASM  to  incorporate your  mod  and  reassemble DMKDMP.    This
     produces a  file called DMKDMP  TXTLCL,  which the  loader will pick  up in
     preference to any	files named DMKDMP TEXT  or DMKDMP TXTPTFS when  you use
     the DMKSPLCL control file.


									 PAGE 30

     With that,  you have worked  your way through all the files  on your old A-
     disk, and your new A-disk looks like this:

      listfile * * a

      DKPTFMAC EXEC	A1
      DKPTFMAC MACLIB	A1
      DMKDMP   AUXLCL	A1
      DMKDMP   DMPZERO0 A1
      DMKDMP   TXTLCL	A1
      DMKIOS   AUXPTFS	A1
      DMKIOS   S13318DK A1
      DMKIOS   TXTPTFS	A1
      DMKRIO   ASSEMBLE A1
      DMKRIO   TEXT	A1
      DMKSNT   ASSEMBLE A1
      DMKSNT   TEXT	A1
      DMKSPLCL CNTRL	A1
      DMKSYS   ASSEMBLE A1
      DMKSYS   TEXT	A1
      IOBLOKS  AUXPTFS	A1
      IOBLOKS  S13318DK A1
      R;

     With as few files as we had in this example,  this procedure is done easily
     enough by inspection.  If there were substantially more fixes, however, you
     would need a better  mechanism to make sure you really  processed them all.
     Many installations have developed EXECs to perform this operation for them.
     IBM provides  no tool for this.	I had an  EXEC myself for a  while,  but
     ultimately I decided that I really wanted	to look at what was happening in
     this part of the process, so I no longer use that EXEC.  Now, I copy all of
     the updates and auxfiles from my old 191 to the new 191 and then just use a
     LISTFILE EXEC to  step through the auxfiles,  erasing  auxfiles and updates
     which are no  longer needed and making  sure that the AUXSP11  files that I
     still need on my  A-disk are current.   When that is done,   I have only to
     reassemble all the  modules which still have auxfiles on  my A-disk,  again
     using a LISTFILE EXEC to drive the process and assure that nobody gets left
     out.   This clearly is a matter of  taste,  though.   Do it whatever way is
     best  for you,   as long  as all  the fixes  you need  get carried  forward
     correctly.


									 PAGE 31

     H. Taking the Actions Described in the PUT Error Bucket

     Next you should  take the corrective measures recommended in  the PUT error
     bucket.   The bucket will tell you about  such things as any bad PTFs known
     to be  on the PUT,   any changes to program  products known to  be required
     because of changes to CP or CMS in this PUT,  any PUT packaging errors that
     have been reported,  and other information that you need to have before you
     put this  PUT into production.    When the  bucket comes,	you  should read
     through it carefully,  taking the actions	it recommends,	and marking them
     off as you  go.   The  buckets tend  to be  huge and  ugly and  formidable-
     looking,  but they are important,	so you need to learn to understand them.
     After reading  a few buckets,  you  will come to recognize  the unimportant
     parts and be able to skip over them quickly to get to the useful parts.

     The bucket is divided into a number of subsets, one for each component, CP,
     CMS, DIRMAINT, RSCS, etc.	Each subset contains three sections which may be
     of interest  -- Documentation Changes,   General Information,   and Service
     Recommendations.

     The Documentation Changes sections seldom have anything in them.  When they
     do,  they	mainly tell you about  misinformation in the Memoranda	to Users
     from the PUT.  Read these comments and note them.

     The items	in the General	Information sections  are almost all  things you
     need  to know.    Most of	the items  there  are directions  for fixing  up
     packaging errors on the PUT.   The descriptions  of the actions you need to
     take are generally reliable, although skimpy.   They assume you know how to
     do the sorts of  things I've been talking about.	They  may tell you,  for
     example, to remove a certain bad fix,  or to edit an auxfile and reassemble
     some module to pick up a fix they left out,  or to generate such-and-such a
     CMS  module  which  they  forgot  to  regenerate  after  they  updated  the
     textfiles.

     Other items  in General  Information may tell  you that  one of  the sysgen
     modules (DMKRIO,  DMKSNT,	or DMKSYS)  needs to be reassembled because of a
     change to a macro on this PUT.   There  may also be notes telling you about
     new  permanent  restrictions  or  warning	 you  to  apply  some  important
     corrective fix.	The information in  this section is  generally reliable.
     When it tells you to do something,  you  should do it.   It will usually be
     reasonably clear whether the item applies to you or not.

     One particular class of General Information items you should be aware of is
     notes telling you to apply a certain fix to some component, say,  DIRMAINT,
     when you apply the PUT service to CP  or CMS.   They do not usually tell us
     about these "co-requisites", but when they do, they mean it.   Take careful
     note of such advice.

     The Service  Recommendations sections are the  part of the bucket	that you
     will find hardest to digest.   These sections are essentially just dumps of
     APARs from RETAIN.  This is a typical example:


									 PAGE 32

      +--------------------------------------------------------------------+
      | APAR NUMBER = VM13499		     LAST UPDATE = 81/09/23	   |
      | PTF IN ERROR = UV03973		     PIN = YES			   |
      | CURRENT APAR STATUS = CLOSED	     CLOSING CODE = PER 	   |
      | ORIGINAL APAR NUMBER =		     SECURITY/INTEGRITY = NO	   |
      | SERVICE NUMBER = X401302-					   |
      | REPORTED COMPONENT = 5749DMK00	     RD62	5749 VM/370 CP	   |
      | FIXED	 COMPONENT = 5749DMK00			5749 VM/370 CP	   |
      | FAILING MODULE = DMKFRE 					   |
      | PROBLEM ABSTRACT:						   |
      | DMKCPU USES WRONG REG AND WRONG INSTRUCTIONS WERE IN DMKFRE	   |
      | REPORTED SCP RELEASE:	D62					   |
      | ERROR DESCRIPTION:						   |
      | APPLICABLE PTFS: PE03973-T8104, PE03974-T8104			   |
      | VM12596 DMKCPU FIX USES REG4 TO STORE THE CPEXBLOK ADDRESS INTO    |
      | THE FREE STORAGE BACK POCKET DMKFREAP 'CPUFREAP'.  REG10 READ	   |
      | ADDRESS IS THE REGISTER LOADED WITH THE ADDRESS OF 'CPUFREAP',	   |
      | AND IS THEREFORE THE CORRECT REGISTER TO USE FOR THE STORE.	   |
      | ALSO, THE DMKFRE FIXES FOR R060, RD61, RD62 ARE INCORRECT.  THE    |
      | WRONG INSTRUCTION WAS REPLACED. 				   |
      | TEMPORARY FIX:							   |
      | PRE-REQ APAR IS VM12596 					   |
      | FIX FOR WRONG REGISTER USAGE IN DMKCPU: 			   |
      | FILE: DMKCPU R13499DK FOR R060					   |
      | ./ R 426500 $ 426600						   |
      | 	 ST    R1,4(,R10)   PUT CPEX POINTER IN DMKFREAP  @VA13499 |
      | **** END OF REL6 FIX****					   |
      | FILE: DMKCPU S13499DK FOR RD71					   |
      | ./ R 4317000 $ 4318000						   |
      | 	 ST    R1,4(,R10)   PUT CPEX POINTER IN DMKFREAP  @VA13499 |
      | **** END OF VM/SP FIX ****					   |
      | FIX FOR DMKFRE FOR R060:					   |
      | FILE: DMKFRE R13499DK						   |
      | ./ R 758100 $ 758100						   |
      | 	 ICM   R2,B'0111',DMKFREAP+1  ADDR OF BACKPOCKET  @VA13499 |
      | ./ R 762000 $ 762100						   |
      | 	 L     R1,DMKFREAP+4  GET ADDR OF CPEX FROM FREAP @VA13499 |
      | **** END OF R060 FIX ****					   |
      | PROBLEM SUMMARY:						   |
      | VM12596 - DMKCPU FIX USES REG4 TO STORE THE 'CPEXBLOK' ADDRESS	   |
      | INTO DMKFREAP INSTEAD OF REG10. THE DMKFRE FIX FOR R060 IS ALSO    |
      | INCORRECT: THE WRONG INSTRUCTION WAS REPLACED.			   |
      | AFFECTED USERS: AP AND MP USERS ONLY				   |
      | RECOMMENDATION: APPLY APAR TEMPORARY FIX			   |
      | PROBLEM CONCLUSION:						   |
      | DMKCPU WILL BE CHANGED FOR R060 AND RD71. DMKFRE WILL BE	   |
      | CHANGED FOR R060.						   |
      | MODULES/MACROS:   DMKFRE   DMKCPU				   |
      | SRLS:	  NONE							   |
      | CIRCUMVENTION:							   |
      | APPLICABLE COMPONENT LEVEL/SU:					   |
      | ENV=060 	PS=Y  PTF=UV04522 OPEN	  AVAIL=NO   VOLID=	   |
      | ENV=D71 	PS=Y  PTF=UV04523 OPEN	  AVAIL=NO   VOLID=	   |
      +--------------------------------------------------------------------+


									 PAGE 33

     You have  got to work  your way through these  APARs,  deciding what  to do
     about each  one.	There are  some clues.	 Each  of them has  an "AFFECTED
     USERS" line (toward the end and very hard to spot).   In this case, it says
     "AP AND  MP USERS ONLY".	 This field frequently	says "ALL" when  the fix
     really doesn't apply to all installations.   In fact,  when this particular
     APAR  was first  entered into  the bucket,   it  said that  all users  were
     affected, even though the fix is to DMKCPU, which is not even listed in the
     UP loadlists.   But,  if the "AFFECTED  USERS" field says "MP-ONLY" and you
     have a UP, or if it says "FBA-ONLY" and you have only CKD devices, then you
     are safe in skipping that item.	In other cases,  the problem description
     will make it clear that you are not impacted.   For example, if it is a fix
     for a problem in  IUCV and you know that you are not  using IUCV,	then you
     can skip that one, too.   You should be aware that some of the APARs in the
     Service Recommendations sections are marked  "HIPER",  which is supposed to
     mean that this is a high-impact problem.  This is a new designation, and so
     far it has not been terribly accurate, but it does give you some guidance.

     When you  decide you  have to  do something  about an  APAR in  the Service
     Recommendations section, you may have several options.  Look at the "PTF IN
     ERROR" line,   the "RECOMMENDATION"  line,  and  the "CIRCUMVENTION"  line.
     There is very seldom anything given as a circumvention, but if there is, it
     is likely to be something relatively safe and easy to do,	such as making a
     module resident.	If  there is no circumvention,	you may  have the choice
     between  applying this  fix and  removing some  bad  fix that  this one  is
     supposed to correct, the one mentioned as the "PTF IN ERROR".

     You should keep in mind that the fixes  in the bucket are for the most part
     even less	well-tested than the  fixes on the PUT,   so you are  asking for
     trouble if  you just  blindly apply  them all,   even if  that is	what the
     "RECOMMENDATION" fields tell you to do.   If this	APAR is a fix for a "PTF
     in Error" ("PE"),	you may be better  off just pulling the bad PTF,  rather
     than installing this APAR.  To pull off the PE, the first thing you have to
     do is figure out  the APAR number that corresponds to  the PTF number given
     in  the "PTF  IN ERROR"  line.    All VM  fixes  have both  an APAR  number
     ("VMnnnnn") and a PTF number ("UVmmmmm").	 VM fixes are named according to
     their APAR number,  rather  than their PTF number,  and VM  APARs are never
     superseded by PTFs, as VS PTFs are.   Therefore, in VM,  PTF numbers convey
     no information to the user, but IBM puts the PTF numbers in the VM buckets,
     rather than the APAR numbers, because what's good for MVS is good for VM.

     Given the PTF number for the PE,  here is how you find out its APAR number,
     so you know its  filetype,  so you can remove it.	 If  you are lucky,  the
     "PROBLEM DESCRIPTION" field will reference the  bad fix by its APAR number,
     as it does in this case, VM12596.	Or, the bad fix may be listed as a "PRE-
     REQ APAR",  as it is here.   If not,  you could just call Level One and ask
     them what the APAR number is for PTF UV03973.   Or,  if you have INFO/DATA,
     you could look up the PTF number there;   the command is this case would be
     "S E UV03973".


									 PAGE 34

     If you don't have INFO and you don't  want to call the Support Center,  you
     can try a little  detective work.	 A reasonable assumption is  that the PE
     probably hit  at least some of  the modules that  the fix for the	PE hits.
     You have the fix for the PE sitting there in front of you.  So, look at the
     AUXSP and	AUXSP11 files  for the	modules the  fix applies  to;  you  will
     probably find the	PTF number of the PE  listed in one of	them.	The APAR
     number will be on the same line,  because it is included in the name of the
     update,  S12596DK.   Now that you know the APAR number of the bad fix,  you
     can find out what the original problem was that it was trying to fix.  Look
     up the APAR number in Early Warnings and read the problem description.  (Of
     course,  if you phone the Support Center  to find out the APAR number,  you
     can also ask them to read you the problem description.   Similarly,  if you
     look  up the  PTF number  in INFO,   that will  also give	you the  problem
     description.)

     If you decide that  the original problem is not one that  you have had,  it
     may well be that you will get more stability from removing the bad fix than
     you will  get from applying  the fix for  the bad	fix.   If you  decide to
     remove the bad fix, you go through the same process that we went through to
     remove the bad  fix to DMKMSG earlier.    You use LISTFILE to  find all the
     macros and  modules which	are hit by  the PE.   You  copy the  AUXSP11 (or
     AUXSP)  auxfiles for those macros and modules from the service disk to your
     A-disk,  and you edit the A-disk copies  of the auxfiles to comment out the
     bad fix.	 If the bad  fix hits any  macros,  you  add the macros  to your
     DKPTFMAC MACLIB by adding entries for them to DKPTFMAC EXEC and issuing the
     VMFMAC command to rebuild the maclib.   (You could update the macro by hand
     and then add the updated macro to DKPTFMAC with the MACLIB ADD command, but
     your PTF macro  libraries will generally be  so small that it  will be very
     inexpensive to rebuild them  from scratch when you need to  make any change
     in them.  And a problem with using MACLIB ADD to add a macro to a maclib is
     that it is so easy then to forget to add the name of that macro to the EXEC
     for that maclib.	 This means that the  next time you rebuild  that maclib
     from scratch,  you will lose the new macro and the service that was on it.)
     Once you  have the  auxfiles and the  maclib in order,   you use  VMFASM to
     reassemble all the modules that were hit by the PE.

     If,  on the  other hand,  you decide  that you really should  apply the fix
     given in the  bucket,  you use the  same procedure that we  used earlier in
     applying the fix for the hungusers problem.  First, key in the update files
     from the bucket.	 Then,	create (or update)  an AUXPTFS	auxfile for each
     macro and module hit by the fix.	If any macros are involved,  add them to
     DKPTFMAC,	in the usual way.   Then use  VMFASM to assemble the modules and
     create TXTPTFS files on your A-disk.

     That is all you  do with the APARs in the	Service Recommendations sections
     of the bucket -- skip them,  apply them,  or pull the PEs they are supposed
     to fix.   There is another bucket you need to check, however,  the one from
     VMSHARE.	There are  generally a series of files on  VMSHARE which discuss
     current problems  with the system.    For SP,   these have been  named PROB
     1SP00, PROB 1SP01, etc., to correspond to the various service levels.  Read
     all these buckets,   since they are not  cumulative.   You may not  need to
     apply all the service that is recommended there,  but many of us have found
     that that is the safest course for us.


									 PAGE 35

     I. Carrying Forward Your Local Mods

     We did not have any local mods on the old 191 disk in this example.   If we
     had, they would now need to be copied to the new 191.   The process here is
     really just the same as it is with locally-applied service.   Copy over the
     AUXLCL auxfiles  and the local  updates.	Rebuild DKLCLMAC  MACLIB,  using
     VMFMAC  with the  DMKSPLCL  control file.	  Then	reassemble the	modified
     modules, using VMFASM and the DMKSPLCL control file.

     With enough  effort,  you could  probably figure out  that some of  the old
     TXTLCL files could  just be copied forward,  because those  modules had not
     received any new service.	 I would  advise against this approach,  though,
     because the checking required is really substantial.   You would have to be
     sure that the  macros used by those  modules also had not	received service
     that would require a reassembly.	And, if you were to miss just one module
     that really needed reassembly, you would have built yourself a very obscure
     problem to debug.

     In carrying forward your local mods,  you	need to check,	of course,  that
     they still fit in	IBM's code after the new service  has been applied.   It
     will be well worth  your time to read through the	APAR descriptions in the
     Memo to Users, looking for fixes which sound as if they might hit areas you
     have modified.   Fortunately,  you can count on UPDATE and the assembler to
     find most of the  conflicts between your mods and the  new service for you.
     So, the first step is the VMFASMs I suggested above.   Check very carefully
     for both UPDATE sequence error messages and assembly error messages.   When
     you have all of those fixed up,  you  really should examine all the mods in
     the new listings to make sure they still make sense, but this is so tedious
     that I suspect that  many of us skip that step and  just rely on functional
     testing to make  sure our mods are  all still working.   Certainly,   it is
     worth spending  some time building yourself  a testing EXEC  that exercises
     all your mods.   You may also want to consider modifying the VMFASM EXEC so
     that it will not  go on and do the assembly when there  is an UPDATE error.
     This will make UPDATE errors much more conspicuous.  Many of the old-timers
     are of the opinion that this is how VMFASM should work.   So far, we've not
     been able to convince IBM of that, however.


									 PAGE 36

     J. Testing a New Version of CP

     Having done all this, you are ready to test your new version of CP.

     I'm pretty well  convinced that the primary  reason that VM still	lives is
     the fierce loyalty of the VM system programmers and that the primary reason
     for their	loyalty is that  VM means never  having to take  standalone test
     time at 6 A.M. on Saturday.

	      +------------------------------------------------------+
	      | 		  RULE NUMBER FIVE		     |
	      +------------------------------------------------------+
	      |  VM SYSTEM PROGRAMMERS DO IT VIRTUALLY ALL THE TIME  |
	      +------------------------------------------------------+

     It is my  impression that most experienced VM  installations never schedule
     standalone test  time for	CP.   A new  version of CP  can be  tested quite
     thoroughly running in a virtual machine.	It will take you a little effort
     to learn how  to do this effectively,   but the effort will  be repaid many
     times over.   A good place to start is by reading the chapter on running VM
     under VM in GC19-6212, "Operating Systems in a Virtual Machine".

     If you are new to VM system programming,	you will also need to spend some
     time learning  to read dumps interactively  using the DUMPSCAN  facility of
     IPCS or Amdahl's ANALYZE (if you are lucky enough to be able to get hold of
     it).   DUMPSCAN is a frustratingly primitive facility, but, even so, it can
     greatly enhance your  productivity.   Spend a little time	learning to read
     dumps interactively, and you'll soon be refusing to look at paper dumps.


     K. Putting a New Version of CP Into Production

     Finally,  you are ready to build and install a production CP nucleus at the
     new PUT level.  The mechanisms you use are exactly the same as the ones you
     use in building and installing a new nucleus to incorporate a single fix.

     Even after you have this PUT in production,  you should order a new copy of
     the bucket  every once  in a while  and go  through it to	see if	any more
     problems have been discovered.    How often you need to do  this depends on
     how stable your system is.   In the early days of SP, when things were very
     unstable, I checked the bucket every week.   Fortunately, at that time, the
     bucket was in  a format which allowed  Level One to tell  us easily whether
     there had been any important changes since we last got a bucket.	It is no
     longer possible for us  to phone Tampa or Chicago and just  ask what is new
     in the "hotlist", but I hope this situation will be remedied someday.


									 PAGE 37

			V. Converting to a New Release of CP


     Once you have a VM system up and running, installing a new release of VM is
     exactly the same process as installing a  new PUT,  so don't let them trick
     you into  thinking that  you ever	have to  use that  nasty starter  system
     again.   The steps we  have just gone through to install a  new PUT are the
     same steps you need to take to install a new release.  Essentially, all you
     do is load up the	tape,  do whatever the bucket tells you to  do to fix it
     up,  apply any old corrective service you	still need,  and then apply your
     local mods.


     A. Loading Up the Base Tape (and Possibly a Service Tape)

     I cannot give you	the exact commands you will need for  loading up the new
     release,	because the  tape formats  tend to  be different  with each  new
     release.	The documentation with the tapes may be sufficient to enable you
     to find the files you need.   If it  is not,  use VMFPLC2 (or whatever they
     call it next time)  to scan the tapes and show you what is there.	 For CP,
     you need to find  a file with source and macros and  a file with textfiles.
     (When we went to Release 6,  the  only place on the distribution tapes that
     we  could find  the textfiles  was on  a  minidisk in  the starter  system!
     Apparently,  they thought that people actually use the starter system to go
     to a new release.	 We can hope that they will remember the shrieks of pain
     and outrage and not do that to us	again for a while.)   The control files,
     loadlists,  and maclibs for CP will also  be somewhere on the tapes.   Once
     you have found all these, get yourself a new base minidisk (like 195 in our
     canonical layout) and load all the CP files up onto it.

     New releases tend to be pretty badly back-levelled on service,  so,  unless
     you are really desperate to get onto the new release for some reason,  wait
     at least until the first service tape arrives.   When it does, get yourself
     a new PUT minidisk and load the CP service up onto it.


     B. Doing What the Bucket Says

     Either way,   get yourself  a bucket and  take a look  at the  subset which
     describes problems in installing  the new release.   Get yourself	a new A-
     disk and do whatever fixups the  bucket suggests.	 Then start working your
     way through the  task of carrying forward old corrective  service and local
     mods.


									 PAGE 38

     C. Carrying Forward Old Corrective Service

     Since even with  a service tape the  new release may be  back-levelled,  it
     would be a good idea for you to  make yourself a list of all the corrective
     service you  have had  to apply  in the  past six	months.   Work	your way
     through the list deciding which of those  fixes have been picked up for the
     new release and which have not.   Then phone the Support Center and ask for
     new versions of all  the old fixes which have not yet  been picked up.   Do
     not try to update these fixes  yourself;  the Support Center will generally
     send you tapes of the updated fixes within  a week or so of your asking for
     them.


     D. Carrying Forward Your Local Mods

     Moving your mods into  the new release is much like moving  them into a new
     PUT.   It may be complicated,  however,   by the base ASSEMBLE files having
     been resequenced.	 If that happens, the sequence numbers in your mods will
     need reworking,  even if the logic doesn't.   You should be aware of a very
     useful program  on the Waterloo tapes,   the extended COMPARE  command from
     Cornell.  One of its many functions is to prepare a resequenced update file
     when it is given an old ASSEMBLE file,  an update to that file,  and a new,
     resequenced ASSEMBLE file.  I would still be trying to get to SP if it were
     not for this program.


     E. Compatibility Problems

     The  one  real   complication  you  may  encounter   is  release-to-release
     incompatibilities,  most likely in spool files  or the directory.	 We have
     been telling IBM for a long time that we  must be able to go back and forth
     between  releases without	doing  cold starts  and  without rebuilding  our
     directories.   The user  community has traditionally built  and distributed
     the modifications necessary to achieve these goals.  In the Release 6 to SP
     conversion,  IBM finally came through with a PTF to allow us not to do cold
     starts either when installing SP or when backing out of it.  They still did
     not achieve directory compatibility,  but the users did,  and there is hope
     that IBM will next time.	You can expect to find directions for use of any
     compatibility PTFs in the install bucket for the new release.  Changing the
     size of,  say,  the  SFBLOK without cold starting is a  tricky process,  so
     follow the instructions very carefully.


									 PAGE 39

			     VI. Advanced Nucleus Theory


     A. Building and Delivering a CP Nucleus

     To build a  CP nucleus,  you just	spool your punch to  yourself and invoke
     VMFLOAD  to punch	to  your reader  a  big file  containing  the CP  loader
     followed by all the textfiles for the  nucleus.   At some point you deliver
     the nucleus to your sysres by IPLing  that loader file.   IPL gives control
     to the loader; and the loader reads in the rest of the deck, link-edits the
     whole thing together,  and prints the  loadmap.   It then passes control to
     DMKSAVNC,	which writes the nucleus out onto the sysres volume described in
     DMKSYS.

     There are several different ways to go about accomplishing this delivery of
     the nucleus:

     1. Perhaps the most common delivery method is to move that reader file to a
     tape and later IPL the loader from that tape into the real machine to write
     the nucleus to the real sysres:

      tape rew
      filedef input reader
      filedef output tap1 ( recfm f lrecl 80 block 80 den 1600
      movefile input output

     Either VMSERV  or GENERATE can  also be used  to create an  IPLable nucleus
     tape.

     2.  Or,  as in our earlier examples,  you	can just get write access to the
     real sysres and IPL  that reader file in your virtual  machine to write the
     nucleus out  onto your  real sysres.   This  is risky  enough that  I would
     advise against it, however,  until you feel that you really understand what
     is going on.

     3.  You can also set up a virtual sysres on a minidisk,  giving it the same
     address and volid as  the real sysres and CP-allocating it.    You then IPL
     that reader file  in your virtual machine,   and the loader writes  the new
     nucleus onto the virtual sysres.	After you have tested the new nucleus in
     your virtual machine  and are happy with it,   you can use DDR  COPY NUC to
     copy it from your	virtual sysres to the real one.    A somewhat less gutsy
     approach is to use DDR DUMP NUC to move the nucleus from the virtual sysres
     to tape,	after which  you shut  the real  system down  at some  point and
     install the new nucleus using the RESTORE NUC function of standalone DDR.

     4. You can use RSCS to send your reader file to a virtual reader on another
     real machine and then use one of these three methods to install the nucleus
     on that machine.


									 PAGE 40

     I have used all of these approaches myself and currently use different ones
     for  different systems.	I would  advise you  to  start with  one of  the
     approaches that doesn't involve writing on the real sysres while the system
     is up and running.   I will be discussing the perils involved in doing that
     shortly.	I do recommend that which ever	way you deliver your new nucleus
     to your  real sysres,   you first load  every new CP  nucleus to  a virtual
     sysres and IPL it	from there.   It's so humiliating to  have the operators
     tell you that you've given them a new system that won't even IPL.


     B. Defining A V=R Area: DMKSLC

     If you  build your nucleus "by  hand" or with  your own build EXEC  and you
     want to have a V=R area in your  system,  be sure that you have generated a
     DMKSLC textfile.	(You must also,  of  course,  use a loadlist which lists
     DMKSLC.)	DMKSLC comes right after DMKPSA  (page zero)  in the CP nucleus.
     "SLC" stands  for "set location counter",	 which is precisely  what DMKSLC
     does.   It moves the location counter from the beginning of page one to the
     end of the V=R area, which is just a big hole in your CP nucleus.	 You use
     the VRSIZE command to generate DMKSLC:

      vrsize
      VIRTUAL=REAL OPTION REQUIRED (YES,NO):
      yes
      STORAGE SIZE OF VIRT=REAL  (MINIMUM IS 32K):
      5m
      STORAGE SIZE OF VIRT=REAL  (MINIMUM IS 32K):
      5120k
      05120K STORAGE SIZE FOR VIRTUAL=REAL
      IS THE ABOVE ENTRY CORRECT (YES,NO):
      yes
      R;

      l dmkslc ( d
      FILENAME FILETYPE FM FORMAT LRECL       RECS     BLOCKS	DATE	 TIME
      DMKSLC   TEXT	A1 F	     80 	 3	    1  1/16/82 14:24:57
      R;

     Just reply to  the questions,  and VRSIZE	will build a file  called DMKSLC
     TEXT.  As you can see, you must tell it the V=R size in K, rather than M --
     very unfriendly.	You need do this only once, as long as you don't want to
     change your V=R  size,  and you may keep around  different DMKSLC textfiles
     for different purposes.   For example,  I keep two versions of DMKSLC on my
     MAINT A-disk,  DMKSLC TXT3033,  which defines a 5-meg V=R for my 3033,  and
     DMKSLC TXTTST, which defines a 2-meg V=R for my test system.


									 PAGE 41

     C. Detecting Nucleus Overflow

     One  of the  hazards  of building	CP  nuclei is  the  problem of	"nucleus
     overflow".   There is no check made for  whether the nucleus is too big for
     the DASD space  you've set aside for  it.	 In fact,  you	specify only the
     starting cylinder	or block  for your  CP nucleus	in DMKSYS.    The system
     neither knows nor cares where you intend for the nucleus to end.	DMKSAVNC
     starts writing the  nucleus at your starting point and  keeps writing until
     it's done.    If it goes  too far,  whatever comes  next on that  volume is
     quietly destroyed.

     Early in SP,  IBM	came out with a very friendly fix  to DMKSAV which tells
     you exactly which cylinders or blocks the nucleus has been written on.  You
     should certainly always check that message.    But,  since there's a chance
     that you might overlook  it,  you should also adopt one  of the old-timers'
     strategies for detecting nucleus overflow.

     One good strategy is  to lay out your virtual sysres so  that the I/O error
     recording area is immediately after the  CP nucleus.   Then,  when you load
     your new nucleus  onto your virtual sysres,  if the  nucleus overflows,  it
     will  overlay the	error  recording  cylinders.   Since  CP  initialization
     carefully checks  to make sure  that the  error recording area  is properly
     formatted, you will get the message:

      DMKIOG552I FORMATTING ERROR RECORDING AREA

     when you IPL your virtual sysres under these circumstances.   Then you know
     not to install on your real sysres without first rearranging it a bit.

     There is another  easy way to detect  nucleus overflow.   When you  IPL the
     loader reader file in  a virtual machine,	you must have  the sysres volume
     (whether virtual or  real)  defined as a minidisk to  your virtual machine.
     If you define that minidisk as ending at the end of the nucleus area, then,
     if the nucleus  overflows,  you will draw	I/O errors when DMKSAV	tries to
     write beyond the end of the minidisk.   Again, you are warned that you have
     a problem.


									 PAGE 42

     D. Backing Your Nucleus Up

     The most  important part  of building a  new CP nucleus  is backing  up the
     previous nucleus, so that you will be able to back out of the new one.

				+-------------------+
				|  RULE NUMBER SIX  |
				+-------------------+
				|    BACK IT UP     |
				+-------------------+

     Two of the delivery methods I described  just now involved your writing the
     nucleus to tape.	If you do it yourself,	then you will know it really got
     done and you will	know what tape the nucleus is on.    If you deliver your
     nucleus direct to the  sysres,  rather than writing it to	tape,  make sure
     that your operators have good system backup procedures and that they really
     follow them.

			       +---------------------+
			       |  RULE NUMBER SEVEN  |
			       +---------------------+
			       |  BACK IT UP AGAIN   |
			       +---------------------+

     Keep more than one nucleus backup tape.	Set up your backup procedures to
     use a rotating pool  of several tapes on which to dump  new nuclei in turn.
     (We find ten to  be a good number.)   And when you  really screw things up,
     you will  be happy  that you  have dumped	your MAINT  A-disk out	onto the
     backups too, following the nucleus.   That way, when you back out to an old
     nucleus,  you can	also back your A-disk up  to the state it was  in at the
     time you built the good nucleus, if you need to.

			       +---------------------+
			       |  RULE NUMBER EIGHT  |
			       +---------------------+
			       |   DON'T TRUST DDR   |
			       +---------------------+

     Sad to say,  DDR  has been very unreliable ever since we  went to SP.   PUT
     8209 includes forty-six fixes to DDR, most of which represent situations in
     which somebody's backup tapes were no good.  I am not saying not to use DDR
     --  we  really have  no  choice  -- I  am	just  saying  not to  trust  it.
     Thoroughly test every  DDR procedure you establish,  to make  sure that DDR
     works with the particular combination of  devices and commands that you are
     using.   And don't believe that DDR is  working just because it says it is.
     Restore whatever it is to another volume and compare the restored data with
     the original data.    Also,  if part of  the procedure calls for  using DDR
     standalone, then test it standalone; IPLing DDR in a virtual machine is not
     the same as  IPLing it in a bare  machine.   And be VERY  suspicious of new
     service for DDR.	DDR is like CPEREP; if you find a version that you like,
     stick  with it,   or,  at	least,	keep  a  copy of  it around  for use  in
     emergencies.


									 PAGE 43

     E. Logging and Numbering Your Systems

     A good system log, whether in the form of a CMS file or of an old-fashioned
     logbook, can be invaluable when things start going wrong.	 There should be
     one place	where your  installation logs the  time and  date of  all system
     changes, both hardware and software.   When you install a new CP nucleus or
     make any change  to CMS,  you should  log that fact and  include a detailed
     description of your changes, including APAR numbers, etc.

     Many installations find it useful to number  their CP nuclei.   In the case
     of my own installation, the system number is recorded in the system log, of
     course, but it is also recorded in the CP nucleus itself to help keep dumps
     straight.	 This number is displayed at IPL time,	and there is an operator
     command  to display  it as  well.	  Our nucleus  build EXEC  automatically
     increments this number and reassembles DMKCPE, which is where the number is
     kept.   I have included this very simple modification in an appendix in the
     handout.


     F. Archiving Your Load Maps

     Archive your CP (and  CMS)  loadmaps in some orderly way,	 so that you can
     retrieve them  for use in looking	at dumps and documenting  problems.   If
     DASD or tape space  for archiving loadmaps is a problem  for you,	then you
     can discard the loadmaps for systems that	don't produce any dumps or other
     problems.	 If you  make a practice of numbering your  system builds,  then
     name the loadmap disk file accordingly, as NUC175 MAP, say; otherwise, name
     it according to its build date.   Before  you put a new CP into production,
     make sure	that you have already  sent a copy  of the loadmap to  your IPCS
     virtual machine.

     The loader creates the  loadmap while it is building the  nucleus.   If you
     are planning to do the build on a	bare machine,  first IPL the loader file
     in a virtual machine to get a copy of the loadmap.  (Remember to spool your
     reader HOLD,  so that you don't lose  the loader file.)   Even if you don't
     have a  virtual sysres  to load the  new nucleus onto,   you can  trick the
     loader into creating a loadmap spool file.    By the time it has discovered
     that it has no sysres on which to	write the nucleus,  it will already have
     built the	loadmap in your virtual  printer.   So,  just close  the printer
     after it tells you it got an I/O error trying to write out the nucleus.


									 PAGE 44

     G. Unresolved References

     Part of  what the	loader does,  of  course,  is  resolve all  the external
     references from one nucleus module to another.  Ideally, there should be no
     unresolved references.   You  can find out whether there are  by looking at
     the end of your nucleus loadmap.	 If there are any unresolved references,
     you had  better find  out why,  because  there is a  good chance  that your
     system is missing	function and also a  good chance that it  will branch to
     zero now and then.   The one time	that you neglect to check the unresolved
     references before putting your nucleus into production will be the one time
     you  manage to  build  a nucleus  with  no  DMKSNT in  it.    I speak  from
     experience.

			+-----------------------------------+
			|	  RULE NUMBER NINE	    |
			+-----------------------------------+
			|  CHECK THE UNRESOLVED REFERENCES  |
			+-----------------------------------+

     Unfortunately,  you may find that your CP nucleus has some references which
     are supposed to be unresolved.  In VM/SP Release 1, you may have three such
     unresolved  references.	If  you  build a  system  without  a  V=R  area,
     references to DMKSLC  will be unresolved.	 If you don't  specify a NAMENCP
     macro in  DMKSNT (because	you don't have	a 370X),  then	you will  get an
     unresolved reference to DMKSNTRN.	If you don't specify a NAME3800 macro in
     DMKSNT (because  you don't  have a  3800 printer),   then you  will get  an
     unresolved reference to DMKSNTQN.

     Unresolved references can be a real problem,   because it is so easy,  when
     you are supposed  to have seven of  them,	to overlook the  eighth one that
     sneaks in -- until it crashes your  system,  of course.   But,  suppose you
     decide  that  having  all	these  unresolved  references  is  slovenly  and
     dangerous,  and  that you	are going  to do  a little  mod to  artificially
     resolve all the references you normally  have unresolved.	 It sounds good,
     but if you do it,	you are likely to find your system crashing all over the
     place.   This is because  our friends the developers have a  nasty habit of
     using the fact that an ADCON is all  zeroes as a flag.   If you resolve the
     reference to something other than zero, they decide that you are using that
     function.	 You can trick them,  however,	 by resolving such references to
     zero.

     Larry Brenner  of Cornell	has written  a very  nice little  program called
     NUCMAP,  which is available on the Waterloo tapes.   NUCMAP reads a loadmap
     spool  file and  creates  two small  disk files  containing  the names  and
     addresses of all the modules in that nucleus,  sorted alphabetically in one
     file and numerically in the other.   At the same time,  NUCMAP displays all
     the unresolved  references on the	console.   I find  that this is  a good,
     quick  way  of   checking	for  unresolved  references;	you  might  too.
     Incidentally,  when you are  "fixtesting" a new fix,  it is  a good idea to
     check  for any  new  unresolved references  introduced by	the  fix and  to
     complain if there are any.


									 PAGE 45

     H. The Small CP Nucleus Option

     You may want to consider using the  small CP nucleus option.   The small CP
     nucleus is just  a CP nucleus built  with a loadlist that	doesn't have all
     the  modules  listed  in  it.   This  loadlist  is  called  CPLOADSM  EXEC.
     Specifically,  the small  nucleus doesn't have MSS  support,  3340 support,
     AP/MP support,  remote  3270 support,  SNA support,  or  the SEPP fast-path
     privop handling for guest SCPs.   It can save  you quite a bit of memory on
     small systems.   In our  example,	the command to build a	small CP nucleus
     would be:

      vmfload cploadsm dmksplcl

     VMSERV will not let you specify that  you want to use the CPLOADSM loadlist
     to build your nucleus,  but GENERATE will.   However,  neither of them will
     let you specify your own control file.

     Unresolved references get to be a much  bigger problem if you use the small
     CP  loadlist,  however.	Many modules  are not  there,  so  you get  many
     unresolved references -- dozens of them.	This is a real hazard, so I have
     included  in an  appendix to  the handout	the  mod I  use to  artificially
     resolve all of the normally unresolved references in my small CP nuclei.


									 PAGE 46

     I. Alternate CP Nuclei

     Sooner or later,  you  will build a really awful CP  nucleus.   It will run
     just fine when  you are testing it in  a virtual machine,	but  on the real
     machine it will not IPL at all or it will crash as soon as you bring it up,
     every time you bring it up,  or it  will go straight into a loop every time
     you bring it up.  When this happens, you will be called to the machine room
     and told to do something about it,  while the operators sneer and crowds of
     angry users mill about, crying for system programmer blood.

			    +--------------------------+
			    |	   RULE NUMBER TEN     |
			    +--------------------------+
			    |  PLAN ON BACKING IT OUT  |
			    +--------------------------+

     Certainly,  this is a good time to have  a sound CP nucleus on a sound tape
     and to know which tape that is.   But  with all that shouting going on,  it
     can take a while to find the tape and  load it up.   It would be much nicer
     if you  had another  nucleus online  and could  just tell	the operator  to
     change the load  address and IPL.	 Many  of the old users  have long since
     concluded that the better they can back  out,  the better their raises are,
     so they have become very good at backing out.   That is why one of the most
     common mods floating around among the  old users is the "alternate nucleus"
     mod for CP.  This mod allows one to have CP nuclei scattered about here and
     there,  one per DASD volume,  rather than	forcing the nucleus to be on the
     sysres  volume (the  volume with  the  warm start,   error recording,   and
     checkpoint areas).   My smallest system has two nuclei, the current one and
     a recent one that I liked.   My largest system has four nuclei, the current
     one, the one before that, the one before that, and a spare.

     The spare is usually  a non-V=R system that I keep  around because we can't
     IPL our V=R  system in the IBM  memory.   Sometimes,  though,  I  put a new
     system there with a  new I/O configuration.   If I want to  go away for the
     weekend,  for example,  and I know that the  CEs may not be able to get the
     new gear they  are installing on Saturday	morning to fly,  I  just let the
     operators know to IPL 843 if the change  goes and to IPL 840 if it doesn't.
     In the early months  of SP,  I kept a really good old  BSEPP nucleus on the
     spare as  insurance.   That is  the one I	backed out to  so I could  go to
     SHARE.   If I could have only one mod on my system, this is the one I would
     choose.	(The second  would  be the  University	of  Maine's virtual  PER
     support.)	 The  alternate nucleus  mod and  some examples  of its  use are
     included in an appendix in the handout.


									 PAGE 47

     J. The Perils of SHUTDOWN

     You may  have been  surprised earlier  to hear  me suggest  that you  might
     install a new  CP nucleus on your real  sysres while your system  is up and
     running.  On the other hand, you may have been surprised to hear me suggest
     that this is a risky undertaking.	 All of IBM's higher-level service tools
     (IPF,  VMSERV,   and GENERATE)  behave  as though	it is perfectly  safe to
     install a new CP nucleus while the system is running.  But many experienced
     VM shops regard this as altogether too dangerous even to consider doing it.
     In my  view,  there  are two  circumstances in  which it  is reasonable  to
     install a new CP nucleus on a live sysres:   (1)  you don't mind doing cold
     starts or (2) you actually understand what is going on.

     Installing a new nucleus on a live sysres is made possible by the fact that
     during initialization  the nucleus  modules are read  into memory	from the
     sysres,  and  then the  pageable ones  are written  out to  paging devices.
     Subsequent references to pageable modules cause  them to be brought in from
     the paging area,  not from the sysres.   So,   you are free to write on the
     sysres,  except  that there  is one  real gotcha  -- DMKCKP,   the SHUTDOWN
     module.   DMKCKP  lives on the sysres.    When your system gets  shut down,
     either because  the operator  issues the  SHUTDOWN command  or because  the
     system crashes, DMKCKP is loaded into memory from the device from which the
     system was last IPLed, not from a paging volume.	DMKCKP is also loaded in
     from the sysres when  you IPL the sysres to do a  shutdown and,  of course,
     that means any time you IPL CP and  it finds that address X'370' still says
     "CPCP".   Now  suppose that  your system  is running  and you  write a  new
     nucleus onto the sysres.  When something happens to cause your system to be
     shut down,  it is the new version of  DMKCKP that is going to be brought in
     to shut the old system down,  so you had better be sure that the new CKP is
     compatible with the old system.

     There  are   two  major  areas  in   which  you  may  have   problems  with
     incompatibility between a new DMKCKP and an old nucleus.	The first is the
     result  of changes  in the  spooling subsystem.	One of	the main  things
     SHUTDOWN does, of course, is move information about your spool files out to
     the warm start area,  so that you can bring your system back up with a warm
     start.   If the new system expects the SFBLOKs, the SPLINKs,  the RECBLOKs,
     or the ALOCBLOKs  to have a different size  or shape from that  they had in
     the old system,  your warm start area is  likely to end up full of garbage.
     However,  IBM is not going to change these things without telling you,  and
     you should avoid changing them yourself and  should do it very carefully if
     you must.	 The only time IBM is likely to make such a change is going from
     release to release.   When they have to  do this,	they generally give us a
     compatibility PTF	to change the old  system's control blocks to  look like
     those for the new.   When you build a nucleus to install such a PTF, do not
     shut down the previous system with the new DMKCKP.   And, in general, never
     shut down a  system with a DMKCKP	from another release,  whether	or not a
     compatibility PTF has been applied.  A cold start is the best thing that is
     going to happen to you if you  try that.	Again,	I speak from experience.
     If you have installed a new release and  things are going so badly that you
     are unable to shut down before you back  out to the old release,  hit stop,
     clear memory, and then IPL the old nucleus and do a CKPT start.


									 PAGE 48

     The  other thing  which may  make a  new  DMKCKP incompatible  with an  old
     nucleus is the fact that CKP must be able to use various control blocks and
     system service routines.	If it can't find them,	it won't be able to shut
     your system down correctly.   Of course, the offsets to these things may be
     different from one nucleus to the next, since the length of various nucleus
     modules may have been changed by new service or mods.  So, the new CKP must
     be able to find the things it needs in the old nucleus without using VCONs.
     The way it does this is to use  the pointer ARSPPR,  which is always at the
     same location in page zero, to lead it to a list of VCONs in DMKRSP.   This
     list contains all the external references that DMKCKP needs.  And since the
     list is part of the old system,  it  shows CKP where those items are in the
     old nucleus that it is trying to shut down.  This mechanism works perfectly
     well until somebody breaks it -- either you or IBM.   If you modify DMKCKP,
     be sure that your mods don't add any EXTRN statements to CKP.   If you need
     a new external reference,	add it to the end of that list in RSP.	 IBM has
     been known to break this mechanism itself	on a number of occasions,  so if
     they ever	ask you  to fixtest a  fix to DMKCKP  which introduces	an EXTRN
     statement,  protest vigorously.   SP,  as released,  has two such EXTRNs in
     CKP,  one for DMKRIOCN  and one for DMKSYSFL.   These have  caused a lot of
     systems not  to shut down reliably.    There is a fix  available,	VM15048,
     which adds  those EXTRNs to  the end of  the list in  RSP and fixes  CKP to
     refer  to them  through  that  list rather  than  through	its own  EXTRNs.
     Caution is required when installing such a fix, however.  Assuming that you
     are operating in  a mode of installing  your new nuclei on  the sysres with
     the system running,  such a fix or  mod should be applied over two separate
     IPLs.  You should first build and install a nucleus which adds the items to
     the end of the list in RSP and then later build and install a nucleus which
     changes CKP to expect to find the new items in the list.

     Another caveat:   if you increase your V=R size,  don't shut the old system
     down with the new DMKCKP.	 During SHUTDOWN,   CKP is loaded into memory at
     X'800' bytes beyond the end of the V=R region specified in the new nucleus.
     You risk either overlaying CKP on top of service routines that it needs (if
     you make the V=R region a little bigger) or overlaying it on top of SFBLOKs
     in free storage (if you make the V=R much larger).

     One of  the other perils of  SHUTDOWN is simply  that it is so  buggy.   In
     fact,  the whole  SHUTDOWN/WARM START/CKPT START subsystem is  just full of
     bugs,  especially in I/O error recovery.	The VM community is subjected to
     altogether too many cold starts as a  result.   The bugs stay there because
     IBM provides  us with no  means of  diagnosing problems in  this subsystem.
     When there is a failure in shutting down or starting up,  CP is too sick to
     take  a dump  of itself.	 IBM doesn't  provide  its VM  customers with  a
     standalone dump facility, so it gets very few dumps of shutdown and startup
     failures.	 If you begin seeing failures of  this subsystem,  I urge you to
     get hold of a  standalone dump program from one of the  other SCPs and take
     dumps and report the problems to IBM.


									 PAGE 49

			  VII. Maintaining Multiple Systems


     A. A Test System

     A situation you are likely to run into  sooner or later is one in which you
     have a fix  from IBM assembled on your  A-disk and you are  not yet through
     testing  it,  but	you  suddenly  have to	build  a  new production  system
     immediately because of some hardware change  they forgot to tell you about.
     Or,  it might instead be a local mod that you are not yet ready to install.
     Either way,  getting  your A-disk back to	where it was before  you started
     playing around with that new piece of code, so you can go ahead and build a
     new production system, is a process which can very easily go awry.  This is
     why many people keep "accepted" local mods and locally-applied service on a
     disk accessed after the A-disk  and keep only the volatile stuff  on the A-
     disk.   Another tip here  is that whenever you are about  to do an assembly
     which will end up	replacing a textfile on your A-disk,  it  is a very good
     practice to first rename the old textfile:

      rename dmkiot txtptfs a = oldptfs a

     It doesn't take up much disk space, and you may want it tomorrow.

     A more general solution is to maintain two systems, a production system and
     a test system.   To do this,  you use the same minidisk layout we have been
     talking about, but you add a new control file:

     FILE: DMKSPTST CNTRL

      TEXT MACS DKTSTMAC DKLCLMAC DKPTFMAC DMKSP DMKMAC DMSSP CMSLIB OSMACRO
      TST  AUXTST
      LCL  AUXLCL
      PTFS AUXPTFS
      TEXT AUXSP12
      TEXT AUXSP11
      TEXT AUXSP

     The only differences here are that we  have added DKTSTMAC at the beginning
     of  the maclib  list and  we have	added the  statement TST  AUXTST as  the
     highest-level update  specification.   Then,  when  you get  a questionable
     "fixtest" from IBM,   you list it,  not  in an AUXPTFS auxfile,   but in an
     AUXTST auxfile:

     FILE: DMKDSP AUXTST A1

      *$*$*$*$*$*$*$*$*$*$*$*$*$*$*$*$ AUXTST $*$*$*$*$*$*$*$*$*$*$*$*$*$*$*$
      S13025DK - 11/04/81 - FIXTEST FOR TAPE I/O COMPLETING AFTER LOGOFF


									 PAGE 50

     You treat questionable new mods the same way.   You specify DMKSPTST as the
     control file when you assemble the module,  so that VMFASM will pick up the
     update from the AUXTST auxfile and build  you a TXTTST textfile.	When you
     invoke VMFLOAD,  you specify DMKSPTST as the  control file,  and you end up
     with  a CP  nucleus that  incorporates any  TXTTST textfiles  you may  have
     sitting  around.	And  you are  in a  position of  being able  to build  a
     production system on a moment's notice by using your DMKSPLCL control file,
     so that you don't pick up any of the test versions of textfiles.

     There is another use for the test	control file and TXTTST textfiles.   You
     may want  to have permanently  different versions	of some modules  in your
     test system, particularly if you test by running CP under CP.  You may want
     to use a different version of DMKSYS in your test system, for example.   In
     this case,  you should build yourself an update which modifies your regular
     DMKSYS:

     FILE: DMKSYS VIRTCP0 A1

      ./ R 5000 9000 $ 5100 100 				      VIRTCP0
	       SYSOWN VMR901,VMM911,VMM913,VMM916,VMM917	      VIRTCP0
      ./ R 11000 12000 $ 11100 100				      VIRTCP0
	       SYSRES  SYSVOL=VMR901,SYSRES=844,SYSTYPE=3350,	      VIRTCP0*
		     SYSCKP=2,SYSWRM=3,SYSNUC=4,SYSERR=6,	      VIRTCP0*
      ./ R 17000 $ 17100 100					      VIRTCP0
	       SYSCOR  RMSIZE=4M				      VIRTCP0

     You should list this update in a DMKSYS AUXTST auxfile:

     FILE: DMKSYS AUXTST A1

      *$*$*$*$*$*$*$*$*$*$*$*$*$*$*$*$ AUXTST $*$*$*$*$*$*$*$*$*$*$*$*$*$*$*$
      VIRTCP0 - 05/30/79 - DEFINE TEST SYSTEM 'SYSOWN', 'SYSCOR', AND 'SYSRES'

     And you should use  VMFASM with the DMKSPTST control file	to create DMKSYS
     TXTTST.

      vmfasm dmksys dmksptst

     Note that	if your production DMKSYS  textfile is named DMKSYS  TEXT,  then
     VMFASM just erased it for you.


									 PAGE 51

     B. The FRE013 Trap

     One piece of code that you should definitely have in your test system, even
     if you do not have it in your production system, is the "FRE013 trap".  The
     FRE013 trap (or the "FRE018 trap", as the AP/MP version is known)	is a mod
     to DMKFRE which validates allocation and de-allocation of blocks of CP free
     storage.	The trap abends  CP with a FRE013 abend if a  CP module tries to
     return a block that is larger or smaller than the block that was originally
     gotten or	if a CP  module tries to  return a  block that has  already been
     returned.	 It also abends if the two-doubleword  marker that it put at the
     end of the block has been overlaid;  this is a good way to catch a function
     that is overwriting memory.  In the majority of the cases in which the trap
     takes your system down, your system would have crashed very obscurely a few
     seconds later anyhow,  so having the trap there just gets you a dump nearer
     the time of the error.  The trap also marks each piece of free storage that
     is given out with	its length and the address from  which it was requested.
     When a  block is returned,   this marker is  altered to reflect  that fact.
     Without this trap or a similar one on your system,  it is almost impossible
     to shoot "core cancer" bugs.

     You get the  FRE013 trap by phoning  the Support Center and  asking them to
     queue a request  for the "free trap"  to Level Two.   You	should seriously
     consider running  this trap in your  production system.   My  impression is
     that most	of the old  users use it all  the time.   The  arguments against
     using it in your production system are that it uses some extra cycles (less
     than one  per cent  in my system),   that it uses	some real  memory (about
     thirty pages in my 150-user system),  and that,  if you have a machine with
     the ECPS microcode,  it  turns off a portion of that  microcode.	It makes
     debugging CP a whole lot easier,  though,	so you are likely to have a more
     stable system if you use it.  If the trap's memory utilization is a problem
     for you, you can modify it to add only one doubleword to each block, rather
     than two.	 If its CPU utilization is a problem for you,  you can modify it
     not to set each new block to X'EE's.   These two mods and a current version
     (February,  1982)	of the FRE013 trap for SP are included in an appendix in
     the handout.

     A note of	warning:  If you install the  FRE013 trap on a	system which has
     ECPS,  be sure  to make the additional  changes documented in the	trap for
     ECPS systems.   If you do not,  the results are predictable.   I speak from
     experience.

     If you decide to run the FRE013 trap  only in your test system,  the way to
     do it is to key in the trap and name it DMKFRE FRE013 (or some such),  list
     that  filetype in	a  DMKFRE AUXTST  auxfile,  and  build	a DMKFRE  TXTTST
     textfile,	using VMFASM with the DMKSPTST control file.   Then,  of course,
     you use that control file with VMFLOAD when you build your test system.


									 PAGE 52

     C. Systems for Multiple CPUs

     Things are going along pretty smoothly for you now, until one day your boss
     comes in and  tells you that they are  so pleased with your  work that they
     are going to give you another VM  system to maintain.   Don't despair.   In
     VM, it is not much harder to maintain two systems than one, and you can use
     one set of  service disks to maintain  the systems for any  number of CPUs.
     The CPUs can be a mix of UPs  and dyadics and whatever.   They can all have
     different I/O configurations and different logos and anything else you want
     to be different.  Maintaining systems for two CPUs is just like maintaining
     one system for production	and one system for testing.   All  it takes is a
     different control file for each CPU.   With  a unique control file for each
     CPU,  you will be able to tell  VMFASM to produce unique textfiles for each
     CPU, where that is required, as, for example, DMKRIO.  And you will be able
     to tell VMFLOAD to build a unique	nucleus for each CPU,  incorporating the
     appropriate textfiles.  I will illustrate with my own configuration.   I am
     currently maintaining three systems (a 3033, a 4341,  and a 4331)	with one
     set of service disks.  To do this, I use three control files:

     FILE: DMKSPPU CNTRL A1

      TEXT MACS PUMAC PTFMAC DMKSP DMKMAC DMSSP CMSLIB OSMACRO
      3033 AUX3033
      PU   AUXPU
      PTFS AUXPTFS
      TEXT AUXSP11
      TEXT AUXSP

     FILE: DMKSP41 CNTRL A1

      TEXT MACS PUMAC PTFMAC DMKSP DMKMAC DMSSP CMSLIB OSMACRO
      4341 AUX4341
      DIST AUXDIST
      PU   AUXPU
      PTFS AUXPTFS
      TEXT AUXSP11
      TEXT AUXSP

     FILE: DMKSP31 CNTRL A1

      TEXT MACS PUMAC PTFMAC DMKSP DMKMAC DMSSP CMSLIB OSMACRO
      4331 AUX4331
      DIST AUXDIST
      PU   AUXPU
      PTFS AUXPTFS
      TEXT AUXSP11
      TEXT AUXSP

     You will  note that  these three control  files differ  mainly in	having a
     different highest-level update specification.   The different control files
     are used to assemble and load CPU-dependent modules for our three machines,
     DMKRIO,  DMKSYS,  DMKSNT,	DMKFCB,  DMKBOX (the module which defines the VM
     logo), and our local charging algorithm module, DMKPXJ.   So,  I have,  for
     example, DMKSNT TXT3033, DMKSNT TXT4341,  and DMKSNT TXT4331 on my MAINT A-


									 PAGE 53

     disk.    The other  difference  between the  control  files  for the  three
     machines is that the control files  for the two distributed systems contain
     an  additional update  specification,  "DIST  AUXDIST",  which  is used  to
     specify a number of local mods that we have found necessary to install only
     on our distributed systems.   These mods are mostly fixes to make it easier
     to run an unattended  system -- little things like not  letting DMKDID fill
     up  all of  memory with  messages about  intervention being  required on  a
     printer.

     You  may  find yourself  getting  carried	away  with making  your  systems
     different from one another,   because it is so easy to  do.   You'll end up
     confusing both yourself and  your users,  though,	so try to  keep it under
     control.  But, if you have multiple CPUs, you must be prepared to have some
     differences  between them.    For	example,  I  have  found  myself in  the
     situation of badly needing a certain PTF on  the 4331 and not being able to
     install that  PTF on the  3033 because it broke  a function that  was being
     used only	on the 3033.	In that case,	I commented  the PTF out  of the
     AUXSP11 auxfiles and listed it in AUX4331	auxfiles,  until I could get the
     problem it caused on the 3033 straightened out.

     Many of us have  concluded that the cleanest way to  build different sysgen
     modules for different CPUs is to build a skeleton ASSEMBLE file,  like this
     DMKRIO ASSEMBLE file:

     FILE: DMKRIO ASSEMBLE A1

      RIO      TITLE 'DMKRIO - PRINCETON UNIVERSITY: VM/SP RELEASE 1'
	       COPY  OPTIONS
      DMKRIO   CSECT
	       END   DMKRIO

     and to  build a large update  to this file  for each of our  CPUs,  listing
     these  updates in	the  CPU-specific auxfiles,   of  course.    One of  the
     advantages to this approach is that you don't end up with a DMKRIO TEXT for
     VMFASM to erase behind your back, but, rather, in my case,  DMKRIO TXT3033,
     DMKRIO TXT4341, and DMKRIO TXT4331.

     Another tip given to me by a friend  who maintains systems for many CPUs is
     that he finds it useful to rearrange his loadlist so that the CPU-dependent
     resident modules  are located  at the end	of the	resident portion  of the
     loadlist, just before DMKCPE.  This has the advantage of making most of the
     module addresses the same for all of his systems (modulo any differences in
     V=R size, of course).


     D. Maintaining Distributed Systems

     Since I mentioned unattended,  distributed systems  above,  this might be a
     good place  to go into  what I've	learned about maintaining  such systems.
     When your boss tells you he's giving  you a distributed system,  be sure to
     let him know  he's also got to give  you a terminal which	will access that
     system.   Even if the system is only a  block away,  you can waste an awful
     lot of  time running  back and  forth through  the rain  otherwise.   (It's
     always raining when you  have to run back and forth.)    We use PASSTHRU to


									 PAGE 54

     access one of our distributed systems and a locally-attached 3270 on a coax
     through a trench  to access the other.   Response is  certainly better with
     the locally-attached tube,  but either  mechanism seems to be satisfactory,
     except for  the fact that	in neither case can  I access the  remote system
     from my home terminal (a TTY).  Your management should realize that if they
     care at all about uptime on any of the systems for which you are the system
     janitor,  then they must provide you with access to those systems from your
     home.

		      +---------------------------------------+
		      | 	 RULE NUMBER ELEVEN	      |
		      +---------------------------------------+
		      |  YOU ARE ENTITLED TO A HOME TERMINAL  |
		      +---------------------------------------+

     Your  management  should	also  understand  that	proper	 maintenance  of
     distributed systems  requires powerful enough communications  facilities to
     allow you	to ship  new CP  and CMS  systems down	the line  to the  remote
     systems and to transfer dumps,  monitor data,  and accounting data from the
     remote locations to your central site.   I have one friend who has had such
     severe  problems with  the reliability  of communications	with his  remote
     systems that he  has been forced to  keep complete sets of  CP textfiles at
     the remote locations  so that new nuclei  can be built there,   but I don't
     think that he would recommend that mode  of operation if it can be avoided.
     It's easier to  keep all your service  disks at the central  site.   If you
     ordinarily install  your CP  systems by IPLing  a tape  and if  your remote
     sites have  real operators  and real  tape drives,   then you  may find  it
     satisfactory to distribute new systems by mailing tapes around.  Otherwise,
     you'll probably find downloading new systems to be much better.

     You'll almost certainly want to have  the capability to read dumps remotely
     (most likely via PASSTHRU and IPCS),  but	you may still find it convenient
     to be  able to  transfer dumps to	the central site  for archiving  and for
     mailing to IBM, or just to get better dump viewing performance.

     One  annoying  little  problem  with  installing	new  CP  systems  on  an
     unattended,  distributed processor is that IBM  provides you with no way to
     IPL the new nucleus once you get it installed on the remote sysres.  Either
     you must wait for the system to crash,  in which case it will automatically
     re-IPL itself, or you must arrange for some human being to go to the remote
     site to do a SHUTDOWN and re-IPL.	 A number of installations have modified
     SHUTDOWN to add a REIPL option,  which  allows them to shut a remote system
     down and have it bring itself back up just as it would after a crash.  Some
     of the rest of  us just crash our remote systems on purpose  to get the new
     nucleus IPLed.  One easy way to do this is:

      stcp s7f 01

     That puts an odd  address into the I/O NEW PSW.   It  seldom lasts for long
     after that.   There are some among us,   however,	who feel that it is more
     elegant to crash ones system by storing into the SVC NEW PSW.


									 PAGE 55

	      VIII. The Differences Between CMS Service and CP Service


     At long last, we come to CMS.   CMS service is done the same way CP service
     is done, but,  because CMS has a more complex structure than CP has,  there
     are a few additional tasks for you to master.  Specifically, you must learn
     to build the  CMS system disks (the  "S-disk" and the "Y-disk");	you must
     learn to build the CMS saved systems;  and  you must learn to build the CMS
     MODULE files.


     A. CMS Macro Update and Auxfile Names

     There is also one minor difference from CP  which I will tell you about now
     before I forget about  it.   The auxfile and update names	for fixes to CMS
     macros and  copy sections	do not	follow the  standard rules.    For VM/SP
     Release 1,  the CMS macro updates	have filetypes of EnnnnnDS,  rather than
     SnnnnnDS,	as you	would expect,  and the macro auxfiles  are named AUXMSP,
     rather than AUXSP.   Therefore,  you must	use a different control file for
     updating  CMS macros  and	copy  sections than  you  use  for updating  CMS
     ASSEMBLE files.  The one IBM supplies for updating the SP1 CMS macros is:

     FILE: DMSMSP CNTRL S2

      TEXT MACS
      TEXT AUXMSP12
      TEXT AUXMSP11
      TEXT AUXMSP

     The  reason it  is done  this way	is  that two  CMS macros  have the  same
     filenames as CMS ASSEMBLE files,  and that wouldn't work if the updates and
     auxfiles had  the same filetypes  for both macros	and source.   This  is a
     totally unnecessary  complication,  which the  developers really  should do
     something about.	It can be a real  gotcha,  because when you want to find
     out what  parts of  CMS were hit  by APAR	VM12345,  it's so  easy to  do a
     LISTFILE on * S12345DS and to forget also to do a LISTFILE on * E12345DS.


     B. Another Maxim

     This also seems like a good time for another maxim:

			+-----------------------------------+
			|	 RULE NUMBER TWELVE	    |
			+-----------------------------------+
			|  CHANGE ONLY ONE THING AT A TIME  |
			+-----------------------------------+

     Most new users seem  to have been told that the right way	to do VM service
     is to apply service to all the components at once.  Slap up the PUT and let
     VMSERV go wild.   The old users,  however,  make a point of not doing that.
     We NEVER install new  versions of CP and CMS at the  same time,  because if
     you do them  one at at time,  it is  easier to track down the  bugs,  it is
     easier to back out, and it is just plain easier.	Furthermore,  many of us


									 PAGE 56

     prefer  to make  both  old-release and  new-release  CMS systems  available
     simultaneously during a transition period.

     For years,  IBM has been telling us that we MUST install new releases of CP
     and CMS simultaneously, and for years we have been refusing to do so.   So,
     it's been left  to the user community  to prepare and distribute  the fixes
     necessary to run  a new CMS under an  old CP and vice  versa.   You'll find
     that VMSHARE will provide	you with a lot of guidance  in this area.   Even
     though it may involve your applying mods to your system, I still advise you
     not to install new releases of CP and CMS simultaneously on a system of any
     complexity.   You may,  of course,  need to install a new CP nucleus with a
     new DMKSNT when you install a new CMS, but you can plan ahead so that there
     is nothing else new in that CP nucleus.	It's a shame to have to back out
     of a new CMS because of some unrelated  glitch in CP.   A corollary to this
     rule suggests that  you will be better  off keeping your service  disks for
     various components separate,  i.e.,  don't put CP and CMS fixes on the same
     disk.   Incidentally,  it appears that SP1 and SP2 CMS and CP mix much more
     easily than  has been the	case with previous new	releases;  IBM is  to be
     congratulated for this.


     C. CMS Structure

     CP has an extremely simple structure.   With only a few exceptions*, all CP
     modules are part  of the CP nucleus,   and the CP nucleus	has the simplest
     possible structure -- a straight line --  as described by the CP loadlists.
     CMS has a more complex structure than CP.	Many CMS modules are included in
     the CMS  nucleus,	which is described  by the CMS loadlist,   CMSLOAD EXEC.
     When you IPL the  CMS nucleus,  however,  you do not bring  all of CMS into
     memory,  because not all of CMS is in the CMS nucleus.   The portions which
     are not in the nucleus are in the form of MODULE files and textfiles, which
     are disk-resident.   The disk  that they reside on is the	CMS system disk,
     the S-disk, which is normally at virtual address 190 for a CMS user.   When
     you are using  CMS and you invoke a  CMS function which is not  part of the
     CMS nucleus,  the appropriate module is  loaded into memory from the S-disk
     and is then executed.

     However,  if you had a lot of users bringing copies of the same CMS nucleus
     and the same CMS disk-resident modules into their own virtual memories, you
     would need a  lot of real memory  to hold all that  virtual memory.   Since
     much of the code in CMS is re-entrant,   there is no reason why one copy of
     it could not be shared by many users.    That is what the CMS saved systems
     are for.	They allow named copies of  the re-entrant portions of CMS to be
     stored on	CP-owned volumes so  that they can be  loaded into memory  to be
     used by many users at once.   Furthermore,  they are loaded by efficient CP
     paging I/O,  so there is an advantage to  using saved systems even for non-

				--------------------

     * A few CP modules (DMKDDR, DMKDIR, DMKFMT, DMKLD00E,  and DMKRND)  are not
     part of the CP nucleus.  Instead, they are used in the form of "standalone"
     utilities which you can IPL in either  a virtual machine or a bare machine.
     Some of them (with the notable and  annoying exception of DMKFMT)	are also
     available in the form of MODULE files which execute under CMS.


									 PAGE 57

     sharable code.   Thus, your CMS user doesn't ordinarily IPL 190 to bring in
     the CMS nucleus; instead, he IPLs a saved CMS nucleus, which you have built
     and named "CMS".	This saved CMS nucleus	contains two segments,	0 and 1.
     Segment 0 is not shared between users, but segment 1 is.  You may also have
     built two	other saved  systems,  the  CMS "shared  segments",  CMSSEG  and
     CMSZER.   CMSSEG contains much of the S-disk-resident CMS code, such as the
     editors and OS  simulation.   CMSZER contains sharable code  which is moved
     from segment zero of the nucleus,	plus the file directories for the S-disk
     and the Y-disk,  which are known as  the "SSTAT" and the "YSTAT".	 The CMS
     nucleus knows how to load these shared  segments and will use them,  rather
     than  the S-disk-resident	code,  as  long as  the segments  exist and  are
     defined  as  having virtual  memory  locations  beyond the  user's  virtual
     machine size.   You don't have to have saved systems to run CMS, but if you
     intend to have more than  one CMS user at a time,	it's a	good idea,  so I
     will be assuming the use of the CMS saved systems.

     There are usually	a good many functions  available to CMS users  which are
     not,  strictly  speaking,	a part of  CMS,  as,  for example,   the various
     language processors.    These are	ordinarily resident  on the  CMS Y-disk,
     which is defined at address 19E for each of your CMS users.   IBM and other
     software vendors are slowly coming around	to designing compilers and other
     big packages to run in "shared segments" similar to CMSSEG and CMSZER.  So,
     it may be	that much of your  Y-disk-resident code can also  be executed in
     the form of shared segments.   This is an	area where you will find lots of
     user mods, too, because the performance benefits are quite noticeable.

     One  of the  things that  make the  S-disk  and the  Y-disk different  from
     regular CMS user-type disks is that only  the mode 2 files are visible when
     those disks are accessed as S and Y.    This is achieved by building the S-
     disk  and Y-disk  file  directories with  the  equivalent	of the	commands
     ACCESS 190 S/S * * S2  and   ACCESS 19E Y/S * * Y2.    This  is   done  for
     performance reasons;  smaller file directories  can be scanned more quickly
     and require less memory.	There are lots of mode	1 files on the S- and Y-
     disks, but the general CMS user doesn't need to see them.	The mode 1 files
     are such  things as  textfiles which  the user  doesn't reference	directly
     because he  instead uses the MODULE  files into which those  textfiles have
     been "link-edited".  In other words, the mode 1 files on the S- and Y-disks
     are on those disks  because they are needed to build  CMS and the compilers
     and so forth,   but they are stored  invisibly,  as mode 1  files,  because
     nobody should ever want to use them.   But  you need those mode 1 files for
     doing CMS maintenance,  so you will  ordinarily have the S-disk accessed at
     another  mode,   so that  you  can  "see"	the  mode 1  files.    You  will
     occasionally want a similar access to the Y-disk.

     Another  unusual property	of  the  S- and  Y-disks  is  that they  contain
     "auxiliary directories".	Auxiliary directories are another way of keeping
     the users'  S- and  Y-disk directories small.    An auxiliary  directory is
     contained in a mode 2 file,  such as ASSEMBLE MODULE S2.	It points to the
     disk location  of a bunch	of mode 1 files  needed only by  that particular
     function, as the assembler MODULEs, in this case.	 When the user invokes a
     function which  uses an  auxiliary directory,   the auxiliary  directory is
     appended to the main directory in memory,	but only for the duration of the
     command.  Ordinarily, the only auxiliary directory on the S-disk is the one
     for the assembler.   There may be several on the Y-disk, depending on which


									 PAGE 58

     language processors you have.   The  existence of the auxiliary directories
     makes copying your  S- and Y-disks a  bit tricky.	 If you  use COPYFILE to
     copy your S-disk to a new location,  for example,	you will need to rebuild
     the assembler's  auxiliary directory,   because the  relative addresses  of
     those mode 1 files that the  assembler auxiliary directory knows about will
     tend to be different on the new disk.  The same would hold for copying your
     Y-disk with COPYFILE,  of course.	 The GENDIRT command is used to build an
     auxiliary directory; it's not hard to do, but it is hard to remember to do.
     If you  copy your	entire S- or  Y-disk with DDR  COPY ALL,   the auxiliary
     directories do not have to be rebuilt,  because all of the files on the new
     disk will	have the same  relative address that they  had on the  old disk.
     (However, it's a good thing to compress your system disks now and then,  to
     reduce head movement, so it's worth doing the GENDIRTs now and then.)

     You need to understand the structure of  the S-disk,  so that you can build
     yourself a new one from scratch when you need to.	 For the most part,  the
     S-disk is just another CMS-format disk,  but it has to be able to be IPLed,
     so it has IPL text at the beginning  and the CMS nucleus at the end.   When
     you build a CMS nucleus, you normally specify that there should be IPL text
     written on cylinder/block zero of the S-disk to point to the cylinder/block
     at which the nucleus begins.   When your users IPL 190,  this cylinder-zero
     IPL text is loaded, and then it loads the actual CMS nucleus.  When you get
     yourself a new S-disk, you CMS FORMAT it and then you use the RECOMP option
     of FORMAT to decrease the apparent size of the disk.  The space left at the
     end is  where the CMS  nucleus is kept.   RECOMPing  the size to  below the
     nucleus prevents  regular files from  overlaying the nucleus.    You should
     look in  the sysgen manual and  the PUT Memo to  Users to find out  how big
     your S-disk should be and how much room you should leave at the end for the
     nucleus.  You should  also be  aware of  a bizarre  restriction for  FBA S-
     disks:   the nucleus  must begin on an  FBA block whose block  number is an
     even multiple of 256 (counting from the  beginning of the S-disk,	not from
     the beginning of the physical volume).

     I	recently learned  a neat  trick from  one  of the  CMS old-timers.    He
     maintains a  rather volatile  CMS system and  has found  it useful  to have
     alternate CMS nuclei,   similar to the alternate CP nuclei  we talked about
     earlier.  Of course, not all of CMS is contained in the CMS nucleus, so you
     don't back all the way out of a bad CMS by IPLing an alternate CMS nucleus,
     but,  if you've done something really disastrous to CMS,  it's likely to be
     something in  the nucleus that's wrong,   so that alternate nucleus  may be
     quite valuable.   What my friend does is quite simple; putting an alternate
     nucleus on his S-disk requires no mods at all.   He allocates his S-disk so
     that it is big enough to hold the extra nucleus.  He RECOMPs enough room at
     the end for two nuclei, rather than one.	He builds his public, production
     nucleus in the standard way,  in one  of the two nucleus slots,  specifying
     that the  cylinder-zero IPL text  should point to	it,  so that  anyone who
     simply IPLs  190 gets that CMS  nucleus.	He builds his  reliable,  backup
     nucleus in the other slot,  but replies  that he doesn't want the cylinder-
     zero IPL  text rewritten,	thus leaving  it pointing to the  other nucleus.
     But, if it turns out that he needs to IPL the backup nucleus,  he can issue
     an IPL command which specifies the cylinder/block which is to be IPLed (the
     one where the backup nucleus starts), as, for example, "IPL 190 43".


									 PAGE 59

     D. Recommended Control Files and Service Minidisks for CMS

     I will be using these control files for CMS:

     FILE: DMSSPLCL CNTRL A1

      TEXT MACS DSLCLMAC DSPTFMAC DMSSP CMSLIB OSMACRO DOSMACRO TSOMAC
      TEXT AUXLCL
      TEXT AUXPTFS
      TEXT AUXSP12
      TEXT AUXSP11
      TEXT AUXSP

     FILE: LCLMAC CNTRL A1

      TEXT MACS
      TEXT AUXMLCL
      TEXT AUXMPTFS
      TEXT AUXMSP12
      TEXT AUXMSP11
      TEXT AUXMSP

     As you can  see,  they differ from  the IBM-supplied control files  only in
     specifying  auxfiles and  maclibs to  contain  locally-applied service  and
     local mods.

     Since the	CMS system  disk,  the S-disk,	 traditionally contains  all CMS
     textfiles and  MODULEs,  even the old  users generally give in  and overlay
     local mods on top of service on top of base on the S-disk.  They compensate
     for the uncleanness of this by  keeping alternate S-disks to flip-flop from
     PUT to PUT.    (If they modify CMS much,	they tend also to  keep around a
     totally unmodified S-disk,  at the current PUT level,  for deciding whether
     it's their bug or	IBM's.)   IBM's VMSERV EXEC is designed  to allow you to
     install CMS  service without  having an alternate	S-disk.   If  you cannot
     afford a second S-disk,  then I suggest  that you use VMSERV to install CMS
     service during dedicated  test time.   I also  suggest that you pray  a lot
     while you are doing it.  You will be running CMS from your S-disk while you
     are writing the new service onto that  S-disk.   If you get a machine check
     or a  power failure or  a bug in  VMSERV while you  are doing this,   it is
     likely to leave  you without a usable  S-disk,  which is the  same as being
     without a system at all.  This brings up my next-to-the-last rule:

		      +---------------------------------------+
		      | 	RULE NUMBER THIRTEEN	      |
		      +---------------------------------------+
		      |  YOU CAN NEVER HAVE TOO MANY S-DISKS  |
		      +---------------------------------------+

     If you  have only	one S-disk,   you are  going to  have to  have a  lot of
     dedicated test time  for installing CMS service and new  releases.   If you
     have two S-disks,	you can put a new version of CMS into production by just
     taking CP down and  bringing it back up with a  different DMKSNT.	 You are
     made much	less vulnerable to having  an installation problem cause  a long
     outage,  and you can  have new versions of CMS available  for your users to


									 PAGE 60

     try out  in advance of  their being put into  production.	 I hope  you can
     convince your management that the sensible approach  is to let you have two
     S-disks.	If they won't let you have more than one,  be absolutely certain
     that you  have a  couple of  good DDR dumps  of your  S-disk and  a working
     version of an IPLable DDR, either on tape or on cards.

     For the rest of this discussion,  I am going to assume that you have two S-
     disks,  the production  version at address 190 in	MAINT's virtual machine,
     and the alternate one at address 490.   At any one time,  490 may be either
     an old CMS  system you may still  want to back out  to or a new  CMS system
     that you are not yet ready to put	into production.   As we did in the case
     of CP,  let's start  with the assumption that you are a  brand new user who
     has somehow got SP  CMS up and running.   This will  be the assumed service
     minidisk layout,	but what  I'll be  doing would	also work  with the  IBM
     minidisk layout as long as you have an alternate A-disk and an alternate S-
     disk:

	      +---------------------------+	  +---------------+
      391 A   | WORKAREA, LOCAL MODS AND  |   491 | ALTERNATE 391 |
	      | LOCALLY-APPLIED SERVICE   |	  |		  |
	      | (updates, auxfiles,	  |	  |		  |
	      | textfiles, maclibs)	  |	  |		  |
	      +---------------------------+	  +---------------+

	      +---------------------------+	  +---------------+
      394 C/A | CMS UPDATES, AUXFILES,	  |   494 | ALTERNATE 394 |
	      | AND NEW SOURCE FROM	  |	  |		  |
	      | THE CURRENT PUT 	  |	  |		  |
	      +---------------------------+	  +---------------+

	      +---------------------------+
      395 D/A | ASSEMBLE, COPY, AND MACRO |
	      | FILES FROM 1.1 BASE -or-  |
	      | CMS UPDATES, AUXFILES,	  |
	      | NEW SOURCE FROM PUT 8105  |
	      | AND ASSEMBLE, COPY, AND   |
	      | MACRO FILES FROM 1.0 BASE |
	      +---------------------------+

	      +---------------------------+	  +---------------+
      190 F/A | CMS TEXTFILES, MODULES,   |   490 | ALTERNATE 190 |
	      | AND EXECS		  |	  |		  |
	      +---------------------------+	  +---------------+

     Note that	the A-disk for	CMS service in this  example is at  address 391.
     The  service disks  for  the current  PUT	and for  the  base are	normally
     accessed as read-only extensions,	as is  the S-disk.   The virtual machine
     you use for doing CMS maintenance will  ordinarily have a write link to 190
     defined in its  directory entry,  but your PROFILE EXEC  should re-LINK 190
     read-only,  both to reduce the chances  of your inadvertently modifying the
     S-disk and also  to prevent your users  from receiving a message  about the
     LINK every time they log on when you're logged on.


									 PAGE 61

     Before we	go any	further,  I should  point out  that there  are hard-line
     purists among us who insist that most of the mode 1 files on the S-disk and
     the Y-disk should not  be there.	The quality of the  performance your CMS
     users get depends a lot on how quickly  they can load files from the system
     disks.   Obviously, the larger these disks are,  the greater is the average
     head  movement required  to service  a  user's requests  for system  files.
     There are some sophisticated installations which do run with S- and Y-disks
     from which most of the mode 1 files have been removed to the base, service,
     and local	mods disks,  as  with CP.   There are  people here who	run with
     5-cylinder  S-disks.   Implementing  such	a  departure from  the	standard
     configuration is beyond the scope of  this presentation,  but you should be
     aware of the possibility.

     You should certainly keep	in mind the desirability of keeping  your S- and
     Y-disks as small as possible and as  unfragmented as possible.   And,  as a
     general rule,   you should  be careful  not to  "pollute" your  S-disk with
     anything that is not  an integral part of CMS.   One good	move IBM made in
     VM/SP was to suggest that the EREP  libraries be removed from the S-disk to
     a separate disk at virtual address  201.	Since the EREP libraries account
     for about a fourth of the space required for the S-disk and tend to be used
     once a day by one userid, this recommendation made a lot of sense.  You may
     want to consider removing other functions too, e.g.,  the vanilla IPCS,  if
     you're using the program product,	or all of the DOS stuff,  if you can get
     away with it.   Also,  if your S-disk was built originally with either DISK
     LOAD or VMFPLC2  LOAD,  you will find that  copying it to a  TDISK and back
     again with  COPYFILE may reduce the  space used by several  hundred blocks.
     This is  because of lamentable  bugs in both  VMFPLC2 and DISK  which leave
     empty blocks at the ends of files.


									 PAGE 62

		      IX. Installing Corrective Service for CMS


     A. Regenerating a CMS Module

     You are sitting in your office one  day,  browsing through a new PUT bucket
     that just came in the mail,  when a  guy from down the hall sticks his head
     in  and tells  you  that  SSERV is  broken;   it  keeps getting  an  opcode
     exception.   If you are like me,  you tell him that that's too bad but that
     you have never heard of SSERV.   Then he tells you that it's part of CMS, a
     really neat DOS  utility.	 You tell him  you'll get right on  the problem.
     After you look up SSERV to find out what it does, you decide to take a look
     at that new bucket before calling the  Support Center.   And there,  in the
     General  Information  section of  the  SPCMS  subset,   you find  an  exact
     description of the problem:

	     "THE SSERV MODULE AND THE DMSSRV TEXT ARE INCORRECT ON PUT
	     8107.  THERE IS AN MVC INSTRUCTION MISSING WHICH WILL CAUSE
	     A PROGRAM CHECK OPERATION EXCEPTION.
	     RECOMMENDATION: REASSEMBLE DMSSRV AND CREATE A NEW TEXT.
			     THEN PERFORM A CMSGEND SSERV TO CREATE A
			     NEW SSERV MODULE."

     Sounds like  they left  some debugging code  in,  doesn't	it?   This  is a
     typical packaging problem, and the fixup is typical,  too.   You don't even
     have to apply a PTF;  you just have to pick up the pieces and put them back
     together.	  The instructions  tell  you to  reassemble  DMSSRV.	That  is
     certainly easy enough:

      vmfasm dmssrv dmssplcl
      UPDATING 'DMSSRV ASSEMBLE D1'
      APPLYING 'DMSSRV S12530DS D1'
      ASMBLING DMSSRV
      ASSEMBLER (XF) DONE
      NO STATEMENTS FLAGGED IN THIS ASSEMBLY
      DMSSRV TEXT CREATED

     That gives you a file called DMSSRV  TEXT on your CMS service A-disk,  391.
     But what do you do then?	Well,  the bucket writer was nice enough to tell
     you.   He said to create a new SSERV  MODULE file by doing a CMSGEND SSERV.
     You type "CMSGEND SSERV", and you get a response indicating that CMSGEND is
     not a  known CP/CMS  command.   But,  I  happen to  know where  CMSGEND is,
     because I have gotten that message so many times.	 CMSGEND is an EXEC, and
     it lives on the  S-disk.	The reason you couldn't find it is  that it is a
     mode 1 file and you forgot about  accessing the S-disk at another mode,  so
     you can't see any of the mode 1 files.  IBM makes CMSGEND a mode 1 file for
     a good reason -- CMSGEND ordinarily needs	to pick up mode 1 textfiles from
     the S-disk in order to function properly;	keeping CMSGEND at mode 1 forces
     you to have the S-disk accessed properly  when you use it.   You don't need
     write access; you just need to access 190 as something other than S and try
     again:


									 PAGE 63

      access 190 f/a

      cmsgend sserv

      *** CURRENT STATUS:
      FILE ' SSERV MODULE A2 ' DOES NOT EXIST
      FILE ' SSERV MODOLD A1 ' DOES NOT EXIST
      *** LOADING:
       INVALID CARD - S12530DS 104 UV03791 MISSING STATEMENT IN SOURCE BOOK.
       INVALID CARD - * 	DMSSRV	 S12530DS D1 CMS495  02/17/81	16:10:00
       INVALID CARD - * 	DMSSP	 MACLIB   S2 CMS190   6/10/81	18:45:00
       INVALID CARD - * 	CMSLIB	 MACLIB   S2 CMS190   2/07/81	12:19:00
       INVALID CARD - * 	OSMACRO  MACLIB   S2 CMS190   3/18/81	13:32:56
       INVALID CARD - * 	DOSMACRO MACLIB   S2 CMS190   6/11/80	13:25:00
       INVALID CARD - * 	DMSSRV	 ASSEMBLE A1 CMS496   6/13/80	 7:51:00
       DMSSRV	SD 020000

      *** RESULTS:
      ' SSERV MODULE A2 ' CREATED FROM TEXT DECK ( S ) DMSSRV
      WITH ATTRIBUTES CLEAR NOMAP ALL
      R;

     You invoke CMSGEND, which invokes LOAD, which puts out messages complaining
     about all those comment cards in your  textfile,  but the MODULE gets built
     anyway.  (You could suppress the messages by specifying the NOINV option of
     CMSGEND,  but I prefer the security of seeing the messages.)   Now you have
     on your A-disk a  new SSERV MODULE which incorporates that  new DMSSRV TEXT
     from your A-disk.	 You  DISK DUMP the MODULE to the guy  down the hall and
     ask him to test it.  He does.   It works fine.   That's great, but the only
     places where the good version exists are on your A-disk and his A-disk,  so
     you are going to have to do something to make it generally available, i.e.,
     you must put it on the S-disk where everyone can find it.

     But before we get into that,  let's talk some more about CMSGEND.	 CMSGEND
     is a  very nice,  reliable  tool that understands	how to build  the MODULE
     files for	various CMS commands from  their constituent textfiles.    It is
     also used to build the MODULEs that are built from CP textfiles, e.g., DDR,
     DIRECT, etc.   When you use CMSGEND, you just tell it the module name.   It
     knows which  textfiles are needed	and what GENMOD  options to use  in each
     case and whether  or not the MODULE should  be generated to run  in the CMS
     transient area.   The CMSGEND EXEC is sort  of interesting to look at,  but
     you needn't bother to,  because you are quite safe in treating CMSGEND as a
     primitive.   The only problems I have ever had with CMSGEND were the result
     of its being so badly documented in the sysgen manual.


									 PAGE 64

     Some of what  the sysgen manual tells  you about CMSGEND is  both wrong and
     dangerous.  It tells you that to use CMSGEND you must access your S-disk as
     your read/write A-disk.   This is certainly  not true and not something you
     ever want to do when there is some  good way to avoid it.	 The manual goes
     on to  tell you that  if you want	to generate  GLORP MODULE from	a DMSGLP
     textfile that  is on  some disk other  than your  S-disk,	then  you should
     access your 190 as A, access the other disk as B/A,  temporarily rename the
     DMSGLP TEXT that is on the 190 to	something else (so CMSGEND will not find
     it  and will  use	your new  version instead),   and  then invoke	CMSGEND.
     CMSGEND will then erase GLORP MODOLD,  rename GLORP MODULE to GLORP MODOLD,
     and create a new GLORP MODULE, all on the 190.  Don't believe it!	That is,
     indeed,  what will happen if you take those steps,  but that is NOT the way
     to do  it.   As we  have seen,  CMSGEND  works perfectly well  without your
     having write access to the S-disk,  and  it is perfectly legitimate to want
     to build CMS  MODULEs from textfiles that	are not on an  S-disk.	 Indeed,
     that is  the best way to  test fixes to CMS  MODULEs,  as well as	fixes to
     DIRECT and DDR.

     There is,	however,   one important point about using CMSGEND  that did not
     come out in our very simple example of regenerating SSERV.  CMSGEND doesn't
     use a control file.   This means that  it doesn't know about textfiles that
     have filetypes of TXTLCL or TXTPTFS or  TXTTST or whatever.   It just knows
     about textfiles that  are named TEXT.   The DMSSRV textfile  we built above
     was named TEXT, so it all worked out,  but it would not have worked if that
     had been a DMSSRV TXTPTFS textfile.  This inability to use control files is
     unfortunately not a  problem just with CMSGEND;  it  occurs throughout CMS.
     The  textfiles which  are	incorporated into  MODULEs  must  be named  TEXT
     because CMSGEND doesn't understand control  files;  the textfiles which are
     incorporated into	the shared segments must  be named TEXT  because CMSXGEN
     and CMSZGEN don't understand control files; and the textfiles which sit out
     in the open  as mode 2 files on  the S-disk must be named	TEXT because CMS
     LOAD doesn't understand  control files.   Some CMS  nucleus textfiles could
     have filetypes other than	TEXT,  since the CMS nucleus is  built with good
     old VMFLOAD, but it is safer always to follow:

		   +---------------------------------------------+
		   |		RULE NUMBER FOURTEEN		 |
		   +---------------------------------------------+
		   |  IF IT'S CMS, YOU'VE GOT TO NAME IT 'TEXT'  |
		   +---------------------------------------------+

     This also holds for the CP textfiles for DMKDDR, DMKDIR, DMKFMT, etc., when
     you want to use them to build IPL decks or MODULEs.

     This is why all the update level  identifiers in my recommended CMS control
     files are TEXT.   This way, any time you assemble a CMS module, VMFASM will
     name the output TEXT,  rather than TXTPTFS or some such.	So,  you have to
     remember only thirteen rules,  not fourteen.   But,  if you are going to be
     modifying CMS a lot,   you might be better off to	use a more sophisticated
     control file and  keep the modified textfiles on your  A-disk named TXTPTFS
     and TXTLCL and TXTTST and so forth.   However, you will have to remember to
     rename them  when you  copy them  to the  S-disk or  when you  are building
     MODULEs on your A-disk.


									 PAGE 65

     B. Putting It on the S-disk (Or on the Y-disk)

     Now,  back to the question of getting the new DMSSRV TEXT and the new SSERV
     MODULE onto the S-disk.  One thing you should understand about changing the
     S-disk,  is that the S-disk directory is saved in both the CMS saved system
     and the CMSZER shared  segment,  so you must resave both  of those when you
     change  the  S-disk.    The  Y-disk directory  is	saved  only  in  CMSZER;
     therefore, you need not resave CMS when you change the Y-disk, but you must
     update the saved Y-disk directory in the CMSZER shared segment.

     Here are the steps you need to take  to put your new SSERV into production,
     starting with the new textfile and MODULE on your A-disk:

      link * 190 190 mr
      access 190 f

      rename dmssrv text f1 = oldtext f5
      copyfile dmssrv text a = = f1 ( olddate
      copyfile sserv module a = newmod f1 ( olddate
      rename sserv module f2 = oldmod f5
      rename sserv newmod f1 = module f2

      ipl 190 clear
      VM/SP CMS - 02/28/82 16:36
      savesys cms

      VM/SP CMS - 02/28/82 16:36
      Y (19E) R/O
      R;

      dmszes
      IS THE SHARED S-DISK DIRECTORY TO BE USED WITH THIS SYSTEM? YES|NO
      yes
      IS THE SHARED Y-DISK DIRECTORY TO BE USED WITH THIS SYSTEM? YES|NO
      yes
      SYSTEM SAVED
      R;

     You first get write access to 190.  You rename the old textfile on the 190,
     rather than erasing it, because you never know when you might want it.  But
     you make it mode 5,  so that the users can't see it and so you'll know that
     it's garbage which you can erase one of these days.  Remember that you want
     to avoid fragmentation  of the S- and Y-disks for	performance reasons,  so
     don't let the obsolete files accumulate  endlessly.   You copy over the new
     textfile, making it mode 1 (since that's what the old one was) and you copy
     over the new SSERV MODULE under a temporary name.	 Then you quickly rename
     the old  SSERV MODULE S2 to  SSERV OLDMOD S5  and rename the new  one SSERV
     MODULE S2.   You do an IPL 190,  which (unlike IPL CMS)  causes the nucleus
     SSTAT to be rebuilt.   You then immediately do a SAVESYS to rebuild the CMS
     saved  system,  incorporating  this new  SSTAT.   (You  enter that  SAVESYS
     command when CMS puts  up its first read,	not later,   because that is the
     state in which you want CMS saved.)  Once that is done,  you use the DMSZES
     command to resave the SSTAT and YSTAT  portions of CMSZER,  in order to get
     the SSTATs (the S-disk directories)  in CMSZER and CMS back into synch with


									 PAGE 66

     one another.  If the new file had been going onto the Y-disk, the procedure
     would have been the same, except that you would have skipped the SAVESYS.

     Be very careful, when you move something to the S- or Y-disks, to make sure
     you make it mode 1,  if it is supposed  to be mode 1,  and that you make it
     mode 2, if it is supposed to be mode 2.   If you make something mode 1 that
     is really supposed to be mode 2,  the users will get strange error messages
     and start	phoning you.	The easiest  way to  tell which  mode a  file is
     supposed to be is to look at the file it is going to replace.

     In this example,  I used the DMSZES  command to rebuild the SSTAT and YSTAT
     in CMSZER.   Even though only the S-disk was changed,  you must tell DMSZES
     that you want both the SSTAT and  the YSTAT rebuilt.   Contrary to what you
     might expect,  if you tell DMSZES to rebuild only the SSTAT (because you've
     changed only the S-disk),	it will wipe out the pointer to the CMSZER YSTAT
     when it  rebuilds the  SSTAT.   (There is	a recent  fix for  this problem,
     VM15270.)	 On the other  hand,  if you've changed only the  Y-disk and you
     tell DMSZES not to rebuild the SSTAT,  it exits without building either the
     SSTAT or the YSTAT.   The CMSZGEN EXEC  invokes DMSZES for you when you use
     it to build CMSZER.  So, another approach would have been simply to rebuild
     the entire CMSZER shared segment,	using the CMSZGEN EXEC,  but DMSZES is a
     bit faster and you don't have to  increase your virtual machine size to use
     it.  Note that when you use DMSZES, your virtual machine size must be small
     enough that CMSZER can be attached beyond	the end of your virtual machine,
     as it normally  is for a CMS  user;  however,  when you  use CMSZGEN,  your
     virtual machine size  must be large enough  that CMSZER can be  loaded into
     your virtual machine.

     You should be  aware of the fact  that the standard one-segment  CMSZER has
     room for only seven  hundred File Status Table entries.   If  you have more
     than a total of seven hundred mode 2 files on your S- and Y-disks, then you
     will overflow CMSZER,  which will cause you to get an obscure error message
     when you invoke DMSZES or CMSZGEN:

      DMSZES100W CMSZER SYSTEM NAME 'CMSZER' NOT INITIALIZED

     If this  happens,	you should  question whether  you really need  all those
     files on your system  disks.   If you do,	you can  redefine CMSZER in your
     DMKSNT to be two segments long.   This will give you room for an additional
     1024 mode 2 files.   (It may also mean that you have to change the location
     of your CMSSEG so that CMSSEG and CMSZER don't overlap in virtual memory.)


									 PAGE 67

     C. A Digression on the Subject of Updating a Production CMS System

     The first several times you go  through this operation,  you certainly want
     to do it with no other users logged onto your system using the S-disk.   In
     fact, you may want never to do it any other way.	This is an area in which
     there are many  schools of thought.   Some installations  take the position
     that it  is wrong ever  to change anything  about the production  CMS while
     there are users logged  on,  because the chances are so  good that you will
     interfere with their  use of the system.	 Others say you are  hurting the
     users more by taking the machine away from  them every time you need to put
     some little fix  on CMS.	A few  of the larger,  older  installations have
     solved  the  problem  by  means  of elaborate  local  mods  which	make  it
     completely safe for  them to update CMS  "on the fly".   (Perhaps	the most
     notable of these  mods are the ones that  Charlie Brown did when  he was at
     TYMSHARE.	I wish he had done them at IBM instead.)  Most of the rest of us
     take the position that we will change CMS on the fly when we have to, using
     the most  reliable mechanisms  that we can,   and that  when the  change is
     major,  we will  install it by flip-flopping our S-disks  and saved systems
     across a CP IPL.	In my examples, I am going to show you how to update CMS
     on the fly,   but I am not  necessarily recommending that you  should do it
     that way.	The same command sequences are reasonable to use even if you are
     the only one on the machine.

     The situation is this:  the users who are	logged on have access to 190 and
     19E  and have  the S-disk	and Y-disk  directories in  memory.   They  will
     continue to use those directories after you  change the disks,  so you must
     make sure that their directories remain  valid;  otherwise,  the users will
     get strange I/O error messages.   Their directories can "see" only the mode
     2 files on the S-	and Y-disks,  so you can change any of	the mode 1 files
     which are	not pointed to	by auxiliary  directories (except for  a problem
     with HELP, which I'll explain later).  You must not erase or replace a mode
     2 file, but you CAN change its name and mode, as long as you leave the file
     in the  place where the  old directory expects to	find it.   In  our SSERV
     example,  the only mode  2 file that is changed is  the SSERV MODULE.   You
     rename that to SSERV OLDMOD S5 and copy  over a new SSERV MODULE S2.   This
     allows the  users who  are already logged	on to continue	to use	that old
     version of SSERV.	  It still exists at  the old location,  and  their file
     directories still point to it.

     You will  recall that  the S-disk	directory (the	SSTAT)	is  kept in  two
     places.   The saved CMS system contains an  SSTAT in segment zero.   When a
     user IPLs CMS,  this SSTAT comes into  his virtual machine with the rest of
     the CMS nucleus.	CMS then tries to attach the CMSZER shared segment.   If
     that is successful and if you have saved  an SSTAT in CMSZER and if the two
     SSTATs match,  then  CMS releases the memory  used by the SSTAT  in nucleus
     segment zero and uses the shared SSTAT in CMSZER instead.


									 PAGE 68

     Getting back to our  example,  until you change the SSTAT	in the CMS saved
     system by doing the SAVESYS,  anyone who logs  on will still be able to use
     the saved SSTAT in CMSZER, which points to the old SSERV MODULE.	Once you
     do the SAVESYS, everyone who logs on or re-IPLs CMS will get the new S-disk
     directory in the new CMS saved system and, thus,  the new SSERV.	However,
     users who logon (or  re-IPL)  between the time that you  do the SAVESYS and
     the time  that you  do the  DMSZES to  update the	S-disk directory  in the
     CMSZER  shared segment  will have	two  S-disk directories  which will  not
     match.   CMS  initialization will notice this  and will not use  the shared
     directory in CMSZER.  It will also issue the error message:

      DMSINS100W CMSZER SYSTEM NAME 'CMSZER' SSTAT NOT AVAILABLE.

     (There is	a similar message  when you change  the Y-disk and  don't update
     CMSZER's YSTAT.)	 Users who  never notice  the most  urgent LOGMSGs  will
     notice this  message and  get upset.    So,  you  should resave  the shared
     directory as  quickly as possible.   One  little trick that will  speed the
     process up a bit is to stack the replies to DMSZES:

      dmszes#yes#yes

     The situation with changing the Y-disk  is slightly different.   The Y-disk
     directory is not saved  in the saved CMS system,  so every  time a CMS user
     logs on or re-IPLs CMS, he gets a new nucleus copy of the Y-disk directory,
     which is built from the Y-disk as it exists at that moment.   So, you might
     have a  problem with  someone who logs  on between the  time an  old Y-disk
     MODULE gets renamed to mode 1 and the  time the new mode 2 file is created.
     As far as this user can tell, there is no such file on the Y-disk,  because
     the copy of the  Y-disk directory in his nucleus doesn't  list such a file,
     since it lists only mode 2 files.	This is a hole that is simply there, and
     you cannot stop it up without modifying the system.  You can, however, make
     the hole as small as possible by doing the RENAMEs very quickly in an EXEC,
     rather than keying in the commands by hand.   This can still catch someone,
     of course, but the hole is rather small.

     Even  if you  don't  catch  someone that  way,   you  have the  problem  of
     DMSINS100W messages for the Y-disk too.  When a user logs on or re-IPLs CMS
     after you have changed the Y-disk,  but  before you have rebuilt the shared
     YSTAT in CMSZER,  he'll get that message  telling him that he can't use the
     shared version  of the YSTAT  because it doesn't  match the YSTAT	that has
     just been	built in his  CMS nucleus.   Because  there is no  saved nucleus
     version of  the Y-disk directory,	users  will start getting the  YSTAT NOT
     AVAILABLE message at  logon as soon as  you change the Y-disk.    This will
     continue until  you get  the DMSZES done  to get the  shared YSTAT  back in
     synch with the real volume.   So, you would be well advised to have an EXEC
     for updating the Y-disk.	Basically, your EXEC should copy the new file to
     the Y-disk under a temporary name,  then  rename the old file to OLDxxx Y5,
     rename the  new file to its  proper name and  mode 2,  release the  disk to
     rewrite the directory,  re-access	it to build a new YSTAT  in your nucleus
     (ACCESS 19E Y/S * * Y2), and then do the DMSZES, as above.


									 PAGE 69

     If you  were to take these  actions at a time  when there weren't a  lot of
     people logging on, it might be acceptable to have a few users get the SSTAT
     or YSTAT message and non-shared directories.  There is another, more severe
     problem with changing the S-disk,	however.    The users who were logged on
     before all this  started are still using  the old version of  the CMS saved
     system and the CMSZER SSTAT and YSTAT and will continue to do so until they
     re-IPL or log off.   If they use  the HELP facility,  they may have trouble
     because of the way the HELP files are accessed.  The HELP files are mode 1,
     not mode 2,  so they don't show up  in the saved directories,  but the HELP
     function uses the saved S-disk directory in the CMS nucleus or in CMSZER to
     point to the disk-resident directory for the disk,  so that it can find the
     mode 1  HELP files.   If you've  done anything to change  the disk-resident
     directory,  then  the memory-resident  directory may not  point to  a valid
     disk-resident directory.	 More precisely,  the  "disk origin  pointer" in
     virtual storage points to either record 4 or record 5 on the disk.   One of
     these two records	always points to the current directory	file;  the other
     points to	the previous directory file.	Each time the disk  directory is
     updated, the roles of records 4 and 5 are reversed.   So,	if your saved S-
     disk directory points to record 4 as the disk origin pointer,  and you make
     any change to the S-disk,	then record  5 will become the valid disk origin
     pointer,  but your  saved directory in virtual storage will  still point to
     record 4,	which will  point to the old directory.   There  is no guarantee
     that the old directory will remain valid.	  In this case,  users trying to
     get help  will get  I/O error messages  instead.	Some  installations have
     addressed	this problem  by such  means as  having the  HELP XEDIT  profile
     (HELPXED XEDIT)   automatically re-access the S-disk  when an I/O	error is
     received.	 (Note that you can't re-access 190  as S,  so the fixup in this
     case would be to access it at some  other mode.)	You may have mode 1 HELP
     files on your Y-disk, as well as on your S-disk.  Some program products put
     mode 1 HELP files there.	If you have such files,  then the situation with
     changing the Y-disk is the same as the situation with changing the S-disk.

     There is  one other potential problem  with updating CMS with  users logged
     on.   Your logged-on  users are using the CMS shared  segments,  CMSSEG and
     CMSZER.   If you make  a change to CMS which requires you	to resave one of
     these,  then the system will automatically give each of the logged-on users
     a private copy  of the old shared	segment,  which he will  continue to use
     until he logs  off or re-IPLs CMS	or detaches the segment.    This doesn't
     help your performance,  if you do it in  the middle of the day,  of course,
     but there is potentially a worse problem.	 Those old users will get copies
     of the old segment,  but they'll get  copies of only those pages which have
     been referenced  by someone  since the last  CP IPL (or  the last	time the
     segment was saved).  After you save the new shared segment, if one of these
     old users	references a shared-segment page  which had not  been referenced
     previously,  then he will get that page  from the new shared segment.   I'm
     sure you  can see	the possibility  of getting  bizarre results  from this.
     This is less likely to be a  problem with CMSSEG than with CMSZER,  because
     CMSSEG is	detached after every use  (unless you have modified  your system
     not to do that,  as many installations have).   In fact,  in practice it is
     seldom a problem  with either segment.   If several people  have been using
     CMS for a while before you resave the shared segment, it's very likely that
     all the pages which are ever going  to be referenced will already have been
     referenced before you resave the shared segment.	Nevertheless, you should
     be aware of this potential source of interference with your users.


									 PAGE 70

     D. Updating a Shared Segment

     Just when you have the SSERV fire fought,	another of your colleagues tells
     you that he's finally gotten hold of a  C compiler for CMS.   He's going to
     install  it,  but	he  wants you  to  make  the CMS  EDITOR  (the old  one)
     understand a filetype of "C", so you sit down and slam out a mod to DMSEDF:

     FILE: DMSEDF CFDEF0 A1

      ./ I 00740000	     $ 740900 900		    11/21/80 16:20:31
	       DC    CL8'C',A(C)				       CFDEF0
      ./ I 01620000	     $ 1620200 200		    11/21/80 16:20:31
      C        DS    0F 		 C LANGUAGE		       CFDEF0
	       DC    C'S',X'00' 	 MIXED CASE, NO SERIALIZATION  CFDEF0
	       DC    C'V',AL1(160)	 RECFM V, LRECL 160	       CFDEF0
	       DC    AL1(0,0)		 NO TRUNC, VERIFY ALL	       CFDEF0
	       DC    A(CTABS)		 DEFAULT TAB STOPS	       CFDEF0
	       SPACE 2						       CFDEF0
      ./ I 01720000	     $ 1721000 1000		    11/21/80 16:20:31
      CTABS    DC    AL1(1,4,7,10,13,16,19,22,25,28,31,34,37,40,43,46) CFDEF0
	       DC    AL1(49,52,55,58,61,64,67,70,73,76,0)	       CFDEF0

     FILE: DMSEDF AUXLCL A1

      * * * * * * * * * * * * * * *  AUXLCL  * * * * * * * * * * * * * * * *
      CFDEF0 - 05/22/79 - DEFINE FILE DEFAULTS FOR C LANGUAGE PROCESSOR.

      vmfasm dmsedf dmssplcl
      UPDATING 'DMSEDF ASSEMBLE D1'
      APPLYING 'DMSEDF CFDEF0 A1'
      ASMBLING DMSEDF
      ASSEMBLER (XF) DONE
      NO STATEMENTS FLAGGED IN THIS ASSEMBLY
      DMSEDF TEXT CREATED

     Again, you have the problem of how to install the change.	This time, there
     is no friendly bucket writer to tell you,	so you look in Appendix C of the
     sysgen manual.*  You  find there a table  which tells you what  needs to be

				--------------------

     * Appendix C is not infallible.  There have been errors in it, but the real
     problem is that it doesn't list every  CMS module.   A more reliable way to
     decide how to put	a given CMS textfile into production is  to look for its
     name in DMSZER ASSEMBLE, DMSSEG ASSEMBLE, the CMSGEND EXEC, and the CMSLOAD
     EXEC (the CMS nucleus loadlist).  If the name is listed in DMSZER ASSEMBLE,
     then the textfile	is part of the	CMSZER shared segment,	which  you build
     with CMSZGEN.   If the name is listed in DMSSEG ASSEMBLE, then the textfile
     is part of the CMSSEG shared segment, which you build with CMSXGEN.  If the
     textfile is listed in the CMSGEND EXEC,   then it must be incorporated into
     some CMS MODULE via  CMSGEND.   If the name is listed  in the CMS loadlist,
     then the textfile is part of the CMS nucleus;  you install it by rebuilding
     the nucleus with VMFLOAD.	Note, too, that all the textfiles between DMSNUC
     and the first SLC statement in the CMS loadlist are also part of CMSZER.


									 PAGE 71

     regenerated when a given  CMS module is changed and even  what EXECs to use
     to do  it.   You look  up DMSEDF in  this table and  find that you  need to
     regenerate the  EDIT MODULE,   the EDMAIN	MODULE,  and  the CMSSEG  shared
     segment and that  you do these things  with CMSGEND and CMSXGEN.	 You use
     CMSGEND to  generate an EDIT  MODULE and an  EDMAIN MODULE on  your A-disk.
     One command does them both:

      cmsgend edit

      *** RESULTS:
      ' EDIT MODULE A2 ' CREATED FROM TEXT DECK ( S ) DMSEDX DMSEDF DMSZIT
      *** RESULTS:
      ' EDMAIN MODULE A2 ' CREATED FROM TEXT DECK ( S ) DMSEDX DMSEDF

     Once you have the two editor modules on your A-disk,  you can test your mod
     by just issuing an  EDIT command.	 Like almost all the  other CMS MODULEs,
     EDIT is loaded from  a user's disk even if it exists  in the shared segment
     and on the  S-disk.   If you were	applying a fix to  XEDIT,  however,  you
     couldn't test the	new XEDIT MODULE from your A-disk  without first getting
     rid of the  CMSSEG shared segment (by re-IPLing with  PARM SEG=NULL).   The
     shared segment version  of XEDIT is  always used  in preference to  a disk-
     resident version.	 Alternatively, you could test a new version of XEDIT by
     invoking XEDMAIN,	rather than XEDIT;  the XEDMAIN MODULE is picked up from
     your disk, rather than from the shared segment.   (Note, however,	that you
     can't test EDIT  by invoking EDMAIN.)   It's  not clear why the  authors of
     XEDIT chose to violate CMS conventions in these ways, but they did, so it's
     something you must remember when you test fixes or mods to XEDIT.

     You test your EDIT mod and decide you like it, so you move the new textfile
     and the two new MODULEs to the S-disk.   Then, of course,	you do a SAVESYS
     and a DMSZES to get the saved S-disk directories back in line.   That gives
     you a new EDIT  MODULE S2 and a new EDMAIN MODULE S2,   but the editor also
     lives in the CMSSEG shared segment, so you still need to regenerate CMSSEG.

     The CMSXGEN EXEC,	which is used  to generate CMSSEG,  is another generally
     reliable tool which  you can treat as  a primitive.   CMSXGEN knows  how to
     build the shared segment,	defaulting the shared segment name to CMSSEG and
     its address to 100000;  you may specify a different name and address if you
     wish.   You should be conscious, however, of one problem with CMSXGEN.   It
     won't warn you if you overflow the segment,   so it's a good idea always to
     check the CMSSEG loadmap to make  sure everything fits.   Before you invoke
     CMSXGEN,  you must make your virtual machine size large enough that CMSXGEN
     will be able to  load the contents of the shared  segment into your virtual
     memory, at the addresses they will have in the shared segment:


									 PAGE 72

      spool prt to ipcs
      define storage 4m
      STORAGE = 04096K
      CP ENTERED; DISABLED WAIT PSW '00020000 00000000'

      ipl 190 clear
      VM/SP CMS - 02/28/82 16:36
      Y (19E) R/O
      CMSZER SYSTEM NAME 'CMSZER' NOT AVAILABLE.
      CMSSEG SYSTEM NAME 'CMSSEG' NOT AVAILABLE.

      access 391 a ( noprof
      access 190 b/a
      cmsxgen 210000 cmsseg
      PRT FILE 0003  TO  IPCS	  COPY 001   NOHOLD
      SYSTEM SAVED
      CMSXGEN COMPLETE

     Those two messages about the segments  not being available simply mean that
     the segments can't be attached to your virtual machine because your virtual
     machine is too big.  That's exactly what you want to have happen, since you
     want to rebuild CMSSEG.   Because your  virtual printer is spooled to IPCS,
     the loadmap  for this  new segment is  sent to that  virtual machine  to be
     archived.


     E. Updating an IPL Deck

     You have barely got the new editor installed when you get a call from Level
     Two asking you to	fixtest a fix for a problem you've  been having with DDR
     running standalone.  They read you the fix.  You key it in and assemble it.
     You rename  DMKDDR TXTTST to  DMKDDR TEXT,  since this  is one of	those CP
     functions which live  on the S-disk.   Then  you have to figure  out how to
     build a version  of DDR that you can  run standalone to do  the test.   The
     sysgen manual tells you to use the GENERATE EXEC,	so you do.   It seems to
     work;  at any rate,  it builds you a new IPL DDR file on your A-disk.   But
     you type  out the	beginning of  that new	IPL file  and discover	that the
     comments there don't list your new fix;  the S-disk textfile was used,  not
     yours, even though you remembered to rename yours to TEXT.   So, you take a
     look at the GENERATE EXEC and decide that, short of modifying it,	there is
     no way you  are going to be able to  get GENERATE to build you  an IPL file
     from a  textfile on your  A-disk.	 Since this is	a fixtest,  you  have no
     intention of putting the textfile on your	S-disk yet,  but it turns out to
     be very easy to build the IPL file "by hand":

      copyfile ddr loader s dmkddr text a ipl ddr a ( replace

     The  IPL file  is	quite simply  just  a loader  with  the DMKDDR	textfile
     concatenated to it.  (Other IPL files are built with 3CARD LOADER S2.)  You
     punch IPL DDR A to  cards or MOVEFILE it to tape,	so that  you can do your
     standalone test.	Later,	when you are satisfied	that this is a good fix,
     you invoke CMSGEND to  build a new DDR MODULE;  then  you copy DMKDDR TEXT,
     DDR MODULE, and IPL DDR from your A-disk to the S-disk and do a SAVESYS and
     a DMSZES.


									 PAGE 73

     F. Updating the CMS Nucleus

     The next CMS problem  you encounter requires you to apply	a fix to DMSITP.
     You  key in  the fix  and	do the	assembly  and then  consult Appendix  C.
     Appendix C  tells you that  DMSITP is part of  the CMS nucleus.	When you
     change DMSITP,   you must rebuild	both the  nucleus and the  CMSZER shared
     segment.	You want to test this fix before you put it into production, but
     you are using  your alternate S-disk for  something else just now,   so you
     have the problem  of how to test this  nucleus code.   It can  be done very
     nicely using a small disk (which might even  be a TDISK)  to hold your test
     nucleus:

      define t3350 590 2
      DASD 590 DEFINED
      format 590 k
      '2' CYLINDERS FORMATTED ON 'K(590)'.

      format 590 k 1 ( recomp
      LABEL  CUU M  STAT CYL TYPE BLKSIZE    FILES
      MNT590 590 K   R/W   1 3350  1024 	 0

     The disk on  which the CMS nucleus  resides must be CMS-formatted	and must
     have room	for IPL text at  the beginning and  for the nucleus at	the end.
     The  space  for the  nucleus  at  the end	is  set  aside by  reducing  the
     minidisk's apparent size with the RECOMP option of FORMAT.

     Building a CMS nucleus is very much like building a CP nucleus.  VMFLOAD is
     used  to punch  the  files  listed in  the  CMS  loadlist,  beginning  with
     DMKLD00E, the VM loader.  Then the loader file is IPLed.	The loader loads
     the  nucleus  and	passes	control  to  DMSINIW,	which  prompts	you  for
     information about	your new  nucleus.   The  reply to  the query  about the
     "system disk address" is "190", because 190 is the place where the CMS user
     running with this new nucleus (i.e., you)	will find the CMS MODULEs,  etc.
     The reply to  the query about the	"IPL device address" is  "590",  because
     that's where you  want this nucleus written.    The "nucleus cylinder/block
     address" is  the number  of the first  cylinder or block  in the  space set
     aside at the end of the nucleus minidisk, in this case, cylinder 1.


									 PAGE 74

      access 190 f/a
      F (190) R/O
      190 ALSO = S-DISK

      close punch
      close reader
      spool reader class n
      spool punch to * class n
      spool prt to ipcs

      vmfload cmsload dmssplcl
      SYSTEM LOAD DECK COMPLETE
      PUN FILE 8837  TO  MAINT	  COPY 001   NOHOLD
      R;

      order reader 8837

      ipl 00c clear
      DMSINI606R SYSTEM DISK ADDRESS =
      190
      DMSINI615R Y-DISK ADDRESS =
      19e
      DMSINI607R REWRITE THE NUCLEUS ?
      yes
      DMSINI608R IPL DEVICE ADDRESS =
      590
      DMSINI609R NUCLEUS CYL/BLK ADDRESS =
      1
      DMSINI610R ALSO IPL CYL/BLK 0 ?
      yes
      DMSINI611R VERSION IDENTIFICATION =
      test cms system
      DMSINI612R INSTALLATION HEADING =
      princeton university time-sharing system

      TEST CMS SYSTEM

     With that, the new nucleus is written out onto your 590 and IPLed,  so that
     you can test the fix to DMSITP.

     When you  are ready  to put  this fix  into production,   you copy  the new
     textfile to  190,	ACCESS 190  as A,  and again  invoke VMFLOAD to  build a
     nucleus.	This time,  you reply "190" to	the query about the IPL address.
     You reply to the query about the nucleus address with the block or cylinder
     number at	which the nucleus  starts on your  S-disk (the beginning  of the
     area set aside by RECOMP).  As soon as the new nucleus is IPLed, you can do
     a SAVESYS and a  CMSZGEN to save the new nucleus and  the new CMSZER shared
     segment.  Remember that you must first have made your virtual machine large
     enough to contain CMSZER.	 Your virtual printer should again be spooled to
     IPCS so that the new CMS nucleus loadmap  and the new CMSZER loadmap can be
     archived.


									 PAGE 75

		      X. Installing Preventive Service for CMS


     A. New CMS Service Minidisks

     When you are  ready to load up the  CMS service from a PUT,   you first get
     your alternate S-disk (490)   ready to receive the service by  using DDR to
     copy the  current S-disk to  the alternate.    One thing to  remember about
     using DDR to copy S-disks: the size you see when you issue the QUERY DISK S
     command is the  size of the S-disk less  the amount of space  that has been
     set  aside for  the CMS  nucleus  (by means  of  the RECOMP  option of  CMS
     FORMAT); the command QUERY VIRTUAL 190 will give you the true size; that is
     the number of cylinders or blocks you want to copy.   To be safe,	just use
     DDR COPY ALL.

     You may want to swap your 491 with your 391 and your 494 with your 394, but
     since you	can't swap  490 with 190  yet,	let's just  leave them	at those
     addresses and set up an EXEC to access them like this:

	      +---------------------------+
      491 A   | WORKAREA, LOCAL MODS AND  |
	      | LOCALLY-APPLIED SERVICE   |
	      +---------------------------+

	      +---------------------------+
      494 C/A | CMS UPDATES, AUXFILES,	  |
	      | AND NEW SOURCE FROM	  |
	      | THE NEW PUT		  |
	      +---------------------------+

	      +---------------------------+
      395 D/A | ASSEMBLE, COPY, AND MACRO |
	      | FILES FROM 1.1 BASE -or-  |
	      | CMS UPDATES, AUXFILES,	  |
	      | NEW SOURCE FROM PUT 8105  |
	      | AND ASSEMBLE, COPY, AND   |
	      | MACRO FILES FROM 1.0 BASE |
	      +---------------------------+

	      +---------------------------+
      490 F/A | CMS TEXTFILES, MODULES,   |
	      | AND EXECS		  |
	      +---------------------------+


									 PAGE 76

     B. Loading the Service

     You remember that the  layout of the files on the	logical service tape for
     SP was something like this:

       1. SP installation EXEC		    10. CMS auxfiles
					    11. CMS updates
       2. CP auxfiles			    12. CMS macro auxfiles
       3. CP updates (PTFs)		    13. CMS macro updates
       4. CP macro auxfiles		    14. New CMS source
       5. CP macro updates		    15. CMS maclibs
       6. New CP source 		    16. CMS textfiles
       7. CP maclibs			    17. Standalone IPL decks
       8. CP textfiles			    18. LOADER and service EXECs
       9. CP loadlist EXECs		    19. CMS module files
					    20. HELP files and XEDIT EXECs
					    21. EREP txtlibs
					    22. 308x IOCP

     You use VMSERV to load the CMS service onto the 490 and 494 disks or you do
     it by  hand with these commands  (assuming that your SERVICE  DISKMAP shows
     the SP logical tape starting at file 40 of the PUT):

      tape rewind
      tape fsf 2		   <== skip PUT junk
      tape fsf 37		   <== skip VM Release 6 files
      tape fsf 1		   <== skip SP installation EXEC
      tape fsf 8		   <== skip VM/SP CP files
      access 494 c
      access 490 f
      vmfplc2 load * * c ( eof 5
      vmfplc2 load * * f ( eof 6
      tape fsf
      vmfplc2 load * * f

     These commands  load the  new CMS source,	 the CMS  updates,  and  the CMS
     auxfiles onto your alternate CMS PUT disk;   all other CMS files are loaded
     onto the alternate S-disk.    Wait to load the EREP file  to your EREP disk
     some other day, when you're feeling strong and adventurous.   Load the IOCP
     file only if you are supporting a 308x.


									 PAGE 77

     C. Rebuilding the Assembler Auxiliary Directory

     Having  built the	new S-disk  from the  old S-disk  and the  files on  the
     service  tape,  you  must	rebuild the  auxiliary	directory for  ASSEMBLE.
     CMSGEND knows how to do the GENDIRT for ASSEMBLE, so you just enter:

      access 490 a
      cmsgend assemble

     You may have noticed that there is an ASMGEND command.  You could use that,
     instead of CMSGEND, to rebuild the assembler auxiliary directory,	but that
     would be overkill.    ASMGEND also rebuilds all the  assembler MODULE files
     from the textfiles.  You need to use ASMGEND only if you have applied a mod
     or a fix to one of the IFNxxxxx textfiles, which doesn't happen often.


     D. Building a Nucleus on the Alternate S-Disk

     Having loaded up the service,  you again  go through the steps that we went
     through for  CP earlier.	 You take  the corrective  measures the  IBM and
     VMSHARE buckets recommend; you carry forward any old corrective service you
     still need;  and you reapply your local mods.   You do the VMFMACs with the
     LCLMAC control file and the VMFASMs  with the DMSSPLCL control file.   When
     you have all the updated textfiles, etc., on your alternate S-disk, you can
     build a new nucleus on the alternate S-disk:

      access 490 a
      close pun
      close rdr
      spool pun to * class n
      spool rdr class n

      vmfload cmsload dmssplcl
      PUN FILE 1301   TO  MAINT    COPY 001    NOHOLD
      order rdr 1301

      system clear
      cp detach 190
      cp define 490 190

      ipl 00c clear

     VMFLOAD punches a CMS nucleus loader file to your virtual reader.	 You get
     rid of the regular S-disk at 190 and the CMS system you were running under.
     You  redefine your  alternate  S-disk to  have a  virtual	address of  190,
     because that's where you want it to be when you test this system.	You then
     IPL the CMS loader file and reply to the questions from DMSINI.  Answer the
     ones about  the system disk  address and the  IPL address with  "190",  not
     "490".   (Your alternate S-disk  will be at 190 when it's	being used,  and
     that's where  it is now,	so that's where  you want the  nucleus written.)
     It's a good idea  to reply to the request for  the "version identification"
     with something like "TEST CMS SP107 mm/dd/yy"  to make it obvious that this
     is a  test system.   When	you've answered all  the questions,  you  have a
     system for testing the new PUT built on your alternate S-disk.


									 PAGE 78

     E. Building Alternate Saved Systems

     You also  need to build  some saved systems  for the  new PUT,  to  test it
     properly.	Don't skip this  step.	 It is very often the  case that shared-
     segment code works fine until it's actually put into a shared segment.   In
     DMKSNT,  in  addition to  your regular definitions  for CMS,   CMSSEG,  and
     CMSZER,  create definitions  for NEWCMS,  NEWSEG,	and  NEWZER.   These new
     definitions will be  very like your standard  definitions.   Their SYSNAMEs
     will  be different,   of course.	 And  you must	allocate different  DASD
     locations for these saved systems and  describe the locations in the SYSVOL
     and SYSSTRT parameters.   In the NEWCMS definition,  VSYSADR should be 190,
     but VSYSRES and SYSCYL should point to the 490 S-disk.

     Then, once you've got that version of DMKSNT in production and you have the
     new PUT loaded onto 490, you can build your new saved systems:

      define storage 16m
      define 490 190

      ipl 190 parm seg=newsegBB zer=newzerBB	 ("B" = blank)
      savesys newcms

      access 491 a ( noprof
      access 190 b/a
      cmsxgen nnnnnn newseg
      cmszgen nnnnnn newzer

     CMS uses the CMSSEG and CMSZER shared  segments by default,  so you need to
     do something  to make  this NEWCMS system	know to  use NEWSEG  and NEWZER,
     instead.  The PARM on the IPL statement is one way of doing this.	When you
     specify the IPL  PARM field as shown  here,  with the segment  names right-
     padded with blanks,  the names "NEWSEG  " and "NEWZER  " get moved into the
     SYSNAMES table in the CMS nucleus	by the CMS initialization routine before
     the SAVESYS  is done,   so the saved  NEWCMS system  will default	to using
     NEWSEG and NEWZER.    This will not be sufficient,  however,   if anyone is
     going to be using this system by IPLing it from its virtual address, rather
     than IPLing the saved system.  In that case, you need to change the default
     shared segment names in your test S-disk-resident nucleus,  not just in the
     saved system.   I	know people who do  this by simply editing  DMSNUC TEXT,
     changing "CMSSEG" and "CMSZER" to "NEWSEG"  and "NEWZER",	before doing the
     VMFLOAD to build the nucleus.   But, since that seems a little impure,  you
     could build  yourself a  test version of  the SYSNAMES  macro and	a DMSNUC
     TXTTST which uses the test macro and a control file that knows about TXTTST
     textfiles.   Incidentally,  if  you ever have any doubts  about what shared
     segments you  are using,  you  can find out  by issuing the  QUERY SYSNAMES
     command.


									 PAGE 79

     F. Making the Test CMS System Available to Your Users

     You now have a complete test system.   Announce to your users that they can
     try it out by invoking the NEWCMS EXEC, which you've put on the Y-disk:

     FILE: NEWCMS EXEC Y2

      CP DETACH 190
      CP LINK MAINT 490 190 RR
      CP IPL NEWCMS

     Be sure  to warn  them not to  invoke this EXEC  from their  PROFILE EXECs.
     They're likely to become confused when their PROFILE does an IPL which does
     a PROFILE which does an IPL, etc.


     G. Putting a New Version of CMS Into Production

     We have two possible scenarios for making	the test CMS the production CMS.
     The easiest way depends on your having  been able to position your 490 disk
     in a  good place  as far  as performance  is concerned  (middle of  volume,
     etc.).  In that case, you just want to swap the two S-disks.   Here are the
     steps involved in that:

      - Rebuild DMKSNT,  changing the SYSNAMES for  CMS,  CMSSEG,  and CMSZER to
	OLDCMS, OLDSEG, and OLDZER, and changing NEWCMS,  NEWSEG,  and NEWZER to
	CMS, CMSSEG, and CMSZER.
      - Rebuild  the CMS  nucleus  on 490  as before,	but  specify a	"version
	identification" that will be suitable for production or use the default.
      - Swap the directory entries for 190 and 490.
      - Install the new directory just before shutting CP down.
      - IPL the new CP nucleus containing the new DMKSNT.
      - Before letting any real users log on, resave your new CMS system without
	specifying the segment names, so that the defaults will be used:
	  ipl 190
	  savesys cms

     The other scenario is for putting the  new CMS into production if you can't
     afford to have both S-disks in good places.   In that case,  you'll want to
     copy 490 to 190,  rather than swapping  the two.	For this,  you need some
     dedicated test time.   First,  back up your 190 (DDR to tape).   Next,  DDR
     COPY 490 to 190 and:

      define storage 16m
      ipl 190
      savesys cms
      access 391 a
      access 190 b/a
      cmsxgen nnnnnn cmsseg
      cmszgen nnnnnn cmszer

     Then, restore the backup of the old system to 490,  just in case you have a
     disaster ahead of you.   (It's so nice  to have at least one truly runnable
     CMS system online at all times.)  Finally, open it up to the users.


									 PAGE 80

		       XI. Converting to a New Release of CMS


     When you are ready to go to a new release of CMS, get yourself a new S-disk
     at address, say, 590 and format it and RECOMP it.	 Then,	you are ready to
     load up the files from the distribution  tape.   All the CMS files from the
     distribution tape go onto the new S-disk,	except the ASSEMBLE,  COPY,  and
     MACRO files.   So, you load the CMS textfiles, MODULEs, EXECs, maclibs, IPL
     files, etc., onto the new S-disk and the source files onto a new base disk.

     Note that until you get your new CMS  built and can run under it,	you need
     to access 590 after the S-disk for your current system as, say, mode W;  if
     the new S-disk were accessed before the production S-disk, you would end up
     using CMS MODULEs and textfiles from the new release, which are very likely
     to be incompatible with the CMS that  you are running under.   However,  if
     there are	files on  the new  S-disk that	you need  to use  while you  are
     building your new system, these must be accessed ahead of the corresponding
     files on the  production S-disk.	This complication is  another reason why
     the purists  feel that  many of  the files  that are  on the  S-disk should
     really be	on service disks instead.    Probably the easiest way  to handle
     this  difficulty  is to  access  the  new	S-disk	as a  whole  after  your
     production S-disk and  to access components of  the new S-disk in	front of
     the production S-disk:

      access 590 w/a
      access 590 f/a * exec f1
      access 590 g/a * maclib g2

     If you have  a service tape to be	applied atop the new base,   you load it
     just as we did before, and, again, you go through the steps of applying the
     service recommended  in the  error bucket,   reapplying any  old corrective
     service you still need,  and reapplying your local mods.	Remember also to
     re-CMSGEND the assembler.	Having done all that, you have a complete S-disk
     and can build a new CMS nucleus  on that S-disk using VMFLOAD.   You should
     also build new  test saved systems to  use to test this  new release before
     you put it into production.  Check the sysgen manual for the new release to
     see what  the saved systems  for the new release  should look like  and put
     appropriate new entries into your DMKSNT.

     Again, the process of installing a new release is very much the same as the
     process of putting a new service level into production.


									 PAGE 81

		     XII. Installing Service on Program Products


     Many of  the VM  program products,   such as  PASSTHRU,  for  example,  are
     installed and maintained in  very much the same way that  the SCP itself is
     installed and maintained.	Once you understand the philosophy of installing
     service on CP and CMS, you should have no trouble applying service to these
     products as  long as  they have  been packaged  correctly.   Most	of these
     products look more like CMS than like CP;	you may have to generate MODULEs
     for them and put these files on the  Y-disk.   You may find that they don't
     have nice EXECs like CMSGEND to generate the MODULEs for you, but,  if they
     don't,  there will  be instructions somewhere in their  manuals telling you
     the commands you need  to regenerate any MODULEs.	 You will  need to check
     most of the  program product installation and service EXECs  to see whether
     they reference the CP or CMS maclibs,  in which case you may have to modify
     the EXECs to  reference the correct maclib names for  your installation and
     the version of VM that you are running.


									 PAGE 82

		      XIII. Converting from SP1 CMS to SP2 CMS


     Converting from SP1 CMS to SP2 CMS turns out to be remarkably easy.  If you
     define the  saved systems	and set up  the minidisks  before your	SP2 tape
     arrives,  you  can have the  new CMS up and  running within ten  minutes of
     getting the tape.	I am very pleased to be able to report that IBM put some
     effort into making this new CMS run under an old CP;  for example,  the new
     CMS IDENTIFY command  checks to see whether  an SP2 CP command  it needs is
     available and, if it isn't, uses an older CP DIAGNOSE instead.  Most of SP2
     CMS seems to function properly under SP1  CP,  with one exception:   if you
     have applied APAR VM14879 to your Release	1 CP system,  you will be unable
     to IPL an SP2 saved CMS system.  However, you will have the same problem if
     you have applied VM14879 to your Release 2 CP system.

     I'll  be going  through  the steps  for  bringing up  SP2	CMS,  using  the
     assumptions that you are running SP1 CP and  CMS and that you want to bring
     the new CMS up alongside the old one, rather than replacing it immediately.


     A. SP2 Changes that Affect CMS Installation and Service

     There are some structural changes in SP2 CMS  which you need to be aware of
     before you try installing it.

     First,  the HELP files no longer default  to being on the S-disk,	although
     they can be,   if you wish.   By default,	 they are on a	separate disk at
     virtual address 19D,  as mode 1 files,   except that the HELPMENU files are
     mode 2.   As far as I can see,  making  the MENU files mode 2 is not magic;
     they did it that way just because they wanted the disk to appear to contain
     a few  files when HELP accesses  only the mode  2 files.	You may  want to
     consider moving your local  HELP files onto 19D,  but the	HELP command can
     use HELP  files on  other disks,	so you	don't have  to move  your files.
     However,  HELP can no longer find mode 1 HELP files on the Y-disk,  so,  if
     you have any such files, you must move them,  change their mode,  or modify
     HELP.   HELP accesses the HELP files at  the first vacant disk mode.   This
     may cause	you problems  if you are  expecting local HELP	files on  a disk
     later in the  search order to be used  in preference to IBM's  files of the
     same name.  We have tentatively decided to move our local HELP files to the
     19D in order  to get them off of  the Y-disk (and out of  the YSTAT).   One
     thing you should keep in mind that the sysgen manual neglects to mention is
     that you need to  add DIRECTORY LINKs to 19D for all  your CMS users;  this
     may cause problems for users who are  already using 19D for something else.
     Another change in	HELP that you should be  aware of is that  the format of
     the HELP screen has been changed;	there are now two fewer lines of data on
     the screen than formerly.	So, if your local HELP files have been carefully
     formatted to look pretty on the screen, they won't anymore.


									 PAGE 83

     Second,  IBM has now decided that EREP  should be put back onto the S-disk.
     I disagree.  EREP is a separate component and causes plenty of headaches in
     its own right.   You shouldn't have to cope  with new EREP bugs at the same
     time you  are coping with	the bugs in  a new level  of CMS.   And,   it is
     ridiculous to have  to resave your CMS  systems just to apply  an EREP fix.
     Besides, the EREP libraries  are huge and will make  two big,  practically-
     unused holes in the middle of your  S-disk.   When you decide to risk going
     to a new EREP,   I recommend that you load up the	current EREP txtlibs and
     the current EREP MODULE onto a 201 disk and run EREP from there.

     Third,  there is no longer a  CMSZER shared segment.   The sharable nucleus
     code and the SSTAT  and YSTAT (the directories for the  S-disk and Y-disk),
     which used  to be	in CMSZER,   have been	folded back  into the  CMS saved
     system.

     Fourth, the CMS nucleus is now loaded at a high address,  rather than being
     loaded into segments 0 and 1.  One result of this is that you may find that
     you cannot IPL 190 because your virtual  machine size isn't large enough to
     contain the  nucleus.   Another result  of moving	the nucleus to	a higher
     address is that it  ends up in the middle of  larger virtual machines.   It
     will work that way,  but the big user's free storage is fragmented into one
     piece below the nucleus and another above it.  Furthermore, the piece above
     the nucleus cannot be used by CMS OS GETMAIN simulation,  no matter how big
     you make  the virtual  machine.   Some  installations have  decided to  get
     around this  problem by generating  their CMS  nucleus up in  the sixteenth
     megabyte of virtual memory.   But this means  that all their CMS users will
     have segment tables for  16 megs of segments;  moving CMS	from its default
     location to  the sixteenth meg increases  the CP free storage  required for
     segment tables by 112 doublewords for each CMS user.   IBM's recommendation
     is to  build two CMS  saved systems,  "CMS"  and "CMSL",  the  latter being
     generated at a much higher address than the former.   (They provide two CMS
     loadlist EXECs, CMSLOAD and CMSLOADL,  for building these two CMS systems.)
     But if you do that,  you may end up with twice as many shared pages in real
     memory as you have now.   You'll have to decide what is best for you.   One
     approach being  taken by many  installations is  to install a  saved system
     named "CMS" which is not really CMS,  but is,  instead,  an IPLable program
     which decides which CMS the user needs and IPLs it for him.   That way, the
     general  user  need never	be  aware  of  the  two sizes  of  CMS	systems.
     Obviously,  IBM should have provided this	function when it decided to give
     us two flavors  of CMS.   But,  since IBM didn't,	 Cornell University did.
     Appendix E  contains  Larry Brenner's  program  to  build such  an  IPLable
     system.

     Fifth, some benighted soul decided that in SP2 the CP maclib, DMKSP MACLIB,
     should be on the S-disk, rather than on a CP service disk.   When you build
     your S-disk from the distribution tape,  DMKSP MACLIB will end up on the S-
     disk.  This is madness, of course, so you should copy the maclib to your CP
     base service  disk and  erase it  from the  S-disk.   After  a considerable
     struggle,	IBM has accepted APAR VM16999  against this problem.   The first
     SP2 PUT will move the CP maclib off the S-disk onto the 194.


									 PAGE 84

     B. Before the Tape Arrives


     It can be very confusing juggling two releases of CMS.   For example,  I've
     been told by others  that the assembler goes crazy if  you accidentally mix
     the nucleus and the S-disk from SP1 and SP2.  In general, I find life to be
     easier if	I can start  running under a  new CMS immediately,   rather than
     switching	back and  forth  between two  flavors  of CMS  or  trying to  do
     assemblies for one level of CMS under  another level.   For that reason,  I
     suggest that you first  build a totally unmodified SP2 CMS  and later apply
     your mods	and corrective	service to it  once you can  run under	it.   Of
     course,   I'm not	suggesting that  you open  it up  to the  world in  that
     condition.

     You can get your new CMS service minidisks set up before your tape arrives.
     I recommend a service disk layout along the lines of the following:

				+---------------------------+
			491 A	| WORKAREA, LOCAL MODS AND  |
				| LOCALLY-APPLIED SERVICE   |
				| (updates, auxfiles,	    |
				| textfiles, maclibs)	    |
				+---------------------------+

				+---------------------------+
			494 C/A | CMS UPDATES, AUXFILES,    |
				| AND NEW SOURCE FROM	    |
				| THE CURRENT PUT	    |
				+---------------------------+

				+---------------------------+
			495 D/A | ASSEMBLE, COPY, AND MACRO |
				| FILES FROM 2.0 BASE	    |
				+---------------------------+

				+---------------------------+
			490 F/A | CMS TEXTFILES, MODULES,   |
				| AND EXECS		    |
				+---------------------------+

				+---------------------------+
			19D	| HELP FILES		    |
				+---------------------------+

     This layout includes an A-disk,  an S-disk,  a HELP disk,	and source disks
     for the  base and PUT.   If  your 491 and	494 from the earlier  layout are
     available,  you can use them for the  A-disk and the PUT source disk.   The
     SP2 base CMS source  fits nicely in 55 cylinders of  3350.   The new S-disk
     can be  quite a bit  smaller than the SP1	S-disk was (assuming  you aren't
     planning to put EREP on it).  Thirty 3350 cylinders will give you an S-disk
     which holds  vanilla SP2  CMS and two  one-cylinder nuclei  and is  only 85
     percent full.   Fifteen 3350 cylinders for the  19D holds all of IBM's HELP
     files and our local HELP files and leaves plenty of room for growth.   When
     you are calculating the sizes for your minidisks, note that the CMS nucleus


									 PAGE 85

     has grown quite a bit, to 46 pages (368 FBA blocks), so be sure to allocate
     enough room for it.   In fact,  I recommend that you set aside room for two
     CMS nuclei on your new S-disk,  not  for backout purposes,  but because you
     are going	to want  to be	able to  IPL both  the large  and the  small CMS
     nucleus by address,  as when you want to resave your CMS systems because of
     some change to the S-disk or Y-disk.  Format your new minidisks and build a
     PROFILE EXEC for your new A-disk which will access the service disks in the
     order shown.   Remember to RECOMP the S-disk, to leave room for the nuclei.
     (In my case,  the 30-cylinder S-disk  is RECOMPed to 28 cylinders,  leaving
     room for two 1-cylinder nuclei, in cylinders 28 and 29.)

     Once you've defined the SP2 minidisks,  you can set up the new saved system
     definitions in  DMKSNT.   You may	want to  set everything up  with default
     values to begin with, so that you can get a Release 2 CMS built right away.
     The Release 2 sysgen manual will tell you what the saved system definitions
     should look  like,  except  that it forgets  to tell  you about  the CMSSEG
     definition for the  "large" CMS nucleus.	(The sample DMKSNT  files on the
     distribution tape don't  have it either,  but the	Program Directory does.)
     Here are the default definitions I used for a system with 3350's:

       *								VMSPR2
       *  DMSALPHA AT X'1D0000' 					VMSPR2
       SP2CMS	NAMESYS  SYSNAME=SP2CMS,SYSSIZE=256K,			VMSPR2*
		      VSYSADR=190,VSYSRES=XXX974,SYSCYL=031,		VMSPR2*
		      SYSVOL=VMM018,SYSSTRT=(262,1),SYSPGCT=73, 	VMSPR2*
		      SYSPGNM=(0-4,14-33,464-511),SYSHRSG=(29,30,31)	VMSPR2
       *								VMSPR2
       *  SP2SEG AT X'1A0000'						VMSPR2
       SP2SEG	NAMESYS  SYSNAME=SP2SEG,SYSSIZE=96K,			VMSPR2*
		      VSYSADR=IGNORE,SYSCYL=,VSYSRES=,			VMSPR2*
		      SYSVOL=VMM010,SYSSTRT=(223,60),SYSPGCT=48,	VMSPR2*
		      SYSPGNM=(416-463),SYSHRSG=(26,27,28)		VMSPR2
       *								VMSPR2
       *  DMSALPHA AT X'F00000' 					VMSPR2
       SP2CMSL	NAMESYS  SYSNAME=SP2CMSL,SYSSIZE=256K,			VMSPR2*
		      VSYSADR=190,VSYSRES=XXX974,SYSCYL=031,		VMSPR2*
		      SYSVOL=VMR001,SYSSTRT=(327,1),SYSPGCT=73, 	VMSPR2*
		      SYSPGNM=(0-4,14-33,3840-3887),			VMSPR2*
		      SYSHRSG=(240,241,242)				VMSPR2
       *								VMSPR2
       *  SP2SEGL AT X'ED0000'						VMSPR2
       SP2SEGL	NAMESYS  SYSNAME=SP2SEGL,SYSSIZE=96K,			VMSPR2*
		      VSYSADR=IGNORE,SYSCYL=,VSYSRES=,			VMSPR2*
		      SYSVOL=VMM018,SYSSTRT=(263,1),SYSPGCT=48, 	VMSPR2*
		      SYSPGNM=(3792-3839),SYSHRSG=(237,238,239) 	VMSPR2

     These entries  define a "small  CMS" named SP2CMS	and a "large  CMS" named
     SP2CMSL, with CMSSEG shared segments named SP2SEG and SP2SEGL.  These names
     are used rather  than "CMS" and "CMSSEG"  because we are still  using those
     for our production SP1  CMS system.   Note that the saved	CMS system needs
     quite a bit more DASD space than before.	Once you've figured out how much
     space you need for these additional saved	systems,  find the space on your
     system-owned volumes, CP-format it, add the new saved system definitions to
     your DMKSNT, and install a new CP nucleus containing the new DMKSNT.


									 PAGE 86

     C. Loading up SP2 CMS from the Distribution Tape and the PUT

     Once the saved  system spaces are formatted,  the new  DMKSNT is installed,
     and the  minidisks are allocated  and formatted,	you've done all  you can
     until the tape arrives.   When it comes, you are ready to load it up.   The
     files on the distribution tape are in the following order:

	    1. Installation EXEC	 5. EREP
	    2. Sample files		 6. CMS textfiles, EXECs, maclibs
	    3. CP textfiles		 7. CP source
	    4. HELP files		 8. CMS source

     (The last	two items are  on separate reels,  if  you get 1600  bpi tapes.)
     There is an elaborate new installation EXEC, PREP EXEC, on the distribution
     tape.  I loaded it up, but it looked like an awful lot of bother, so I just
     erased it	and did  everything "by hand."	 That's the  approach I  will be
     demonstrating.

     First, access your new disks in write mode.   Note again that until you get
     your new CMS built and can run under  it,	you need to access 490 after the
     S-disk for your current system as, say, mode Z.

      access 19d b		   <== HELP disk
      access 495 d		   <== base source disk
      access 490 z		   <== new S-disk

     Mount the tape on	181 and load it up,  skipping EREP and	the CP stuff and
     erasing the CP maclib which gets loaded onto the S-disk:

      tape fsf 3
      vmfplc2 load * * b
      tape fsf
      vmfplc2 load * * z
      erase dmksp maclib z
      tape fsf
      vmfplc2 load * * d

     If you've	been able to get  hold of an SP2  PUT,	then you should  load it
     next.   The  file layout in the  SP2 "logical tape"  on the VM PUT  is very
     similar to the SP1 file layout, but with a few differences:

       1. SP installation EXEC		10. CMS auxfiles
					11. CMS updates
       2. CP auxfiles			12. CMS macro auxfiles
       3. CP updates (PTFs)		13. CMS macro updates
       4. CP macro auxfiles		14. New CMS source
       5. CP macro updates		15. CMS maclibs
       6. New CP source 		16. CMS textfiles
       7. CP maclibs			17. Standalone IPL decks
       8. CP textfiles			18. LOADER, service EXECs, XEDIT EXECs
       9. CP loadlist EXECs		19. CMS module files
					20. EREP txtlibs
					21. HELP files
					22. 308x IOCP


									 PAGE 87


     The differences  are that	the XEDIT macros  are now in  the file	with the
     service EXECs,  rather than with the HELP	files,	and files 20 and 21 have
     been interchanged.   To apply the CMS portion of the SP2 PUT,  position the
     tape to the beginning of the SP2  logical tape and VMFPLC2 LOAD files 10-14
     to your new PUT source disk (494),   files 15-19 (and possibly 22)  to your
     new S-disk (490),	and  file 21 to your new HELP disk  (19D).   By the way,
     despite what the sysgen manual says, the filetypes of SP2 APAR fixes have a
     prefix of "L", except that the CMS macro APARs have a prefix of "Z".



     D. Building the CMS Nuclei and Saved Systems


     Now you are ready to build a CMS nucleus, just as we've done before:

      spool prt to ipcs
      spool pun to * class n
      spool rdr class n
      access 490 a
      vmfload cmsload dmssp
      SYSTEM LOAD DECK COMPLETE

      define storage 16m
      CP ENTERED

      detach 190
      DASD 190 DETACHED
      define 490 190
      DASD 190 DEFINED

      ipl 00c clear

      DMSINI606R SYSTEM DISK ADDRESS = 190
      DMSINI615R Y-DISK ADDRESS = 19e
      DMSINI640R HELP DISK ADDRESS = 19d
      DMSINI604R REWRITE THE NUCLEUS ? yes
      DMSINI608R IPL DEVICE ADDRESS = 190
      DMSINI082E IPL DEVICE ERROR - REENTER
      #cp link * 190 190 mr
      DMSINI608R IPL DEVICE ADDRESS = 190
      DMSINI609R NUCLEUS CYL/BLK ADDRESS = 29
      DMSINI610R ALSO IPL CYL/BLK 0 ? yes
      DMSINI611R VERSION IDENTIFICATION = sp2 cms
      DMSINI612R INSTALLATION HEADING = princeton university time-sharing system

      SP2 CMS

     (If you get that "IPL DEVICE ERROR" message,  you need to establish a write
     link to 190.)  The only thing new here is the prompt for the address of the
     HELP disk,  normally 19D.	 You can specify some other address for the HELP
     disk, if you prefer.   You can even put the HELP files on the S-disk, as in
     SP1, in which case you would reply "190" to DMSINI640R.


									 PAGE 88

     At this stage, you've got a runnable CMS system and should never have to go
     back to Release 1, so you might find it easier to define this new S-disk as
     190 in your DIRECTORY entry, leaving the current S-disk as 190 for everyone
     else, of course.	The rest of the presentation will assume that the SP2 S-
     disk is at address 190.

     There are a couple of things which still need to be done to the new S-disk.
     The first is the one I always  forget,  the regeneration of the assembler's
     auxiliary directory:

      access 190 a
      cmsgend assemble
      ENTER GENDIRT TARGET DISK MODE LETTER
      s
      ASSEMBLE MODULE A2 CREATED FROM DMSASM DMSASD
      access 491 a
      access 190 f/a

     You  specify the  "target	disk mode"  as "S",   because  that's where  the
     ASSEMBLE MODULE will be when it's being used.

     The other thing you need to do is	new with this release and not documented
     in the sysgen manual  -- you must build a SYSTEM NETID  file to define your
     systems to the new IDENTIFY command.  There is a sample SYSTEM NETID on the
     distribution tape, and it should now be on your new S-disk:

     FILE: SYSTEM NETID S2

     +-----------------------+
     |	*CPUID NODEID NETID  |
     |	00000  NODEID NETID  |
     +-----------------------+

     You need to update the SYSTEM NETID file with the CPU serial numbers,  node
     names,  and RSCS virtual machine names of	all your CPUs.	 The sample file
     from the tape  is in error in  showing a five-character CPU  serial number;
     IDENTIFY won't work unless you give it six-character serial numbers.

     I'm going to dig my heels in and insist that this file should be maintained
     with UPDATE, so it's time to build local control files for the new CMS:

     FILE: DMSSPLCL CNTRL

      TEXT MACS DSLCLMAC DMSSP CMSLIB OSMACRO DOSMACRO TSOMAC DMKSP
      TEXT AUXLCL
      TEXT AUXPTFS
      TEXT AUXSP

     To build DMSSPLCL CNTRL,  start with the  DMSSP CNTRL from your new S-disk.
     Note that there  are no longer 'AUXSP11' and 'AUXSP12'  entries,  but there
     will soon be an 'AUXSP21' entry, alas.   Note,  too,  that you still need a
     separate LCLMAC  CNTRL,  since the  developers haven't done  anything about
     DMSERR and DMSABN being the names of both macros and ASSEMBLE files.


									 PAGE 89

     Build an update  file to sequence SYSTEM  NETID and another update  file to
     define your configuration and an auxfile which lists both these updates:

     FILE: SYSTEM SEQUENCE	 FILE: SYSTEM SYSGEN

	+----------------+	    +--------------------------------------+
	|  ./  S	 |	    |  ./ R  00002000 00002000 $ 2100 100  |
	|		 |	    |  020470 PUCC3081 VMRSCS		   |
	|		 |	    |  220470 PUCC3081 VMRSCS		   |
	|		 |	    |  010577 MAE4341  VMRSCS		   |
	|		 |	    |  014099 ASIS4331 VMRSCS		   |
	+----------------+	    +--------------------------------------+

     FILE: SYSTEM AUXLCL

      *$*$*$*$*$*$*$*$*$*$*$*$*$*$*$ AUXLCL $*$*$*$*$*$*$*$*$*$*$*$*$*$*$*$*
      SYSGEN - 08/07/82 - PRINCETON CPU ID'S, NODE NAMES, RSCS VM NAMES
      SEQUENCE - 08/07/82 - SEQUENCE SYSTEM NETID, SINCE IBM WON'T

     You will be replacing the SYSTEM NETID file that came on the S-disk with an
     updated version, so copy the original to your base source disk, so you will
     always have a copy to update.   Then  build an updated copy of SYSTEM NETID
     on your A-disk and copy it to the S-disk, remembering to make it mode 2:

      access 190 f/a
      access 495 d
      copy system netid f = = d ( olddate
      access 495 d/a
      update system netid d dmssplcl ( ctl rep
      access 190 f
      copy system netid a system netid f2 ( olddate replace
      access 190 f/a

     That gets the S-disk in order.  You can now build a "large CMS" nucleus:

      spool prt to ipcs
      spool pun to * class n
      spool rdr class n

      access 190 a
      vmfload cmsloadl dmssp
      SYSTEM LOAD DECK COMPLETE

      define storage 16m
      ipl 00c clear
      DMSINI606R SYSTEM DISK ADDRESS = 190
      DMSINI615R Y-DISK ADDRESS = 19e
      DMSINI640R HELP DISK ADDRESS = 19d
      DMSINI604R REWRITE THE NUCLEUS ? yes
      DMSINI608R IPL DEVICE ADDRESS = 190
      DMSINI609R NUCLEUS CYL/BLK ADDRESS = 28
      DMSINI610R ALSO IPL CYL/BLK 0 ? no
      DMSINI611R VERSION IDENTIFICATION = sp2 large cms
      DMSINI612R INSTALLATION HEADING = princeton university time-sharing system


									 PAGE 90

     This is just like building the small nucleus, except for four things:

     1.  The CMSLOADL loadlist is used in the VMFLOAD command;
     2.  The nucleus is written on the other nucleus cylinder;
     3.  The cylinder-zero IPL text is not rewritten; and
     4.  A different version identifier is specified.

     Incidentally,  instead of keeping both CMS nuclei on the S-disk,  you might
     prefer to keep  one on the S-disk and  one on the Y-disk.	  That way,  you
     could have cylinder-zero IPL text for both of them.   To do this, you would
     have to RECOMP room  for a nucleus at the end of  your Y-disk.   Then,  you
     would reply "19E" to  DMSINI608R and "yes" to 610R,  and  you would specify
     the correct Y-disk cylinder number in response to 609R.

     Having built both	nuclei somewhere,  you can build the  new saved systems,
     SP2CMS and SP2CMSL:

      define storage 16m

      ipl 190 clear parm seg=sp2segBB	       ("B" = blank)
      SP2 CMS
      savesys sp2cms
      SYSTEM SAVED
      SP2 CMS

      ipl 190 28 clear parm seg=sp2seglB  <or>	ipl 19e clear parm seg=sp2seglB
      SP2 LARGE CMS
      savesys sp2cmsl
      SYSTEM SAVED
      SP2 LARGE CMS

     Note that IPLing 190 IPLs the cylinder-zero  IPL text,  which brings in the
     small nucleus from cylinder  29.	To IPL the large nucleus  from 190,  you
     simply specify its cylinder (28)  in the IPL command.   You specify segment
     names in  the IPL commands  so that those	will become the  default segment
     names in the saved systems you are building.  Be sure to remember to right-
     pad the segment names with blanks to eight characters.

     Now, you can invoke CMSXGEN to build your shared segments,  the CMSSEGs for
     the two new saved systems:

      spool prt to ipcs
      define storage 16m

      ipl sp2cmsl parm seg=null
      SP2 LARGE CMS
      access 491 a ( noprof
      access 190 b/a
      cmsxgen 1a0000 sp2seg
      SYSTEM SAVED
      CMSXGEN COMPLETE
      cmsxgen ed0000 sp2segl
      SYSTEM SAVED
      CMSXGEN COMPLETE


									 PAGE 91

     You specify  NOPROFILE when  you access  your A-disk  because your  profile
     might access  unneeded disks and  use memory  needed for saving  the shared
     segments.	 You access your S-disk read-only so that the segment maps won't
     be written on it and obsolete the	SSTATs in your newly-saved systems.   If
     you want  the maps on  the S-disk,  then  do the  SAVESYSs for the  two CMS
     systems after you have built the shared segments.



     E. What To Do If You Don't Like the Default Shared Segment Locations


     At Princeton, we've tentatively decided to put the small CMS and its shared
     segment high enough (5 megs)  that they will almost always be the only ones
     in use and to move  the shared segment for the large CMS up  a bit into the
     sixteenth	meg,  so  that the  big users  can have  the bottom  15 megs  to
     themselves.   We  also want  to expand  the nucleus  area allocated  to the
     shared SSTAT and YSTAT by one segment,  so  that we can use Brown's idea of
     adding a shared RSTAT for the HELP files.

     Moving the shared segments is no problem.	  As in the past,  you need only
     change the definitions in DMKSNT and specify the new, non-default addresses
     in the CMSXGEN commands.  These are our new shared segment definitions:

       *								VMSPR2
       *  SP2SEG AT X'500000'						VMSPR2
       SP2SEG	NAMESYS  SYSNAME=SP2SEG,SYSSIZE=96K,			VMSPR2*
		      VSYSADR=IGNORE,SYSCYL=,VSYSRES=,			VMSPR2*
		      SYSVOL=VMM010,SYSSTRT=(223,60),SYSPGCT=48,	VMSPR2*
		      SYSPGNM=(1280-1327),SYSHRSG=(80,81,82)		VMSPR2
       *								VMSPR2
       *  SP2SEGL AT X'F40000'						VMSPR2
       SP2SEGL	NAMESYS  SYSNAME=SP2SEGL,SYSSIZE=96K,			VMSPR2*
		      VSYSADR=IGNORE,SYSCYL=,VSYSRES=,			VMSPR2*
		      SYSVOL=VMM018,SYSSTRT=(263,1),SYSPGCT=48, 	VMSPR2*
		      SYSPGNM=(3904-3951),SYSHRSG=(244,245,246) 	VMSPR2

     The SP2 Program Directory says that,  "The  first 64K segment after the CMS
     saved  system is  reserved for  CMS's use."   It  warns you  to leave  that
     segment empty, rather than allocating it to a shared segment.   But, if you
     are virtual memory constrained, you may not find it acceptable to lose that
     segment.	The  basis for the warning  is that CMSXGEN (and  similar EXECs)
     cannot build  a shared segment immediately  above the running  CMS nucleus.
     When CMSXGEN tries to load the contents of the segment into virtual storage
     before doing the SAVESYS for the shared segment,  it gets the error message
     DMSLIO109S VIRTUAL  STORAGE CAPACITY  EXCEEDED.   This  is because  CMSXGEN
     loads into free  storage without first allocating that storage  -- a highly
     dubious technique.   Fortunately, DMSLDR won't allow the free storage chain
     element right  above the nucleus  to be overlaid,	 so it issues  the error
     message and quits.  But, if you can contrive to build a segment immediately
     above the nucleus, CMS is perfectly happy to use it.  The obvious way to do
     this is to  build the shared segment  while running some CMS  nucleus other
     than the one the segment abuts.   I have tried this and it works,	so these
     are the commands for rebuilding the shared segments at their new addresses:


									 PAGE 92

      define storage 16m
      ipl sp2cms
      access 491 a ( noprof
      access 190 b/a
      cmsxgen 500000 sp2seg
      cmsxgen f40000 sp2segl

     You should be aware of a mysterious  warning in the Program Directory which
     says that due to a bug in DMSLDR you must not save shared segments anyplace
     above the location of the nucleus you are running from.   I have tried this
     only with the CMSSEG  for my large CMS nucleus,  and I  had no trouble with
     that, but apparently there is a sporadic problem with other segments,  such
     as APL or GDDM.  The fix is VM16182.



     F. What To Do If You Don't Like the Default Nucleus Location or Size


     Moving the CMS nucleus  is not so easy as moving  the shared segment.   The
     locations of the various parts of the  CMS nucleus in SP2 are determined by
     LOADER SLC ("set location counter")  statements  inserted here and there in
     the loadlist EXEC.   That's why there are different loadlists for the large
     and small nuclei --  the SLCs are different.   The address  of the start of
     the  main portion	of the	nucleus is  determined by  an SLC  entry in  the
     loadlist just  before the entry  for DMSALP  ("ALP" is short  for "alpha").
     This is the part of the small CMS loadlist (CMSLOAD EXEC)	that defines the
     location of DMSALP:

	    +-----------------------------------------------------------+
	    |	 .							|
	    |	 .							|
	    |  &1 &2 &3 DMSINI						|
	    |  ******** DMSZIT MUST BE THE LAST MODULE BEFORE DMSALP	|
	    |  &1 &2 &3 DMSZIT						|
	    |  &1 &2 &3 SLC L1D0000					|
	    |  ******** DMSALP MUST BE THE FIRST MODULE IN THE NUCLEUS	|
	    |  &1 &2 &3 DMSALP						|
	    |  &1 &2 &3 DMSCAT						|
	    |	 .							|
	    |	 .							|
	    +-----------------------------------------------------------+

     Actually,	 the loadlist  record  that says  "SLC L1D0000"  is  not an  SLC
     statement	itself;  it's  the name  of a  CMS  file which	contains an  SLC
     statement:

     FILE: SLC L1D0000 S1

     +----------------+
     |	bSLC  1D0000  | 		    ("b" = X'02')
     +----------------+


									 PAGE 93

     If you want the small CMS nucleus	to start somewhere other than at 1D0000,
     you must change  that entry to point to  a new SLC file  which you've built
     and put on the  S-disk.   You must also make a  corresponding change to the
     SLC entry just before DMSOME ("omega"), which marks the end of the nucleus:

	    +-----------------------------------------------------------+
	    |	 .							|
	    |	 .							|
	    |  &1 &2 &3 DMSVSR						|
	    |  ******** DMSSIG MARKS THE END OF EXECUTABLE CODE 	|
	    |  &1 &2 &3 DMSSIG						|
	    |  &1 &2 &3 SLC L200000					|
	    |  ******** DMSOME MARKS THE END OF THE NUCLEUS		|
	    |  &1 &2 &3 DMSOME						|
	    |  &1 &2 &3 LDT STARTADR					|
	    +-----------------------------------------------------------+

     Expanding the CMS nucleus to make more  room for the shared SSTAT and YSTAT
     also involves modifying the CMS loadlists.   The shared SSTAT and YSTAT are
     now stored  between DMSSIG ("sigma")  and	DMSOME in the CMS  nucleus.   To
     expand the space available for the SSTAT and YSTAT, you increment that last
     SLC by one segment.  You must also, of course, modify your DMKSNT entry for
     the saved system to show that it contains the additional segment.

     The modified DMKSNT entries for our two saved CMS systems are as follows:

       *								VMSPR2
       *  DMSALPHA AT X'530000' 					VMSPR2
       SP2CMS	NAMESYS  SYSNAME=SP2CMS,SYSSIZE=256K,			VMSPR2*
		      VSYSADR=190,VSYSRES=XXX974,SYSCYL=031,		VMSPR2*
		      SYSVOL=VMM018,SYSSTRT=(262,1),SYSPGCT=89, 	VMSPR2*
		      SYSPGNM=(0-4,14-33,1328-1391),			VMSPR2*
		      SYSHRSG=(83,84,85,86)				VMSPR2
       *								VMSPR2
       *  DMSALPHA AT X'F00000' 					VMSPR2
       SP2CMSL	NAMESYS  SYSNAME=SP2CMSL,SYSSIZE=256K,			VMSPR2*
		      VSYSADR=190,VSYSRES=XXX974,SYSCYL=031,		VMSPR2*
		      SYSVOL=VMR001,SYSSTRT=(327,1),SYSPGCT=89, 	VMSPR2*
		      SYSPGNM=(0-4,14-33,3840-3903),			VMSPR2*
		      SYSHRSG=(240,241,242,243) 			VMSPR2

     Note that both saved systems have been expanded by one segment and that the
     location of the small saved system has been changed.

     Modifying the two loadlist EXECs involves	the same tedious process we went
     through to modify SYSTEM NETID.   The virgin loadlists must be saved on the
     CMS base source disk.   Then,  auxfiles must be created to list the updates
     for sequencing and modifying the  loadlists.   Finally,  updated copies are
     built on the A-disk and moved to the  S-disk.   The one extra twist in this
     case is that you must also create new SLC files if there don't happen to be
     existing ones for the addresses you need.	 (Remember that you need a X'02'
     immediately preceding the characters "SLC".)  The files and commands needed
     for making these changes to the two CMS nuclei follow:


									 PAGE 94

     FILE: CMSLOAD AUXLCL

      *$*$*$*$*$*$*$*$*$*$*$*$*$*$*$ AUXLCL $*$*$*$*$*$*$*$*$*$*$*$*$*$*$*$*
      EXPAND - 08/07/82 - EXPAND SMALL NUCLEUS SSTAT/YSTAT BY ONE SEGMENT
      SYSGEN - 08/07/82 - MOVE SMALL NUCLEUS TO FIT ABOVE 5-MEG MACHINE
      SEQUENCE - 08/07/82 - SEQUENCE LOADLIST EXEC SINCE IBM WON'T


     FILE: CMSLOAD SYSGEN

      ./ R 00018000	     $ 18100 100
      &1 &2 &3 SLC L530000
      ./ R 00079000	     $ 79100 100
      &1 &2 &3 SLC L560000


     FILE: CMSLOAD EXPAND

      ./ R 00079100	     $ 79200 100
      &1 &2 &3 SLC L570000


     FILE: CMSLOADL AUXLCL

      *$*$*$*$*$*$*$*$*$*$*$*$*$*$*$ AUXLCL $*$*$*$*$*$*$*$*$*$*$*$*$*$*$*$*
      EXPAND - 08/07/82 - EXPAND LARGE NUCLEUS SSTAT/YSTAT BY ONE SEGMENT
      SEQUENCE - 08/07/82 - SEQUENCE LOADLIST EXEC SINCE IBM WON'T


     FILE: CMSLOADL EXPAND

      ./ R 00079000	     $ 79100 100
      &1 &2 &3 SLC LF40000


     FILE: SLC L530000 S1      SLC L570000 S1	   SLC LF40000 S1

	 +----------------+  +----------------+  +----------------+
	 |  bSLC  530000  |  |	bSLC  570000  |  |  bSLC  F40000  |  "b" = X'02'
	 +----------------+  +----------------+  +----------------+


      access 190 f/a
      access 495 d
      copy cmsload exec f = = d ( olddate
      copy cmsloadl exec f = = d ( olddate
      access 495 d/a
      update cmsload exec d dmssplcl ( ctl rep
      update cmsloadl exec d dmssplcl ( ctl rep
      access 190 f
      copy cmsload exec a = = f1 ( olddate replace
      copy cmsloadl exec a = = f1 ( olddate replace
      access 190 f/a


									 PAGE 95

     When you have gotten the loadlists updated, rebuild your CP system with the
     new  definitions in  DMKSNT  and  then rebuild  the  CMS  nuclei and  saved
     systems,  using  the same	commands you used  in building	them originally.
     When you are ready to install a new PUT,  you will have to apply these same
     updates to the loadlists from the PUT.   Having the auxfiles and the update
     files sitting on your A-disk should serve as a reminder to do this.



     G. Notes on Updating a Production SP2 CMS System


     Because lots of new function tends to mean lots of new bugs, you'll want to
     be sure to get the IBM and VMSHARE buckets for the new system and apply the
     corrective  service suggested  there.   When  you	are happy  with the  new
     system,  you can make it available to  your users to try out.   Eventually,
     you'll want to make  it the production CMS system.   The  procedure will be
     exactly the same as the one used in converting the "NEWCMS" system to "CMS"
     back on Release 1, except that now you may be putting both "CMS" and "CMSL"
     into production.

     Once it's	in production,	though,  you're  likely to encounter a	few more
     glitches,	so I'll tell you what I've  learned so far about updating an SP2
     CMS on  the fly.	Most  of what I  told you  about updating SP1  CMS still
     applies, but there are some changes.

     The situation with the HELP files	is completely different,  since they are
     no  longer on  the S-disk.    Changing the  HELP  disk does  not cause  the
     problems for HELP that  changing the S-disk caused in Release  1;	that is,
     your  users no  longer get  I/O error  messages because  their disk  origin
     pointer is invalid.   Anyone  who uses HELP has the HELP  disk accessed and
     has a directory of the mode 2 HELP files in his virtual memory.  Therefore,
     if you want to change a mode 2 HELP file, you should rename it,  so that it
     can still be found  at its old location by users  who have old directories.
     The mode 1 HELP files, which are the vast majority,  are searched for every
     time the user enters HELP, so you can add or replace them more easily,  but
     it's still better to rename one you are replacing,  rather than erasing it,
     in case someone else is reading it right at that moment.  If you add a mode
     2 HELP file, users with old HELP disk directories will be able to find it.

     The situation  with the shared  SSTAT and	YSTAT has also	changed.   Since
     there is no longer  a CMSZER shared segment,  you no  longer do CMSZGENs or
     DMSZESs to get the shared SSTAT and YSTAT back  in synch with the S- and Y-
     disks.   The shared SSTAT	and YSTAT are now part of  the CMS saved system.
     So,  when	you change the	S-disk or the Y-disk,	you must do  SAVESYSs to
     resave  your  CMS saved  systems.	  In  SP2  your  users get  the  message
     DMSINS100W SHARED SSTAT/YSTAT  NOT AVAILABLE any time you make  a change to
     the S-disk or Y-disk, even if it's only a change to a mode 1 file.  This is
     because  DMSINS now  checks  for whether  the shared  SSTAT  and YSTAT  are
     current by  comparing the	date the  disk was  last updated  with the  disk
     update date  saved in the	saved system.	 This makes changing  the system
     disks on the fly less graceful than it used to be.  You will even find that
     you make the shared  SSTAT or YSTAT unavailable by simply	accessing the S-
     or Y-disk in R/W mode and releasing it, without making any changes.


									 PAGE 96

     One other difference which affects the process of updating a production CMS
     system is that CMSSEG is no longer detached  after every use.   As far as I
     have been able to learn, the other rules for changing CMS still apply.



     H. Miscellaneous Caveats


     There are a few other points you should be aware of:

     The base source for Release 2 corresponds to SLU 12 for Release 1.   If you
     are at a higher level  than that on SP1,  you may find that  you need to go
     back and  apply some  of the same	corrective service to  SP2 that  you had
     applied to SP1 when you were at an earlier level.

     A few of the SP2 CMS base source files were sequenced improperly; there are
     fixes for this problem on the first SP2 PUT.

     In SP2, a number of CMS commands are implemented as nucleus extensions.  If
     you are testing a fix or mod to one of these, you may have to do a NUCXDROP
     to get rid of the old version before  you can test your new version.   When
     in doubt, do a NUCXMAP.

     If you have a large number of mode 2 files on your S- and Y-disks,  you may
     find that	you cannot IPL	an SP2 CMS system  by address.	 The  symptom is
     messages DMSFRE159T and  DMSFRE162T.   The circumvention is  to DETACH your
     19E disk.	The fix is VM16392, which has a pre-requisite of VM16189.

     Some other APARs which  may be of interest include:   VM16450,   which is a
     performance fix for FILELIST, and VM16189, which is a fix for abends caused
     by IPLing an SP2 CMS system by name and specifying an IPL parm greater than
     thirty-six characters in length.

     If you use the new SENDFILE command to  send data to an SP1 CMS system,  be
     sure to specify the "OLD" parameter in the SENDFILE command.

     If your local mods  or programs stop working,  two things	to check out are
     the fact that the	handling of mode bytes is different in	SP2 and the fact
     that the "CONCCWS" field has been moved from NUCON to OPSECT.   In general,
     programs which reference fields in OPSECT need to be reassembled.

     You  may also  have trouble  with a  couple  of widely-used  mods from  the
     Waterloo tape.   In particular,  RESLIB doesn't seem to work unless the CMS
     nucleus is at  the top of the  virtual machine or beyond  it.   The Cornell
     CARD and FCOPY modules won't run correctly  on an SP2 CMS system unless you
     put a dummy DMSZES MODULE on your S-disk.


									    PAGE 97

				       APPENDIX A

			 Applying Service to Other Levels of VM



     +----------------------------------------------------------------------------+
     +----------------------------------------------------------------------------+
     |										  |
     |		      Naming Conventions for Current Levels of VM		  |
     |										  |
     +----------------------------------------------------------------------------+
     +----------+----------+----------+----------+----------+----------+----------+
     |		|	   |	      | 	 |	    |	       |	  |
     |		|  REL 6   | BSEPP 2  |  SEPP 2  |   SP 1   |	HPO 1  |   SP 2   |
     |		|	   |	      | 	 |	    |	       |	  |
     +----------+----------+----------+----------+----------+----------+----------+
     +----------+----------+----------+----------+----------+----------+----------+
     | TEXT	| TEXT	   | TEXT     | TEXT	 | TEXT     | TXTH1    | TEXT	  |
     |	FILES	| TXTAP    | TXTAP    | TXTAP	 | TXTAP    | TXTH1A   | TXTAP	  |
     |		|	   |	      | 	 | TXTMP    | TXTHIM   | TXTMP	  |
     +----------+----------+----------+----------+----------+----------+----------+
     | AUXFILES | AUXR60   | AUXB20   | AUXS20	 | AUXSP    | AUXHP1   | AUXSP	  |
     |		|	   |	      | 	 | AUXSP11  |	       |	  |
     |		| AUXM60   | AUXMB20  | 	 | AUXMSP   |	       | AUXMSP   |
     |		|	   |	      | 	 | AUXMSP11 |	       |	  |
     +----------+----------+----------+----------+----------+----------+----------+
     | UPDATES	| RnnnnnDx | NnnnnnDx | KnnnnnDK | SnnnnnDx | AnnnnnDK | LnnnnnDx |
     |		| MnnnnnDS | CnnnnnDS | 	 | EnnnnnDS |	       | ZnnnnnDS |
     +----------+----------+----------+----------+----------+----------+----------+
     | CP	| DMKMAC   | CPBSE    | CPSEP	 | DMKSP    | DMKH1    | DMKSP	  |
     |	MACLIBS | DMKAMAC  | DMKMAC   | DMKMAC	 | DMKSPA   | DMKSP    | DMKSPA   |
     |		|	   | DMKAMAC  | DMKAMAC  | DMKSPM   | DMKSPA   | DMKSPM   |
     |		|	   |	      | 	 | DMKMAC   | DMKSPM   | DMKMAC   |
     |		|	   |	      | 	 |	    | DMKMAC   |	  |
     +----------+----------+----------+----------+----------+----------+----------+
     | CMS	| CMSLIB   | CMSBSE   | 	 | DMSSP    |	       | DMSSP	  |
     |	MACLIBS |	   | CMSLIB   | 	 | CMSLIB   |	       | CMSLIB   |
     +----------+----------+----------+----------+----------+----------+----------+
     | CP	| DMKR60   | DMKB20   | DMKS20	 | DMKSP    | DMKH1    | DMKSP	  |
     |	CNTRL	| DMKR6A   | DMKB2A   | DMKS2A	 | DMKSPA   | DMKH1A   | DMKSPA   |
     |	 FILES	|	   |	      | 	 | DMKSPM   | DMKH1M   | DMKSPM   |
     +----------+----------+----------+----------+----------+----------+----------+
     | CMS	| DMSR60   | DMSB20   | 	 | DMSSP    |	       | DMSSP	  |
     |	CNTRL	| DMSM60   | DMSMB20  | 	 | DMSMSP   |	       | DMSMSP   |
     |	 FILES	|	   |	      | 	 |	    |	       |	  |
     +----------+----------+----------+----------+----------+----------+----------+
     +----------------------------------------------------------------------------+


									 PAGE 98

		      Service Disk Layouts for "Delta" Systems

     Some  VM  systems	are  shipped  to you  as  "deltas"  to	another  system.
     Specifically, BSEPP Release 2 and SEPP Release 2 are shipped in the form of
     updates to be applied on top of a VM Release 6 system, and HPO Release 1 is
     shipped as updates to be applied on top of a VM/SP Release 1 system.   This
     makes applying service slightly more complicated  for these systems than it
     is for VM/SP.   Note that neither SEPP nor HPO Release 1 "versions" CMS, so
     you use the next lower system level for CMS,  i.e.,  you use VM/SP CMS with
     HPO and BSEPP CMS with SEPP.

     The  standard way	of maintaining	a delta  system  is simply  to load  the
     corresponding files for the two pieces of	the system onto the same service
     disks.   Thus,  in the case of an HPO system,  the base disk should include
     the base ASSEMBLE, COPY, MACRO,  TEXT,  TXTAP,  TXTMP,  UPDTAP,  and UPDTMP
     files from  the base VM/SP  system.   It  should also contain  the original
     UPDTHP1 files from the HPO distribution tape, as well as the textfiles from
     that tape (TXTH1 and TXTH1A).  The PUT disk should contain the SP auxfiles,
     updates,  and  textfiles from  the SP  portion of	the PUT,   plus the  HPO
     auxfiles, updates, and textfiles from the HPO portion of the PUT.	 The HPO
     auxfiles are complete  replacements for the SP auxfiles,  but  only for the
     "HPO-versioned" modules.	An HPO auxfile may list both SP fixes (S12345DK)
     and HPO  fixes (A12222DK).   In  some cases,   there will be  two different
     versions of the same fix for SP and HPO;  these may be distinguished by the
     prefix on the filetypes.

     Exactly the same scheme is used with a BSEPP or SEPP system.   You load the
     Release 6 tape and the base (B)SEPP  tape onto your base service disk,  and
     you load the Release  6 files and the (B)SEPP files from  the PUT onto your
     PUT disk.	 There is one difference, however,  from the HPO scheme;  all of
     IBM's textfiles for a (B)SEPP system are named TEXT or TXTAP.   Originally,
     the (B)SEPP-versioned textfiles were named TXTB20	and TXTB2A or TXTS20 and
     TXTS2A.   But then somebody at IBM who  didn't understand what was going on
     decided  that the	(B)SEPP-versioned textfiles  should  be renamed.    This
     blunder has been causing  a good many systems around the  world to crash in
     obscure ways for a couple of years  now.	If you are maintaining a (B)SEPP
     system,  be very careful  to load the Release 6 textfiles	from a given PUT
     before you load the (B)SEPP textfiles,   so that the (B)SEPP textfiles will
     overlay the  corresponding vanilla  textfiles,  rather  than the  other way
     around.  And don't use the SELECT option of VMFPLC2 LOAD, either.	 (That's
     the option that says not to replace a file on the disk with a file from the
     tape with the same name if they have the same timestamp.)	 There have been
     cases of the  vanilla and (B)SEPP textfiles having the  same timestamp;  if
     SELECT is	specified in  such a case,   the resulting  system is  missing a
     (B)SEPP update and will tend to be unstable.   To avoid such problems, many
     (B)SEPP installations have taken to loading  the (B)SEPP textfiles from the
     PUT onto one minidisk  and the vanilla textfiles from the	PUT onto another
     disk later in their standard disk search order.


									 PAGE 99

				 Preferred Auxfiles

     One new  concept you  need to master  in order to	understand how	to apply
     service to a delta system is the "preferred auxfile".   As mentioned above,
     the  delta   systems  provide   auxfiles  which   completely  replace   the
     corresponding base system	auxfiles,  but only for those  modules which are
     "versioned" by the delta system.	This means  that there needs to be a way
     of saying in the control file that the  base auxfile should be used only if
     there is no delta	auxfile for that module.   This is  done by specifying a
     preferred auxfile, as in the CP control file for BSEPP Release 2:

     FILE: DMKB20 CNTRL

      TEXT MACS ....
      TEXT AUXB20
      TEXT AUXR60 AUXB20

     That last line means  that the updates listed in the  AUXR60 auxfile are to
     be applied unless there is an AUXB20 auxfile for the module,  in which case
     the whole line is to be ignored.  The second line from the bottom then says
     to apply the updates listed in the AUXB20 auxfile, if there is one.   There
     can be more than one preferred auxfile  listed in a control file statement.
     If any of the preferred auxfiles exists for the module,  then the statement
     is skipped.

     One further  wrinkle in using UPDATE  with control files:	  UPDATE records
     each auxfile name as  it is being used and does not use  it again,  even if
     the control file  specifies that auxfile again.	This can be seen  in the
     following control file, which is used for HPO Release 1 for MP systems.  It
     is included as an exercise for the reader:

     FILE: DMKH1M CNTRL

      TEXT MACS ....
      H1M  AUXH1
      H1A  AUXH1 UPDTMP
      H1   AUXH1 UPDTAP UPDTMP
      MP   AUXSP11 AUXH1
      AP   AUXSP11 AUXH1 UPDTMP
      TEXT AUXSP11 AUXH1 UPDTAP UPDTMP
      MP   UPDTMP
      AP   UPDTAP
      TEXT AUXSP

     Hint:  All HPO updates are listed in  auxfiles named AUXH1,  but it must be
     possible to use this control file	to produce HPO-versioned textfiles named
     TXTH1, TXTH1A, or TXTH1M (as appropriate) and to produce textfiles for non-
     versioned modules named TEXT, TXTAP, or TXTMP (as appropriate).


									PAGE 100

				     APPENDIX B

				   The FRE013 Trap



     This version of the "FRE013 trap" is current for a VM/SP Release 1,  SLU 7,
     system running on a UP without ECPS  microcode.   Versions of this trap for
     other configurations are available from the IBM Support Center.


     FILE: DMKFRE FRE013

      ./ I 1680000 $ 1680100 100
	       EJECT
      *************DMKFRE FRE013 TRAP FOR FREE STORAGE PROBLEMS**************
      * 		   VM/SP VERSION - UNI-PROCESSOR		    *
      ***********************************************************************
      *****    MUST ALSO TURN OFF DMKDSP1, DMKDSP2, DMKUNTFR ECPS      ******
      *****	INSTRUCTIONS IN DMKDSP AND DMKUNT FOR MICROCODED       ******
      *****    CPU TYPES 3138, 3148, 303X, 4331, 4341, ETC.	       ******
      ***********************************************************************
      *****    THIS VERSION HAS THE FOLLOWING PRE-REQUISITES IN ORDER  ******
      *****    TO INSTALL AND EXECUTE SUCCESSFULLY:		       ******
      *****    VM13017 PUTXXXX UVXXXXX - ADD LARGER BUFFER TO SUBPOOL  ******
      *****    VM14280 PUTXXXX UVXXXXX - MICROCODE FOR TCH/FREE/FRET   ******
      *****    VM12640 PUTXXXX UVXXXXX - CLEAN UP EXTENDED PAGES       ******
      ***********************************************************************
      * TRAP OPERATION: 						    *
      * A) TURNS OFF ECPS FOR 'FREE' AND 'FRET' 			    *
      * B) FOR EACH 'FREE' REQUEST:					    *
      *    1) EXPANDS EACH STORAGE REQUEST BY TWO DOUBLEWORDS		    *
      *    2) PUTS 'GVN' + REQUEST LENGTH + CALLER'S R14 IN THE FIRST	    *
      *       ADDITIONAL DOUBLEWORD					    *
      *    3) IF THE CALLER IS PAGEABLE, GETS THE MODULE NAME AT THE START  *
      *       OF THE PAGE IN WHICH THE MODULE RESIDES, AND PUTS IT IN THE   *
      *       SECOND ADDITIONAL DOUBLEWORD				    *
      *    4) RESETS FREE STORAGE BLOCK TO X'EEEEEE...' 		    *
      * C) FOR EACH 'FRET' REQUEST:					    *
      *    1) CHECKS THE REQUEST LENGTH AGAINST THE SAVED LENGTH	    *
      *    2) CHECKS TO SEE THAT THE EYECATCHER IS 'GVN' IN THE FIRST	    *
      *       ADDITIONAL DOUBLEWORD					    *
      * D) ABENDS FROM ILLEGAL SITUATIONS (FRET REQUESTS ONLY): 	    *
      *    ABENDFRE013 - STORAGE NOT MARKED 'GVN' ON CALL TO FRET	    *
      *    ABENDFRE033 - FRET SIZE NOT THE SAME AS EYECATCHER SIZE	    *
      ***********************************************************************
      ./ R 2965000 $ 2966000
	       DC    X'070007000700'  SHUT OFF ECPS 'FREE'	     @FRE13SP
      ./ I 3090000 $ 3091000
	       LA    R2,2(,R2)	    ADD 2 TO REQUESTED SIZE	     @FRE13SP
      ./ I 3280000 $ 3281000 1000
	       L     R15,SUBSIZES(R7)  SET TO FULL SUBPOOL SIZE      @FRE13SP
	       SLL   R15,3	    TIMES 8 FOR NUMBER OF BYTES      @FRE13SP
	       B     FREE20CN					     @FRE13SP


									PAGE 101

      ./ I 3300000 $ 3300100 100
      ***********************  FRE013 TRAP  ************************ @FRE13SP
      *** FILL BLOCK WITH X'EEEEEEEE' S 			     @FRE13SP
      *** MOVE EYECATCHER INTO FIRST WORD AFTER REQUESTED STORAGE,   @FRE13SP
      ***     CALLER'S R14 + LENGTH (FROM R0) INTO THE 2ND WORD      @FRE13SP
      ***     CALLING PGM'S NAME (IF PGM IS PAGEABLE) INTO WORDS 3+4 @FRE13SP
	       L     R15,FREEWORK   GET FULL SUBPOOL OR BLOCK SIZE   @FRE13SP
      FREE20CN L     R14,GPR1	    POINT TO FREE STORAGE	     @FRE13SP
	       L     R2,FREER0	    GET ORIGINAL STORAGE REQUEST     @FRE13SP
	       SLL   R2,3	    GET NUMBER OF REQUESTED BYTES    @FRE13SP
	       AR    R2,R14	    POINT TO END OF REQSTD STORAGE   @FRE13SP
	       L     R1,TESTPATT    SET UP PATTERN OF EEEEEEEE'S     @FRE13SP
	       MVCL  R14,R0	    CLEAR THE STORAGE TO EEEEEE'S    @FRE13SP
	       L     R3,EYEGVN	    AND SET UP TRAP DATA	     @FRE13SP
	       L     R4,FREER14     POINT TO CALLER'S RETN REGISTER  @FRE13SP
	       CL    R4,APAGCP	    IS CALLER PAGEABLE? 	     @FRE13SP
	       BL    NOTPAG	    NO, SKIP SAVING THE MODULE NAME  @FRE13SP
	       N     R4,XPAGNUM     YES, FIND BEGINNING OF MODULE    @FRE13SP
	       LM    R6,R7,0(R4)    GET MODULE NAME AT BEG OF MODULE @FRE13SP
	       STM   R6,R7,8(R2)    SAVE IT BEHIND THE EYECATCHER    @FRE13SP
	       L     R4,FREER14     RESET R4 TO CALLER'S R14	     @FRE13SP
      NOTPAG   DS    0H 	    HERE IF CALLER IS NOT PAGEABLE   @FRE13SP
	       ICM   R4,8,FREER0+3  INCLUDE COUNT IN DOUBLE WORDS    @FRE13SP
	       STM   R3,R4,0(R2)    SAVE CONSTANT AND RETURN REG     @FRE13SP
      ./ I 5130000 $ 5131000
	       ST    R2,FREEWORK   SAVE FULL BYTE CNT OF STORAGE BLK @FRE13SP
      ./ I 6110000 $ 6111000
	       ST    R2,FREEWORK   SAVE FULL BYTE CNT OF STORAGE BLK @FRE13SP
      ./ I 8610000 $ 8611000
	       ST    R2,FREEWORK   SAVE FULL BYTE CNT OF STORAGE BLK @FRE13SP
      ./ I 11462500 $ 11462600
	       LA    R10,FR14	    SET R10 TO GO TO FRE013 TRAP     @FRE13SP
      ./ R 11525000 $ 11526000
	       DC    X'070007000700'  SHUT OFF ECPS 'FRET'	     @FRE13SP
      ./ R 11550000 $ 11551000 1000
	       LM    R7,R9,ADCONFRT  INIT R7-R9 FOR FRET PROCESS     @FRE13SP
	       LA    R10,FR14	    SET R10 TO GO TO FRE013 TRAP     @FRE13SP
      ./ I 11950000 $ 11950100 100
      FR14     DS    0H 	    START OF FRE13 TRAP CATCH LOGIC  @FRE13SP
	       LR    R7,R0	    SIZE INTO REG7		     @FRE13SP
	       SLL   R7,3	    CONVERT TO BYTES		     @FRE13SP
	       L     R8,EYEGVN	    GET THE 'GVN' EYECATCHER	     @FRE13SP
	       C     R8,0(R7,R1)    DID WE FIND 'GVN'?		     @FRE13SP
	       BE    CHECKSZ	    YES, CONTINUE		     @FRE13SP
	       ABEND 13 	    NO, ABENDFRE013		     @FRE13SP
      CHECKSZ  DS    0H 	    CHECK THE SIZE		     @FRE13SP
	       SR    R8,R8	    ZERO REG8			     @FRE13SP
	       IC    R8,4(R7,R1)    GET SIZE FROM EYECATCHER	     @FRE13SP
	       LR    R9,R0	    GET SIZE PASSED TO DMKFRET	     @FRE13SP
	       N     R9,SIZEMASK    STRIP OFF ALL BUT LAST BYTE      @FRE13SP
	       CLR   R9,R8	    IS IT THE SAME?		     @FRE13SP
	       BE    SETEYE	    YES - GO RESET EYECATCHER	     @FRE13SP
	       ABEND 33 	    NO - ABEND FRE033		     @FRE13SP
      SETEYE   DS    0H 	    RESET EYECATCHER		     @FRE13SP


									PAGE 102

	       L     R8,EYEFREE     REPLACE 'GVN' WITH 'FREE'	     @FRE13SP
	       ST    R8,0(R7,R1)    TO TRAP 2ND FRET OF SAME BLOCK   @FRE13SP
	       AL    R0,F2	    BUMP COUNT UP TO FULL FRET SIZE  @FRE13SP
	       LR    R2,R0	    FRET01 NEEDS LENGTH IN REG2
	       LA    R9,DMKFRETE    GET ADDRESS OF FRETE
	       C     R9,FREER15     DID WE COME IN AT FRETE?
	       BE    FRET01	    YES, GO TO FRET01 TO FINISH
	       LM    R7,R10,ADCONFRT RELOAD REGS FOR FRET PROCESS    @FRE13SP
	       BR    R10	    GO COMPLETE FRET PROCESSING      @FRE13SP
	       EJECT
      ./ I 15010000 $ 15011000 1000
      ******************* CONSTANTS FOR FRE13 TRAP **************************
	       DS    0F 	    ...FOR ALIGNMENT		     @FRE13SP
      SIZEMASK DC    XL4'000000FF'  TO ISOLATE LAST BYTE OF SIZE     @FRE13SP
      TESTPATT DC    XL4'EE000000'  PATTERN CHARACTERS FOR GIVEN AREA@FRE13SP
      EYEGVN   DC    XL4'9AC7E5D5'  EYECATCHER 'GVN'		     @FRE13SP
      EYEFREE  DC    XL4'C6D9C5C5'  EYECATCHER 'FREE'		     @FRE13SP



     FILE: DMKFRE FRE13X

      ./ * MODIFY FRE013 TRAP TO ADD ONLY ONE DOUBLEWORD, RATHER THAN  FRE13X
      ./ * TWO, TO EACH FREE REQUEST.				       FRE13X
      ./ *							       FRE13X
      ./  R  03091000 $ 03091100 100				       FRE13X
	       LA    R2,1(,R2)		 ADD 1 TO REQUESTED SIZE.      FRE13X
      ./  D  03300500 $ 					       FRE13X
      ./  D  03301500 03302100 $				       FRE13X
      ./  R  11951900 $ 11951910 10				       FRE13X
	       AL    R0,F1		 BUMP COUNT TO FULL FRET SIZE. FRE13X



     FILE: DMKFRE FRE13Y

      ./ * MODIFY FRE013 TRAP NOT TO SET STORAGE TO X'EE'.	       FRE13Y
      ./ *							       FRE13Y
      ./  D  03281000 03282000 $				       FRE13Y
      ./  D  03300200 $ 					       FRE13Y
      ./  D  03300600 $ 					       FRE13Y
      ./  D  03301100 03301200 $				       FRE13Y
      ./  D  15014000 $ 					       FRE13Y


									PAGE 103

				     APPENDIX C

	       Mod to Resolve External References in Small CP Nucleus



     This  modification is  for VM/SP  Release 1,   SLU 7.    It is  based on  a
     suggestion from Jim Best (PWC).   It builds a dummy module,  DMKRES,  which
     contains  ENTRY  statements  for  all the	external  references  which  are
     normally unresolved in a CP nucleus built with the "small CP option".  This
     zero-length module must be placed at address zero, so that these references
     are "resolved" to zeroes.	WARNING:  If you put DMKRES at any address other
     than zero, your system will crash a lot.



     FILE: CPLOADSM SMALCP

      ./ * INSERT THE DUMMY MODULE 'DMKRES' BETWEEN DMKLD00E AND       SMALCP
      ./ * DMKPSA IN THE SMALL CP LOADLIST, IN ORDER TO RESOLVE        SMALCP
      ./ * ALL THE NORMALLY-UNRESOLVED EXTERNAL REFERENCES IN THE      SMALCP
      ./ * SMALL CP NUCLEUS TO ZERO.				       SMALCP
      ./ *							       SMALCP
      ./  I  00006000 $ 00006500 500				       SMALCP
      &1 &2 &3 DMKRES



     FILE: DMKRES ASSEMBLE

      RES      TITLE 'DMKRES - RESOLVE NORMALLY UNRESOLVED REFERENCES' SMALCP
      DMKRES   CSECT ,						       SMALCP
	       SPACE 1						       SMALCP
	       ENTRY DMKBSCER,DMKDADER,DMKFPS			       SMALCP
	       ENTRY DMKMHCIN,DMKMHCRE,DMKMHVSM 		       SMALCP
	       ENTRY DMKQVMCU,DMKQVMEP,DMKQVMRT,DMKQVMTS	       SMALCP
	       ENTRY DMKRGAIN,DMKRGBEN,DMKRGBFM,DMKRGBIC	       SMALCP
	       ENTRY DMKRGC,DMKRGDOB,DMKRGDOI			       SMALCP
	       ENTRY DMKRNH,DMKRNHIC,DMKRNHIN,DMKRNHND		       SMALCP
	       ENTRY DMKRNHTR,DMKSLC,DMKSNTRN			       SMALCP
	       ENTRY DMKSNTQN					       SMALCP
	       SPACE 1						       SMALCP
	       ENTRY DMKSSS,DMKSSSHV,DMKSSSMQ,DMKSSSEN,DMKSSSVA        SMALCP
	       ENTRY DMKSSSDE,DMKSSSL1,DMKSSSL2,DMKSSSL3	       SMALCP
	       ENTRY DMKSSSUS,DMKSSSAS,DMKSSSLN,DMKSSSRL	       SMALCP
	       ENTRY DMKSSSVM,DMKSSTHV,DMKSSTUS 		       SMALCP
	       ENTRY DMKSSUI1,DMKSSUI2,DMKSSUCF,DMKSSULO	       SMALCP
	       SPACE 1						       SMALCP
	       ENTRY DMKTRKIN,DMKTRKFP,DMKTRKVA 		       SMALCP
	       SPACE 1						       SMALCP
	       ENTRY DMKVCPIL,DMKVCRMT,DMKVCRNR,DMKVCRRD,DMKVCRWT      SMALCP
	       ENTRY DMKVCT,DMKVCTCH,DMKVCTCN,DMKVCTDA,DMKVCTEN        SMALCP
	       ENTRY DMKVCTER,DMKVCTLO,DMKVCTQS 		       SMALCP
	       ENTRY DMKVCTRM,DMKVCTSV,DMKVCVER,DMKVCXIO	       SMALCP


									PAGE 104

	       ENTRY DMKVSC,DMKVSCVR				       SMALCP
      * 							       SMALCP
      DMKBSCER EQU   *						       SMALCP
      DMKDADER EQU   *						       SMALCP
      DMKFPS   EQU   *						       SMALCP
      DMKMHCIN EQU   *						       SMALCP
      DMKMHCRE EQU   *						       SMALCP
      DMKMHVSM EQU   *						       SMALCP
      DMKQVMCU EQU   *						       SMALCP
      DMKQVMEP EQU   *						       SMALCP
      DMKQVMRT EQU   *						       SMALCP
      DMKQVMTS EQU   *						       SMALCP
      DMKRGAIN EQU   *						       SMALCP
      DMKRGBEN EQU   *						       SMALCP
      DMKRGBFM EQU   *						       SMALCP
      DMKRGBIC EQU   *						       SMALCP
      DMKRGC   EQU   *						       SMALCP
      DMKRGDOB EQU   *						       SMALCP
      DMKRGDOI EQU   *						       SMALCP
      DMKRNH   EQU   *						       SMALCP
      DMKRNHIC EQU   *						       SMALCP
      DMKRNHIN EQU   *						       SMALCP
      DMKRNHND EQU   *						       SMALCP
      DMKRNHTR EQU   *						       SMALCP
      DMKSLC   EQU   *						       SMALCP
      DMKSNTRN EQU   *						       SMALCP
      DMKSNTQN EQU   *						       SMALCP
	       SPACE 1						       SMALCP
      DMKSSS   EQU   *						       SMALCP
      DMKSSSAS EQU   *						       SMALCP
      DMKSSSDE EQU   *						       SMALCP
      DMKSSSEN EQU   *						       SMALCP
      DMKSSSHV EQU   *						       SMALCP
      DMKSSSLN EQU   *						       SMALCP
      DMKSSSL1 EQU   *						       SMALCP
      DMKSSSL2 EQU   *						       SMALCP
      DMKSSSL3 EQU   *						       SMALCP
      DMKSSSMQ EQU   *						       SMALCP
      DMKSSSRL EQU   *						       SMALCP
      DMKSSSUS EQU   *						       SMALCP
      DMKSSSVA EQU   *						       SMALCP
      DMKSSSVM EQU   *						       SMALCP
      DMKSSTHV EQU   *						       SMALCP
      DMKSSTUS EQU   *						       SMALCP
      DMKSSUCF EQU   *						       SMALCP
      DMKSSUI1 EQU   *						       SMALCP
      DMKSSUI2 EQU   *						       SMALCP
      DMKSSULO EQU   *						       SMALCP
	       SPACE 1						       SMALCP
      DMKTRKIN EQU   *						       SMALCP
      DMKTRKFP EQU   *						       SMALCP
      DMKTRKVA EQU   *						       SMALCP
	       SPACE 1						       SMALCP
      DMKVCPIL EQU   *						       SMALCP


									PAGE 105

      DMKVCRMT EQU   *						       SMALCP
      DMKVCRNR EQU   *						       SMALCP
      DMKVCRRD EQU   *						       SMALCP
      DMKVCRWT EQU   *						       SMALCP
      DMKVCT   EQU   *						       SMALCP
      DMKVCTCH EQU   *						       SMALCP
      DMKVCTCN EQU   *						       SMALCP
      DMKVCTDA EQU   *						       SMALCP
      DMKVCTEN EQU   *						       SMALCP
      DMKVCTER EQU   *						       SMALCP
      DMKVCTLO EQU   *						       SMALCP
      DMKVCTQS EQU   *						       SMALCP
      DMKVCTRM EQU   *						       SMALCP
      DMKVCTSV EQU   *						       SMALCP
      DMKVCVER EQU   *						       SMALCP
      DMKVCXIO EQU   *						       SMALCP
      DMKVSC   EQU   *						       SMALCP
      DMKVSCVR EQU   *						       SMALCP
	       SPACE 1						       SMALCP
	       END   DMKRES					       SMALCP



     FILE: DTVTAB SMALCP

      ./ * MAKE IPCS/E UNDERSTAND THAT DMKRES IS FIRST CP MODULE,      SMALCP
      ./ * RATHER THAN DMKPSA.					       SMALCP
      ./ *							       SMALCP
      ./ R 00090000	     $ 90490 490			       SMALCP
      CPFIRST  DC    CL8'DMKRES'	 1ST CP NUC MAP MODULE NAME.   SMALCP


									PAGE 106

				     APPENDIX D

		  Alternate Nucleus Mod, System Numbering Mod, and
			EXECs for Building and Installing CP



     Please note that these modifications and  EXECs are included as an example.
     No warranty is  implied.	These modifications are from a	VM/SP Release 1,
     SLU 11,  system and have been used for both FBA and CKD sysres devices,  on
     MP and UP systems.

     It should be noted that all "alternate nuclei" must be on CP-owned volumes.
     All nuclei must have the same cylinder/block location, the one specified in
     the SYSNUC parm on the SYSRES macro in DMKSYS ASSEMBLE.




     FILE: DMKCKP ALTNC0 A1

      ./ * PURPOSE:						       ALTNC0
      ./ *  TO SUPPORT THE 'ALTERNATE NUCLEUS MODIFICATION'.  SPECI-   ALTNC0
      ./ *  FICALLY, TO DIFFERENTIATE BETWEEN THE SYSRES ADDRESS AND   ALTNC0
      ./ *  THE SYSIPL ADDRESS WHEN CHECKPOINTING AND WARM STARTING,   ALTNC0
      ./ *  RESPECTIVELY.					       ALTNC0
      ./ *							       ALTNC0
      ./ R 00280000	      $ 00280010  00000010		       ALTNC0
      *        SYSWARM AREA OF THE SYSRES PACK. 		       ALTNC0
      ./ R  02790000  02800000 $  02790010  00000010		       ALTNC0
	       LH    R0,SYSIPLDV    GET SYSRES ADDRESS		       ALTNC0
	       ST    R0,SYSRES	    SAVE FOR USE BY IBM CODE	       ALTNC0
	       LH    R0,INTTIO	    GET IPL ADDR LEFT BY 'DMP' OR IPL  ALTNC0
	       STH   R0,SYSIPL	    AND SAVE FOR ALT. NUCLEUS CODE.    ALTNC0
      ./ R  05080000	       $  05080010			       ALTNC0
	       LH    R2,SYSIPL	    GET IPL DEVICE ADDRESS	       ALTNC0
      ./ R  09020000	       $  09020010  00000010		       ALTNC0
      SYSRES   DS    F		    SYSTEM RESIDENCE ADDRESS	       ALTNC0
      SYSIPL   DS    F		    SYSTEM IPL ADDRESS		       ALTNC0
      * 							       ALTNC0


     FILE: DMKCPI ALTNC0 A1

      ./ * PURPOSE:						       ALTNC0
      ./ *  TO SUPPORT THE 'ALTERNATE NUCLEUS MODIFICATION'.  SPECI-   ALTNC0
      ./ *  FICALLY, TO ELIMINATE THE TEST FOR IPL'ING FROM THE        ALTNC0
      ./ *  'SYSRES' VOLUME AND TO SAVE THE ACTUAL IPL ADDRESS IN      ALTNC0
      ./ *  'PSAIPLDV' FOR LATER USE BY DMKCKP, DMKCPS AND DMKDMP.     ALTNC0
      ./ *							       ALTNC0
      ./ R 05950000 05970000 $ 5959990 9990			       ALTNC0
	       STH   R10,PSAIPLDV   SAVE IPL ADDRESS.		       ALTNC0
      ./ R 06450000	     $ 6454990 4990			       ALTNC0
	       LH    R15,PSAIPLDV   GET ADDRESS OF IPL DEVICE.	       ALTNC0


									PAGE 107

      ./ R 09990000	     $ 9994990 4990			       ALTNC0
	       LH    R1,PSAIPLDV    ADDRESS OF IPL DEVICE...	       ALTNC0
      ./ R 10970000	     $ 10974990 4990			       ALTNC0
	       CH    R15,PSAIPLDV   IPL DEVICE? 		       ALTNC0
      ./ R 18100000 18110000 $ 18100990 990			       ALTNC0
	       LR    R8,R1	    STANDARD ADDR FOR RDEVBLOK.        ALTNC0
	       CALL  DMKSCNRD	    GET SYSRES DEVICE ADDRESS.	       ALTNC0
	       STH   R1,SYSIPLDV    SAVE A(CKPT/WARM/ERROR VOLUME).    ALTNC0
	       TM    APSTAT1,APUOPER  OTHER PROCESSOR OPERATIONAL?     ALTNC0
	       BZ    CPIPU020	    NO, THEN NO PREFIXING.	       ALTNC0
	       L     R15,PREFIXA    YES, GET ABSOLUTE PSA.	       ALTNC0
	       STH   R1,SYSIPLDV-PSA(,R15)  SAVE VOLUME ADDRESS THERE. ALTNC0
	       L     R15,PREFIXB    AND GET OTHER PROC'S PSA, TOO.     ALTNC0
	       STH   R1,SYSIPLDV-PSA(,R15) SAVE VOLUME ADDRESS FOR HIM.ALTNC0
      CPIPU020 L     R15,CPIDMPSD   ALSO SAVE A(CKPT/WARM/ERROR...     ALTNC0
	       STH   R1,0(,R15)     ...VOLUME) IN 'DMKDMPSD'.	       ALTNC0
	       LH    R1,PSAIPLDV    LOAD ADDRESS OF IPL DEVICE.        ALTNC0
      ./ D 18140000 18150000					       ALTNC0


     FILE: DMKCPS ALTNC0 A1

      ./ * PURPOSE:						       ALTNC0
      ./ *  TO SUPPORT THE 'ALTERNATE NUCLEUS MODIFICATION'.  SPECI-   ALTNC0
      ./ *  FICALLY, TO ALLOW FOR SAVING THE PATH TO AN IPL VOLUME     ALTNC0
      ./ *  WHICH IS NOT THE ONE DESIGNATED AS THE 'SYSRES' VOLUME.    ALTNC0
      ./ *							       ALTNC0
      ./  R  05190000	     $ 05194990 4990			       ALTNC0
      CPSDMPSD DC    A(PSAIPLDV-PSA)  PNTR TO CCU ADDR OF SYS IPL VOL. ALTNC0


     FILE: DMKDDR ALTNC0 A1

      ./ * PURPOSE:						       ALTNC0
      ./ *  TO SUPPORT THE 'ALTERNATE NUCLEUS MODIFICATION'.  SPECI-   ALTNC0
      ./ *  FICALLY, TO ALLOW FOR COPYING A NUCLEUS TO A VOLUME WITH   ALTNC0
      ./ *  A DIFFERENT VOLID.	PREVIOUSLY, THIS RESULTED IN MESSAGE:  ALTNC0
      ./ *  DMKDDR722E OUTPUT UNIT NOT PROPERLY FORMATTED FOR NUCLEUS. ALTNC0
      ./ *  NOTE!!!  THE LOCATION OF THE NUCLEUS CYLINDERS IS STILL    ALTNC0
      ./ *  THAT DEFINED BY THE SYSRES MACRO; ONLY THE VOLID IS        ALTNC0
      ./ *  IGNORED, AND THE VOLUME MUST STILL BE CP-OWNED.	       ALTNC0
      ./ *							       ALTNC0
      ./ I 22700000	      $ 22700100  00000100		       ALTNC0
      * 		NOTE THAT THIS CHECK HAS BEEN MODIFIED	       ALTNC0
      * 		TO ALLOW THE VOLID TO BE DIFFERENT FROM        ALTNC0
      * 		FROM THAT ON THE INPUT NUCLEUS. 	       ALTNC0
      ./ D  23410000  23430000 $				       ALTNC0


									PAGE 108

     FILE: DMKDMP ALTNC0 A1

      ./ * PURPOSE:						       ALTNC0
      ./ *  TO SUPPORT THE 'ALTERNATE NUCLEUS MODIFICATION'.  SPECI-   ALTNC0
      ./ *  FICALLY, TO DIFFERENTIATE BETWEEN THE SYSRES ADDRESS AND   ALTNC0
      ./ *  THE SYSIPL ADDRESS WHEN CHECKPOINTING AND WARM STARTING,   ALTNC0
      ./ *  RESPECTIVELY.					       ALTNC0
      ./ *							       ALTNC0
      ./ R 08950000	     $ 8954990 4990			       ALTNC0
	       LH    R1,DMKDMPSD    A(CKPT/WARM/ERROR VOLUME).	       ALTNC0
      ./ R 09460000	     $ 9464990 4990			       ALTNC0
	       LH    R1,DMKDMPSD    A(CKPT/WARM/ERROR VOLUME).	       ALTNC0
      ./ R 09730000	     $ 9734990 4990			       ALTNC0
	       LH    R15,DMKDMPSD   A(CKPT/WARM/ERROR VOLUME).	       ALTNC0
      ./ R 12350000	     $ 12354990 4990			       ALTNC0
	       LH    R1,PSAIPLDV    GET A(SYSTEM IPL DEVICE).	       ALTNC0
      ./ R 12550000	     $ 12554990 4990			       ALTNC0
	       STH   R1,PSAIPLDV    SAVE PATH'S CCU ADDRESS.	       ALTNC0
      ./ R 12870000	     $ 12874990 4990			       ALTNC0
	       LH    R15,PSAIPLDV   GET SYSTEM IPL DEVICE ADDRESS.     ALTNC0
      ./ I 13500000	     $ 13505000 5000			       ALTNC0
	       STH   R15,DMKDMPSD	 WANT THIS ADDRESS IN MSG.     ALTNC0


     FILE: DMKSAV ALTNC0 A1

      ./ * PURPOSE:						       ALTNC0
      ./ *  TO SUPPORT THE 'ALTERNATE NUCLEUS MODIFICATION'.  SPECI-   ALTNC0
      ./ *  FICALLY, TO ALLOW FOR WRITING NEW NUCLEI ON VOLUMES NOT    ALTNC0
      ./ *  DESIGNATED AS THE 'SYSRES' VOLUME.	PREVIOUSLY, THIS       ALTNC0
      ./ *  RESULTED IN MSG DMKSAV350W DASD 'RADDR' VOLID NOT 'LABEL'. ALTNC0
      ./ *							       ALTNC0
      ./ *     THIS MOD DELETES BOTH THE LABEL COMPARISON TEST AND     ALTNC0
      ./ *     THE MESSAGE DMKSAV350W.				       ALTNC0
      ./ *							       ALTNC0
      ./ R  00460000	       $  00460010  00000010		       ALTNC0
      *        DMKSAVRS:					       ALTNC0
      * 	     R10 = IPL DEVICE ADDRESS IN LOW ORDER BYTES       ALTNC0
      ./  R  01020000 01100000 $ 01020100  00000100		       ALTNC0
      *        3. READ THE VOLUME LABEL, BUT DO NOT CHECK FOR	       ALTNC0
      * 	  EQUALITY WITH THE SYSRES VOLUME LABEL.	       ALTNC0
      ./  D  06640000 06660000 $				       ALTNC0
      ./  D  09640000 09730000 $				       ALTNC0


     FILE: PSA ALTNC0 A1

      ./ R 03080000	     $ 3081000 1000			       ALTNC0
      *        SYSIPLDV IS MAINTAINED IN ALL THREE PSA'S.	       ALTNC0
      SYSIPLDV DS    1H -      P*3  ADDRESS OF CKPT/WARM/ERROR DEVICE. ALTNC0
      ./ R 03770000	      $ 03770100  00000100		       ALTNC0
      *        PSAIPLDV IS MAINTAINED IN ALL THREE PSA'S.	       ALTNC0
      PSAIPLDV DC    H'0'		 SYSTEM IPL DEVICE ADDRESS.    ALTNC0
	       DC    H'0'		 UNUSED.		       ALTNC0


									PAGE 109

     FILE: DMKCPE SYSNM0 A1

      ./ I 00220000 $ 00220100 100				       SYSNM0
	       ENTRY DMKCPE#		 PU CP SYSTEM #.	       SYSNM0
      ./ I 00270000 $ 00270100 100				       SYSNM0
      DMKCPE#  DC    CL8' 192 ' 	 PU CP SYSTEM NUMBER.	       SYSNM0


     FILE: DMKCPI SYSNM0 A1

      ./ I  28400000	       $  28400100  00000100
	       DC    C'; SYSTEM #'				       SYSNM0
      CPINUM   DC    CL3' '		 PU CP SYSTEM NUMBER.	       SYSNM0
      ./ I  29850000	       $  29850100  00000100
	       L     R1,PSACPE# 	 R1=A(PU CP SYSTEM NUMBER).    SYSNM0
	       MVC   CPINUM,1(R1)	 PUT IT INTO THE MESSAGE.      SYSNM0


     FILE: DMKPSA SYSNM0 A1

      ./ * REASSEMBLED BECAUSE OF ADDITION OF			       SYSNM0
      ./ * SYSTEM NUMBER VCON TO PSA MACRO			       SYSNM0


     FILE: PSA SYSNM0 A1

      ./ R 03780000	      $ 03780100  00000100		       SYSNM0
      PSACPE#  DC    V(DMKCPE#) 	 A(PU CP SYSTEM NUMBER).       SYSNM0


									PAGE 110

     FILE: BLDCPT0 EXEC A1

      * THIS EXEC BUILDS A TEST CP NUCLEUS ON MAINT'S 844 (MINI-SYSRES).
      *
      ***   ALLOCATION FOR MAINT'S 844 (MINI-SYSRES); VOLUME LABEL VMR901
      ***   PERM 000 000		       ALLOCATION CYLINDER
      ***   PAGE 001 001		       VIRTUAL FIXED-HEAD PAGING
      ***   PERM 002 002		       CKPT AREA
      ***   PERM 003 003		       WARM START AREA
      ***   PERM 004 005		       CP NUCLEUS
      ***   PERM 006 007		       ERROR RECORDING CYLS
      ***   DRCT 008 009		       DIRECTORY
      ***   TDSK 010 015		       T-DISKS
      ***   TEMP 016 022		       SECONDARY PAGING, SPOOLING
      ***   ....END OF MINIDISK
      ***   PERM 023 554
      *
      ***   ALLOCATION FOR MAINT'S 845; VOLUME LABEL VMM911
      ***   PERM 000 000		       ALLOCATION CYLINDER
      ***   PAGE 001 002		       VIRTUAL FIXED-HEAD PAGING
      ***   TEMP 003 003		       SECONDARY PAGING, SPOOLING
      ***   PERM 004 005		       ALTERNATE CP NUCLEUS
      ***   PERM 006 006		       SAVED-SYSTEM AREA
      ***   PERM 007 007		       VMSETUP A-DISK
      ***   PERM 008 008		       VMSETUP1 A-DISK
      ***   PERM 009 009		       SAVED-SYSTEM AREA
      ***   ....END OF MINIDISK
      ***   PERM 010 554
      *
      ***   ALLOCATION FOR MAINT'S 846; VOLUME LABEL VMM913
      ***   PERM 000 000		       ALLOCATION CYLINDER
      ***   PAGE 001 002		       VIRTUAL FIXED-HEAD PAGING
      ***   TEMP 003 010		       SECONDARY PAGING, SPOOLING
      ***   ....END OF MINIDISK
      ***   PERM 011 554
      *
      ***   ALLOCATION FOR MAINT'S 847; VOLUME LABEL VMM916; 40-CYL T-DISK
      ***   PERM 000 000		       ALLOCATION CYLINDER
      ***   TEMP 001 039		       SECONDARY PAGING, SPOOLING
      ***   ....END OF MINIDISK
      ***   PERM 040 554
      *
      ***   ALLOCATION FOR MAINT'S 947; VOLUME LABEL VMM917; 40-CYL T-DISK
      ***   PERM 000 000		       ALLOCATION CYLINDER
      ***   TEMP 001 019		       SECONDARY PAGING, SPOOLING
      ***   TDSK 001 039		       T-DISKS
      ***   ....END OF MINIDISK
      ***   PERM 040 554
      *
      &CONTROL OFF
      &TYPE TEST SYSTEM BUILD
      CP SPOOL CON START NOTERM
      EXEC SYSDISKS
      CP CLOSE RDR


									PAGE 111

      CP PURGE RDR
      CP CLOSE PUN
      CP PURGE PUN
      CP SPOOL 00D *
      VMFLOAD VRLOAD DMKSPTST
      CP SPOOL PRT *
      CP SPOOL CON STOP PURGE TERM
      CP IPL 00C CLEAR


     FILE: BLDCPT1 EXEC A1

      * THIS EXEC BUILDS A TEST NON-V=R CP NUCLEUS ON MAINT'S 845 (MINI-SYSRES
      * ALTERNATE).
      *
      &CONTROL OFF
      &TYPE ALTERNATE TEST SYSTEM BUILD
      CP SPOOL CON STA NOTERM
      LINCNTRL LINK
      CP DET 844
      CP LINK MAINT 845 844 MW
      LINCNTRL DET
      EXEC SYSDISKS
      CP CLOSE RDR
      CP PURGE RDR
      CP CLOSE PUN
      CP PURGE PUN
      CP SPOOL 00D *
      VMFLOAD CPLOAD DMKSPTST
      CP SPOOL PRT *
      CP SPOOL CON STOP PURGE TERM
      &TYPE REMEMBER TO: - DET 844 - AND - LINK * 844 844 MW
      CP IPL 00C CLEAR


									PAGE 112

     FILE: SYSDISKS EXEC A1

      * THIS EXEC IS USED TO ESTABLISH THE ENVIRONMENT FOR THE VIRTUAL
      * CP TEST SYSTEM
      *
      &CONTROL OFF
      CP SPOOL CON START NOTERM
      CP TERM LINEND
      CP DEF GRAF 020
      CP DEF GRAF 021
      CP DEF GRAF 022
      CP DEF LINE 670 IBM1
      CP DEF LINE 672 IBM1
      CP DEF LINE 692 TELE2
      CP DEF LINE 693 TELE2
      CP DEF LINE 694 TELE2
      CP DEF LINE 695 TELE2
      CP DEF LINE 696 TELE2
      CP DEF LINE 697 TELE2
      CP DEF 3211 602
      CP READY 602
      * NOTE THAT LINCNTRL IS THE LOCAL 'SUPERLINK' COMMAND
      LINCNTRL LINK
      CP LINK VMOSSYS 353 353 MW
      CP LINK VMOSSYS 440 440 RR
      CP LINK VMBACKUP 354 354 RR
      CP LINK VMBACKUP 356 356 RR
      CP LINK VMBACKUP 35A 35A RR
      CP LINK VMBACKUP 443 443 RR
      CP LINK VMBACKUP 840 840 RR
      CP LINK VMBACKUP 841 841 RR
      CP LINK VMBACKUP 842 842 RR
      CP LINK VMBACKUP 843 843 RR
      CP LINK VMBACKUP 940 940 RR
      CP LINK VMBACKUP 941 941 RR
      CP LINK VMBACKUP 942 942 RR
      CP LINK VMBACKUP 943 943 RR
      CP LINK VMBACKUP A65 A60 RR
      CP LINK VMBACKUP A62 A62 RR
      CP LINK VMBACKUP A64 A64 RR
      CP LINK VMBACKUP A6E A6E RR
      CP SPOOL CON STOP TERM PURGE
      &EXIT


									PAGE 113

     FILE: BLDCP0 EXEC A1

      * THIS EXEC BUILDS A REAL CP SYSTEM ON MAINT'S 740 (MINI-SYSRES) FROM
      * WHENCE IT IS MOVED TO THE REAL 840 VIA DDR'S COPY NUCLEUS FUNCTION,
      * USING THE 'COPYNUC0' OR 'COPYNUCX' EXEC'S.
      *
      ***   ALLOCATION FOR MAINT'S 740 (MINI-SYSRES); VOLUME LABEL VMR001
      ***   PERM 000 000		       ALLOCATION CYLINDER
      ***   PAGE 001 002		       VIRTUAL FIXED-HEAD PAGING
      ***   PERM 003 003		       WARM START AREA
      ***   PERM 004 005		       CP NUCLEUS
      ***   PERM 006 007		       ERROR RECORDING CYLS
      ***   DRCT 008 009		       DIRECTORY
      ***   TDSK 010 010		       T-DISKS
      ***   TEMP 011 014		       SECONDARY PAGING, SPOOLING
      ***   ....END OF MINIDISK
      ***   PERM 015 554
      *
      ***   ALLOCATION FOR MAINT'S 741; VOLUME LABEL VMM011
      ***   PERM 000 000		       ALLOCATION CYLINDER
      ***   TEMP 001 003		       SECONDARY PAGING, SPOOLING
      ***   PERM 004 005		       ALTERNATE CP NUCLEUS
      ***   ....END OF MINIDISK
      ***   PERM 006 554
      *
      &TYPE REAL SYSTEM BUILD...
      &CONTROL OFF
      CP SPOOL PRT VMRSCS
      CP SPOOL CON START NOTERM
      *
      * IF "NOINC" OPTION SPECIFIED, BYPASS INCREMENTING OF CP NUCLEUS NUMBER
      * IN DMKCPE.
      *
      &IF &$ EQ NOINC &GOTO -NOINC
      *
      EXEC SYSNUM &STACK LIFO
      &READ VARS &NUM
      &NUM = &NUM + 1
      *
      ERASE SYSNUM EXEC *
      &STACK INPUT
      &STACK &LITERAL &1 &LITERAL &2 &NUM
      &STACK
      &STACK FILE
      EDIT SYSNUM EXEC
      *
      ERASE DMKCPE SYSNM0 *
      &STACK INPUT
      &BEGSTACK
      ./ I 00220000 $ 00220100 100				       SYSNM0
	       ENTRY DMKCPE#	   PU CP SYSTEM #.		       SYSNM0
      ./ I 00270000 $ 00270100 100				       SYSNM0
      &END
      &STACK DMKCPE# DC CL8' &NUM ' PU CP SYSTEM NUMBER. SYSNM0


									PAGE 114

      &STACK
      &STACK FILE
      EDIT DMKCPE SYSNM0
      *
      EXEC VMFASM DMKCPE DMKSPPU
      *
      -NOINC
      CP DET 840
      CP DET 841
      CP DET 842
      CP DET 843
      CP DET 940
      CP DET 941
      CP DET 942
      CP DET 943
      CP LINK MAINT 740 840 MW MWRITE
      CP CLOSE RDR
      CP PURGE RDR
      CP CLOSE PUN
      CP PURGE PUN
      CP SPOOL 00D *
      VMFLOAD VRLOAD DMKSPPU
      CP SPOOL PRT VMIPCS
      CP SPOOL CON STOP PUR TERM
      CP IPL 00C CLEAR


     FILE: SYSNUM EXEC A1

      &1 &2 192


									PAGE 115

     FILE: BLDCP1 EXEC A1

      * THIS EXEC BUILDS A REAL NON-V=R CP SYSTEM ON MAINT'S 741 FOR USE IF
      * MEMORY FAILS (SINCE THE V=R SYSTEM WON'T RUN LESS THAN 8 MEGS.
      * THE EXEC 'COPYNUC1' IS USED TO INSTALL THIS SYSTEM ON THE REAL 841.
      *
      ***   ALLOCATION FOR MAINT'S 741; VOLUME LABEL VMM011
      ***   PERM 000 000		       ALLOCATION CYLINDER
      ***   TEMP 001 003		       SECONDARY PAGING, SPOOLING
      ***   PERM 004 005		       ALTERNATE CP NUCLEUS
      ***   ....END OF MINIDISK
      ***   PERM 006 554
      *
      &TYPE NON-V=R SYSTEM BUILD...
      &CONTROL OFF
      CP SPOOL CON STA NOTERM
      LINCNTRL LINK
      CP DET 840
      CP DET 841
      CP DET 842
      CP DET 843
      CP DET 940
      CP DET 941
      CP DET 942
      CP DET 943
      CP LINK MAINT 741 840 MW
      CP CLOSE RDR
      CP PURGE RDR
      CP CLOSE PUN
      CP PURGE PUN
      CP SPOOL 00D *
      VMFLOAD CPLOAD DMKSPPU
      CP SPOOL PRT *
      CP SPOOL CON STOP PUR TERM
      &TYPE REMEMBER TO: - DEF 840 841 - AND - LINK * 740 840 MW
      CP IPL 00C CLEAR


									PAGE 116

     FILE: COPYNUC0 EXEC A1

      * THIS EXEC IS USED TO INSTALL A NEW CP SYSTEM BY COPYING IT FROM MAINT'S
      * 740 MINIDISK (MINI-SYSRES) TO THE REAL 840.  IT ALSO COPIES THE MOST
      * RECENT SYSTEM FROM 840 TO 842 AND THE PREVIOUS SYSTEM FROM 842 TO 843.
      *
      &CONTROL OFF
      &ERROR -ERR
      *
      CP DET 840
      CP DET 842
      CP DET 843
      CP LINK * 740 740 RR
      *
      LINCNTRL LINK
      CP LINK VMBACKUP 840 840 MW
      CP LINK VMBACKUP 842 842 MW
      CP LINK VMBACKUP 843 843 MW
      *
      &BEGSTACK
      IN 842 3350 VMM013
      OUT 843 3350 VMM015
      COPY NUCLEUS

      &ENDSTACK
      CP SPOOL CON NOTERM
      DDR
      CP SPOOL CON TERM STOP
      &TYPE OLD OLD SYSTEM NOW ON REAL VMM015
      *
      &BEGSTACK
      IN 840 3350 VMR001
      OUT 842 3350 VMM013
      COPY NUCLEUS

      &ENDSTACK
      CP SPOOL CON NOTERM
      DDR
      CP SPOOL CON TERM STOP
      &TYPE OLD SYSTEM NOW ON REAL VMM013
      *
      &BEGSTACK
      IN 740 3350 VMR001
      OUT 840 3350 VMR001
      COPY NUCLEUS

      &ENDSTACK
      CP SPOOL CON NOTERM
      DDR
      CP SPOOL CON TERM STOP
      &TYPE NEW SYSTEM NOW ON REAL VMR001
      *
      LINCNTRL DET
      &EXIT


									PAGE 117

      *
      -ERR CP SPOOL CON TERM STOP
      &TYPE ERROR OCCURRED DURING COPY.
      LINCNTRL DET
      &EXIT


     FILE: COPYNUC1 EXEC A1

      * THIS EXEC IS USED TO INSTALL AN ALTERNATE SYSTEM ON THE REAL 841 BY
      * COPYING IT FROM MAINT'S 741; THIS IS GENERALLY A NON-V=R SYSTEM.
      *
      &CONTROL OFF
      &ERROR -ERR
      LINCNTRL LINK
      CP DET 841
      CP LINK * 741 741 RR
      CP LINK VMBACKUP 841 841 MW
      &BEGSTACK
      IN 741 3350 VMM011
      OUT 841 3350 VMM011
      COPY NUCLEUS

      &ENDSTACK
      CP SPOOL CON NOTERM
      DDR
      CP SPOOL CON TERM STOP
      &TYPE NEW SYSTEM NOW ON REAL VMM011
      LINCNTRL DET
      &EXIT
      -ERR CP SPOOL CON TERM STOP
       &TYPE ERROR OCCURRED DURING COPY.
      LINCNTRL DET
      &EXIT


									PAGE 118

     FILE: COPYNUCX EXEC A1

      * THIS EXEC COPIES A NEW CP SYSTEM FROM MAINT'S 740 TO THE REAL 840
      * WITHOUT MOVING THE OLD SYSTEMS DOWN A SLOT.
      *
      &CONTROL OFF
      &TYPE OLD SYSTEM NOT BEING COPIED TO VMM013
      &ERROR -ERR
      LINCNTRL LINK
      CP DET 840
      CP DET 842
      CP LINK * 740 740 RR
      CP LINK VMBACKUP 840 840 MW
      CP LINK VMBACKUP 842 842 MW
      *
      &BEGSTACK
      IN 740 3350 VMR001
      OUT 840 3350 VMR001
      COPY NUCLEUS

      &ENDSTACK
      CP SPOOL CON NOTERM
      DDR
      CP SPOOL CON TERM STOP
      &TYPE NEW SYSTEM NOW ON REAL VMR001
      *
      LINCNTRL DET
      &EXIT
      *
      -ERR CP SPOOL CON TERM STOP
       &TYPE ERROR OCCURRED DURING COPY.
      LINCNTRL DET
      &EXIT


									PAGE 119

     FILE: BACKOUT EXEC A1

      * THIS EXEC BACKS OUT OF A BAD CP SYSTEM.  IT MOVES THE PREVIOUS SYSTEM
      * FROM THE REAL 842 TO THE REAL 840.  THIS IS DONE ONLY FOR NEATNESS
      * AND TIDINESS AND SO THAT THE OPERATORS DON'T HAVE TO USE AN IPL
      * ADDRESS THEY ARE NOT USED TO.  THE SYSTEM WILL RUN PERFECTLY WELL
      * FROM DEVICE 842.
      *
      &CONTROL OFF
      &ERROR -ERR
      LINCNTRL LINK
      CP DET 840
      CP DET 842
      CP LINK VMBACKUP 840 840 MW
      CP LINK VMBACKUP 842 842 MW
      *
      &BEGSTACK
      IN 842 3350 VMM013
      OUT 840 3350 VMR001
      COPY NUCLEUS

      &ENDSTACK
      CP SPOOL CON NOTERM
      DDR
      CP SPOOL CON TERM STOP
      &TYPE OLD SYSTEM NOW ON REAL VMR001
      *
      LINCNTRL DET
      &EXIT
      *
      -ERR CP SPOOL CON TERM STOP
       &TYPE ERROR OCCURRED DURING COPY.
      LINCNTRL DET
      &EXIT


									PAGE 120

     FILE: IPLTIME ASSEMBLE A1

	       TITLE 'IPLTIME--DISPLAYS IPL TIME, SYSTEM #, LAST ABEND'
	       COPY  EQU
	       EJECT
      IPLTIME  CSECT
	       STM   R14,R12,12(R13)
	       BALR  R12,0	    GET ADDRESSABILITY
	       USING *,R12	    AND TELL ASSEMBLER
	       USING PSA,0
	       SPACE
	       LA    R3,STRTTIME    POINT TO STARTIME WORD IN CP
	       LA    R4,4	    FOUR WORDS NEEDED FROM CP
	       LA    R5,TMPR4	    OUTPUT AREA
	       DIAG  R3,R4,4	    FETCH THE WORK
      * 			    SYSTEM IPL DATE AND TIME
	       LM    R0,R1,TMPR4    GET TOD CLOCK VALUE
	       SRDL  R0,12	    CONVERT TO MICROSECONDS
	       D     R0,=F'8000000' GET NUMBER OF SECONDS BY THE FOLLOWING
	       LR    R3,R0	    DOUBLE PRECISION DIVISION:
	       SLR   R2,R2	    X/Y=8*(X/(8*Y))+MOD(X,8*Y)/Y
	       D     R2,=F'1000000' WHERE X = NUMBER OF MICROSECONDS SINCE
	       SLR   R0,R0	    EPOCH
	       SLDL  R0,3	    Y = 1000000
	       ALR   R1,R3	    ...
	       BC    12,*+8	    ...
	       A     R0,FW1	    R0 - R1 = NUMBER OF SECONDS SINCE EPOCH
	       D     R0,=F'86400'   R1 = NUMBER OF DAYS SINCE EPOCH
      * 			    R0 = NUMBER OF SECONDS PAST MIDNIGHT
      *        L     R15,=A(DMKSYSTZ)  GET PTR OT TIME ZONE CORRECTION
	       LA    R15,FW0	    NO CORRECTION FOR NOW
	       A     R0,0(,R15)     ADJUST SEC TO INCLUDE GMT DIFFERENCE
	       BNM   *+10	    BRANCH IF RESULT .GE. ZERO
	       A     R0,=F'86400'   ADD A DAYS WORTH OF SECONDS
	       BCTR  R1,0	    AND SUBTRACT A DAY
	       C     R0,=F'86400'   SEC .LT. 1 DAY?
	       BL    *+12	    YES
	       S     R0,=F'86400'   SUBTRACT A DAYS WORTH OF SECONDS
	       A     R1,FW1	    AND ADD A DAY
	       LR    R5,R0
	       M     R4,=F'1000000' MULTIPLY CORRECTED SECONDS BY 1000000
	       ALR   R5,R2	    ADD REMAINDER FROM FIRST DIVISION
	       BC    12,*+8	    ...
	       A     R4,FW1	    ...
	       SLDL  R4,12
	       LM    R14,R15,TMPR4  GET INITIAL TOD CLOCK VALUE
	       SLR   R15,R5	    NUMBER OF SECONDS INTO THE DAY
	       BC    11,*+8	    ...
	       SL    R14,FW1	    ...
	       SLR   R14,R4	    ...
	       STM   R14,R15,TMPR2  RESULT IS TOD CLOCK VALUE AT MIDNIGHT
      * 			    TODAY LOCAL TIME
	       SPACE
	       LA    R3,365


									PAGE 121

	       CR    R1,R3	    IS DAYS .LT. 365?
	       BNL   NOT1900	    NO
	       LR    R6,R1	    GET NUMBER OF DAYS HERE
	       SLR   R1,R1	    INDICATE YEAR = 00
	       B     YEARSET
	       SPACE
      NOT1900  EQU   *	HERE IS YEAR IS GREATER THAN 1900
	       SR    R1,R3	    SUBTRACT THE YEAR 1900 OUT
	       SLR   R0,R0	    CLEAR FOR DIVIDE
	       D     R0,=A(4*365+1) DIVIDE BY THE NUMBER OF DAYS IN 4 YEARS
	       LR    R7,R0	    R7 = NUMBER OF DAYS SINCE LAST YEAR
	       SLR   R6,R6
	       DR    R6,R3
	       A     R6,FW1	    R6 = NUMBER OF DAYS SINCE START OF YEAR
	       C     R7,=F'4'	    MULTIPLE OF 4 YEARS?
	       BNE   NOTQUAD	    NO
	       AR    R6,R3	    SETPDAY = 366
	       L     R7,FW3	    ...
      NOTQUAD  EQU   *
	       ALR   R1,R1
	       ALR   R1,R1
	       A     R1,FW1
	       AR    R1,R7
	       SPACE
      YEARSET  EQU   *	HERE WHEN YEAR HAS BEEN DETERMINED
	       LA    R11,OUTBUF     POINT TO BUFFER FOR OUTPUT
      * 			    AND TIME DATE AREA IN THE SYSTEM MSG
	       SPACE
	       CVD   R1,TMPSAVE     CONVERT DATE TO DECIMAL
	       UNPK  6(2,R11),TMPSAVE+6(2)  UNPACK AND
	       OI    7(R11),X'F0'   FORMAT IT
	       SPACE
      * 	     HERE TO CONVERT JULIAN DATE TO GREGORIAN
	       SPACE 1
      * THE FOLLOWING ALGORITHM TO CONVERT A JULIAN DATE TO GREGORIAN WAS
      * ADOPTED FROM AN ALGORITHM ENTITLED 'TABLELESS DATE CONVERSION'
      * APPEARING IN 'COMMUNICATIONS OF THE ACM', VOLUME 13, NUMBER 10,
      * OCTOBER 1970, P. 621, BY RICHARD A. STONE, WESTERN ELECTRIC COMPANY
      * P.O. BOX 900, PRINCETON, N.J. 08540
	       SLR   R2,R2	    CLEAR REG 2
	       N     R1,FW3	    P YEAR MOD 4
	       BNZ   *+8	    BRANCH IF NOT A LEAP YEAR
	       LA    R2,1	    GET GREGORIAN DATE FROM JULIAN
	       LA    R1,59(,R2)     ...
	       CR    R6,R1	    ...
	       BNH   *+10	    ...
	       A     R6,FW2	    ...
	       SR    R6,R2	    ...
	       A     R6,=F'91'	    ...
	       LR    R9,R6	    ...
	       M     R8,=F'100'     ...
	       D     R8,=F'3055'    ...
	       LR    R15,R9	    ...
	       M     R14,=F'3055'   ...


									PAGE 122

	       D     R14,=F'100'    ...
	       SR    R6,R15	    ...
	       BCTR  R9,0	    ...
	       BCTR  R9,0	    ...
	       CVD   R6,TMPSAVE     CONVERT DAY TO DECIMAL
	       UNPK  3(2,R11),TMPSAVE+6(2)  UNPACK AND
	       OI    4(R11),X'F0'   FORMAT IT
	       MVI   5(R11),C'/'
	       CVD   R9,TMPSAVE     CONVERT MONTH TO DECIMAL
	       UNPK  0(2,R11),TMPSAVE+6(2)  UNPACK AND
	       OI    1(R11),X'F0'   FORMAT IT
	       MVI   2(R11),C'/'
	       SPACE
      * 	     SET UP TIME
	       LA    R11,9(0,R11)   POINT TO THE TIME IN MSG
	       LM    R0,R1,TMPR4    GET TOD CLOCK VALUE IN R0 AND R1
	       SL    R1,TMPR2+4     SUBTRACT CORRECT TIME AT MIDNIGHT
	       BC    11,*+8	    ...
	       SL    R0,=F'1'	    ...
	       SL    R0,TMPR2	    ...
	       SRDL  R0,12	    GET NUMBER OF MICROSECONDS PAST MIDNIGHT
	       D     R0,=F'1000000' GET NUMBER OF SECONDS PAST MIDNIGHT
	       SR    R0,R0	    IGNORE REMAINDER
	       D     R0,=F'3600'    GET NUMBER OF HOURS PAST MIDNIGHT
	       CVD   R1,TMPSAVE     CONVERT NUMBER OF HOURS TO DECIMAL
	       UNPK  0(4,R11),TMPSAVE+6(3)   UNPACK
	       MVI   2(R11),C':'    NEATEN UP
	       LR    R1,R0	    GET REMAINDER FROM LAST DIVIDE
	       SR    R0,R0	    CLEAR
	       D     R0,=F'60'	    GET NUMBER OF MINUTES PAST THIS HOUR
	       CVD   R1,TMPSAVE     CONVERT NUMBER OF MINUTES TO DECIMAL
	       UNPK  3(4,R11),TMPSAVE+6(3)   UNPACK
	       MVI   5(R11),C':'    NEATEN UP
	       CVD   R0,TMPSAVE     CONVERT NUMBER OF SECONDS TO DECIMAL
	       UNPK  6(2,R11),TMPSAVE+6(2)   UNPACK
	       OI    7(R11),X'F0'   MAKE UP FOR HARDWARE DEFICIENCIES
      *
	       MVC   OUTBUF2,=CL6'NONE'  DEFAULT TO NO ABEND CODE
	       ICM   R1,B'1111',TMPR5	PICK UP ABEND CODE
	       BZ    NOABEND	    NO ABEND CODE
	       STCM  R1,B'1110',OUTBUF2  PUT CHAR DIRECTLY IN MSG
	       N     R1,=X'000000FF'  SAVE ONLY BINARY ABEND CODE
	       CVD   R1,TMPR2	    BINARY TO DECIMAL
	       UNPK  OUTBUF2+3(3),TMPR2+6(2)  NOW EBCDIC
	       OI    OUTBUF2+5,X'F0' MAKE A VALID ZONE FIELD
      *
      NOABEND  EQU   *
	       LA    R3,TMPR6	      A(CP SYSTEM NUMBER).
	       LA    R4,1	      NEED 1 WORD.
	       LA    R5,OUTBUF3       PUT SYSTEM NUMBER IN OUTBUF3.
	       DIAG  R3,R4,4
      *
	       LINEDIT TEXT='SYSTEM IPL TIME: ................. ABEND CODE: .*
		     .....; CP SYSTEM #...',SUB=(CHARA,OUTBUF,CHARA,OUTBUF2, *


									PAGE 123

		     CHARA,OUTBUF3+1)
	       LM    R14,R12,12(R13)  RESTORE CALLERS REGS
	       SR    R15,R15
	       BR    R14
	       SPACE
	       LTORG
      TMPSAVE  DS    D
      OUTBUF   DC    CL32' '
	       DS    0F
      OUTBUF2  DS    CL6
      OUTBUF3  DS    F		    CP SYSTEM NUMBER
      *
      TMPR2    DS    D
      TMPR4    DS    D
      TMPR5    DS    F
      TMPR6    DS    F		    A(CP SYSTEM NUMBER).
      *
      STRTTIME DC    A(STARTIME-PSA)  CP START TIME
	       DC    A(STARTIME+4-PSA)	SECOND HALF
	       DC    A(CPABEND-PSA) ABEND CODE
	       DC    A(PSACPE#-PSA) A(A(CP SYSTEM NUMBER)).
      *
      FW0      DC    F'0'
      FW1      DC    F'1'
      FW2      DC    F'2'
      FW3      DC    F'3'
	       EJECT
	       PSA
	       END   IPLTIME


									PAGE 124

				     APPENDIX E

		  IPLable System Which Decides Which SP2 CMS to IPL



     The following program  was written by Larry Brenner  of Cornell University.
     It is  used to save  a one-page,	IPLable system (ordinarily  named "CMS")
     which will IPL  either "CMSS" (a "small  CMS" system)  or "CMSL"  (a "large
     CMS"  system),  depending	on the	virtual  machine size.	  This makes  it
     unnecessary for the user to know that  there are two different CMS systems,
     with their nuclei loaded at different addresses.


     FILE: IPLER ASSEMBLE

	       PRINT NOGEN
      *  THIS PROGRAM IS TO BE SAVED AS AN UNSHARED SINGLE PAGE SYSTEM,
      *  X'20000', AND WHEN IPLED IT THEN DECIDES BASED UPON THE CURRENT
      *  VIRTUAL MACHINE SIZE WHICH 'REAL' SYSTEM TO IPL FOR THE USER.
      *  THE MODULE MUST BE GENERATED WITH THE 'SYSTEM' OPTION.
      *
      *  ORIGINAL INTENT:  'IPL CMS' GETS YOU INTO THIS PROGRAM, WHICH
      *  THEN IPLS EITHER STANDARD CMS (CALLED CMSS) OR LARGE CMS (CMSL).
      *
      *  RUN THIS PROGRAM IN THE CMS USER AREA AS FOLLOWS
      *
      *    IPLER FUNCTION SAVENAME SMALLSYS LARGESYS
      *
      *  WHERE
      *
      *    FUNCTION IS 'SAVESYS' TO CAUSE THE PROGRAM TO ISSUE A CP
      *      SAVESYS TO SAVE ITSELF AS SYSTEM SAVENAME.  IF FUNCTION
      *      IS ANYTHING ELSE, WE JUST RUN IN TEST MODE UNDER CMS.
      *      (THAT IS, WE DON'T IPL ANYTHING, BUT INSTEAD SEND A CP
      *      MESSAGE INDICATING WHAT WOULD HAVE BEEN IPLED.)
      *
      *    SAVENAME IS THE NAME FOR THIS PROGRAM AS A SAVED SYSTEM.
      *      (NOTE - JUST SAVE THE FIRST PAGE OF THE USER AREA, AND
      *      DO NOT DECLARE ANYTHING AS A SHARED SEGMENT.)
      *
      *    SMALLSYS IS THE NAME OF THE SYSTEM TO IPL IF IT FITS IN
      *      THE CURRENT VIRTUAL MACHINE STORAGE.
      *
      *    LARGESYS IS THE NAME OF THE SYSTEM TO IPL OTHERWISE.
      *
      *  LARRY BRENNER 9/82 VM/SP RELEASE 2.
      *
      IPLER    START X'20000'
	       USING *,R12
	       LR    R12,R15
	       LA    R15,8	    PRESET FOR ERROR
	       CLI   40(R1),X'FF'   A QUICK TEST FOR ENOUGH PARAMETERS
	       BNER  R14	    NO - TOO BAD.


									PAGE 125

	       MVC   FUNCTION(32),8(R1)  SAVE OUR PARAMETERS
	       CLC   FUNCTION,SAVESYS	 TEST HERE TO SAVESYS OURSELF
	       BNE   RUN	    NO - JUST HERE TO TEST.
      *
      *  USE DIAG 8 TO ISSUE A CP SAVESYS.
      *
      *  THE INTERESTING THING HERE IS THAT THE CODE BELOW THE DIAGNOSE
      *  WHICH ISSUES THE SAVESYS WILL BE EXECUTED IN TWO MODES.  AFTER
      *  THE SAVESYS, IT WILL HAVE TO RETURN CONTROL TO CMS.  BUT WHEN
      *  RUNNING 'STAND-ALONE' AFTER BEING IPLED, IT MUST CONTINUE AND
      *  BE ABLE TO RECOGNIZE IF ANY IPL PARMS ARE TO BE PASSED.
      *  WE TELL IF WE'RE STAND-ALONE BY SEEING IF THE IONEW PSW IS ALL
      *  ZEROES.  UNDER CMS IT CAN'T BE, AND AFTER IPL ALL PAGES EXCEPT
      *  THE ONE CONTAINING THIS PROGRAM HAVE BEEN RELEASED.
      *
      *  OF PARTICULAR IMPORTANCE HERE IS THE HANDLING OF THE REGISTERS.
      *  SINCE THE IPL PARMS MAY WIPE OUT ALL 16 REGISTERS, THIS CODE MUST
      *  BE ABLE TO RUN WITH NO ASSUMPTIONS ABOUT ITS REGISTERS BELOW THE
      *  DIAGNOSE.  SINCE R15 IS USED IMMEDIATELY AS A TEMPORARY BASE, THE
      *  ONLY WAY TO PRESERVE THE POSSIBLE PIECE OF IPL PARMS THAT MIGHT
      *  BE IN IT IS TO USE STORAGE IN PAGE 0 (NO BASE REGISTER).  WE USE
      *  LOCATION ZERO, AND PRESERVE IT OVER THE DIAGNOSE SO THAT IT CAN
      *  BE RESTORED IF WE ARE JUST RUNNING UNDER CMS.
      *  AT THE TIME THE DIAGNOSE SAVESYS IS ISSUED, ALL REGISTERS ARE
      *  EITHER ZERO OR AT LEAST THEIR HIGH-ORDER BYTES ARE ZERO.  THIS
      *  ALLOWS US TO DETERMINE HOW MANY REGISTERS WORTH OF IPL PARMS
      *  WERE PASSED TO US, SO WE CAN IN TURN PASS THEM TO THE SYSTEM WE
      *  WILL IPL.  NOTE THAT ALL THIS OBSCURITY ALLOWS US TO DEAL WITH
      *  THE FULL 64 BYTES.
      *
	       ST    R14,CMSRET     SAVE RETURN ADDRESS TO CMS
	       MVC   CMS0,0	    SAVE CONTENTS OF LOCATION ZERO
	       LR    R15,R12	    MOVE BASE TO HIGHEST REGISTER
	       USING IPLER,R15
	       LM    R0,R14,IPLPARMS	 CLEAR LOTS OF REGISTERS
	       LA    R2,FUNCTION    -> 'SAVESYS' AND SAVENAME
	       LA    R3,16	    LENGTH
	       SSM   *+1	    RUN DISABLED WHEN IPLED
	       DC    X'83230008'    ISSUE SAVESYS COMMAND
      *-----------------------------
	       ST    R15,0	    SAVE POSSIBLE END OF IPL PARMS
	       BALR  R15,0	    LOAD BASE TO BE SAFE
	       USING *,R15
	       STM   R0,R14,IPLPARMS	 SAVE MOST IPL PARMS
	       L     R12,=A(IPLER)  RESTORE NORMAL BASE REGISTER
	       DROP  R15
	       MVC   IPLP15,0	    APPEND LAST 4 POSSIBLE PARM BYTES
	       L     R14,CMSRET     RESTORE R14
	       CLC   =XL8'0',120    IF IONEWPSW=0, WE'RE STAND-ALONE
	       BE    RUN	    YES - CONTINUE.
	       SSM   =X'FF'	    NO - RE-ENABLE,
	       LR    R15,R3	    LOAD RETURN CODE VALUE,
	       MVC   0(4,0),CMS0    RESTORE CONTENTS OF LOCATION ZERO,
	       BR    R14	    AND RETURN.


									PAGE 126

      *
      *  ISSUE DIAGS 60 AND 64 TO DETERMINE THE VIRTUAL MACHINE SIZE AND
      *  LIMIT ADDRESS FOR THE SMALL SYSTEM.  (THIS ISN'T PERFECT, BUT
      *  UNFORTUNATELY THE LOW ADDRESS OF A CMS SYSTEM IS ALWAYS ZERO.)
      *  NOTE - IF THE SMALL SYSTEM DOES NOT EXIST, R4 <- 44, AND THE
      *  IPL WILL BE FOR THE LARGE SYSTEM.
      *
      RUN      DC    X'83200060'    VIRTUAL MACHINE SIZE -> R2
	       LA    R3,SMALLSYS    -> SMALL SYSTEM NAME
	       LA    R4,12	    FINDSYS SUBCODE
	       DC    X'83340064'    TOP OF SYSTEM -> R4
	       MVC   IPLNAME,SMALLSYS	 ASSUME WILL IPL THE SMALL ONE
	       CR    R4,R2	    TOP SYSTEM ADDRESS :: VMSIZE
	       BH    *+10	    OK TO IPL SMALL ONE
	       MVC   IPLNAME,LARGESYS	 MUST IPL LARGE ONE
      *
      *  HANDLE IPL PARMS.
      *
      *  WE KNOW THAT THE HIGH-ORDER BYTE OF ALL REGISTERS THAT WE CHECK
      *  WAS ZERO BEFORE THE SAVESYS, SO ONLY THOSE REGISTERS CONTAINING
      *  NEW INFORMATION (THERE USUALLY BEING NO WAY TO HAVE X'00' IN AN
      *  IPL PARM) WILL HAVE NON-ZERO HIGH ORDER BYTES.
      *
	       LA    R1,IPLPARMS
	       LR    R0,R1
	       LA    R2,4	    INCREMENT ONE REGISTER AT A TIME
	       LA    R3,LASTPARM    BXLE LIMIT
      PARMLOOP CLI   0(R1),0	    TEST THIS REGISTER HAS ANY GOODIES
	       BE    PARMEND	    NO - THEN WE'VE FOUND THE END
	       BXLE  R1,R2,PARMLOOP YES - KEEP LOOKING.
      PARMEND  SR    R1,R0	    PARM LENGTH (ROUNDED UP FULLWORD)
	       BZ    *+8	    WERE NO PARMS AFTER ALL
	       LA    R1,8(,R1)	    ADD LENGTH OF 'PARM' TO IPL CMD LEN
      *
      *  EITHER IPL OR MSG * THE CHOSEN SYSTEM
      *
	       CLC   FUNCTION,SAVESYS	 TEST RUNNING FOR REAL
	       BE    *+10	    YES - LEAVE 'IPL'
	       MVC   IPLCMD,=CL8'MSG * I'     NO - CHANGE TO HARMLESS MSG.
	       LA    R2,IPLCMD	    -> IPL OR MSG COMMAND
	       LA    R15,16(,R1)    LENGTH
	       DC    X'832F0008'    PASS IT UP TO CP
      *
      *  IF WE JUST IPLED, WE'RE NOT HERE.  THIS IS ONLY TO RETURN UNDER CMS.
      *
	       BR    R14
      *
	       DS    0D
      FUNCTION DC    CL8' '	    SAVESYS OR TEST
      SAVENAME DC    CL8'CMS'
      SMALLSYS DC    CL8'CMSS'
      LARGESYS DC    CL8'CMSL'
      *
      IPLCMD   DC    CL8'IPL'


									PAGE 127

      IPLNAME  DC    CL8' '
	       DC    CL8'   PARM '
      IPLPARMS DC    15F'0'
      IPLP15   DC    F'0'
      LASTPARM EQU   *-4
      *
      SAVESYS  DC    CL8'SAVESYS'
      CMSRET   DC    F'0'
      CMS0     DC    F'0'
      *
	       REGEQU ,
	       END   IPLER






     The following modification  to IPLER ASSEMBLE will tailor it  to the system
     names used in Chapter XIII, i.e., it will invoke a "small CMS" system named
     "SP2CMS" and  a "large  CMS" system named	"SP2CMSL".   The  IPLable system
     itself will be named  "CMS2" so that it can co-exist with	an SP1 CMS saved
     system named "CMS".

     FILE: IPLER SYSGEN

      ./  R  00142000 00144000 $ 00142100 100
      SAVENAME DC    CL8'CMS2'
      SMALLSYS DC    CL8'SP2CMS'
      LARGESYS DC    CL8'SP2CMSL'






     The following NAMESYS macro  can be used in DMKSNT to  define the one-page,
     IPLable system named "CMS2".

     FILE: DMKSNT IPLER0

      CMS2     NAMESYS	SYSNAME=CMS2,SYSSIZE=256K,		       IPLER0*
		     VSYSADR=IGNORE,				       IPLER0*
		     SYSVOL=VMM010,SYSSTRT=(217,60),SYSPGCT=1,	       IPLER0*
		     SYSPGNM=(32)				       IPLER0