IGZ0033S: Parameter above 16 MB passed to an AMODE(24) program
IGZ0033S means a COBOL program called a program that runs in AMODE 24 and tried to pass it a parameter whose address is above 16 megabytes. A 24-bit program can't address that storage, so the COBOL runtime stops the call and ends the program.
Other names for this code
Also written as IGZ0033, IGZ033S, IGZ0033S AMODE 24, parameter address above 16 megabytes, IGZ0033S RTEREUS, AMODE(24) program COBOL CALL.
What it means
z/OS programs run in an addressing mode. A program in AMODE 24 can only address storage below the 16 MB line. A program in AMODE 31 can address storage up to 2 GB. Most COBOL code today runs in AMODE 31 and keeps its data above the line.
When an AMODE 31 COBOL program calls an AMODE 24 program, every parameter it passes has to sit below the line, or the called program can't reach it. The COBOL runtime checks this on the call. If a parameter address is above 16 MB, it writes IGZ0033S, naming the called program, and ends the program instead of letting the 24-bit code read the wrong storage.
The S suffix marks a severe error. Under Language Environment the step normally ends with abend U4038.
Where the caller's data lives depends on its compile options. For a program compiled with RENT, the DATA option decides. DATA(31) puts WORKING-STORAGE and parameter lists above the line, and DATA(24) puts them below. DATA has no effect on programs compiled with NORENT. Data the program gets from the heap follows the HEAP runtime option.
IBM APAR PI92522 describes a COBOL runtime defect that gave IGZ0033S wrongly. Under RTEREUS(ON), a COBOL 5 or later program that dynamically called an AMODE 31 program built with an older COBOL could find that program marked as AMODE 24. The fix is in the PTFs for that APAR.
Common causes
- An old subprogram is still link-edited AMODE 24, and the caller was recompiled with RENT and DATA(31), so its WORKING-STORAGE moved above the line.
- The data being passed was obtained from the heap, and the heap is allocated above the line.
- A caller was migrated to a newer COBOL release with different default options, while the called program stayed in 24-bit mode.
- On an unpatched COBOL runtime, an RTEREUS(ON) environment marked an AMODE 31 subprogram as AMODE 24 (APAR PI92522).
How to find the problem
- Find IGZ0033S in SYSOUT and note the called program it names.
- Check that program's AMODE and RMODE in the binder output from its last link-edit, or by running AMBLIST against the load module.
- Look at the caller's compile listing for the RENT, DATA and RMODE options in effect.
- Check the runtime options report or CEEDUMP for HEAP and RTEREUS if the data comes from the heap or the run uses RTEREUS(ON).
How to fix it
- Relink the called program as AMODE 31 if its code can run in 31-bit mode. This is the long-term fix.
- If the called program must stay in 24-bit mode, compile the caller with RENT and DATA(24), or with NORENT, so its parameter data stays below the line.
- If the parameters come from the heap, run with HEAP(,,BELOW) so heap storage is allocated below the line.
- If the run uses RTEREUS(ON) and the called program really is AMODE 31, check whether the PTF for APAR PI92522 is installed.
IBM documentation
IBM z/OS documentation. Use the documentation for your installed release.
This link opens the relevant IBM reference library or lookup instructions. Match the complete code and your installed product release; it is not a code-specific review.
Related codes
Questions
Can an AMODE 31 program call an AMODE 24 program at all?
Yes. The call works as long as every parameter passed is in storage below the 16 MB line, because that is all the 24-bit program can address.
Why did IGZ0033S start after recompiling the caller?
The recompile probably changed the DATA or RENT setting, which moved the caller's WORKING-STORAGE above the line. The called program didn't change, but its parameters are now out of its reach.
Does the DATA option affect NORENT programs?
No. IBM documents that DATA only applies to programs compiled with RENT.