search cancel

U4088-63 abend calling Endevor ENBP1000 utility from a COBOL program

book

Article ID: 257882

calendar_today

Updated On:

Products

Endevor Software Change Manager (SCM)

Issue/Introduction

In past releases, it was possible to call endevor utilities ENBP1000 (batch package handling) and ENBE1000 (batch environment maintenance) via CALL statement from a COBOL program.

This is no longer possible after fix RO99458 which was published during the life of release 18.0 to remove the SAS/C runtime environment from endevor.

After this fix is applied, whenever a COBOL program tries to call ENBP1000 or ENBE1000 utilities, it gets an abend U4088-63 which originates in IBM's Language Environment (LE)

Environment

Release : 19.0

Cause

To remove SAS/C runtime from Endevor, these utilities  were recompiled with the IBM XL C++ compiler which, like IBM COBOL, requires IBM Language Environment runtime.

However, even though most of the logic for ENBx1000 utilities is written in C, they start with some levels of prolog assembler routines which are not intended to be run under LE. Later on, these routines start a LE-conformant main program (via CEEENTRY macro) to run the C portion of the code.

CEEENTRY macro causes LE to initialize a routine. This poses no problem when the utility is run from JCL as this causes a new LE enclave to be initialized.

However, when the utility is called from an LE enclave like a COBOL program, LE tries to run the new routine as a subroutine of the existing enclave.

Since the prolog routines do not properly maintain the LE stack of called routines (they only maintain the stack of MVS saveareas), LE cannot initialize a new routine on top of this stack (which, as per the LE criteria, is corrupted) and raises abend U4088-63.

The exact cause of the abend can be observed in a dump by formatting the LE DSAs created by the non-LE routines. Field NAB (Next-Addressable Byte) contains garbage.

Resolution

After fix RO99458, it is not possible to call ENBx1000 utilities directly from a COBOL program .

It would be possible to call them under a "nested LE enclave" which would cause LE to initialize a new enclave from scratch instead of trying to connect to the existing one.

It's not possible to invoke a nested enclave directly from a COBOL program. It would require the coding of an assembler routine to invoke ENBP1000 via an MVS LINK macro, which causes LE to initialize a "nested enclave" for it.

This technique is used by the Endevor API to run ENBP1000 under the covers when required, and runs fine even though the API has been invoked from a COBOL program.