Files
gottfriedleibniz 3d239d3db5 cleanup va_start/va_end and introduce vasprintf (#826)
* refactor: cleanup va_start/va_end

- Missing va_end statements;
- Incorrect va_copy ordering in BFR_VSNPRINTF;
- Sanitize snprintf results or ensure buffer is initially \0'd.

* refactor: introduce vasprintf

Replace dynamic format string allocation (i.e., incrementing a buffer by
a fixed amount until vsnprintf returns success) with vasprintf.
Polyfill'ing for builds that do not include the GNU extension.
2026-04-30 12:44:49 -07:00

1770 lines
71 KiB
C

/* HSCUTL.H (C) Copyright Roger Bowler, 1999-2012 */
/* (C) and others 2013-2024 */
/* Host-specific functions for Hercules */
/* */
/* Released under "The Q Public License Version 1" */
/* (http://www.hercules-390.org/herclic.html) as modifications to */
/* Hercules. */
/*-------------------------------------------------------------------*/
/* HSCUTL.H -- Implementation of functions used in hercules that */
/* may be missing on some platform ports, or other convenient mis- */
/* laneous global utility functions. */
/*-------------------------------------------------------------------*/
#ifndef __HSCUTL_H__
#define __HSCUTL_H__
#include "hercules.h"
/*********************************************************************
The following couple of Hercules 'utility' functions may be defined
elsewhere depending on which host platform we're being built for...
For Windows builds (e.g. MingW32), the functionality for the below
functions is defined in 'w32util.c'. For other host build platforms
(e.g. Linux, Apple, etc), the functionality for the below functions
is defined right here in 'hscutil.c'...
*********************************************************************/
#if defined(_MSVC_)
/* The w32util.c module will provide the below functionality... */
#else
/* THIS module (hscutil.c) is to provide the below functionality.. */
/*
Returns outpath as a host filesystem compatible filename path.
This is a Cygwin-to-MSVC transitional period helper function.
On non-Windows platforms it simply copies inpath to outpath.
On Windows it converts inpath of the form "/cygdrive/x/foo.bar"
to outpath in the form "x:/foo.bar" for Windows compatibility.
*/
char *hostpath( char *outpath, const char *inpath, size_t buffsize );
/* Poor man's "fcntl( fd, F_GETFL )"... */
/* (only returns access-mode flags and not any others) */
int get_file_accmode_flags( int fd );
/* Initialize/Deinitialize sockets package... */
int socket_init( void );
int socket_deinit( void );
/* Set socket to blocking or non-blocking mode... */
int socket_set_blocking_mode( int sfd, int blocking_mode );
/* Determine whether a file descriptor is a socket or not... */
/* (returns 1==true if it's a socket, 0==false otherwise) */
int socket_is_socket( int sfd );
/* Set the SO_KEEPALIVE option and timeout values for a
socket connection to detect when client disconnects.
Returns 0==success, +1==warning, -1==failure
(*) Warning failure means function only partially
succeeded (not all requested values were set)
*/
int set_socket_keepalive( int sfd, int idle_time, int probe_interval,
int probe_count );
/* Function to retrieve keepalive values. 0==success, -1=failure */
int get_socket_keepalive( int sfd, int* idle_time, int* probe_interval,
int* probe_count );
/* Determine whether process is running "elevated" or not */
/* (returns 1==true running elevated, 0==false otherwise) */
bool are_elevated();
#endif // !defined(_MSVC_)
/*-------------------------------------------------------------------*/
#if !defined(_MSVC_) && !defined(HAVE_STRERROR_R)
HUT_DLL_IMPORT void strerror_r_init(void);
HUT_DLL_IMPORT int strerror_r(int, char *, size_t);
#endif
HUT_DLL_IMPORT const char *get_symbol(const char *);
HUT_DLL_IMPORT char *resolve_symbol_string(const char *);
HUT_DLL_IMPORT void set_symbol(const char *,const char *);
HUT_DLL_IMPORT void del_symbol(const char *);
HUT_DLL_IMPORT void list_all_symbols();
#ifdef _MSVC_
#ifndef HAVE_ID_T
#define HAVE_ID_T
typedef unsigned long id_t;
#endif
#ifndef HAVE_SYS_RESOURCE_H
#define PRIO_PROCESS 0
#define PRIO_PGRP 1
#define PRIO_USER 2
#endif
#endif // _MSVC_
#if !defined(HAVE_STRLCPY)
/* $OpenBSD: strlcpy.c,v 1.8 2003/06/17 21:56:24 millert Exp $ */
/*
* Copyright (c) 1998 Todd C. Miller <Todd.Miller@courtesan.com>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*/
/*
* Copy src to string dst of size siz. At most siz-1 characters
* will be copied. Always NUL terminates (unless siz == 0).
* Returns strlen(src); if retval >= siz, truncation occurred.
*/
/* ** NOTE ** 'siz' is size of DESTINATION buffer, NOT src! */
/* ** NOTE ** returns 'size_t' and NOT 'char*' like strncpy! */
HUT_DLL_IMPORT size_t
strlcpy(char *dst, const char *src, size_t siz);
#endif
#if !defined(HAVE_STRLCAT)
/* $OpenBSD: strlcat.c,v 1.11 2003/06/17 21:56:24 millert Exp $ */
/*
* Copyright (c) 1998 Todd C. Miller <Todd.Miller@courtesan.com>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*/
/*
* Appends src to string dst of size siz (unlike strncat, siz is the
* full size of dst, not space left). At most siz-1 characters
* will be copied. Always NUL terminates (unless siz <= strlen(dst)).
* Returns strlen(src) + MIN(siz, strlen(initial dst)).
* If retval >= siz, truncation occurred.
*/
/* ** NOTE ** 'siz' is size of DESTINATION buffer (disregarding
any existing data!), NOT size of src argument! */
/* ** NOTE ** returns 'size_t' and NOT 'char*' like strncat! */
HUT_DLL_IMPORT size_t
strlcat(char *dst, const char *src, size_t siz);
#endif
#if !defined( HAVE_VASPRINTF )
/*
* The functions asprintf() and vasprintf() are analogs of sprintf(3) and
* vsprintf(3), except that they allocate a string large enough to hold the
* output including the terminating null byte, and return a pointer to it via
* the first argument. This pointer should be passed to free(3) to release the
* allocated storage when it is no longer needed.
*
* When successful, these functions return the number of bytes printed, just
* like sprintf(3). On error, -1 is returned, errno is set to indicate the
* error, and the contents of strp are undefined.
*/
HUT_DLL_IMPORT int
vasprintf(char **strp, const char *fmt, va_list ap) ATTR_PRINTF(2,0);
#endif // !defined(HAVE_VASPRINTF)
/* The following helper macros can be used in place of direct calls
* to either the strlcpy or strlcat functions ONLY when the destination
* buffer is an array. They must NEVER be used whenever the destination
* buffer is a pointer!
*/
#define STRLCPY( dst, src ) strlcpy( (dst), (src), sizeof(dst) )
#define STRLCAT( dst, src ) strlcat( (dst), (src), sizeof(dst) )
#define USLEEP( _u ) herc_usleep( _u, __FILE__, __LINE__ )
HUT_DLL_IMPORT int herc_usleep( useconds_t usecs, const char* file, int line );
#define USLEEP_MIN 1
#define NANOSLEEP_EINTR_RETRY_WARNING_TRESHOLD 256
/* Subtract/add gettimeofday struct timeval */
HUT_DLL_IMPORT int timeval_subtract (struct timeval *beg_timeval, struct timeval *end_timeval, struct timeval *dif_timeval);
HUT_DLL_IMPORT int timeval_add (struct timeval *dif_timeval, struct timeval *accum_timeval);
/*
Easier to use timed_wait_condition that waits for the specified
relative amount of time without you having to build an absolute
timeout time yourself. Use the "timed_wait_condition_relative_usecs"
macro to call it.
*/
#define timed_wait_condition_relative_usecs( plc, plk, usecs, ptv ) \
timed_wait_condition_relative_usecs_impl( plc, plk, usecs, ptv, PTT_LOC )
HUT_DLL_IMPORT int timed_wait_condition_relative_usecs_impl
(
COND* pCOND, // ptr to condition to wait on
LOCK* pLOCK, // ptr to controlling lock (must be held!)
U32 usecs, // max #of microseconds to wait
struct timeval* pTV, // [OPTIONAL] ptr to tod value (may be NULL)
const char* loc // (location)
);
/* Read/write to socket functions */
HUT_DLL_IMPORT int hprintf(int s,char *fmt,...) ATTR_PRINTF(2,3);
HUT_DLL_IMPORT int hwrite(int s,const char *,size_t);
HUT_DLL_IMPORT int hgetc(int s);
HUT_DLL_IMPORT char *hgets(char *b,size_t c,int s);
/* Posix 1003.e capabilities */
#if defined(OPTION_CAPABILITIES)
HUT_DLL_IMPORT int drop_privileges(int c);
HUT_DLL_IMPORT int drop_all_caps(void);
#endif
/* Hercules page-aligned calloc/free */
HUT_DLL_IMPORT void* hpcalloc ( BYTE type, size_t size );
HUT_DLL_IMPORT void hpcfree ( BYTE type, void* ptr );
/* Hercules low-level file open */
HUT_DLL_IMPORT int hopen( const char* path, int oflag, ... );
/* Trim path information from __FILE__ macro */
HUT_DLL_IMPORT const char* trimloc( const char* loc );
#define TRIMLOC(_loc) trimloc( _loc )
/*-------------------------------------------------------------------*/
/* Format TIMEVAL to printable value: "YYYY-MM-DD HH:MM:SS.uuuuuu", */
/* being exactly 26 characters long (27 bytes with null terminator). */
/* pTV points to the TIMEVAL to be formatted. If NULL is passed then */
/* the current time of day returned by a call to 'gettimeofday' is */
/* used instead. buf must point to a char work buffer where the time */
/* is formatted into and must not be NULL. bufsz is the size of buf */
/* and must be >= 2. If successful then the value of buf is returned */
/* and is always zero terminated. If an error occurs or an invalid */
/* parameter is passed then NULL is returned instead. */
/*-------------------------------------------------------------------*/
HUT_DLL_IMPORT char* FormatTIMEVAL( const TIMEVAL* pTV, char* buf, int bufsz );
/*-------------------------------------------------------------------*/
/* format memory size functions: 128K, 64M, 8G, etc... */
/*-------------------------------------------------------------------*/
HUT_DLL_IMPORT char* fmt_memsize ( const U64 memsize, char* buf, const size_t bufsz );
HUT_DLL_IMPORT char* fmt_memsize_KB ( const U64 memsizeKB, char* buf, const size_t bufsz );
HUT_DLL_IMPORT char* fmt_memsize_MB ( const U64 memsizeMB, char* buf, const size_t bufsz );
/*-------------------------------------------------------------------*/
/* Pretty format S64 value with thousand separators. Returns length. */
/*-------------------------------------------------------------------*/
HUT_DLL_IMPORT size_t fmt_S64( char dst[32], S64 num );
/*-------------------------------------------------------------------*/
/* Standard Utility Initialization */
/*-------------------------------------------------------------------*/
HUT_DLL_IMPORT int initialize_utility( int argc, char* argv[],
char* defpgm,
char* desc,
char** pgm );
/*-------------------------------------------------------------------*/
/* Reverse the bits in a BYTE */
/*-------------------------------------------------------------------*/
HUT_DLL_IMPORT BYTE reverse_bits( BYTE b );
/*-------------------------------------------------------------------*/
/* Format printer FCB/CCTAPE information */
/*-------------------------------------------------------------------*/
HUT_DLL_IMPORT void FormatFCB ( char* buf, size_t buflen,
int index, int lpi, int lpp,
int* fcb );
HUT_DLL_IMPORT void FormatCCTAPE ( char* buf, size_t buflen,
int lpi, int lpp,
U16* cctape);
/*-------------------------------------------------------------------*/
/* Count number of tokens in a string */
/*-------------------------------------------------------------------*/
HUT_DLL_IMPORT int tkcount( const char* str, const char* delims );
/*-------------------------------------------------------------------*/
/* Remove leading and/or trailing chars from a string and return str */
/*-------------------------------------------------------------------*/
HUT_DLL_IMPORT char* ltrim ( char* str, const char* dlm ); // (left trim)
HUT_DLL_IMPORT char* rtrim ( char* str, const char* dlm ); // (right trim)
HUT_DLL_IMPORT char* trim ( char* str, const char* dlm ); // (trim both)
/* Helper macros that trims whitespace as opposed to something else */
#define WHITESPACE " \t\n\v\f\r"
#define LTRIM( str ) ltrim ( (str), WHITESPACE )
#define RTRIM( str ) rtrim ( (str), WHITESPACE )
#define TRIM( str ) trim ( (str), WHITESPACE )
#define LTRIMS( str, s ) ltrim ( (str), (s) )
#define RTRIMS( str, s ) rtrim ( (str), (s) )
#if defined( HAVE_PTHREAD_SETNAME_NP ) // !defined( _MSVC_ ) implied
/*-------------------------------------------------------------------*/
/* Set thread name (nonstandard GNU extension) */
/* (note: retcode is error code, NOT errno) */
/*-------------------------------------------------------------------*/
HUT_DLL_IMPORT int nix_set_thread_name( pthread_t tid, const char* name );
#endif
/*-------------------------------------------------------------------*/
/* Hercules command line parsing function */
/*-------------------------------------------------------------------*/
HUT_DLL_IMPORT int parse_args( char* p, int maxargc, char** pargv, int* pargc );
/*-------------------------------------------------------------------*/
/* Ensure all calls to "rand()" return a hopefully unique value */
/*-------------------------------------------------------------------*/
HUT_DLL_IMPORT void init_random();
/*-------------------------------------------------------------------*/
/* Check if string is numeric or hexadecimal */
/*-------------------------------------------------------------------*/
HUT_DLL_IMPORT bool is_numeric( const char* str );
HUT_DLL_IMPORT bool is_numeric_l( const char* str, size_t len );
HUT_DLL_IMPORT bool is_hex( const char* str );
HUT_DLL_IMPORT bool is_hex_l( const char* str, size_t len );
/*-------------------------------------------------------------------*/
/* Subroutines to convert strings to upper or lower case */
/*-------------------------------------------------------------------*/
HUT_DLL_IMPORT void string_to_upper (char *source);
HUT_DLL_IMPORT void string_to_lower (char *source);
/*-------------------------------------------------------------------*/
/* Subroutine to convert a string to EBCDIC and pad with blanks */
/*-------------------------------------------------------------------*/
HUT_DLL_IMPORT void convert_to_ebcdic( BYTE* dest, int len, const char* source );
/*-------------------------------------------------------------------*/
/* Subroutine to convert an EBCDIC string to an ASCIIZ string. */
/* Removes trailing blanks and adds a terminating null. */
/* Returns the length of the ASCII string excluding terminating null */
/*-------------------------------------------------------------------*/
HUT_DLL_IMPORT int make_asciiz (char *dest, int destlen, BYTE *src, int srclen);
/*-------------------------------------------------------------------*/
/* Subroutine to convert DEVBLK halt or clear type to string */
/*-------------------------------------------------------------------*/
HUT_DLL_IMPORT const char* str_HOC( int hoc );
/*-------------------------------------------------------------------*/
/* idx_snprintf */
/* Fix for "Potential snprintf buffer overflow" #457 */
/*-------------------------------------------------------------------*/
/* This function is a replacement for code that builds a message */
/* piecemeal (a little bit at a time) via a series of snprint calls */
/* indexing each time a little bit further into the message buffer */
/* until the entire message is built: */
/* */
/* char buf[64]; */
/* size_t bufl = sizeof( buf ); */
/* int n = 0; */
/* */
/* n = snprintf( buf, bufl, "%part1", part1 ); */
/* n += snprintf( buf+n, bufl-n, "%part2", part2 ); */
/* n += snprintf( buf+n, bufl-n, "%part3", part3 ); */
/* ... */
/* n += snprintf( buf+n, bufl-n, "%lastpart", lastpart ); */
/* */
/* WRMSG( HHCnnnn, "I", buf ); */
/* */
/* The problem with the above code is there is no check to ensure */
/* a buffer overflow does not occur due to trying to format more */
/* data than the buffer can hold. */
/* */
/* The idx_snprintf function accomplishes the same thing but without */
/* overflowing the buffer. It checks to ensure the idx buffer offset */
/* value never exceeds the size of the buffer. */
/* */
/* The return value is the same as what snprintf returns, BUT THE */
/* BUFFER ADDRESS AND SIZE PASSED TO THE FUNCTION is the *original* */
/* address and size of the buffer (i.e. the raw buf and bufl value */
/* but NOT offset by the index): */
/* */
/* char buf[64]; */
/* size_t bufl = sizeof( buf ); */
/* int n = 0; */
/* */
/* n = idx_snprintf( n, buf, bufl, "%part1", part1 ); */
/* n += idx_snprintf( n, buf, bufl, "%part2", part2 ); */
/* n += idx_snprintf( n, buf, bufl, "%part3", part3 ); */
/* ... */
/* n += idx_snprintf( n, buf, bufl, "%lastpart", lastpart ); */
/* */
/* WRMSG( HHCnnnn, "I", buf ); */
/* */
/*-------------------------------------------------------------------*/
HUT_DLL_IMPORT int idx_snprintf( int idx, char* buffer, size_t bufsiz, const char* fmt, ... ) ATTR_PRINTF(4,5);
/*-------------------------------------------------------------------*/
/* Processor types functions */
/*-------------------------------------------------------------------*/
HUT_DLL_IMPORT const char* ptyp2long ( BYTE ptyp );
HUT_DLL_IMPORT const char* ptyp2short( BYTE ptyp );
HUT_DLL_IMPORT BYTE short2ptyp( const char* shortname );
/*-------------------------------------------------------------------*/
/* Store PSW helper function */
/*-------------------------------------------------------------------*/
HUT_DLL_IMPORT U64 do_make_psw64( PSW* psw, BYTE real_ilc, int arch /*370/390/900*/, bool bc );
/*-------------------------------------------------------------------*/
/* Return Program Interrupt Name */
/*-------------------------------------------------------------------*/
HUT_DLL_IMPORT const char* PIC2Name( int code );
/*-------------------------------------------------------------------*/
/* Return SIGP Order Name */
/*-------------------------------------------------------------------*/
HUT_DLL_IMPORT const char* order2name( BYTE order );
/*-------------------------------------------------------------------*/
/* Return PER Event name(s) */
/*-------------------------------------------------------------------*/
HUT_DLL_IMPORT const char* perc2name( BYTE perc, char* buf, size_t bufsiz );
/*-------------------------------------------------------------------*/
/* Format Operation-Request Block (ORB) for display */
/*-------------------------------------------------------------------*/
HUT_DLL_IMPORT const char* FormatORB( ORB* orb, char* buf, size_t bufsz );
/*-------------------------------------------------------------------*/
/* Determine if running on a big endian system or not */
/*-------------------------------------------------------------------*/
HUT_DLL_IMPORT bool are_big_endian();
/*-------------------------------------------------------------------*/
/* Determine if running under the control of a debugger */
/*-------------------------------------------------------------------*/
HUT_DLL_IMPORT bool check_if_debugger_is_present();
/*-------------------------------------------------------------------*/
/* Format and send a status message to HercGUI */
/*-------------------------------------------------------------------*/
HUT_DLL_IMPORT void send2gui( const char* pszFormat, ... );
/*-------------------------------------------------------------------*/
/* convert a version string to a number or vice-versa */
/*-------------------------------------------------------------------*/
HUT_DLL_IMPORT U32 verstr2num ( const char* verstr );
HUT_DLL_IMPORT char* vernum2str ( U32 vernum, char* verstr );
#define VERNUM2STR_BUFFSIZE 16
#define _VNUM( s ) verstr2num( s )
#define VNUM( s ) _VNUM( #s )
#define GNUM() sysblk.gui_vernum
/*********************************************************************/
/*********************************************************************/
/** **/
/** TraceFile support **/
/** **/
/*********************************************************************/
/*********************************************************************/
#define TF_FMT0 '0' // Format 0 = original release
#define TF_FMT1 '1' // Format 1 = 64 bytes of E7 CCW data
#define TF_FMT2 '2' // Format 2 = TFHDR thread id/name
#define TF_FMT3 '3' // Format 3 = 80 bytes of CCW data
#define TF_FMT TF_FMT3 // Current TraceFile file-format
#undef ATTRIBUTE_PACKED
#if defined(_MSVC_)
#pragma pack(push)
#pragma pack(1)
#define ATTRIBUTE_PACKED
#else
#define ATTRIBUTE_PACKED __attribute__((packed))
#endif
//---------------------------------------------------------------------
// TraceFile SYSTEM Record
//---------------------------------------------------------------------
struct TFSYS
{
char ffmt[ 4 ]; // "%TFn" where 'n' = file format
BYTE bigend; // 1 = Big Endian, 0 = Little Endian
BYTE engs; // MAX_CPU_ENGS
U16 archnum0; // _ARCH_NUM_0 (usually 370)
U16 archnum1; // _ARCH_NUM_1 (usually 390)
U16 archnum2; // _ARCH_NUM_2 (usually 900)
BYTE pad [ 4 ]; // (padding/alignment/unused)
TIMEVAL beg_tod; // Time of day trace started
TIMEVAL end_tod; // Time of day trace ended
U64 tot_ins; // Total instructions traced
U64 tot_dev; // Total device trace records
char version[ 128 ]; // Hercules version string (ASCII)
BYTE ptyp[ ROUND_UP( MAX_CPU_ENGS, 8 ) ]; // Processor type for each CPU
}
ATTRIBUTE_PACKED; typedef struct TFSYS TFSYS;
CASSERT( sizeof( TFSYS ) % 8 == 0, hscutl_h );
//---------------------------------------------------------------------
// TraceFile Record Header
//---------------------------------------------------------------------
struct TFHDR
{
U16 prev; // Previous record length
U16 curr; // Current record length (including TFHDR)
U16 cpuad; // CPU Address
U16 msgnum; // Message Number (2269 - 2272, etc)
TIMEVAL tod; // Time of day of record/event
BYTE arch_mode; // Architecture mode for this CPU
BYTE lcss; // LCSS (0-7)
U16 devnum; // Device number
BYTE pad [ 4 ]; // (padding/alignment/unused)
// Format-2...
U64 tidnum; // Thread-Id number (not 'TID'!)
char thrdname[16]; // Thread name
}
ATTRIBUTE_PACKED; typedef struct TFHDR TFHDR;
CASSERT( sizeof( TFHDR ) % 8 == 0, hscutl_h );
//---------------------------------------------------------------------
// TraceFile TF00423 Search Key Record
//---------------------------------------------------------------------
struct TF00423
{
TFHDR rhdr; // Record Header
BYTE kl; // Key length
BYTE key[45]; // Searched Key
BYTE pad [ 2 ]; // (padding/alignment/unused)
char filename[ 256 ];
}
ATTRIBUTE_PACKED; typedef struct TF00423 TF00423;
CASSERT( sizeof( TF00423 ) % 8 == 0, hscutl_h );
//---------------------------------------------------------------------
// TraceFile TF00424 Cur trk Record
//---------------------------------------------------------------------
struct TF00424
{
TFHDR rhdr; // Record Header
S32 trk; // Track
S32 bufcur; // Buffer data identifier
char filename[ 256 ];
}
ATTRIBUTE_PACKED; typedef struct TF00424 TF00424;
CASSERT( sizeof( TF00424 ) % 8 == 0, hscutl_h );
//---------------------------------------------------------------------
// TraceFile TF00425 Updating track Record
//---------------------------------------------------------------------
struct TF00425
{
TFHDR rhdr; // Record Header
S32 bufcur; // Buffer data identifier
BYTE pad [ 4 ]; // (padding/alignment/unused)
char filename[ 256 ];
}
ATTRIBUTE_PACKED; typedef struct TF00425 TF00425;
CASSERT( sizeof( TF00425 ) % 8 == 0, hscutl_h );
//---------------------------------------------------------------------
// TraceFile TF00426 Cache hit Record
//---------------------------------------------------------------------
struct TF00426
{
TFHDR rhdr; // Record Header
S32 trk; // Track
S32 idx; // Cache index
char filename[ 256 ];
}
ATTRIBUTE_PACKED; typedef struct TF00426 TF00426;
CASSERT( sizeof( TF00426 ) % 8 == 0, hscutl_h );
//---------------------------------------------------------------------
// TraceFile TF00427 Unavailable cache Record
//---------------------------------------------------------------------
struct TF00427
{
TFHDR rhdr; // Record Header
S32 trk; // Track
BYTE pad [ 4 ]; // (padding/alignment/unused)
char filename[ 256 ];
}
ATTRIBUTE_PACKED; typedef struct TF00427 TF00427;
CASSERT( sizeof( TF00427 ) % 8 == 0, hscutl_h );
//---------------------------------------------------------------------
// TraceFile TF00428 Cache miss Record
//---------------------------------------------------------------------
struct TF00428
{
TFHDR rhdr; // Record Header
S32 trk; // Track
S32 idx; // Cache index
char filename[ 256 ];
}
ATTRIBUTE_PACKED; typedef struct TF00428 TF00428;
CASSERT( sizeof( TF00428 ) % 8 == 0, hscutl_h );
//---------------------------------------------------------------------
// TraceFile TF00429 Offset Record
//---------------------------------------------------------------------
struct TF00429
{
TFHDR rhdr; // Record Header
S32 trk; // Track
S32 fnum; // File num?
S32 len; // Length
BYTE pad2[ 4 ]; // (padding/alignment/unused)
U64 offset; // Offset
char filename[ 256 ];
}
ATTRIBUTE_PACKED; typedef struct TF00429 TF00429;
CASSERT( sizeof( TF00429 ) % 8 == 0, hscutl_h );
//---------------------------------------------------------------------
// TraceFile TF00430 Trkhdr Record
//---------------------------------------------------------------------
struct TF00430
{
TFHDR rhdr; // Record Header
S32 trk; // Track
BYTE buf[5]; // Track Header
BYTE pad [ 7 ]; // (padding/alignment/unused)
char filename[ 256 ];
}
ATTRIBUTE_PACKED; typedef struct TF00430 TF00430;
CASSERT( sizeof( TF00430 ) % 8 == 0, hscutl_h );
//---------------------------------------------------------------------
// TraceFile TF00431 Seeking Record
//---------------------------------------------------------------------
struct TF00431
{
TFHDR rhdr; // Record Header
S32 cyl; // Cylinder
S32 head; // Head
char filename[ 256 ];
}
ATTRIBUTE_PACKED; typedef struct TF00431 TF00431;
CASSERT( sizeof( TF00431 ) % 8 == 0, hscutl_h );
//---------------------------------------------------------------------
// TraceFile TF00432 MT advance error Record
//---------------------------------------------------------------------
struct TF00432
{
TFHDR rhdr; // Record Header
BYTE count; // Count
BYTE mask; // Mask
BYTE pad [ 6 ]; // (padding/alignment/unused)
char filename[ 256 ];
}
ATTRIBUTE_PACKED; typedef struct TF00432 TF00432;
CASSERT( sizeof( TF00432 ) % 8 == 0, hscutl_h );
//---------------------------------------------------------------------
// TraceFile TF00433 MT advance Record
//---------------------------------------------------------------------
struct TF00433
{
TFHDR rhdr; // Record Header
S32 cyl; // Cylinder
S32 head; // Head
char filename[ 256 ];
}
ATTRIBUTE_PACKED; typedef struct TF00433 TF00433;
CASSERT( sizeof( TF00433 ) % 8 == 0, hscutl_h );
//---------------------------------------------------------------------
// TraceFile TF00434 Read count orientation Record
//---------------------------------------------------------------------
struct TF00434
{
TFHDR rhdr; // Record Header
BYTE orient; // Orientation
BYTE pad [ 7 ]; // (padding/alignment/unused)
char filename[ 256 ];
}
ATTRIBUTE_PACKED; typedef struct TF00434 TF00434;
CASSERT( sizeof( TF00434 ) % 8 == 0, hscutl_h );
//---------------------------------------------------------------------
// TraceFile TF00435 Cyl head record kl dl Record
//---------------------------------------------------------------------
struct TF00435
{
TFHDR rhdr; // Record Header
U16 dl; // Data length
BYTE pad [ 2 ]; // (padding/alignment/unused)
S32 cyl; // Cylinder
S32 head; // Head
S32 record; // Record
S32 kl; // Key length
U32 offset; // Track offset
char filename[ 256 ];
}
ATTRIBUTE_PACKED; typedef struct TF00435 TF00435;
CASSERT( sizeof( TF00435 ) % 8 == 0, hscutl_h );
//---------------------------------------------------------------------
// TraceFile TF00436 Read key Record
//---------------------------------------------------------------------
struct TF00436
{
TFHDR rhdr; // Record Header
S32 kl; // Key length
BYTE pad [ 4 ]; // (padding/alignment/unused)
char filename[ 256 ];
}
ATTRIBUTE_PACKED; typedef struct TF00436 TF00436;
CASSERT( sizeof( TF00436 ) % 8 == 0, hscutl_h );
//---------------------------------------------------------------------
// TraceFile TF00437 Read data Record
//---------------------------------------------------------------------
struct TF00437
{
TFHDR rhdr; // Record Header
U16 dl; // Data length
BYTE pad [ 6 ]; // (padding/alignment/unused)
char filename[ 256 ];
}
ATTRIBUTE_PACKED; typedef struct TF00437 TF00437;
CASSERT( sizeof( TF00437 ) % 8 == 0, hscutl_h );
//---------------------------------------------------------------------
// TraceFile TF00438 Write cyl head record kl dl Record
//---------------------------------------------------------------------
struct TF00438
{
TFHDR rhdr; // Record Header
S32 cyl; // Cylinder
S32 head; // Head
U16 datalen; // Data length
BYTE recnum; // Record number
BYTE keylen; // Key length
BYTE pad [ 4 ]; // (padding/alignment/unused)
char filename[ 256 ];
}
ATTRIBUTE_PACKED; typedef struct TF00438 TF00438;
CASSERT( sizeof( TF00438 ) % 8 == 0, hscutl_h );
//---------------------------------------------------------------------
// TraceFile TF00439 Set track overflow flag Record
//---------------------------------------------------------------------
struct TF00439
{
TFHDR rhdr; // Record Header
S32 cyl; // Cylinder
S32 head; // Head
BYTE recnum; // Record number
BYTE pad [ 7 ]; // (padding/alignment/unused)
char filename[ 256 ];
}
ATTRIBUTE_PACKED; typedef struct TF00439 TF00439;
CASSERT( sizeof( TF00439 ) % 8 == 0, hscutl_h );
//---------------------------------------------------------------------
// TraceFile TF00440 Update cyl head record kl dl Record
//---------------------------------------------------------------------
struct TF00440
{
TFHDR rhdr; // Record Header
S32 cyl; // Cylinder
S32 head; // Head
S32 recnum; // Record number
S32 keylen; // Key length
U16 datalen; // Data length
BYTE pad [ 6 ]; // (padding/alignment/unused)
char filename[ 256 ];
}
ATTRIBUTE_PACKED; typedef struct TF00440 TF00440;
CASSERT( sizeof( TF00440 ) % 8 == 0, hscutl_h );
//---------------------------------------------------------------------
// TraceFile TF00441 Update cyl head record dl Record
//---------------------------------------------------------------------
struct TF00441
{
TFHDR rhdr; // Record Header
S32 cyl; // Cylinder
S32 head; // Head
S32 recnum; // Record number
U16 datalen; // Data length
BYTE pad [ 2 ]; // (padding/alignment/unused)
char filename[ 256 ];
}
ATTRIBUTE_PACKED; typedef struct TF00441 TF00441;
CASSERT( sizeof( TF00441 ) % 8 == 0, hscutl_h );
//---------------------------------------------------------------------
// TraceFile TF00442 Set file mask Record
//---------------------------------------------------------------------
struct TF00442
{
TFHDR rhdr; // Record Header
BYTE mask; // Mask
BYTE pad [ 7 ]; // (padding/alignment/unused)
char filename[ 256 ];
}
ATTRIBUTE_PACKED; typedef struct TF00442 TF00442;
CASSERT( sizeof( TF00442 ) % 8 == 0, hscutl_h );
//---------------------------------------------------------------------
// TraceFile TF00516 Cache hit Record
//---------------------------------------------------------------------
struct TF00516
{
TFHDR rhdr; // Record Header
S32 blkgrp; // Block group
S32 idx; // Cache index
char filename[ 256 ];
}
ATTRIBUTE_PACKED; typedef struct TF00516 TF00516;
CASSERT( sizeof( TF00516 ) % 8 == 0, hscutl_h );
//---------------------------------------------------------------------
// TraceFile TF00517 Unavailable cache Record
//---------------------------------------------------------------------
struct TF00517
{
TFHDR rhdr; // Record Header
S32 blkgrp; // Block group
BYTE pad [ 4 ]; // (padding/alignment/unused)
char filename[ 256 ];
}
ATTRIBUTE_PACKED; typedef struct TF00517 TF00517;
CASSERT( sizeof( TF00517 ) % 8 == 0, hscutl_h );
//---------------------------------------------------------------------
// TraceFile TF00518 Cache miss Record
//---------------------------------------------------------------------
struct TF00518
{
TFHDR rhdr; // Record Header
S32 blkgrp; // Block group
S32 idx; // Cache index
char filename[ 256 ];
}
ATTRIBUTE_PACKED; typedef struct TF00518 TF00518;
CASSERT( sizeof( TF00518 ) % 8 == 0, hscutl_h );
//---------------------------------------------------------------------
// TraceFile TF00519 Offset len Record
//---------------------------------------------------------------------
struct TF00519
{
TFHDR rhdr; // Record Header
S32 blkgrp; // Block group
S32 len; // Length
U64 offset; // Offset
char filename[ 256 ];
}
ATTRIBUTE_PACKED; typedef struct TF00519 TF00519;
CASSERT( sizeof( TF00519 ) % 8 == 0, hscutl_h );
//---------------------------------------------------------------------
// TraceFile TF00520 Positioning Record
//---------------------------------------------------------------------
struct TF00520
{
TFHDR rhdr; // Record Header
U64 rba; // Relative Byte Offset
char filename[ 256 ];
}
ATTRIBUTE_PACKED; typedef struct TF00520 TF00520;
CASSERT( sizeof( TF00520 ) % 8 == 0, hscutl_h );
//---------------------------------------------------------------------
// TraceFile TF00800 Wait State PSW Record
//---------------------------------------------------------------------
struct TF00800
{
TFHDR rhdr; // Record Header
PSW psw; // PSW
BYTE amode64; // 64-bit addressing
BYTE amode; // 31-bit addressing
BYTE zeroilc; // 1=Zero ILC
BYTE pad [ 5 ]; // (padding/alignment/unused)
}
ATTRIBUTE_PACKED; typedef struct TF00800 TF00800;
CASSERT( sizeof( TF00800 ) % 8 == 0, hscutl_h );
//---------------------------------------------------------------------
// TraceFile TF00801 Program Interrupt Record
//---------------------------------------------------------------------
struct TF00801
{
TFHDR rhdr; // Record Header
U16 pcode; // Interruption code
BYTE sie; // SIE mode
BYTE ilc; // Instruction Length Code
U32 dxc; // Data-Exception code
U32 why; // TXF why transaction aborted
BYTE pad [ 4 ]; // (padding/alignment/unused)
}
ATTRIBUTE_PACKED; typedef struct TF00801 TF00801;
CASSERT( sizeof( TF00801 ) % 8 == 0, hscutl_h );
//---------------------------------------------------------------------
// TraceFile TF00802 PER Event Record
//---------------------------------------------------------------------
struct TF00802
{
TFHDR rhdr; // Record Header
U64 ia; // PSW Address
U32 pcode; // Program Interrupt code
U16 perc; // PER code
BYTE pad [ 2 ]; // (padding/alignment/unused)
}
ATTRIBUTE_PACKED; typedef struct TF00802 TF00802;
CASSERT( sizeof( TF00802 ) % 8 == 0, hscutl_h );
//---------------------------------------------------------------------
// TraceFile TF00803 Program Interrupt Loop Record
//---------------------------------------------------------------------
struct TF00803
{
TFHDR rhdr; // Record Header
char str[40]; // Formatted PSW string
}
ATTRIBUTE_PACKED; typedef struct TF00803 TF00803;
CASSERT( sizeof( TF00803 ) % 8 == 0, hscutl_h );
//---------------------------------------------------------------------
// TraceFile TF00804 I/O Interrupt (S/370) Record
//---------------------------------------------------------------------
struct TF00804
{
TFHDR rhdr; // Record Header
BYTE csw[8]; // Channel Status Word
U16 ioid; // Device number
BYTE lcss; // LCSS (0-7)
BYTE pad [ 5 ]; // (padding/alignment/unused)
}
ATTRIBUTE_PACKED; typedef struct TF00804 TF00804;
CASSERT( sizeof( TF00804 ) % 8 == 0, hscutl_h );
//---------------------------------------------------------------------
// TraceFile TF00806 I/O Interrupt Record
// (handles both HHC00805 and HHC00806)
//---------------------------------------------------------------------
struct TF00806
{
TFHDR rhdr; // Record Header
U32 ioid; // I/O interruption address
U32 ioparm; // I/O interruption parameter
U32 iointid; // I/O interruption ident
BYTE pad [ 4 ]; // (padding/alignment/unused)
}
ATTRIBUTE_PACKED; typedef struct TF00806 TF00806;
CASSERT( sizeof( TF00806 ) % 8 == 0, hscutl_h );
//---------------------------------------------------------------------
// TraceFile TF00807 Machine Check Interrupt Record
//---------------------------------------------------------------------
struct TF00807
{
TFHDR rhdr; // Record Header
U64 mcic; // Interruption code
U64 fsta; // Failing storage address
U32 xdmg; // External-Damage code
BYTE pad [ 4 ]; // (padding/alignment/unused)
}
ATTRIBUTE_PACKED; typedef struct TF00807 TF00807;
CASSERT( sizeof( TF00807 ) % 8 == 0, hscutl_h );
//---------------------------------------------------------------------
// TraceFile TF00808 Store Status Record
//---------------------------------------------------------------------
struct TF00808
{
TFHDR rhdr; // Record Header
}
ATTRIBUTE_PACKED; typedef struct TF00808 TF00808;
CASSERT( sizeof( TF00808 ) % 8 == 0, hscutl_h );
//---------------------------------------------------------------------
// TraceFile TF00809 Disabled Wait State Record
//---------------------------------------------------------------------
struct TF00809
{
TFHDR rhdr; // Record Header
char str[40]; // Formatted PSW string
}
ATTRIBUTE_PACKED; typedef struct TF00809 TF00809;
CASSERT( sizeof( TF00809 ) % 8 == 0, hscutl_h );
//---------------------------------------------------------------------
// TraceFile TF00811 Architecture mode Record
//---------------------------------------------------------------------
struct TF00811
{
TFHDR rhdr; // Record Header
char archname[8]; // Architecture name
}
ATTRIBUTE_PACKED; typedef struct TF00811 TF00811;
CASSERT( sizeof( TF00811 ) % 8 == 0, hscutl_h );
//---------------------------------------------------------------------
// TraceFile TF00812 Vector facility online (370/390) Record
//---------------------------------------------------------------------
struct TF00812
{
TFHDR rhdr; // Record Header
}
ATTRIBUTE_PACKED; typedef struct TF00812 TF00812;
CASSERT( sizeof( TF00812 ) % 8 == 0, hscutl_h );
//---------------------------------------------------------------------
// TraceFile TF00814 Signal Processor Record
//---------------------------------------------------------------------
struct TF00814
{
TFHDR rhdr; // Record Header
U16 cpad; // Target CPU
BYTE order; // Order
BYTE cc; // Condition code
U32 status; // Status
U64 parm; // Parameter
BYTE got_status; // boolean
BYTE pad [ 7 ]; // (padding/alignment/unused)
}
ATTRIBUTE_PACKED; typedef struct TF00814 TF00814;
CASSERT( sizeof( TF00814 ) % 8 == 0, hscutl_h );
//---------------------------------------------------------------------
// TraceFile TF00840 External Interrupt Record
//---------------------------------------------------------------------
struct TF00840 // Messages HHC00840 .. HHC00843
{
TFHDR rhdr; // Record Header
S64 cpu_timer; // CPU_TIMER
U16 icode; // Interruption code
BYTE pad [ 6 ]; // (padding/alignment/unused)
}
ATTRIBUTE_PACKED; typedef struct TF00840 TF00840;
CASSERT( sizeof( TF00840 ) % 8 == 0, hscutl_h );
//---------------------------------------------------------------------
// TraceFile TF00844 Block I/O Interrupt Record
//---------------------------------------------------------------------
struct TF00844
{
TFHDR rhdr; // Record Header
U64 bioparm; // Block I/O interrupt parm
U16 servcode; // External interrupt code
BYTE biostat; // Block I/O status
BYTE biosubcd; // Block I/O sub int. code
BYTE pad [ 4 ]; // (padding/alignment/unused)
}
ATTRIBUTE_PACKED; typedef struct TF00844 TF00844;
CASSERT( sizeof( TF00844 ) % 8 == 0, hscutl_h );
//---------------------------------------------------------------------
// TraceFile TF00845 Block I/O External interrupt Record
//---------------------------------------------------------------------
struct TF00845
{
TFHDR rhdr; // Record Header
U64 bioparm; // Block I/O interrupt parm
BYTE biosubcd; // Block I/O sub int. code
BYTE pad [ 7 ]; // (padding/alignment/unused)
}
ATTRIBUTE_PACKED; typedef struct TF00845 TF00845;
CASSERT( sizeof( TF00845 ) % 8 == 0, hscutl_h );
//---------------------------------------------------------------------
// TraceFile TF00846 Service Signal External Interrupt Record
//---------------------------------------------------------------------
struct TF00846
{
TFHDR rhdr; // Record Header
U32 servparm; // Service signal parameter
BYTE pad [ 4 ]; // (padding/alignment/unused)
}
ATTRIBUTE_PACKED; typedef struct TF00846 TF00846;
CASSERT( sizeof( TF00846 ) % 8 == 0, hscutl_h );
//---------------------------------------------------------------------
// TraceFile TF01300 Halt subchannel Record
//---------------------------------------------------------------------
struct TF01300
{
TFHDR rhdr; // Record Header
BYTE cc; // Condition Code
BYTE pad [ 7 ]; // (padding/alignment/unused)
}
ATTRIBUTE_PACKED; typedef struct TF01300 TF01300;
CASSERT( sizeof( TF01300 ) % 8 == 0, hscutl_h );
//---------------------------------------------------------------------
// TraceFile TF01301 IDAW/MIDAW Record
//---------------------------------------------------------------------
struct TF01301
{
TFHDR rhdr; // Record Header
U64 addr; // IDAW/MIDAW address
U16 count; // CCW byte count
BYTE amt; // Data amount
BYTE type; // IDA type (IDAW1/IDAW2/MIDAW)
BYTE mflag; // MIDAW flag
// Format-0...
// BYTE pad [ 3 ]; // (padding/alignment/unused)
// BYTE data[16]; // IDAW/MIDAW data (amt <= 16)
// Format-1...
BYTE code; // CCW opcode (if E7, amt = 64)
BYTE pad [ 2 ]; // (padding/alignment/unused)
BYTE data[64]; // IDAW/MIDAW data (amt <= 64)
}
ATTRIBUTE_PACKED; typedef struct TF01301 TF01301;
CASSERT( sizeof( TF01301 ) % 8 == 0, hscutl_h );
//---------------------------------------------------------------------
// TraceFile TF01304 Attention signaled Record
//---------------------------------------------------------------------
struct TF01304
{
TFHDR rhdr; // Record Header
}
ATTRIBUTE_PACKED; typedef struct TF01304 TF01304;
CASSERT( sizeof( TF01304 ) % 8 == 0, hscutl_h );
//---------------------------------------------------------------------
// TraceFile TF01305 Attention Record
//---------------------------------------------------------------------
struct TF01305
{
TFHDR rhdr; // Record Header
}
ATTRIBUTE_PACKED; typedef struct TF01305 TF01305;
CASSERT( sizeof( TF01305 ) % 8 == 0, hscutl_h );
//---------------------------------------------------------------------
// TraceFile TF01306 Initial status interrupt Record
//---------------------------------------------------------------------
struct TF01306
{
TFHDR rhdr; // Record Header
}
ATTRIBUTE_PACKED; typedef struct TF01306 TF01306;
CASSERT( sizeof( TF01306 ) % 8 == 0, hscutl_h );
//---------------------------------------------------------------------
// TraceFile TF01307 Attention completed Record
//---------------------------------------------------------------------
struct TF01307
{
TFHDR rhdr; // Record Header
}
ATTRIBUTE_PACKED; typedef struct TF01307 TF01307;
CASSERT( sizeof( TF01307 ) % 8 == 0, hscutl_h );
//---------------------------------------------------------------------
// TraceFile TF01308 Clear completed Record
//---------------------------------------------------------------------
struct TF01308
{
TFHDR rhdr; // Record Header
}
ATTRIBUTE_PACKED; typedef struct TF01308 TF01308;
CASSERT( sizeof( TF01308 ) % 8 == 0, hscutl_h );
//---------------------------------------------------------------------
// TraceFile TF01309 Halt completed Record
//---------------------------------------------------------------------
struct TF01309
{
TFHDR rhdr; // Record Header
}
ATTRIBUTE_PACKED; typedef struct TF01309 TF01309;
CASSERT( sizeof( TF01309 ) % 8 == 0, hscutl_h );
//---------------------------------------------------------------------
// TraceFile TF01310 Suspended Record
//---------------------------------------------------------------------
struct TF01310
{
TFHDR rhdr; // Record Header
}
ATTRIBUTE_PACKED; typedef struct TF01310 TF01310;
CASSERT( sizeof( TF01310 ) % 8 == 0, hscutl_h );
//---------------------------------------------------------------------
// TraceFile TF01311 Resumed Record
//---------------------------------------------------------------------
struct TF01311
{
TFHDR rhdr; // Record Header
}
ATTRIBUTE_PACKED; typedef struct TF01311 TF01311;
CASSERT( sizeof( TF01311 ) % 8 == 0, hscutl_h );
//---------------------------------------------------------------------
// TraceFile TF01312 I/O stat Record
//---------------------------------------------------------------------
struct TF01312
{
TFHDR rhdr; // Record Header
U32 residual; // residual
BYTE unitstat; // unitstat
BYTE chanstat; // chanstat
BYTE amt; // data amount
BYTE pad [ 1 ]; // (padding/alignment/unused)
BYTE data[16]; // iobuf data
}
ATTRIBUTE_PACKED; typedef struct TF01312 TF01312;
CASSERT( sizeof( TF01312 ) % 8 == 0, hscutl_h );
//---------------------------------------------------------------------
// TraceFile TF01313 Sense Record
//---------------------------------------------------------------------
struct TF01313
{
TFHDR rhdr; // Record Header
BYTE sense[32]; // Sense
char sns[128]; // Device interpretation of sense bytes 0-1
}
ATTRIBUTE_PACKED; typedef struct TF01313 TF01313;
CASSERT( sizeof( TF01313 ) % 8 == 0, hscutl_h );
//---------------------------------------------------------------------
// TraceFile TF01315 CCW Record
//---------------------------------------------------------------------
struct TF01315
{
TFHDR rhdr; // Record Header
U32 addr; // CCW data address
U16 count; // CCW byte count
BYTE amt; // Data amount
BYTE sysg; // SYSG I/O via
BYTE ccw[8]; // CCW
// Format-0...
// BYTE data[16]; // CCW data (amt <= 16)
// Format-1...
// BYTE data[64]; // CCW data (amt <= 64)
// Format-3...
BYTE data[80]; // CCW data (amt <= 80)
}
ATTRIBUTE_PACKED; typedef struct TF01315 TF01315;
CASSERT( sizeof( TF01315 ) % 8 == 0, hscutl_h );
//---------------------------------------------------------------------
// TraceFile TF01316 CSW (370) Record
//---------------------------------------------------------------------
struct TF01316
{
TFHDR rhdr; // Record Header
BYTE csw[8]; // CSW
}
ATTRIBUTE_PACKED; typedef struct TF01316 TF01316;
CASSERT( sizeof( TF01316 ) % 8 == 0, hscutl_h );
//---------------------------------------------------------------------
// TraceFile TF01317 SCSW Record
//---------------------------------------------------------------------
struct TF01317
{
TFHDR rhdr; // Record Header
SCSW scsw; // SCSW
BYTE pad [ 4 ]; // (padding/alignment/unused)
}
ATTRIBUTE_PACKED; typedef struct TF01317 TF01317;
CASSERT( sizeof( TF01317 ) % 8 == 0, hscutl_h );
//---------------------------------------------------------------------
// TraceFile TF01318 TEST I/O Record
//---------------------------------------------------------------------
struct TF01318
{
TFHDR rhdr; // Record Header
BYTE cc; // Condition Code
BYTE pad [ 7 ]; // (padding/alignment/unused)
}
ATTRIBUTE_PACKED; typedef struct TF01318 TF01318;
CASSERT( sizeof( TF01318 ) % 8 == 0, hscutl_h );
//---------------------------------------------------------------------
// TraceFile TF01320 S/370 SIO conversion started Record
//---------------------------------------------------------------------
struct TF01320
{
TFHDR rhdr; // Record Header
}
ATTRIBUTE_PACKED; typedef struct TF01320 TF01320;
CASSERT( sizeof( TF01320 ) % 8 == 0, hscutl_h );
//---------------------------------------------------------------------
// TraceFile TF01321 S/370 SIO conversion success Record
//---------------------------------------------------------------------
struct TF01321
{
TFHDR rhdr; // Record Header
}
ATTRIBUTE_PACKED; typedef struct TF01321 TF01321;
CASSERT( sizeof( TF01321 ) % 8 == 0, hscutl_h );
//---------------------------------------------------------------------
// TraceFile TF01329 Halt I/O Record
//---------------------------------------------------------------------
struct TF01329
{
TFHDR rhdr; // Record Header
}
ATTRIBUTE_PACKED; typedef struct TF01329 TF01329;
CASSERT( sizeof( TF01329 ) % 8 == 0, hscutl_h );
//---------------------------------------------------------------------
// TraceFile TF01330 HIO modification Record
//---------------------------------------------------------------------
struct TF01330
{
TFHDR rhdr; // Record Header
}
ATTRIBUTE_PACKED; typedef struct TF01330 TF01330;
CASSERT( sizeof( TF01330 ) % 8 == 0, hscutl_h );
//---------------------------------------------------------------------
// TraceFile TF01331 Clear subchannel Record
//---------------------------------------------------------------------
struct TF01331
{
TFHDR rhdr; // Record Header
}
ATTRIBUTE_PACKED; typedef struct TF01331 TF01331;
CASSERT( sizeof( TF01331 ) % 8 == 0, hscutl_h );
//---------------------------------------------------------------------
// TraceFile TF01332 Halt subchannel Record
//---------------------------------------------------------------------
struct TF01332
{
TFHDR rhdr; // Record Header
}
ATTRIBUTE_PACKED; typedef struct TF01332 TF01332;
CASSERT( sizeof( TF01332 ) % 8 == 0, hscutl_h );
//---------------------------------------------------------------------
// TraceFile TF01333 Resume subchannel Record
//---------------------------------------------------------------------
struct TF01333
{
TFHDR rhdr; // Record Header
BYTE cc; // Condition Code
BYTE pad [ 7 ]; // (padding/alignment/unused)
}
ATTRIBUTE_PACKED; typedef struct TF01333 TF01333;
CASSERT( sizeof( TF01333 ) % 8 == 0, hscutl_h );
//---------------------------------------------------------------------
// TraceFile TF01334 ORB Record
//---------------------------------------------------------------------
struct TF01334
{
TFHDR rhdr; // Record Header
ORB orb; // ORB
}
ATTRIBUTE_PACKED; typedef struct TF01334 TF01334;
CASSERT( sizeof( TF01334 ) % 8 == 0, hscutl_h );
//---------------------------------------------------------------------
// TraceFile TF01336 Startio cc=2 Record
//---------------------------------------------------------------------
struct TF01336
{
TFHDR rhdr; // Record Header
BYTE busy; // busy
BYTE startpending; // startpending
BYTE pad [ 6 ]; // (padding/alignment/unused)
}
ATTRIBUTE_PACKED; typedef struct TF01336 TF01336;
CASSERT( sizeof( TF01336 ) % 8 == 0, hscutl_h );
//---------------------------------------------------------------------
// TraceFile TF02266 Vector Register Record
//---------------------------------------------------------------------
struct TF02266
{
TFHDR rhdr; // Record Header
QW vfp[32]; // Vector registers
}
ATTRIBUTE_PACKED; typedef struct TF02266 TF02266;
CASSERT(sizeof(TF02266) % 8 == 0, hscutl_h);
//---------------------------------------------------------------------
// TraceFile TF02269 General Purpose Registers Record
//---------------------------------------------------------------------
struct TF02269
{
TFHDR rhdr; // Record Header
BYTE ifetch_error; // true == instruction fetch error
BYTE sie; // true == SIE mode
BYTE pad [ 6 ]; // (padding/alignment/unused)
DW gr[16]; // General registers
}
ATTRIBUTE_PACKED; typedef struct TF02269 TF02269;
CASSERT( sizeof( TF02269 ) % 8 == 0, hscutl_h );
//---------------------------------------------------------------------
// TraceFile TF02270 Floating Point Registers Record
//---------------------------------------------------------------------
struct TF02270
{
TFHDR rhdr; // Record Header
DW fpr[16]; // FP registers
BYTE afp; // CR0 AFP enabled
BYTE pad [ 7 ]; // (padding/alignment/unused)
}
ATTRIBUTE_PACKED; typedef struct TF02270 TF02270;
CASSERT( sizeof( TF02270 ) % 8 == 0, hscutl_h );
//---------------------------------------------------------------------
// TraceFile TF02271 Control Registers Record
//---------------------------------------------------------------------
struct TF02271
{
TFHDR rhdr; // Record Header
DW cr[16]; // Control registers
}
ATTRIBUTE_PACKED; typedef struct TF02271 TF02271;
CASSERT( sizeof( TF02271 ) % 8 == 0, hscutl_h );
//---------------------------------------------------------------------
// TraceFile TF02272 Access Registers Record
//---------------------------------------------------------------------
struct TF02272
{
TFHDR rhdr; // Record Header
U32 ar[16]; // Access registers
}
ATTRIBUTE_PACKED; typedef struct TF02272 TF02272;
CASSERT( sizeof( TF02272 ) % 8 == 0, hscutl_h );
//---------------------------------------------------------------------
// TraceFile TF02276 Floating Point Control Register Record
//---------------------------------------------------------------------
struct TF02276
{
TFHDR rhdr; // Record Header
U32 fpc; // FP Control register
BYTE afp; // CR0 AFP enabled
BYTE pad [ 3 ]; // (padding/alignment/unused)
}
ATTRIBUTE_PACKED; typedef struct TF02276 TF02276;
CASSERT( sizeof( TF02276 ) % 8 == 0, hscutl_h );
//---------------------------------------------------------------------
// TraceFile TF02324 Primary Instruction Trace Record
//---------------------------------------------------------------------
struct TF02324
{
TFHDR rhdr; // Record Header
PSW psw; // PSW
BYTE amode64; // 64-bit addressing
BYTE amode; // 31-bit addressing
BYTE zeroilc; // 1=Zero ILC
BYTE sie; // SIE mode
BYTE ilc; // Instruction Length Code
BYTE pad [ 3 ]; // (padding/alignment/unused)
BYTE inst[6]; // Instruction
BYTE pad2[ 2 ]; // (padding/alignment/unused)
}
ATTRIBUTE_PACKED; typedef struct TF02324 TF02324;
CASSERT( sizeof( TF02324 ) % 8 == 0, hscutl_h );
//---------------------------------------------------------------------
// TraceFile Storage Operands Structure
//---------------------------------------------------------------------
struct TFOP
{
U64 vaddr; // Effective/Virtual Address
U64 raddr; // Real storage address
BYTE stor[16]; // Actual storage contents
U16 xcode; // Translation Exception code
BYTE skey; // Storage key
BYTE amt; // How much of storage we have
BYTE pad [ 4 ]; // (padding/alignment/unused)
}
ATTRIBUTE_PACKED; typedef struct TFOP TFOP;
CASSERT( sizeof( TFOP ) % 8 == 0, hscutl_h );
//---------------------------------------------------------------------
// TraceFile TF02326 Instruction Operands Record
//---------------------------------------------------------------------
struct TF02326
{
TFHDR rhdr; // Record Header
BYTE valid; // Valid instruction
BYTE sie; // SIE mode
BYTE real_mode; // true == DAT not enabled
BYTE pad [ 1 ]; // (padding/alignment/unused)
S16 b1; // Operand-1 register number (if >= 0)
S16 b2; // Operand-2 register number (if >= 0)
TFOP op1; // OPERAND-1
TFOP op2; // OPERAND-2
}
ATTRIBUTE_PACKED; typedef struct TF02326 TF02326;
CASSERT( sizeof( TF02326 ) % 8 == 0, hscutl_h );
#if defined(_MSVC_)
#pragma pack(pop)
#endif
// Device tracing -----------------------------------------------------------------------------
HUT_DLL_IMPORT bool tf_0423( DEVBLK* dev, // Search key
size_t kl,
BYTE* key );
HUT_DLL_IMPORT bool tf_0424( DEVBLK* dev, // Cur trk
S32 trk );
HUT_DLL_IMPORT bool tf_0425( DEVBLK* dev ); // Updating track
HUT_DLL_IMPORT bool tf_0426( DEVBLK* dev, // Cache hit
S32 trk,
S32 i );
HUT_DLL_IMPORT bool tf_0427( DEVBLK* dev, // Unavailable cache
S32 trk );
HUT_DLL_IMPORT bool tf_0428( DEVBLK* dev, // Cache miss
S32 trk,
S32 o );
HUT_DLL_IMPORT bool tf_0429( DEVBLK* dev, // Offset
S32 trk,
S32 fnum );
HUT_DLL_IMPORT bool tf_0430( DEVBLK* dev, // Trkhdr
S32 trk );
HUT_DLL_IMPORT bool tf_0431( DEVBLK* dev, // Seeking
int cyl,
int head );
HUT_DLL_IMPORT bool tf_0432( DEVBLK* dev ); // MT advance error
HUT_DLL_IMPORT bool tf_0433( DEVBLK* dev, // MT advance
int cyl,
int head );
HUT_DLL_IMPORT bool tf_0434( DEVBLK* dev ); // Read count orientation
HUT_DLL_IMPORT bool tf_0435( DEVBLK* dev ); // Cyl head record kl dl
HUT_DLL_IMPORT bool tf_0436( DEVBLK* dev ); // Read key
HUT_DLL_IMPORT bool tf_0437( DEVBLK* dev ); // Read data
HUT_DLL_IMPORT bool tf_0438( DEVBLK* dev, // Write cyl head record kl dl
BYTE recnum,
BYTE keylen,
U16 datalen );
HUT_DLL_IMPORT bool tf_0439( DEVBLK* dev, // Set track overflow flag
BYTE recnum );
HUT_DLL_IMPORT bool tf_0440( DEVBLK* dev ); // Update cyl head record kl dl
HUT_DLL_IMPORT bool tf_0441( DEVBLK* dev ); // Update cyl head record dl
HUT_DLL_IMPORT bool tf_0442( DEVBLK* dev ); // Set file mask
HUT_DLL_IMPORT bool tf_0516( DEVBLK* dev, // Cache hit
S32 blkgrp,
S32 i );
HUT_DLL_IMPORT bool tf_0517( DEVBLK* dev, // Unavailable cache
S32 blkgrp );
HUT_DLL_IMPORT bool tf_0518( DEVBLK* dev, // Cache miss
S32 blkgrp,
S32 o );
HUT_DLL_IMPORT bool tf_0519( DEVBLK* dev, // Offset len
S32 blkgrp,
U64 offset,
S32 len );
HUT_DLL_IMPORT bool tf_0520( DEVBLK* dev ); // Positioning
// Instruction tracing ------------------------------------------------------------------------
HUT_DLL_IMPORT bool tf_0800( REGS* regs ); // Wait State PSW
HUT_DLL_IMPORT bool tf_0801( REGS* regs, // Program Interrupt
U16 pcode,
BYTE ilc );
HUT_DLL_IMPORT bool tf_0802( REGS* regs, // PER Event
U64 ia,
U32 pcode,
U16 perc );
HUT_DLL_IMPORT bool tf_0803( REGS* regs, // Program Interrupt Loop
const char* str );
HUT_DLL_IMPORT bool tf_0804( REGS* regs, // I/O Interrupt (S/370)
BYTE* csw,
U16 ioid,
BYTE lcss );
HUT_DLL_IMPORT bool tf_0806( REGS* regs, // I/O Interrupt (handles both HHC00805 and HHC00806)
U32 ioid,
U32 ioparm,
U32 iointid );
HUT_DLL_IMPORT bool tf_0807( REGS* regs, // Machine Check Interrupt
U64 mcic,
U64 fsta,
U32 xdmg );
HUT_DLL_IMPORT bool tf_0808( REGS* regs ); // Store Status
HUT_DLL_IMPORT bool tf_0809( REGS* regs, // Disabled Wait State
const char* str );
HUT_DLL_IMPORT bool tf_0811( REGS* regs, // Architecture mode
const char* archname );
HUT_DLL_IMPORT bool tf_0812( REGS* regs ); // Vector facility online (370/390)
HUT_DLL_IMPORT bool tf_0814( REGS* regs, // Signal Processor
BYTE order,
BYTE cc,
U16 cpad,
U32 status,
U64 parm,
BYTE got_status );
HUT_DLL_IMPORT bool tf_0840( REGS* regs, // External Interrupt
U16 icode );
HUT_DLL_IMPORT bool tf_0844( REGS* regs ); // Block I/O Interrupt
HUT_DLL_IMPORT bool tf_0845( REGS* regs ); // Block I/O External interrupt
HUT_DLL_IMPORT bool tf_0846( REGS* regs ); // Service Signal External Interrupt
// Device tracing -----------------------------------------------------------------------------
HUT_DLL_IMPORT bool tf_1300( DEVBLK* dev, // Halt subchannel
BYTE cc );
HUT_DLL_IMPORT bool tf_1301( const DEVBLK* dev, // IDAW/MIDAW
const U64 addr,
const U16 count,
BYTE* data,
BYTE amt,
const BYTE flag,
const BYTE type );
HUT_DLL_IMPORT bool tf_1304( DEVBLK* dev ); // Attention signaled
HUT_DLL_IMPORT bool tf_1305( DEVBLK* dev ); // Attention
HUT_DLL_IMPORT bool tf_1306( DEVBLK* dev ); // Initial status interrupt
HUT_DLL_IMPORT bool tf_1307( DEVBLK* dev ); // Attention completed
HUT_DLL_IMPORT bool tf_1308( DEVBLK* dev ); // Clear completed
HUT_DLL_IMPORT bool tf_1309( DEVBLK* dev ); // Halt completed
HUT_DLL_IMPORT bool tf_1310( DEVBLK* dev ); // Suspended
HUT_DLL_IMPORT bool tf_1311( DEVBLK* dev ); // Resumed
HUT_DLL_IMPORT bool tf_1312( DEVBLK* dev, // I/O stat
BYTE unitstat,
BYTE chanstat,
BYTE amt,
U32 residual,
BYTE* iobuf_data );
HUT_DLL_IMPORT bool tf_1313( DEVBLK* dev ); // Sense
HUT_DLL_IMPORT bool tf_1315( const DEVBLK* dev, // CCW
const BYTE* ccw,
const U32 addr,
const U16 count,
BYTE* data,
BYTE amt );
HUT_DLL_IMPORT bool tf_1316( const DEVBLK* dev, // CSW (370)
const BYTE csw[] );
HUT_DLL_IMPORT bool tf_1317( const DEVBLK* dev, // SCSW
const SCSW scsw );
HUT_DLL_IMPORT bool tf_1318( DEVBLK* dev, // TEST I/O
BYTE cc );
HUT_DLL_IMPORT bool tf_1320( DEVBLK* dev ); // S/370 start I/O conversion started
HUT_DLL_IMPORT bool tf_1321( DEVBLK* dev ); // S/370 start I/O conversion success
HUT_DLL_IMPORT bool tf_1329( DEVBLK* dev ); // Halt I/O
HUT_DLL_IMPORT bool tf_1330( DEVBLK* dev ); // HIO modification
HUT_DLL_IMPORT bool tf_1331( DEVBLK* dev ); // Clear subchannel
HUT_DLL_IMPORT bool tf_1332( DEVBLK* dev ); // Halt subchannel
HUT_DLL_IMPORT bool tf_1333( DEVBLK* dev, // Resume subchannel
BYTE cc );
HUT_DLL_IMPORT bool tf_1334( DEVBLK* dev, // ORB
ORB* orb );
HUT_DLL_IMPORT bool tf_1336( DEVBLK* dev ); // Startio cc=2
// Instruction tracing ------------------------------------------------------------------------
HUT_DLL_IMPORT bool tf_2266( REGS* regs ); // Vector Registers
HUT_DLL_IMPORT bool tf_2269( REGS* regs, // General Registers
BYTE* inst );
HUT_DLL_IMPORT bool tf_2270( REGS* regs ); // Floating Point Registers
HUT_DLL_IMPORT bool tf_2271( REGS* regs ); // Control Registers
HUT_DLL_IMPORT bool tf_2272( REGS* regs ); // Access Registers
HUT_DLL_IMPORT bool tf_2276( REGS* regs ); // Floating Point Control Register
HUT_DLL_IMPORT bool tf_2324( REGS* regs, // Primary Instruction Trace
BYTE* inst );
HUT_DLL_IMPORT bool tf_2326( REGS* regs, // Instruction Storage
TF02326* tf2326,
BYTE opcode1,
BYTE opcode2,
int b1,
int b2 );
HUT_DLL_IMPORT size_t tf_MAX_RECSIZE(); // Return maximum TraceFile record size
HUT_DLL_IMPORT void tf_close( void* notused ); // Close TraceFile
HUT_DLL_IMPORT void tf_close_locked(); // Close TraceFile
HUT_DLL_IMPORT bool tf_autostop(); // Automatically stop all tracing
HUT_DLL_IMPORT bool tf_are_swaps_needed( TFSYS* sys );
HUT_DLL_IMPORT void tf_swap_sys( TFSYS* sys );
HUT_DLL_IMPORT void tf_swap_hdr( BYTE sys_ffmt, TFHDR* hdr );
HUT_DLL_IMPORT void tf_swap_rec( TFHDR* hdr, U16 msgnum );
#endif /* __HSCUTL_H__ */