I needed to extract some information from z/OS in my C program. There is not a callable interface for the data, so I had to chain through z/OS control blocks.
Once you have an example to copy it is pretty easy – it just getting started which is the problem.
I have code (which starts with PSATOLD)
#define PSA 540
char *TCB = (char*)*(int*)(PSA);
char *TIO = (char*)*(int*)(TCB + 12);
char *TIOE = (char*)(TIO + 24) ;
- At absolute address 540 (0x21C) is the address of the currently executing TCB.
- (int *) (PSA) says treat this as an integer (4 byte) pointer.
- * take the value of what this integer pointer points to. This is the address of the TCB
- TCB + 12. Offset 12 (0x0c) in the TCB is the address of the Task I/O table (TCB IO)
- (int *) says treat this as an integer ( 4 byte) pointer
- * take the value of it to get to the TIOT
- Offset 24 (0x18) the the location of the first TIO Entry in the control block
When I copied the code originally had char * (long * ) PSA. This worked fine on 31 bit programs but not on a 64 bit program as it uses 64 bit as an address – not 32 ! I had to use “int” to get it to work.
Another example, which prints the CPU TCB and SRB time used by each address space, is
// CVT Main anchor for many system wide control blocks
#define FLTCVT 16L
// The first Address Space Control Block
#define CVTASCBH 564L
// the chain of ASCBs - next
#define ASCBFWDP 4L
// offset to job info
#define ASCBEJST 64L
// the ASID of this address space
#define ASCBASID 36L
__int64 lTCB, lSRB; // could have used long long
short ASID; // 0x0000
char *plStor = (char*)FLTCVT;
char *plCVT = (char*)*(int*)plStor;
char *plASCB = (char*)*(int*)(plCVT+CVTASCBH); // first ASCB
for( i=0; i<1000 & plASCB != NULL;
i++, plASCB = (char*)*(int*)(plASCB+ASCBFWDP) )
{
lTCB = *(__int64*)(plASCB+ASCBEJST) >> 12; // microseconds
lSRB = *(__int64*)(plASCB+ASCBSRBT) >> 12; // microseconds
ASID = *(short*)(plASCB+ASCBASID));
printf("ASID=%4.4x TCB=%lld; SRB=%lld\n", ASID, lTCB, lSRB);
}
PSA mapping says not to use PSATNEW, but use PSATOLD @ 21C.
LikeLike
Thank you.. I’ll fix it
LikeLike