TITLE 'HZSSAMCK - IBM Health Checker for z/OS Sample Checks' */* START OF SPECIFICATIONS ******************************************* * *01* MODULE-NAME: HZSSAMCK * *01* CSECT NAME: HZSSAMCK * *01* DESCRIPTIVE-NAME: Sample check routines for the IBM Health * Checker for z/OS (health checker) * * *01* PROPRIETARY STATEMENT= * * **PROPRIETARY_STATEMENT********************************************* * * * * * LICENSED MATERIALS - PROPERTY OF IBM * * THIS MACRO IS "RESTRICTED MATERIALS OF IBM" * * 5694-A01 (C) COPYRIGHT IBM CORP. 2003, 2004 * * * * STATUS= HBB7709 * * * * **END_OF_PROPRIETARY_STATEMENT************************************** * * * * *01* FUNCTION: * * This module is called by the IBM Health Checker for z/OS * for the following checks: * * HZS_SAMPLE_ONE_TIME - Demonstrates a check called one time by * producing a message saying it was * called. The message will contain * variable text to provide an example of * text substitution * * HZS_SAMPLE_INTERVAL - Demonstrates a check called at intervals * by producing a message saying it was * called. The message will contain * variable text to provide an example of * text substitution * * *02* OPERATION: * See Function. * *02* OPERATION: HZSSAMCK * * HZSSAMCK * 1 Entry to mainline Sample IBM Health Checker for z/OS * 2 +-Select on Function Code * 3 +-When Init * 4 | Nothing to do since we do not obtain any resources for * | the life of the check * 5 +-When Check * 6 | +-If parms have changed since the last successful Check * 7 | : Call "ValidateParms" * 8 | +-EndIf parms changed * 9 | +-Select on entry code * 10 | +-When HZS_Sample_1Time * 11 | : Call "Chk_One" * 12 | +-When HZS_Sample_Intvl * 13 | : Call "Chk_Intvl" * 14 | +-Otherwise Stop the Check * 15 | : Invoke 'HZSFMSG' to issue error message * 16 | : Invoke 'HZSFMSG' to STOP check for error * 17 | +-EndSelect * 18 +-When Cleanup * 19 | Nothing to do since we did not obtain resources for in * | the check call * 20 +-When Delete * 21 | Nothing to do since we did not obtain any resources for * | the life of the check * 22 +-Otherwise Stop the Check * 23 | : Invoke 'HZSFMSG' to issue error message * 24 | : Invoke 'HZSFMSG' to STOP check for error * 25 +-EndSelect * 26 Return to caller. Pqe_Last_Rc (set by HZSFMSG) contains the * check RC * 27 End HZSSAMCK * *02* OPERATION: SUBROUTINES * * Validate_Parms * 1 Entry to routine to validate the check parameters * 2 +-Select on entry code * 3 +-When HZS_Sample_Intvl * 4 | Get parameter * 5 +-Otherwise for all other checks no parms expected * 6 | : Issue Warning Message * 7 | : Invoke 'HZSFMSG' to issue warning message * 8 +-EndSelect * 9 End "Validate_Parms" * * * HZS_Sample_One_Time * 1 Entry to routine to perform One Time checking * 2 Issue exception message * 3 Invoke 'HZSFMSG' to issue exception message * 4 End "HZS_Sample_1Time" * * * HZS_Sample_Intvl * 1 Entry to routine to perform Interval checking * 2 Increment call count * 3 Invoke 'HZSFMSG' to issue interval message * 4 End "HZS_Sample_Intvl" * * *02* RECOVERY-OPERATION: * * The IBM Health Checker for z/OS provides recovery around * calls. If the check routine abends the IBM Health Checker * for z/OS will call with the Pqe_Cleanup function code. * * *********************************************************************** * *01* NOTES: * * None * *02* DEPENDENCIES: * * None * *02* RESTRICTIONS: * * None * *02* REGISTER-CONVENTIONS: * *03* REGISTERS SAVED: R0-R15 *03* REGISTERS RESTORED: R2-R14 *03* CODE REGISTER: None (Relative Branch) *03* STATIC Data REGISTER: R12 *03* DYNAMIC DATA REGISTER: R13 * *02* PATCH-LABEL: None * *01* MODULE-TYPE: Procedure * *02* PROCESSOR: High Level Assembler * *02* MODULE-SIZE: See External Symbol Dictionary * *02* ATTRIBUTES: * *03* LOCATION: Authorized Link List Library *03* LOAD MOD: HZSSAMCK *03* TYPE: Reentrant *03* APF: NO - AC(0) *03* AMODE: 31 *03* RMODE: Any * *********************************************************************** * *01* ENTRY-POINT: HZSSAMCK * *02* PURPOSE: See FUNCTION section for this module. * *03* OPERATION: See OPERATION section for this module. * *02* ATTRIBUTES: * *03* ENTRY * *04* MODE: Enabled *04* STATE: Supervisor *04* KEY: 8 *04* AMODE: 31 *04* LOCKS HELD: None *04* ASCMODE: Primary *04* MEMORY MODE: P=S=H *04* DISPATCH MODE: Task *04* ADDRESS SPACE: IBM Health Checker for z/OS * *03* EXECUTION * *04* MODE: Enabled *04* STATE: Supervisor *04* KEY: 8 *04* AMODE: 31 *04* LOCKS OBTAINED: NONE *04* ASCMODE: Primary *04* MEMORY MODE: P=S=H *04* ADDRESS SPACE: IBM Health Checker for z/OS * *02* LINKAGE: Branch Entry * *03* CALLERS: * * IBM Health Checker for z/OS backbone * *02* INPUT: * * 1) Register 0. Address of 4K dynamic work area * Register 1. Address of an 8 byte parameter list containing: * +0 The 4 byte address of the HZSPQE for the check * +4 The 4 byte address of the 4K dynamic work area * *03* ENTRY-REGISTERS: * * Reg 0 - Address of the 4K dynamic work area * Reg 1 - Address of 8 byte parameter list * Reg 13 - Address of a 144 byte save area * Reg 14 - Return address. * Reg 15 - Address of the check routine * *02* OUTPUT: * * 1) Messages issued via HZSFMSG * *02* EXIT-NORMAL: RETURN TO CALLER * *03* CONDITIONS: Successful completion * *03* EXIT-REGISTERS: * * R0 - R14 - Unchanged * R15 - Return Code * *03* RETURN-CODES: * * Always zero. The actual return code is determined by the * messages issued with the HZSFMSG macro. * *02* EXIT-ERROR: None * *********************************************************************** * *01* EXTERNAL-REFERENCES : * *02* ROUTINES: * * None * *02* DATA-AREAS: * * None * *02* CONTROL-BLOCKS: * * Name Mapping Use Description * -------- -------- ---- ------------ * MGB HZSMGB C IBM Health Checker for z/OS Message Block * PQE HZSPQE R IBM Health Checker for z/OS Process Queue * Element * * Legend: C=Create, R=Read, W=Write, D=Delete * *01* MACROS-EXECUTABLE: * * HZSFMSG - IBM Health Checker for z/OS Message Macro * *01* SERIALIZATION: * * None * *01* MESSAGES: * * HZSH0001S Sample Check Routine was called with an unknown * IBM Health Checker for z/OS PQE Function Code * (PQE_Function_Code) of . * * HZSH0002S Sample Check Routine was called with an unknown Check * Entry Code (PQE_Entry_Code) of . * * HZSH0003S Sample Check Routine One Time Call Check does not * expect parameters. The first 50 characters of the * invalid parameters are: . * * HZSH0004E Sample Check Routine One Time Call Check. This check * ran on system &HZSSYSNAME L(8); in ASID at * &HZSLOCALTIME L(26);. * * HZSH0005E Sample Check Routine Interval Check has been called. * This is call for this check. This check ran * on system &HZSSYSNAME L(8); in ASID at * &HZSLOCALTIME L(26);. * * HZSH0006E Sample Check Routine Parameters have requested the * check to ABEND. * * HZSH0007S Sample Check Routine Parameters are not allowed for * the One Time Check routine. * * HZSH0008S Sample Check Routine Parameters are incorrect. The * first 50 characters of the incorrect value are: * * HZSH0009S Sample Check Routine Parameter string is too long. * * HZSH0010S Sample Check Routine COUNT parameter has a syntax * error. * * HZSH0011E Sample Check Routine Parameters were changed. The * check call count was changed by the user. The * previous value was It is now set to . * *01* ABEND-CODES: * * S0C3 - The ABEND is created when the interval check is passed * a parameter requesting it. * *01* WAIT-STATE-CODES: * * None * *01* CHANGE-ACTIVITY: * * $L0=HCHXS ,HBB7720,050701,PDFX: Sample Healh Checker checks * **** END OF SPECIFICATIONS *******************************************/ TITLE 'HZSSAMCK - MAKEMGB MACRO - Build a Message Data Block' MACRO &LAB MAKEMGB &MSGID, A number X &INSERTS ((len,address), ...) .* &INSERTS (((r),address), ...) .* null no inserts for message LCLA &insrt_#,&i &insrt_# SETA N'&INSERTS Number sub-lists in param &i SETA 1 ... sub-list index LA R1,MGB_Anchor Start of MGB being built XC 0(MGB_Length,R1),0(R1) ... zero the MGB USING HZSMGB,R1 @@@ Message Block Base .* .* Set MGB_ID Message ID .* Set MGB_insert_cnt count of inserts .* MVI MGB_ID+3,&MSGID Message Number into Message Blk AIF (T'&INSERTS EQ 'O').out No inserts, count already zero MVI MGB_Insert_Cnt+3,&insrt_# Count Msg Inserts to Msg Blk .* .* Compute MGB_InsertD start of list of inserts .* LA R14,MGB_inserts+4*&insrt_# Addr 1st Message Insert Block .* .* Set MGB_InsertAddr start of list of inserts .* USING MGB_MsgInsertD,R14 @@@ Message Insert Block Base .loop ANOP ST R14,MGB_InsertAddr Set next insert block address .* .* MGB_MsgILen length of insert value .* MGb_MsgIVal insert value .* AIF ('&inserts(&i,1)' EQ '&inserts(&i,1,1)').sd_Term LR R15,&inserts(&i,1,1) Length of Insert Value AGO .Cont .* .sd_Term ANOP LA R15,&inserts(&i,1) Length of Insert Value .* .Cont ANOP STH R15,MGB_MsgILen ... to insert block BCTR R15,0 Length - 1 for Execute LA R2,&inserts(&i,2) ... Addr of value to be moved EX R15,MGB_MVC ... and do the move .* .next ANOP &i SETA &i+1 AIF (&i GT &insrt_#).done LA R1,4(0,R1) Increment to next Insert Addr LA R14,2+1(R15,R14) ... and Insert Block Address AGO .loop .done ANOP DROP R14 @@@ Message Insert Block Base .out ANOP DROP R1 @@@ Message Block Base MEND TITLE 'HZSSAMCK - IBM Health Checker for z/OS Sample Checks' HZSSAMCK CSECT HZSSAMCK AMODE 31 HZSSAMCK RMODE ANY R0 EQU 0 Work Register 00300000 R1 EQU 1 Work Register & TRT instruction 00350000 R2 EQU 2 Work Register & TRT instruction 00400000 R3 EQU 3 Parameter Area Scan Index 00450000 R4 EQU 4 Parameter Area Scan Length 00500000 R5 EQU 5 ** UNUSED ** 00550000 R6 EQU 6 ** UNUSED ** 00600000 R7 EQU 7 ** UNUSED ** 00650000 R8 EQU 8 ** UNUSED ** 00700000 R9 EQU 9 Internal Linkage 00750000 R10 EQU 10 @@@ Program Base 00800000 R11 EQU 11 @@@ Retained Work Area Base 00850000 R12 EQU 12 @@@ Process Queue Entry Base 00900000 R13 EQU 13 @@@ Dynamic Work Area Base 00950000 R14 EQU 14 Work Register 01000000 R15 EQU 15 Work Register 01050000 HZSSAMCK CSECT J Chk_Over_ID Jump over the identifier DC YL1(Chk_Over_ID-*) ... Length of identifier DC CL8'HZSSAMCK' ... Program Name DC CL8'&SYSDATE' ... Assembly Date DC CL8'&SYSTIME' ... and Time Chk_Over_ID DC 0H STM R14,R12,12(R13) Save Callers Registers LR R10,R15 ... and Establish Program Base USING HZSSAMCK,R10 @@@ Program Base L R12,0(0,R1) Set our PQE Base USING HZSPQE,R12 @@@ Process Queue Entry Base L R1,PQE_DynamicAreaAddr Get Passed Dynamic Area Address XC 0(4,R1),0(R1) Zero first word of our save area ST R13,4(0,R1) Set save area Back Chain pointer ST R1,8(0,R13) ... forward chain pointer LR R13,R1 ... and my save/work area base USING Dynamic_Work,R13 @@@ Dynamic Work Area Base LA R1,MGB_Anchor Address of our Message Block ST R1,MGB_Anchor_Ptr ... set its pointer for HZSFMSG LA R11,PQEChkWork Address of the Persistant or * ... Retained Work Area USING Retained_Work,R11 @@@ Retained Work Area Base * * We now need to determined what function we were called for and then * perform that function. The possible check functions are: * * Init: The init call is used when a check is installed or * refreshed. Here the default and user parameters are parsed * and a message is issued if there is an error. A 2K check * work area is available into which information can be * saved. The work area is mapped by the checkWorkArea * declare and is contained in the PQE at PQEChkWork. The * work area exists for the life of the check, until it is * deleted or refreshed. * * Check: The check call is where the work is done. The check may * write messages to the report and/or issue exception * messages to notify the installation of a possible problem. * If an abend occurs the CleanUp function will be invoked. * If this check abends twice, it will be disabled. * * CleanUp: This is called after every Check call, including if the * Check call abended. Here any resources obtained by the * check would be cleaned up. * * Delete: Called when the check is deleted. Here any resources that * persist past the CleanUp call would be cleaned up. * L R0,PQE_Function_code Function Code - * ... Why we were called: CHI R0,Pqe_Function_Code_Init Initialization Call? JE Do_PQE_Init Yes, Do 1st time stuff CHI R0,Pqe_Function_Code_Check To perform checks? JE Do_PQE_Check Yes, Go see which check CHI R0,Pqe_Function_Code_Cleanup To clean up from check? JE Do_PQE_CleanUp Yes, Clean up our stuff C R0,=A(Pqe_Function_Code_Delete) Checks being deleted? JE Do_PQE_Delete Yes, Clean it all up PQE_Func_Err DC 0H Unknown Function Code * We were called with a code * that we do not understand. MAKEMGB 1,((4,PQE_Function_Code)) Make our MGB HZSFMSG REQUEST=CHECKMSG, And issue our message X MGBADDR=MGB_Anchor_Ptr, ... with our MGB X MF=(E,MSG_List) ... using message list XC Work1(8),Work1 Zero our diagnostic area MVC Work1+4(4),PQE_Function_Code ... put the bad func code HZSFMSG REQUEST=STOP, ... and tell the health X REASON=ERROR, ... checker to stop this X DIAG=Work1, ... check for this code X MF=(E,MSG_List) ... using message list J Checks_Done And we are all done. Do_PQE_Init DC 0H Function Code 1 - Initialize * ---------------------------- L R1,PSAAOLD-PSA(,R0) Address of my ASCB USING ASCB,R1 @@@ Address Space Ctl Block Base MVC My_ASCBID,ASCBASID ... and my Address Space ID DROP R1 @@@ Address Space Ctl Block Base MVC Int_Count,=F'1' Initialize our counter MVI My_Flags,0 ... and our flags BRAS R9,Validate_Parms Go check our parameters... CLC PQE_Entry_Code,=F'1' Is this my health check 1? JE Checks_Done ... Yes, No init is needed. CLC PQE_Entry_Code,=F'2' Is this my health check 2? JE Checks_Done ... Yes, Return to the checker PQE_Code_Err DC 0H Entry Code Unknown * We were called with a code that * ... we do not understand. MAKEMGB 2,((4,PQE_Entry_Code)) Build our MBG with the bad code HZSFMSG REQUEST=CHECKMSG, ... and issue our messages X MGBADDR=MGB_Anchor_Ptr, ... about that code X MF=(E,MSG_List) ... using message list XC Work1(8),Work1 Zero our diagnostic area MVC Work1+4(4),PQE_Entry_Code .. to hold the bad code HZSFMSG REQUEST=STOP, Tell the health checker to X REASON=ERROR, Stop our check and give it X DIAG=Work1, ... our dignostic data X MF=(E,MSG_List) ... using message list J Checks_Done And we are done with this call Do_PQE_Check DC 0H Function Code 2 - Do Checks * --------------------------- CLC PQE_Entry_Code,=F'1' Is this my health check 1? JE CHK_One_Time ... Yes, Go do one time check. CLC PQE_Entry_Code,=F'2' Is this my health check 2? JE CHK_Interval ... Yes, Go do interval check. J PQE_Code_Err Go handle an Entry Code that * ... do not understand. CHK_One_Time DC 0H Perform our One Time Checks BRAS R9,Validate_Parms Go check our parameters... TM My_Flags,My_Used Any Parameters? JZ CHK_One_Cont ... No bits, none - continue LH R0,PQE_ParmLen MAKEMGB 3, Our One Time Check does not X (((R0),PQE_ParmArea)) ... support any parameters. HZSFMSG REQUEST=CHECKMSG, And Issue our message saying X MGBADDR=MGB_Anchor_Ptr, ... we don't like parameters X MF=(E,MSG_List) ... using message list HZSFMSG REQUEST=STOP, Tell the health checker to stop X REASON=BADPARM, our check for the bad parm X MF=(E,MSG_List) ... using message list J Checks_Done ... We are done with this call CHK_One_Cont DC 0H Perform our One Time Checks MAKEMGB 4, Build the one time message X ((2,My_ASCBID)) ... with our address space ID HZSFMSG REQUEST=CHECKMSG, And have the health checker X MGBADDR=MGB_Anchor_Ptr, ... issue the message X MF=(E,MSG_List) ... using message list J Checks_Done and we are done with this check CHK_Interval DC 0H Perform our Interval Checks BRAS R9,Validate_Parms Go check our parameters... TM My_Flags,My_Used Any Parameters? JZ CHK_Int_Cont ... No bits, none - continue TM My_Flags,My_Abend ABEND Parameter JO CHK_Abend ... Ones, yes - Go ABEND MVC Int_Count,=F'1' Assume RESET Parmeter TM My_Flags,My_Reset Was the assumption a good one? JO CHK_Int_Cont ... Ones, yes - cont w/check * Must have been COUNT(xxxx) MVC Int_Count,New_Count ... so set the new count CHK_Int_Cont DC 0H NI My_Flags,My_Unused Reset any parameter flags MAKEMGB 5, Build our interval check msg X ((4,Int_Count), ... with our iteration count X (2,My_ASCBID)) ... and our ASID HZSFMSG REQUEST=CHECKMSG, And have health checker put X MGBADDR=MGB_Anchor_Ptr, ... the message out X MF=(E,MSG_List) ... using message list L R0,Int_Count Increment the count AHI R0,1 ... by adding one ST R0,Int_Count ... and putting it back J Checks_Done And we are done with this check CHK_Abend DC 0H Parameter Request to ABEND MAKEMGB 6 Build our ABEND message HZSFMSG REQUEST=CHECKMSG, Then have health checker put X MGBADDR=MGB_Anchor_Ptr, ... the message out X MF=(E,MSG_List) ... using message list NI My_Flags,My_Unused Reset parameter flags EX 0,* ... And cause an 0C3 ABEND Validate_Parms DC 0H TM PQE_MoreFlags,PQE_LookAtParms Did our parameters change? BZR R9 ... No, back to caller SR R4,R4 Checking Parameter Length ICM R4,3,PQE_ParmLen Length of parms, if any BZR R9 ... None, back to caller * Maximum parameter length is * ... for: COUNT(xxxx)b or 12 with * ... a trailing blank. CHI R4,12 Is the parameter too long? JH Val_Parm_Err_1 ... yes, message the error CLC PQE_Entry_Code,=F'2' Is this my health check 2? JE Val_Cont Yes, continue with parms MAKEMGB 7 No Parms allowed on one time chk HZSFMSG REQUEST=CHECKMSG, Now have health checker issue X MGBADDR=MGB_Anchor_Ptr, ... our message X MF=(E,MSG_List) ... using message list HZSFMSG REQUEST=STOP, Then have health checker X REASON=BADPARM, ... stop us for a bad parm X MF=(E,MSG_List) ... using message list J Checks_Done All done with call Val_Cont DC 0H CLC =C'ABEND ',PQE_ParmArea Was the parameter ABEND? JE Val_Abend ... yes, set the bit CLC =C'RESET ',PQE_ParmArea ... was it RESET? JE Val_Reset ... yes, set that bit CLC =C'COUNT(',PQE_ParmArea ... Are they changing the count? JE Val_Count ... Yes, go figure it out. Val_Parm_Err DC 0H We don't like what ever it is. * Parameter Bad LH R0,PQE_ParmLen Get length of parameters and MAKEMGB 8, ... build our message buffer X (((R0),PQE_ParmArea)) ... with the bad parameters HZSFMSG REQUEST=CHECKMSG, Now tell health checker to issueX MGBADDR=MGB_Anchor_Ptr, ... saying what we don't like emX MF=(E,MSG_List) ... using message list HZSFMSG REQUEST=STOP, Tell the health checker to stop X REASON=BADPARM, our check for the bad parm X MF=(E,MSG_List) ... using message list J Checks_Done ... We are done with this call Val_Parm_Err_1 DC 0H Length issue MAKEMGB 9 Parameter is too long HZSFMSG REQUEST=CHECKMSG, Now Issue our message X MGBADDR=MGB_Anchor_Ptr, ... saying it is too long X MF=(E,MSG_List) ... using message list J Val_Parm_Err ... and continue with more * ... Parm error information Val_Parm_Err_2 DC 0H Syntax issue MAKEMGB 10 Parameter has a Syntax problem HZSFMSG REQUEST=CHECKMSG, Now Issue our message X MGBADDR=MGB_Anchor_Ptr, ... saying the syntax is bad X MF=(E,MSG_List) ... using message list J Val_Parm_Err ... and continue with more * ... Parm error information Val_Abend DC 0H OI My_Flags,My_Abend Show to Abend BR R9 ... and return to caller Val_Reset DC 0H OI My_Flags,My_Reset Show to Reset Interval count BR R9 ... and return to caller * * The COUNT parameter has a range of formats from COUNT(x) to * COUNT(xxxx). The parameter may be followed by blanks, but the * total character string can be no longer than 11 including any * trailing blanks. The "x"'s must be numeric 0 - 9. * Val_Count DC 0H LA R3,PQE_ParmArea+6 Parm is COUNT(xxxx), -> xxxx) AHI R4,-6-1 ... length - L'COUNT( - 1 JNP Val_Parm_Err_1 If not positive, parm error SR R2,R2 Function Code Register to zero EX R4,TRT1 Scan for closing ) and Numbers BRC B'1001',Val_Parm_Err_2 CC /= 1 or 2, bad characters BRCT R2,Val_Parm_Err_2 ... Only code 1 is valid stop BRC B'0010',Val_Count_Con1 CC = 2 Last char = ')' CLI 1(R1),C' ' Not last, next must be blank JNE Val_Parm_Err_2 ... If not, syntax error Val_Count_Con1 DC 0H SR R1,R3 End of Scan - start = length JNP Val_Parm_Err_2 ... Len <= 0 is an error OI My_Flags,My_New_Count Show to Set a new interval count BCTR R1,0 ... - 1 for Pack EX R1,Pack1 ... and PACK the new count CVB R0,Work1 ... Convert it to Binary ST R0,New_Count ... and save for checks to use CLC Int_Count,New_Count Did the count change? BER R9 No, Then don't issue change msg. Val_Count_Con2 DC 0H MAKEMGB 11, Build our messagage about X ((4,Int_Count), ... the parameter change with X (4,New_Count)) ... before and after values HZSFMSG REQUEST=CHECKMSG, And have the health checker X MGBADDR=MGB_Anchor_Ptr, ... issue the message X MF=(E,MSG_List) ... using message list BR R9 Return to caller TRT1 TRT 0(*-*,R3),TRT_Tbl ** Executed ** Pack1 PACK Work1(8),0(*-*,R3) ** Executed ** USING MGB_MsgInsertD,R14 @@@ Message Insert Block Base MGB_MVC MVC MGB_MsgIVal(*-*),0(R2) Msg Variable Data Move DROP R14 @@@ Message Insert Block Base Do_PQE_CleanUp DC 0H Function Code 3 - Clean Up Check * -------------------------------- * We did nothing requiring us to * ... clean anything up, so J Checks_Done ... we are done with checks Do_PQE_Delete DC 0H Function Code x - Delete Checks * ------------------------------- * We did nothing required us to * ... clean anything up, so J Checks_Done ... we are done with checks Checks_Done DC 0H All Checks Done - Return L R13,4(0,R13) Back up the save area chain LM R14,R12,12(R13) ... Restore callers registers SR R15,R15 ... set a zero return code BR R14 ... And Return DROP R11 @@@ Retained Work Area Base DROP R13 @@@ Dynamic Work Area Base DROP R12 @@@ Process Queue Entry Base DROP R10 @@@ Program Base * ------------------------------------------------------------------- * * Literal Pool * * ------------------------------------------------------------------- * LTORG TRT_Tbl DC 256X'02' Stop on any char with code 2 ORG TRT_Tbl+C')' ... except right paren DC X'01' ... which is code 1 ORG TRT_Tbl+C'0' ... and the numbers DC 10X'00' ... which don't stop ORG , * * Retained Working Area Map - This maps the area provided by the * IBM Health Checker for z/OS that is the same every time this * Check Routine is called. Thus the name Retained. * * Retained_Work DSECT Int_Count DC F'0' Count of Interval calls New_Count DC F'0' Parameter supplied Int Count My_ASCBID DC H'0' ASCBID of this address space My_Flags DC B'00000000' My_Abend EQU B'10000000',1,C'B' Request ABEND for this call My_Reset EQU B'01000000',1,C'B' Reset the Count of Intervals My_New_Count EQU B'00100000',1,C'B' Set Interval Count to new value My_Used EQU B'11100000',1,C'B' Summary of Used Bits My_Unused EQU B'00011111',1,C'B' Available Flag Bits Retained_Len EQU *-Retained_Work * * The IBM Health Checker for z/OS provides a 2K work area in the * Process Queue Element. If the size of the preceeding DSECT, which * is mapping this routine's use of that area, exceeds that 2K, the * following statement will cause an assembly error. * * DS 0XL(2048-Retained_len) * * Dynamic Working Area Map - This maps the area provided by the * IBM Health Checker for z/OS that is different every time this * Check Routine is called. Thus the name dynamic. * Dynamic_Work DSECT DC 18F'0' Save Area Work1 DC XL16'00' Misc Work Area Storage * This is a pointer to the Message Data Block. The HZSFMSG macro * expects the address of a word that contains the address of the * Message Data Blcok. MGB_Anchor_Ptr DC A(0) Pointer to MGB Location. * * Message Data Block Anchor * * Message Data Blocks are built in this area. Following this * anchor are the descriptions for each of the messages the checks * in this module produce. The descriptions overly each other so * that all we produce is an area to hold the largest required * message data block. * MGB_Anchor DS 0F Message Block Anchor * * Message Data Block for Message 1: * * Sample check routine was called with an unknown IBM Health * Checker for z/OS PQE Function Code (PQE_Function_Code) of * xxxxxxxx. * ORG MGB_Anchor MGB_MSG_1 DC F'1' Message Block for Message 1 DC F'1' ... Number of inserts DC A(MSG_1_INS_1) ... Address of insert MSG_1_INS_1 DC Y(L'MSG_1_INSERT_1) Length of Insert MSG_1_INSERT_1 DC X'0000' ... Insert Value (PQE_Func...) * * Message Data Block for Message 2: * * Sample Check Routine was called with an unknown Check Entry * Code (PQE_Entry_Code) of xxxxxxxx. * ORG MGB_Anchor MGB_MSG_2 DC F'1' Message Block for Message 2 DC F'1' ... Number of inserts DC A(MSG_2_INS_1) ... Address of insert MSG_2_INS_1 DC Y(L'MSG_2_INSERT_1) Length of Insert MSG_2_INSERT_1 DC X'0000' ... Insert Value (PQE_Entry..) * * Message Data Block for Message 3: * * Sample Check Routine One Time Call Check does not expect * parameters. The first 50 characters of the invalid parameters * are: 'character insert 1'. * ORG MGB_Anchor MGB_MSG_3 DC F'3' Message Block for Message 1 DC F'1' ... Number of inserts DC A(MSG_3_INS_1) ... Address of insert MSG_3_INS_1 DC Y(L'MSG_3_INSERT_1) Length of Insert MSG_3_INSERT_1 DC CL50' ' ... Insert Value (Parameters) * * Message Data Block for Message 4: * * Sample Check Routine One Time Call Check. This check ran * on system 'system name' in ASID 'hex insert 2' at * 'Local mm/dd/yyyy hh:mm:ss.tttttt' * ORG MGB_Anchor MGB_MSG_4 DC F'4' Message Block for Message 1 DC F'1' ... Number of inserts DC A(MSG_4_INS_1) ... Address of first insert MSG_4_INS_1 DC Y(L'MSG_4_INSERT_1) Length of Insert MSG_4_INSERT_1 DC X'0000' ... Insert Value (My ASCBID) * * Message Data Block for Message 5: * * Sample Check Routine Interval Call Check. This is the * 'decimal insert 1' call for this check. This check ran * on system 'system name' in ASID 'hex insert 2' at * 'Local mm/dd/yyyy hh:mm:ss.tttttt' * ORG MGB_Anchor MGB_MSG_5 DC F'5' Message Block for Message 1 DC F'2' ... Number of inserts DC A(MSG_5_INS_1) ... Address of first insert DC A(MSG_5_INS_2) ... Address of Second Insert MSG_5_INS_1 DC Y(L'MSG_5_INSERT_1) Length of Insert MSG_5_INSERT_1 DC F'0' ... Insert Value (call count) MSG_5_INS_2 DC Y(L'MSG_5_INSERT_1) Length of Insert MSG_5_INSERT_2 DC X'0000' ... Insert Value (My ASCBID) * * Message Data Block for Message 6: * * Sample Check Routine Parameters have request the check * ABEND. * ORG MGB_Anchor MGB_MSG_6 DC F'6' Message Block for Message 6 DC F'0' ... Number of inserts DC A(0) ... No Inserts * * Message Data Block for Message 7: * * Sample Check Routine Parameters are not allowed for the * One Time Check routine. * ORG MGB_Anchor MGB_MSG_7 DC F'7' Message Block for Message 7 DC F'0' ... Number of inserts DC A(0) ... No Inserts * * Message Data Block for Message 8: * * Sample Check Routine Parameters are incorrect. The first 50 * characters of the incorrect value are: 'charcter insert 1'. * ORG MGB_Anchor MGB_MSG_8 DC F'8' Message Block for Message 2 DC F'1' ... Number of inserts DC A(MSG_8_INS_1) ... Address of insert MSG_8_INS_1 DC Y(L'MSG_8_INSERT_1) Length of Insert MSG_8_INSERT_1 DC CL50' ' ... Insert Value (Parameters) * * Message Data Block for Message 9: * * Sample Check Routine Parameter string is too long. * ORG MGB_Anchor MGB_MSG_9 DC F'9' Message Block for Message 9 DC F'0' ... Number of inserts DC A(0) ... No Inserts * * Message Data Block for Message 10: * * Sample Check Routine COUNT parameter has a syntax error. * ORG MGB_Anchor MGB_MSG_10 DC F'10' Message Block for Message 10 DC F'0' ... Number of inserts DC A(0) ... No Inserts * * Message Data Block for Message 11: * * Sample Check Routine Parameters were changed. The check call * count was changed by the user. The previous value was * c_count It is now set to * n_count. * ORG MGB_Anchor MGB_MSG_11 DC F'11' Message Block for Message 11 DC F'2' ... Number of inserts DC A(MSG_A_INS_1) ... Address of first insert DC A(MSG_A_INS_2) ... Address of Second Insert MSG_A_INS_1 DC Y(L'MSG_A_INSERT_1) Length of Insert MSG_A_INSERT_1 DC F'0' ... Insert Value (call count) MSG_A_INS_2 DC Y(L'MSG_A_INSERT_1) Length of Insert MSG_A_INSERT_2 DC F'0' ... Insert Value (new count) ORG , Back to highest used address MGB_Length EQU *-MGB_Anchor,4,C'F' Length of Largest Message Block HZSFMSG MF=(L,MSG_List) Area for HZSFMSG parameter list Dynamic_Len EQU *-Dynamic_Work Length of used work area * * The IBM Health Checker for z/OS provides a 4K dynamic work area * which is pointed to in the Process Queue Element. If the size of * the preceeding DSECT, which is mapping this routine's use of that * area, exceeds that 4K, the following statement will cause an * assembly error. * * DS 0XL(4096-Dynamic_len) * * HZSPQE - IBM Health Checker for z/OS Process Queue Element * HZSPQE TITLE=NO * * HZSMGB - IBM Health Checker for z/OS Message Block * HZSMGB TITLE=NO * * HZSZCONS - IBM Health Checker for z/OS Return and Reason Codes * HZSZCONS TITLE=NO * * Prefix Save Area * IHAPSA * * Address Space Control Block * IHAASCB DSECT=YES,LIST=YES END HZSSAMCK