After applying CA ACF2 maintenance, during the IPL, we get an S0C4 abend in ACF89SIP. What is wrong? What went wrong? What can we check?

Document ID : KB000053003
Last Modified Date : 14/02/2018
Show Technical Document Details

Description

ACF89SIP is the CA ACF2 subsystem initialization program. This program is called automatically during z/OS subsystem initialization (during an IPL), when the CA ACF2 CAILPA library is included in the system LPA list concatenation and the CA ACF2 CAILOAD library is in the system LINK list concatenation.

The main purpose of this program is to initialize some main CA ACF2 control blocks and to dynamically implant the CA ACF2 intercepts.

When you get an S0C4 abend in ACF89SIP, and the message looks like:

  ACFFE100 ACF89SIP S0C4  AT xxxxxxxx LMOD N/A      CSECT N/A 

where "xxxxxxxx" is a storage location. The LMOD and CSECT of N/A indicate "not available."

Common problems that can cause this type of S0C4 abend in ACF89SIP include:

  • there is a release mismatch between the CAILPA and CAILOAD library

  • maintenance is incomplete where only one library was updated

  • program aliases are pointing to the wrong module

How can this happen?

It is common for sites to run from copies of the CAILPA and CAILOAD libraries, to prevent any active maintenance processing from impacting a running system. This requires that after any maintenance is applied to the SMP/E maintained target CAILPA and CAILOAD libraries, an additional copy must be performed to the system LPA list and LINK list CAILPA and CAILOAD libraries. If only one library is copied, that can cause this S0C4 abend. When the CAILPA and CAILOAD libraries are copied, you can either copy the entire library (with replace specified) or you can selectively copy only the members that have changed. When selectively copying members, then it is critical to ensure that all applicable aliases are also copied.

How can you find which modules have aliases?

You can use ISPF to browse the library, check for aliases under the "Alias-of" column. (Hint: sort by "Alias-of" column and scroll to bottom, or sort descending).

For example:

  BROWSE            your.system.lnklst.CAILOAD                Row .... 
  Command ===>                                                  Sc.... 
             Name     Prompt        Alias-of     Size      TTR 
  ....... 
  _________ ACF00SVA                           000A4E58   00EF0E 
  ....... 
  _________ ACF0AVAL                ACF00SVA   000A4E58   00EF0E  
  _________ ACF00VSR                ACF00SVA   000A4E58   00EF0E 
  .......  

Here ACF0AVAL and ACF00VSR are aliases of ACF00SVA. When the TTR locations for the aliases are the same as for the main module, then the alias modules are the same. If the aliases were not properly included in the copy, then the TTR locations (and possibly the size) for the aliases would be different from the main module.

Or, look for the "ENTRY POINT AND ALIAS SUMMARY:" sections in the BINDER (Link Edit) output. These appear after the "SAVE SUMMARY OPERATION" and "SAVE MODULE ATTRIBUTES" sections.

For example:

  SAVE OPERATION SUMMARY: 
   MEMBER NAME         ACF00SVA 
   LOAD LIBRARY        your.smpe.target.CAILOAD 
   ....... 
  SAVE MODULE ATTRIBUTES:  
  .......
  ENTRY POINT AND ALIAS SUMMARY:
  NAME:            ENTRY TYPE AMODE C_OFFSET CLASS NAME        STATUS
  ACF00SVA          MAIN_EP      31 00000000 B_TEXT                         
  ACF0AVAL         ALTERNATE     31 0001A690 B_TEXT           REASSIGNED    
  ACF00VSR         ALTERNATE     31 000263C0 B_TEXT           REASSIGNED    

In this example, the CAILOAD module is ACF00SVA, and ACF0AVAL and ACF00VSR are aliases.

Solution

There are 2 things that you can do to address the issue of library mismatches and or bad aliases.

Copy the complete libraries. Full library copies automatically include all the aliases. Include all the applicable alias names when selectively copying individual load modules.

Using IEBCOPY as the copy program, example control statements are:

  1. Always copy the entire libraries (preferably both in one job):
      .......                                                
      //IN1       DD DISP=SHR,DSN=your.smpe.target.CAILOAD   
      //IN2       DD DISP=SHR,DSN=your.smpe.target.CAILPA    
      .......                                                
      //OUT1      DD DISP=SHR,DSN=your.system.lnklst.CAILOAD 
      //OUT2      DD DISP=SHR,DSN=your.system.lpalst.CAILPA  
      .......                                                
      //SYSIN     DD *                                       
        COPY OUTDD=OUT1,INDD=((IN1,R))                       
        COPY OUTDD=OUT2,INDD=((IN2,R))                       
      /*
  2. Copy selective members (include the alias names, and preferably copy for both libraries in one job):
      ....... 
      //IN1       DD DISP=SHR,DSN=your.smpe.target.CAILOAD    
      //OUT1      DD DISP=SHR,DSN=your.system.lnklst.CAILOAD 
      ....... 
      //SYSIN     DD *                                        
        COPY OUTDD=OUT1,INDD=IN1                              
        SELECT MEMBER=((ACF00SVA,,R))                         
        SELECT MEMBER=((ACF0AVAL,,R))                         
        SELECT MEMBER=((ACF00VSR,,R))   
        .......                      
      /*