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
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:
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.
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:
....... //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)) /*
....... //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)) ....... /*