/* IBM_PROLOG_BEGIN_TAG                                                   */
/* This is an automatically generated prolog.                             */
/*                                                                        */
/* bos72Q src/bos/kernel/sys/trcmacros.h 1.39.1.6                         */
/*                                                                        */
/* Licensed Materials - Property of IBM                                   */
/*                                                                        */
/* COPYRIGHT International Business Machines Corp. 1988,2019              */
/* All Rights Reserved                                                    */
/*                                                                        */
/* US Government Users Restricted Rights - Use, duplication or            */
/* disclosure restricted by GSA ADP Schedule Contract with IBM Corp.      */
/*                                                                        */
/* IBM_PROLOG_END_TAG                                                     */

/* @(#)32       1.39.1.6  src/bos/kernel/sys/trcmacros.h, cmdtrace, bos72Q, q2019_13A4 2/6/19 00:42:53 */


#ifndef _H_TRCMACROS
#define _H_TRCMACROS

/*
 * COMPONENT_NAME: (SYSTRACE) system trace facility
 *
 * FUNCTIONS:  macros for trace hook calls
 *
 * ORIGINS: 27
 *
 * (C) COPYRIGHT International Business Machines Corp. 1988, 1990
 * All Rights Reserved
 * Licensed Materials - Property of IBM
 *
 * US Government Users Restricted Rights - Use, duplication or
 * disclosure restricted by GSA ADP Schedule Contract with IBM Corp.
 */
#include <sys/types.h>


#ifdef __cplusplus
extern "C" {
#endif

/* Correct usage of trace hook routines:
 *
 * Use the macros: TRCHKL0, TRCHKL0T, ..., TRCHKL5, TRCHKL5T
 *
 * You may also use TRCHK, TRCHKT, TRCHKL, TRCHKLT, TRCHKG, and TRCHKGT
 *
 * The 32-bit kernel traces either 0, 1, or 5 parameters per nongeneric hook.
 * This corresponds to 0 - TRCHK and TRCHKT, 1 - TRCHKL and TRCHKLT,
 * and 5 - TRCHKG and TRCHKGT.  The TRCHKL0 ... TRCHKL5T macros simply
 * use these macros.
 *
 * However, the 64-bit kernel traces the number of parameters specified,
 * 0 through 5.  Thus the primary set of macros are the TRCHKL0 - TRCHKL5T
 * macros.
 *
 * For generic trace use the macros: TRCGEN, TRCGENT.
 */

/*
 * 64-bit hookword definition:
 *
 * One character represents one nibble (4 bits)
 *
 * ffffllllhhhhssss
 * 
 * Where:	h is the hook id
 * 	f is a 16-bit flag field
 * 	l is the length in bytes
 * 	s is the subhook id
 * 
 * The flags are defined as
 * 	tgbuuuuuuuuuuuuu: t - time stamped,  g - generic (trcgen),
 * 	  b - 32-bit data, u - unused.
 * 
 * Note that the hook id and subhook are passed as 32 bits
 * in the loe-order portion of the first 64-bit word.
 */
/* a 64-bit hook word. */
struct hook64 {
	unsigned short flags;
	unsigned short ln;
	unsigned short hk;
	unsigned short subhk;
};
#define HKWD64_TMASK 0x8000000000000000LL
#define HKWD64_GMASK 0x4000000000000000LL
#define HKWD64_BMASK 0x2000000000000000LL
#define HKWD64_PMASK 0x1000000000000000LL
#define HKWD64_RMASK 0x0800000000000000LL
#define HKWD64_CIDMASK 0x0400000000000000LL
#define HKWD64_NRMASK 0x0007000000000000LL /* # regs */
#define HKWD64_RSHIFT 48
#define HKWD64_NREGS(hkwd) (((hkwd) & HKWD64_RMASK)?\
	((((hkwd)&HKWD64_NRMASK) >> HKWD64_RSHIFT) + 1): 0)
#define HKWD64_FLAGMASK 0xffff000000000000LL
#define HKWD64_VALIDFLAGMASK 0xfc07000000000000LL
/* Valid flags to pass to trchook64 */
#define HKWD64_VALIDINFLAGMASK 0xf400000000000000LL
#define HKWD64_LENMASK 0x0000ffff00000000LL
#define ISTIMESTAMPED64(hkwd) ((hkwd) & HKWD64_TMASK)
#define HKWD64_NONGEN_MAXLEN 5*8
#define HKWD64_HOOKMASK   0x00000000ffff0000LL
#define HKWD64_SUBHKMASK 0x000000000000ffffLL
#define HKWD64_HOOKSMASK 0x00000000ffffffffLL
#define HKWD64_HOOKSMASK12 0x00000000fff0ffffLL
#define HKWD64_TO_HOOKID(h) ((h) & HKWD64_HOOKMASK)
#define HKWD64_TO_HKID(h) (((h >> 16) & 0xf) ? ((h & HKWD64_HOOKMASK) >> 16) :\
					       ((h & HKWD64_HOOKMASK) >> 20))
#define HKWD64_TO_HKID16(h) ((h & HKWD64_HOOKMASK) >> 16)
#define HKWD64_TO_LEN(h) (((h) & HKWD64_LENMASK) >> 32)
/* Handle hook data length from a 32-bit app in a 64-bit trace. */
#define HKWD64_LENROUND(l) (((l)+4)&0xfff8)
#define HKWD64_TO_SUBHOOK(h) (((h) & HKWD64_SUBHKMASK))
#define HKWD64_VALIDHOOKMASK \
	(HKWD64_VALIDFLAGMASK | HKWD64_LENMASK | HKWD64_HOOKSMASK)
#define HKWD64_VALIDHOOKMASK12 \
	(HKWD64_VALIDFLAGMASK | HKWD64_LENMASK | HKWD64_HOOKSMASK12)
#define HKWD64_VALIDINHOOKMASK \
	(HKWD64_VALIDINFLAGMASK | HKWD64_LENMASK | HKWD64_HOOKSMASK)
#define HKWD64_VALIDINHOOKMASK12 \
	(HKWD64_VALIDINFLAGMASK | HKWD64_LENMASK | HKWD64_HOOKSMASK12)
/* build a 64-bit hook. */
#define HKWD64_EXPAND(h,len) (((u_longlong_t)(h) | \
	  ((u_longlong_t)(len) << 32)) & \
	  HKWD64_VALIDINHOOKMASK)
/* Same as above except the hookid is always 12 bits. */
#define HKWD64_EXPAND12(h,len) (((u_longlong_t)(h) | \
	  ((u_longlong_t)(len) << 32)) & \
	  HKWD64_VALIDINHOOKMASK12)
#define HKID64_EXPAND(hkid) ((hkid<0x1000) ? (hkid<<4) : (hkid))

/*
 * 32-bit hookword definition:
 *
 *  0        4        8       12       16       20       24       28       32
 * +--------+--------+--------+--------+--------+--------+--------+--------+
 * |          Hook ID         |  type  |             data field            |
 * +--------+--------+--------+--------+--------+--------+--------+--------+
 *
 * The Hook ID field is the three digit hex representation of the hook id.
 *
 * The type field is further defined as:
 *   high-order bit:  0 = no time stamp, 1 = time stamp
 *   low-order bits:  indicate the number of words to trace
 *		      (hookword and data words but not timestamp)
 *
 * The data field definition depends on the type of trace hook:
 *   for generic trace it is reserved and indicates the length of the
 *      variable buffer
 *   for all others it is available for 2 bytes of additional trace data
 */
/* a 32-bit hook word. */
struct hook32 {
	unsigned hk:12;
	unsigned tflag:1;
	unsigned ln:3;
	unsigned short subhk;
};
#define HKID_MASK   0xFFF00000
#define HKTY_XMASK  0xFFF0FFFF
#define HKTY_TMASK  0x00080000

#ifndef __64BIT__

/* These #define's should only be used by 32 bit applications.
 * They are unnecessary in 64 bit applications/kernel/kernexts
 */

#define HKTY_Vr     0x0
#define HKTY_Sr     0x1
#define HKTY_Lr     0x2
#define HKTY_Gr     0x6
#define HKTY_VTr    0x8
#define HKTY_STr    0x9
#define HKTY_LTr    0xA
#define HKTY_GTr    0xE

#define HKTY_V      (HKTY_Vr  << 16)
#define HKTY_S      (HKTY_Sr  << 16)
#define HKTY_L      (HKTY_Lr  << 16)
#define HKTY_G      (HKTY_Gr  << 16)
#define HKTY_VT     (HKTY_VTr << 16)
#define HKTY_ST     (HKTY_STr << 16)
#define HKTY_LT     (HKTY_LTr << 16)
#define HKTY_GT     (HKTY_GTr << 16)
#define HKTY_LAST   (HKTY_GTr << 16)

#else /* __64BIT__ */

/* These #define's are unnecessary in 64 bit applications/kernel/kernexts
 */

#define HKTY_Vr     0x0
#define HKTY_Sr     0x0
#define HKTY_Lr     0x0
#define HKTY_Gr     0x0
#define HKTY_VTr    0x0
#define HKTY_STr    0x0
#define HKTY_LTr    0x0
#define HKTY_GTr    0x0

#define HKTY_V      0x0
#define HKTY_S      0x0
#define HKTY_L      0x0
#define HKTY_G      0x0
#define HKTY_VT     0x0
#define HKTY_ST     0x0
#define HKTY_LT     0x0
#define HKTY_GT     0x0
#define HKTY_LAST   0x0

/* These #define's should only be used by 64 bit applications that 
 * examine 32 bit traces
 */
#define TRC32_HKTY_Vr     0x0
#define TRC32_HKTY_Sr     0x1
#define TRC32_HKTY_Lr     0x2
#define TRC32_HKTY_Gr     0x6
#define TRC32_HKTY_VTr    0x8
#define TRC32_HKTY_STr    0x9
#define TRC32_HKTY_LTr    0xA
#define TRC32_HKTY_GTr    0xE

#define TRC32_HKTY_V      (TRC32_HKTY_Vr  << 16)
#define TRC32_HKTY_S      (TRC32_HKTY_Sr  << 16)
#define TRC32_HKTY_L      (TRC32_HKTY_Lr  << 16)
#define TRC32_HKTY_G      (TRC32_HKTY_Gr  << 16)
#define TRC32_HKTY_VT     (TRC32_HKTY_VTr << 16)
#define TRC32_HKTY_ST     (TRC32_HKTY_STr << 16)
#define TRC32_HKTY_LT     (TRC32_HKTY_LTr << 16)
#define TRC32_HKTY_GT     (TRC32_HKTY_GTr << 16)
#define TRC32_HKTY_LAST   (TRC32_HKTY_GTr << 16)

#endif /* __64BIT__ */

#define HKWDTOMAJOR(hw)   (((hw) >> 24) & 0xFF)
#define HKWDTOHKID(hw)    (((hw) >> 20) & 0xFFF)
#define HKWDTOTYPE(hw)    (((hw) >> 16) & 0xF)
#define HKWDTOLEN(hw)     (((hw) >> 16) & 0x7)
#define HKWDTOWLEN(hw)    ((((hw) & 0xFFFF) + 3 ) / 4)
#define HKWDTOBLEN(hw)    ((hw) & 0xFFFF)
#define ISTIMESTAMPED(hw) ((hw) & 0x00080000)
#define __TRCHI64(d) ((long long)d >> 32)
#define __TRCLOW64(d) (unsigned int)((long long)d & 0x00000000ffffffffLL)
#define _TRCTMASK(hw)	((hw) & HKTY_XMASK)

/* Trace channels.
 * Channel 0 is the kernel trace channel and is used for all non-generic
 * trace hooks.
 * Calls to generic trace routines use channels 1-7 or, to include data
 * in the kernel trace, channel 0.
 * 912840: Change the channel mask accordingly if you ever increase number of
 * channels
 */
#ifndef TRC_NCHANNELS
#define TRC_NCHANNELS 8
#endif
extern char Trconflag[TRC_NCHANNELS];
#define TRC_ISON(chan) (Trconflag[(chan)])

/* 912840: Enhancements to trcstop API and discard buffers */
#define TRCSTOP_CHANNEL_MASK		0x00007 /* 0-7 */
#define TRCSTOP_SERIAL			0x40000000 /* Serialize I/O */
#define TRCSTOP_DISCARDBUFS		0x20000000 /* Discard any pending I/O */

#ifdef _KERNEL
#define __TRCHOOK trchook64

#if defined(__64BIT_KERNEL) || defined(__FULL_PROTO)
/* This is the common trace hook routine.
 * Up to 5 data words, in addition to the hookword, can be recorded.
 */
extern void __TRCHOOK(ulong_t hkwd, ...);

#pragma isolated_call(trchook64)

/* These are the generic trace hook kernel services.  */
extern void trcgenk(int chan, ulong_t hkwd, ulong_t d1, uint len, void *buf);
extern void trcgenkt(int chan, ulong_t hkwd, ulong_t d1, uint len, void *buf);

#else /* ! (__FULL_PROTO || __64BIT_KERNEL)*/
/* This is the common trace hook routine.  */
extern void __TRCHOOK();

extern void trcgenk();
extern void trcgenkt();
#endif /* (__FULL_PROTO || __64BIT_KERNEL) */

/* Kernel trace hooks use the common trace hook routine, trchook.
 * The call is avoided if trace is off for channel 0.
 */
#ifndef __MTRACE
#define TRCHKL0(hw) (TRC_ISON(0) ? \
	(void) __TRCHOOK(HKWD64_EXPAND(hw,0)) : \
	(void) 0)
#define TRCHKL0T(hw) (TRC_ISON(0) ? \
	(void) __TRCHOOK(HKWD64_EXPAND(hw,0) | HKWD64_TMASK) : \
	(void) 0)
#define TRCHKL1(hw,a) (TRC_ISON(0) ? \
	(void) __TRCHOOK(HKWD64_EXPAND(hw,8), (ulong_t)(a)) : \
	(void) 0)
#define TRCHKL1T(hw,a)	(TRC_ISON(0) ? \
	(void) __TRCHOOK(HKWD64_EXPAND(hw,8) | HKWD64_TMASK,\
	  (ulong_t)(a)) : \
	(void) 0)
#define TRCHKL2(hw,a,b) (TRC_ISON(0) ? \
	(void) __TRCHOOK(HKWD64_EXPAND(hw,16), \
	  (ulong_t)(a), (ulong_t)(b)) : \
	(void) 0)
#define TRCHKL2T(hw,a,b) (TRC_ISON(0) ? \
	(void) __TRCHOOK(HKWD64_EXPAND(hw,16) | HKWD64_TMASK, \
	  (ulong_t)(a), (ulong_t)(b)) : \
	(void) 0)
#define TRCHKL3(hw,a,b,c) (TRC_ISON(0) ? \
	(void) __TRCHOOK(HKWD64_EXPAND(hw,24), \
	  (ulong_t)(a), (ulong_t)(b), (ulong_t)(c)) : \
	(void) 0)
#define TRCHKL3T(hw,a,b,c) (TRC_ISON(0) ? \
	(void) __TRCHOOK(HKWD64_EXPAND(hw,24) | HKWD64_TMASK,\
	  (ulong_t)(a), (ulong_t)(b), (ulong_t)(c)) : \
	(void) 0)
#define TRCHKL4(hw,a,b,c,d) (TRC_ISON(0) ? \
	(void) __TRCHOOK(HKWD64_EXPAND(hw,32),\
	  (ulong_t)(a), (ulong_t)(b), (ulong_t)(c), (ulong_t)(d)) : \
	(void) 0)
#define TRCHKL4T(hw,a,b,c,d) (TRC_ISON(0) ? \
	(void) __TRCHOOK(HKWD64_EXPAND(hw,32) | HKWD64_TMASK,\
	  (ulong_t)(a), (ulong_t)(b), (ulong_t)(c), (ulong_t)(d)) : \
	(void) 0)
#define TRCHKL5(hw,a,b,c,d,e) (TRC_ISON(0) ? \
	(void) __TRCHOOK(HKWD64_EXPAND(hw,40),\
	  (ulong_t)(a), (ulong_t)(b), (ulong_t)(c), (ulong_t)(d),\
	  (ulong_t)(e)) : \
	(void) 0)
#define TRCHKL5T(hw,a,b,c,d,e) (TRC_ISON(0) ? \
	(void) __TRCHOOK(HKWD64_EXPAND(hw,40) | HKWD64_TMASK,\
	  (ulong_t)(a), (ulong_t)(b), (ulong_t)(c), (ulong_t)(d),\
	  (ulong_t)(e)) :\
	(void) 0)
#endif /* __MTRACE */

/* Kernel generic trace hooks use the kernel services, trcgenk and trcgenkt.
 * The call is avoided if trace is off for the specified channel.
 */
#define TRCGEN(ch,hw,d1,len,buf) (TRC_ISON(ch) ? \
	(void) trcgenk((int)(ch), (hw), \
	  (ulong_t)(d1), (uint)(len), (void *)(buf)) : \
	(void) 0)

#define TRCGENT(ch,hw,d1,len,buf) (TRC_ISON(ch) ? \
	(void) trcgenkt((int)(ch), (hw), \
	  (ulong_t)(d1), (uint)(len), (void *)(buf)) : \
	(void) 0)

/* Redefine uses of the old macros to call the correct kernel service.  */
#define TRCGENK(a,b,c,d,e) TRCGEN(a,b,c,d,e)
#define TRCGENKT(a,b,c,d,e) TRCGENT(a,b,c,d,e)

/*
 * Easy to use macros for hooks in system calls.
 * TRCHKT_SYSC(UNAMEX)
 *   expands to:
 * trchook(HKWD_SYSC_UNAMEX | HKTY_T)
 */
#define TRCHKT_SYSC(x) TRCHKT_NOMTRC(HKWD_SYSC_##x)
#define TRCHKLT_SYSC(x,a) TRCHKLT_NOMTRC(HKWD_SYSC_##x,a)
#define TRCHKGT_SYSC(x,a,b,c,d,e) TRCHKGT_NOMTRC(HKWD_SYSC_##x,a,b,c,d,e)


/* Lightweight Memory Trace macros and definitions */
#if defined(__64BIT_KERNEL) || defined(__FULL_PROTO)
extern void mtrchook0_pre(ulong_t hkwd, int dest);
extern void mtrchook0w_pre(ulong_t hkwd, int dest);
extern void mtrchook0(ulong_t hkwd, int dest);
extern void mtrchook0w(ulong_t hkwd, int dest);
extern void mtrchook1_pre(ulong_t hkwd, ulong_t d1, int dest);
extern void mtrchook1w_pre(ulong_t hkwd, ulong_t d1, int dest);
extern void mtrchook1(ulong_t hkwd, ulong_t d1, int dest);
extern void mtrchook1w(ulong_t hkwd, ulong_t d1, int dest);
extern void mtrchook2_pre(ulong_t hkwd, ulong_t d1, ulong_t d2, int dest);
extern void mtrchook2w_pre(ulong_t hkwd, ulong_t d1, ulong_t d2, int dest);
extern void mtrchook2(ulong_t hkwd, ulong_t d1, ulong_t d2, int dest);
extern void mtrchook2w(ulong_t hkwd, ulong_t d1, ulong_t d2, int dest);
extern void mtrchook3_pre(ulong_t hkwd, ulong_t d1, ulong_t d2, ulong_t d3,
		     int dest);
extern void mtrchook3(ulong_t hkwd, ulong_t d1, ulong_t d2, ulong_t d3,
		     int dest);
extern void mtrchook3w_pre(ulong_t hkwd, ulong_t d1, ulong_t d2, ulong_t d3,
		     int dest);
extern void mtrchook3w(ulong_t hkwd, ulong_t d1, ulong_t d2, ulong_t d3,
		     int dest);
extern void mtrchook4_pre(ulong_t hkwd, ulong_t d1, ulong_t d2, ulong_t d3,
		     ulong_t d4, int dest);
extern void mtrchook4(ulong_t hkwd, ulong_t d1, ulong_t d2, ulong_t d3,
		     ulong_t d4, int dest);
extern void mtrchook4w_pre(ulong_t hkwd, ulong_t d1, ulong_t d2, ulong_t d3,
		     ulong_t d4, int dest);
extern void mtrchook4w(ulong_t hkwd, ulong_t d1, ulong_t d2, ulong_t d3,
		     ulong_t d4, int dest);
extern void mtrchook5_pre(ulong_t hkwd, ulong_t d1, ulong_t d2, ulong_t d3,
		     ulong_t d4, ulong_t d5, int dest);
extern void mtrchook5(ulong_t hkwd, ulong_t d1, ulong_t d2, ulong_t d3,
		     ulong_t d4, ulong_t d5, int dest);
extern void mtrchook5w_pre(ulong_t hkwd, ulong_t d1, ulong_t d2, ulong_t d3,
		     ulong_t d4, ulong_t d5, int dest);
extern void mtrchook5w(ulong_t hkwd, ulong_t d1, ulong_t d2, ulong_t d3,
		     ulong_t d4, ulong_t d5, int dest);
#else /* ! (__FULL_PROTO || __64BIT_KERNEL)*/
extern void mtrchook0_pre();
extern void mtrchook0();
extern void mtrchook1_pre();
extern void mtrchook1();
extern void mtrchook2_pre();
extern void mtrchook2();
extern void mtrchook3_pre();
extern void mtrchook3();
extern void mtrchook4_pre();
extern void mtrchook4();
extern void mtrchook5_pre();
extern void mtrchook5();
#endif /* (__FULL_PROTO || __64BIT_KERNEL) */

#pragma isolated_call(mtrchook0)
#pragma isolated_call(mtrchook0_pre)
#pragma isolated_call(mtrchook1)
#pragma isolated_call(mtrchook1_pre)
#pragma isolated_call(mtrchook2)
#pragma isolated_call(mtrchook2_pre)
#pragma isolated_call(mtrchook3)
#pragma isolated_call(mtrchook3_pre)
#pragma isolated_call(mtrchook4)
#pragma isolated_call(mtrchook4_pre)
#pragma isolated_call(mtrchook5)
#pragma isolated_call(mtrchook5_pre)

/* values of dest parameter of mtrchookx routines
 * MTRC_xxx value is equal to MTR_BUF_xxx << L2_MTRCQSIZE
 * buffer type value may be OR'ed with MTRC_SYSTEM to additionally
 * trace into system trace buffers
 */
#define MTRC_COMMON  0x00   /* trace into common buffer */
#define MTRC_RARE    0x20   /* trace into rare   buffer */
#define MTRC_SYSTEM  0x1000 /* additionally trace into system trace buffers */


/* macros that should be used by base kernel and kernel extensions
 * TRCHKxx        macros which record events in both system trace (if active) 
 *                and memory trace common buffers
 * TRCHKxx_RARE   macros which record events in both system trace (if active)
 *                and memory trace rare buffers
 * TRCHKxx_NOMTRC macros which record events in system trace only (if active)
 * MTRCHKxx       macros which record events in memory trace common buffer only
 * MTRCHKxx_RARE  macros which record events in memory trace rare buffer only
 */
#ifdef __MTRACE
/* common trace events */
#define TRCHKL0(hw) \
        mtrchook0(HKWD64_EXPAND(hw,0), \
		  MTRC_COMMON|MTRC_SYSTEM)
#define TRCHKL1(hw,a) \
        mtrchook1(HKWD64_EXPAND(hw,8), \
		  (ulong_t)(a), \
		  MTRC_COMMON|MTRC_SYSTEM)
#define TRCHKL2(hw,a,b) \
        mtrchook2(HKWD64_EXPAND(hw,16), \
		  (ulong_t)(a),(ulong_t)(b), \
		  MTRC_COMMON|MTRC_SYSTEM)
#define TRCHKL3(hw,a,b,c) \
        mtrchook3(HKWD64_EXPAND(hw,24), \
		  (ulong_t)(a),(ulong_t)(b),(ulong_t)(c), \
		  MTRC_COMMON|MTRC_SYSTEM)
#define TRCHKL4(hw,a,b,c,d) \
	mtrchook4(HKWD64_EXPAND(hw,32), \
		  (ulong_t)(a),(ulong_t)(b),(ulong_t)(c), \
		  (ulong_t)(d), \
		  MTRC_COMMON|MTRC_SYSTEM)
#define TRCHKL5(hw,a,b,c,d,e) \
        mtrchook5(HKWD64_EXPAND(hw,40), \
		  (ulong_t)(a),(ulong_t)(b),(ulong_t)(c), \
		  (ulong_t)(d),(ulong_t)(e), \
		  MTRC_COMMON|MTRC_SYSTEM)

#define TRCHKL0T(hw) \
        mtrchook0(HKWD64_EXPAND(hw,0)|HKWD64_TMASK, \
		  MTRC_COMMON|MTRC_SYSTEM)
#define TRCHKL0TW(hw) \
        mtrchook0w(HKWD64_EXPAND(hw,0)|HKWD64_TMASK, \
		  MTRC_COMMON|MTRC_SYSTEM)
#define TRCHKL1T(hw,a) \
	mtrchook1(HKWD64_EXPAND(hw,8)|HKWD64_TMASK, \
		  (ulong_t)(a), \
		  MTRC_COMMON|MTRC_SYSTEM)
#define TRCHKL1TW(hw,a) \
	mtrchook1w(HKWD64_EXPAND(hw,8)|HKWD64_TMASK, \
		  (ulong_t)(a), \
		  MTRC_COMMON|MTRC_SYSTEM)
#define TRCHKL2T(hw,a,b) \
        mtrchook2(HKWD64_EXPAND(hw,16)|HKWD64_TMASK, \
		  (ulong_t)(a),(ulong_t)(b), \
		  MTRC_COMMON|MTRC_SYSTEM)
#define TRCHKL2TW(hw,a,b) \
        mtrchook2w(HKWD64_EXPAND(hw,16)|HKWD64_TMASK, \
		  (ulong_t)(a),(ulong_t)(b), \
		  MTRC_COMMON|MTRC_SYSTEM)
#define TRCHKL3T(hw,a,b,c) \
        mtrchook3(HKWD64_EXPAND(hw,24)|HKWD64_TMASK, \
		  (ulong_t)(a),(ulong_t)(b),(ulong_t)(c), \
		  MTRC_COMMON|MTRC_SYSTEM)
#define TRCHKL3TW(hw,a,b,c) \
        mtrchook3w(HKWD64_EXPAND(hw,24)|HKWD64_TMASK, \
		  (ulong_t)(a),(ulong_t)(b),(ulong_t)(c), \
		  MTRC_COMMON|MTRC_SYSTEM)
#define TRCHKL4T(hw,a,b,c,d) \
        mtrchook4(HKWD64_EXPAND(hw,32)|HKWD64_TMASK, \
		  (ulong_t)(a),(ulong_t)(b),(ulong_t)(c), \
		  (ulong_t)(d), \
		  MTRC_COMMON|MTRC_SYSTEM)
#define TRCHKL4TW(hw,a,b,c,d) \
        mtrchook4w(HKWD64_EXPAND(hw,32)|HKWD64_TMASK, \
		  (ulong_t)(a),(ulong_t)(b),(ulong_t)(c), \
		  (ulong_t)(d), \
		  MTRC_COMMON|MTRC_SYSTEM)
#define TRCHKL5T(hw,a,b,c,d,e) \
        mtrchook5(HKWD64_EXPAND(hw,40)|HKWD64_TMASK, \
		  (ulong_t)(a),(ulong_t)(b),(ulong_t)(c), \
		  (ulong_t)(d),(ulong_t)(e), \
		  MTRC_COMMON|MTRC_SYSTEM)
#define TRCHKL5TW(hw,a,b,c,d,e) \
        mtrchook5w(HKWD64_EXPAND(hw,40)|HKWD64_TMASK, \
		  (ulong_t)(a),(ulong_t)(b),(ulong_t)(c), \
		  (ulong_t)(d),(ulong_t)(e), \
		  MTRC_COMMON|MTRC_SYSTEM)

/* rare trace events */
#define TRCHKL0_RARE(hw) \
        mtrchook0_pre(HKWD64_EXPAND(hw,0), \
		      MTRC_RARE|MTRC_SYSTEM)
#define TRCHKL1_RARE(hw,a) \
        mtrchook1_pre(HKWD64_EXPAND(hw,8), \
		      (ulong_t)(a), \
		      MTRC_RARE|MTRC_SYSTEM)
#define TRCHKL2_RARE(hw,a,b) \
        mtrchook2_pre(HKWD64_EXPAND(hw,16), \
		      (ulong_t)(a),(ulong_t)(b),  \
		      MTRC_RARE|MTRC_SYSTEM)
#define TRCHKL3_RARE(hw,a,b,c) \
        mtrchook3_pre(HKWD64_EXPAND(hw,24), \
		      (ulong_t)(a),(ulong_t)(b),(ulong_t)(c), \
		      MTRC_RARE|MTRC_SYSTEM)
#define TRCHKL4_RARE(hw,a,b,c,d) \
        mtrchook4_pre(HKWD64_EXPAND(hw,32), \
		      (ulong_t)(a),(ulong_t)(b),(ulong_t)(c), \
		      (ulong_t)(d), \
		      MTRC_RARE|MTRC_SYSTEM)
#define TRCHKL5_RARE(hw,a,b,c,d,e) \
        mtrchook5_pre(HKWD64_EXPAND(hw,40), \
		      (ulong_t)(a),(ulong_t)(b),(ulong_t)(c), \
		      (ulong_t)(d),(ulong_t)(e), \
		      MTRC_RARE|MTRC_SYSTEM)

#define TRCHKL0T_RARE(hw) \
        mtrchook0_pre(HKWD64_EXPAND(hw,0)|HKWD64_TMASK, \
		      MTRC_RARE|MTRC_SYSTEM)
#define TRCHKL1T_RARE(hw,a) \
        mtrchook1_pre(HKWD64_EXPAND(hw,8)|HKWD64_TMASK, \
		      (ulong_t)(a), \
		      MTRC_RARE|MTRC_SYSTEM)
#define TRCHKL2T_RARE(hw,a,b) \
        mtrchook2_pre(HKWD64_EXPAND(hw,16)|HKWD64_TMASK, \
		      (ulong_t)(a),(ulong_t)(b), \
		      MTRC_RARE|MTRC_SYSTEM)
#define TRCHKL3T_RARE(hw,a,b,c) \
        mtrchook3_pre(HKWD64_EXPAND(hw,24)|HKWD64_TMASK, \
		      (ulong_t)(a),(ulong_t)(b),(ulong_t)(c), \
		      MTRC_RARE|MTRC_SYSTEM)
#define TRCHKL4T_RARE(hw,a,b,c,d) \
        mtrchook4_pre(HKWD64_EXPAND(hw,32)|HKWD64_TMASK, \
		      (ulong_t)(a),(ulong_t)(b),(ulong_t)(c), \
		      (ulong_t)(d), \
		      MTRC_RARE|MTRC_SYSTEM)
#define TRCHKL5T_RARE(hw,a,b,c,d,e) \
        mtrchook5_pre(HKWD64_EXPAND(hw,40)|HKWD64_TMASK, \
		      (ulong_t)(a),(ulong_t)(b),(ulong_t)(c), \
		      (ulong_t)(d),(ulong_t)(e), \
		      MTRC_RARE|MTRC_SYSTEM)


/* system trace only events */
#define TRCHKL0_NOMTRC(hw) (TRC_ISON(0) ? \
	(void) __TRCHOOK(HKWD64_EXPAND(hw,0)) : \
	(void) 0)
#define TRCHKL0T_NOMTRC(hw) (TRC_ISON(0) ? \
	(void) __TRCHOOK(HKWD64_EXPAND(hw,0) | HKWD64_TMASK) : \
	(void) 0)
#define TRCHKL1_NOMTRC(hw,a) (TRC_ISON(0) ? \
	(void) __TRCHOOK(HKWD64_EXPAND(hw,8), (ulong_t)(a)) : \
	(void) 0)
#define TRCHKL1T_NOMTRC(hw,a)	(TRC_ISON(0) ? \
	(void) __TRCHOOK(HKWD64_EXPAND(hw,8) | HKWD64_TMASK,\
	                 (ulong_t)(a)) : \
	(void) 0)
#define TRCHKL2_NOMTRC(hw,a,b) (TRC_ISON(0) ? \
	(void) __TRCHOOK(HKWD64_EXPAND(hw,16), \
	                 (ulong_t)(a), (ulong_t)(b)) : \
	(void) 0)
#define TRCHKL2T_NOMTRC(hw,a,b) (TRC_ISON(0) ? \
	(void) __TRCHOOK(HKWD64_EXPAND(hw,16) | HKWD64_TMASK, \
	                 (ulong_t)(a), (ulong_t)(b)) : \
	(void) 0)
#define TRCHKL3_NOMTRC(hw,a,b,c) (TRC_ISON(0) ? \
	(void) __TRCHOOK(HKWD64_EXPAND(hw,24), \
	                 (ulong_t)(a), (ulong_t)(b), (ulong_t)(c)) : \
	(void) 0)
#define TRCHKL3T_NOMTRC(hw,a,b,c) (TRC_ISON(0) ? \
	(void) __TRCHOOK(HKWD64_EXPAND(hw,24) | HKWD64_TMASK,\
	                 (ulong_t)(a), (ulong_t)(b), (ulong_t)(c)) : \
	(void) 0)
#define TRCHKL4_NOMTRC(hw,a,b,c,d) (TRC_ISON(0) ? \
	(void) __TRCHOOK(HKWD64_EXPAND(hw,32),\
	                 (ulong_t)(a), (ulong_t)(b), (ulong_t)(c), \
                         (ulong_t)(d)) : \
	(void) 0)
#define TRCHKL4T_NOMTRC(hw,a,b,c,d) (TRC_ISON(0) ? \
	(void) __TRCHOOK(HKWD64_EXPAND(hw,32) | HKWD64_TMASK,\
	                 (ulong_t)(a), (ulong_t)(b), (ulong_t)(c), \
                         (ulong_t)(d)) : \
	(void) 0)
#define TRCHKL5_NOMTRC(hw,a,b,c,d,e) (TRC_ISON(0) ? \
	(void) __TRCHOOK(HKWD64_EXPAND(hw,40),\
	                 (ulong_t)(a), (ulong_t)(b), (ulong_t)(c), \
                         (ulong_t)(d), (ulong_t)(e)) : \
	(void) 0)
#define TRCHKL5T_NOMTRC(hw,a,b,c,d,e) (TRC_ISON(0) ? \
	(void) __TRCHOOK(HKWD64_EXPAND(hw,40) | HKWD64_TMASK,\
	                 (ulong_t)(a), (ulong_t)(b), (ulong_t)(c), \
                         (ulong_t)(d),(ulong_t)(e)) :\
	(void) 0)

/* common memory trace only events */
#define MTRCHKL0T(hw) \
        mtrchook0(HKWD64_EXPAND(hw,0)|HKWD64_TMASK, \
		  MTRC_COMMON)
#define MTRCHKL1T(hw,a) \
	mtrchook1(HKWD64_EXPAND(hw,8)|HKWD64_TMASK, \
		  (ulong_t)(a), \
		  MTRC_COMMON)
#define MTRCHKL2T(hw,a,b) \
        mtrchook2(HKWD64_EXPAND(hw,16)|HKWD64_TMASK, \
		  (ulong_t)(a),(ulong_t)(b), \
		  MTRC_COMMON)
#define MTRCHKL3T(hw,a,b,c) \
        mtrchook3(HKWD64_EXPAND(hw,24)|HKWD64_TMASK, \
		  (ulong_t)(a),(ulong_t)(b),(ulong_t)(c), \
		  MTRC_COMMON)
#define MTRCHKL4T(hw,a,b,c,d) \
        mtrchook4(HKWD64_EXPAND(hw,32)|HKWD64_TMASK, \
		  (ulong_t)(a),(ulong_t)(b),(ulong_t)(c), \
		  (ulong_t)(d), \
		  MTRC_COMMON)
#define MTRCHKL5T(hw,a,b,c,d,e) \
        mtrchook5(HKWD64_EXPAND(hw,40)|HKWD64_TMASK, \
		  (ulong_t)(a),(ulong_t)(b),(ulong_t)(c), \
		  (ulong_t)(d),(ulong_t)(e), \
		  MTRC_COMMON)

/* rare memory trace only events */
#define MTRCHKL0T_RARE(hw) \
        mtrchook0_pre(HKWD64_EXPAND(hw,0)|HKWD64_TMASK, \
		  MTRC_RARE)
#define MTRCHKL1T_RARE(hw,a) \
	mtrchook1_pre(HKWD64_EXPAND(hw,8)|HKWD64_TMASK, \
		  (ulong_t)(a), \
		  MTRC_RARE)
#define MTRCHKL2T_RARE(hw,a,b) \
        mtrchook2_pre(HKWD64_EXPAND(hw,16)|HKWD64_TMASK, \
		  (ulong_t)(a),(ulong_t)(b), \
		  MTRC_RARE)
#define MTRCHKL3T_RARE(hw,a,b,c) \
        mtrchook3_pre(HKWD64_EXPAND(hw,24)|HKWD64_TMASK, \
		  (ulong_t)(a),(ulong_t)(b),(ulong_t)(c), \
		  MTRC_RARE)
#define MTRCHKL4T_RARE(hw,a,b,c,d) \
        mtrchook4_pre(HKWD64_EXPAND(hw,32)|HKWD64_TMASK, \
		  (ulong_t)(a),(ulong_t)(b),(ulong_t)(c), \
		  (ulong_t)(d), \
		  MTRC_RARE)
#define MTRCHKL5T_RARE(hw,a,b,c,d,e) \
        mtrchook5_pre(HKWD64_EXPAND(hw,40)|HKWD64_TMASK, \
		  (ulong_t)(a),(ulong_t)(b),(ulong_t)(c), \
		  (ulong_t)(d),(ulong_t)(e), \
		  MTRC_RARE)

#else  /* __MTRACE */
/* Define memory trace related macros to their non-LMT equivalent */

#define TRCHKL0_RARE(hw) TRCHKL0(hw)
#define TRCHKL1_RARE(hw,a) TRCHKL1(hw,a)
#define TRCHKL2_RARE(hw,a,b) TRCHKL2(hw,a,b)
#define TRCHKL3_RARE(hw,a,b,c) TRCHKL3(hw,a,b,c)
#define TRCHKL4_RARE(hw,a,b,c,d) TRCHKL4(hw,a,b,c,d)
#define TRCHKL5_RARE(hw,a,b,c,d,e) TRCHKL5(hw,a,b,c,d,e)

#define TRCHKL0T_RARE(hw) TRCHKL0T(hw)
#define TRCHKL1T_RARE(hw,a) TRCHKL1T(hw,a)
#define TRCHKL2T_RARE(hw,a,b) TRCHKL2T(hw,a,b)
#define TRCHKL3T_RARE(hw,a,b,c) TRCHKL3T(hw,a,b,c)
#define TRCHKL4T_RARE(hw,a,b,c,d) TRCHKL4T(hw,a,b,c,d)
#define TRCHKL5T_RARE(hw,a,b,c,d,e) TRCHKL5T(hw,a,b,c,d,e)

#define TRCHKL0_NOMTRC(hw) TRCHKL0(hw)
#define TRCHKL1_NOMTRC(hw,a) TRCHKL1(hw,a)
#define TRCHKL2_NOMTRC(hw,a,b) TRCHKL2(hw,a,b)
#define TRCHKL3_NOMTRC(hw,a,b,c) TRCHKL3(hw,a,b,c)
#define TRCHKL4_NOMTRC(hw,a,b,c,d) TRCHKL4(hw,a,b,c,d)
#define TRCHKL5_NOMTRC(hw,a,b,c,d,e) TRCHKL5(hw,a,b,c,d,e)

#define TRCHKL0T_NOMTRC(hw) TRCHKL0T(hw)
#define TRCHKL1T_NOMTRC(hw,a) TRCHKL1T(hw,a)
#define TRCHKL2T_NOMTRC(hw,a,b) TRCHKL2T(hw,a,b)
#define TRCHKL3T_NOMTRC(hw,a,b,c) TRCHKL3T(hw,a,b,c)
#define TRCHKL4T_NOMTRC(hw,a,b,c,d) TRCHKL4T(hw,a,b,c,d)
#define TRCHKL5T_NOMTRC(hw,a,b,c,d,e) TRCHKL5T(hw,a,b,c,d,e)

#define MTRCHKL0T(hw)
#define MTRCHKL1T(hw,a)
#define MTRCHKL2T(hw,a,b)
#define MTRCHKL3T(hw,a,b,c)
#define MTRCHKL4T(hw,a,b,c,d)
#define MTRCHKL5T(hw,a,b,c,d,e)

#define MTRCHKL0T_RARE(hw)
#define MTRCHKL1T_RARE(hw,a)
#define MTRCHKL2T_RARE(hw,a,b)
#define MTRCHKL3T_RARE(hw,a,b,c)
#define MTRCHKL4T_RARE(hw,a,b,c,d)
#define MTRCHKL5T_RARE(hw,a,b,c,d,e)

#endif /* __MTRACE */

/* Define 32b kernel macros equivalent to 64b kernel macros and vice-versa */

#define TRCHK_RARE(hw) TRCHKL0_RARE(hw)
#define TRCHKL_RARE(hw,a) TRCHKL1_RARE(hw, a)
#define TRCHKG_RARE(hw,a,b,c,d,e) TRCHKL5_RARE(hw, a, b, c, d, e)

#define TRCHKT_RARE(hw) TRCHKL0T_RARE(hw)
#define TRCHKLT_RARE(hw,a) TRCHKL1T_RARE(hw, a)
#define TRCHKGT_RARE(hw,a,b,c,d,e) TRCHKL5T_RARE(hw, a, b, c, d, e)

#define TRCHK_NOMTRC(hw) TRCHKL0_NOMTRC(hw)
#define TRCHKL_NOMTRC(hw,a) TRCHKL1_NOMTRC(hw, a)
#define TRCHKG_NOMTRC(hw,a,b,c,d,e) TRCHKL5_NOMTRC(hw, a, b, c, d, e)

#define TRCHKT_NOMTRC(hw) TRCHKL0T_NOMTRC(hw)
#define TRCHKLT_NOMTRC(hw,a) TRCHKL1T_NOMTRC(hw, a)
#define TRCHKGT_NOMTRC(hw,a,b,c,d,e) TRCHKL5T_NOMTRC(hw, a, b, c, d, e)

#define MTRCHKT(hw) MTRCHKL0T(hw)
#define MTRCHKLT(hw,a) MTRCHKL1T(hw, a)
#define MTRCHKGT(hw,a,b,c,d,e) MTRCHKL5T(hw, a, b, c, d, e)

#define MTRCHKT_RARE(hw) MTRCHKL0T_RARE(hw)
#define MTRCHKLT_RARE(hw,a) MTRCHKL1T_RARE(hw, a)
#define MTRCHKGT_RARE(hw,a,b,c,d,e) MTRCHKL5T_RARE(hw, a, b, c, d, e)

#else /* !_KERNEL */

/*
 * Recompiled apps get these routines.
 * If not recompiled, apps use the old utrchook.
 */
#ifdef __64BIT__
/* Old 64-bit apps use an old-format hookword.  Newly compiled apps
 * get utrchook64.
 */
#define __UTRCHOOK utrchook64
#else /* !__64BIT__ */
/* There's no significant gain from having a utrchook32. */
#define __UTRCHOOK utrchook
#endif
#define __TRCGENCALL trcgen
#define __TRCGENTCALL trcgent

#ifdef _NO_PROTO
/* This is the main trace hook routine.  */
extern void __UTRCHOOK();
/* These are the generic trace hook system calls. */
extern void __TRCGENCALL();
extern void __TRCGENTCALL();

extern int trcon();
extern int trcoff();
extern int trcstart();
extern int trcstop();
extern int trc_ishookon();
#else /* !_NO_PROTO */
#ifdef __64BIT__
/* This is the main trace hook routine.  */
extern void __UTRCHOOK(ulong_t hkwd, ulong_t d1, ulong_t d2, ulong_t d3,
	ulong_t d4, ulong_t d5);
/* These are the generic trace hook system calls. */
extern void __TRCGENCALL(int chan, ulong_t hkwd, ulong_t dword,
	uint len, char * buf);
extern void __TRCGENTCALL(int chan, ulong_t hkwd, ulong_t dword,
	uint len, char * buf);
#else /* !__64BIT__ */
/* This is the main trace hook routine.  */
extern void __UTRCHOOK(unsigned int hkwd, unsigned int d1,
	unsigned int d2, unsigned int d3, unsigned int d4,
	unsigned int d5);
/* These are the generic trace hook system calls. */
extern void __TRCGENCALL(int chan, unsigned int hkwd, unsigned int dword,
		unsigned int len, char * buf);
extern void __TRCGENTCALL(int chan, unsigned int hkwd, unsigned int dword,
		unsigned int len, char * buf);
#endif /* __64BIT__ */

/* These have the same prototypes in either environment. */
extern int trcon(int chan);
extern int trcoff(int chan);
extern int trcstart(char * str);
extern int trcstop(int chan);
extern int trc_ishookon(int chan, ulong_t hkwd);
#endif /* _NO_PROTO */

/* User-level trace hooks use the main trace hook routine, UTRCHOOK.
 * The call is avoided if trace is off for channel 0.
 */
#ifdef __64BIT__
#ifdef _NO_PROTO
#define TRCHKL0(hw) (TRC_ISON(0) ? \
	(void) __UTRCHOOK(HKWD64_EXPAND(hw,0)) : \
	(void) 0)
#define TRCHKL0T(hw) (TRC_ISON(0) ? \
	(void) __UTRCHOOK(HKWD64_EXPAND(hw,0) | HKWD64_TMASK) : \
	(void) 0)
#define TRCHKL1(hw,a) (TRC_ISON(0) ? \
	(void) __UTRCHOOK(HKWD64_EXPAND(hw,8), a) : \
	(void) 0)
#define TRCHKL1T(hw,a)	(TRC_ISON(0) ? \
	(void) __UTRCHOOK(HKWD64_EXPAND(hw,8) | HKWD64_TMASK, a) : \
	(void) 0)
#define TRCHKL2(hw,a,b) (TRC_ISON(0) ? \
	(void) __UTRCHOOK(HKWD64_EXPAND(hw,16), a, b) : \
	(void) 0)
#define TRCHKL2T(hw,a,b) (TRC_ISON(0) ? \
	(void) __UTRCHOOK(HKWD64_EXPAND(hw,16) | HKWD64_TMASK, a, b) : \
	(void) 0)
#define TRCHKL3(hw,a,b,c) (TRC_ISON(0) ? \
	(void) __UTRCHOOK(HKWD64_EXPAND(hw,24), a, b, c) : \
	(void) 0)
#define TRCHKL3T(hw,a,b,c) (TRC_ISON(0) ? \
	(void) __UTRCHOOK(HKWD64_EXPAND(hw,24) | HKWD64_TMASK, a, b, c) : \
	(void) 0)
#define TRCHKL4(hw,a,b,c,d) (TRC_ISON(0) ? \
	(void) __UTRCHOOK(HKWD64_EXPAND(hw,32), a, b, c, d) : \
	(void) 0)
#define TRCHKL4T(hw,a,b,c,d) (TRC_ISON(0) ? \
	(void) __UTRCHOOK(HKWD64_EXPAND(hw,32) | HKWD64_TMASK, a, b, c, d) : \
	(void) 0)
#define TRCHKL5(hw,a,b,c,d,e) (TRC_ISON(0) ? \
	(void) __UTRCHOOK(HKWD64_EXPAND(hw,40), a, b, c, d, e) : \
	(void) 0)
#define TRCHKL5T(hw,a,b,c,d,e) (TRC_ISON(0) ? \
	(void) __UTRCHOOK(HKWD64_EXPAND(hw,40) | HKWD64_TMASK, a, b, c, d, e) : \
	(void) 0)
#else /* !_NO_PROTO */
#define TRCHKL0(hw) (TRC_ISON(0) ? \
	(void) __UTRCHOOK(HKWD64_EXPAND(hw,0),0,0,0,0,0) : \
	(void) 0)
#define TRCHKL0T(hw) (TRC_ISON(0) ? \
	(void) __UTRCHOOK(HKWD64_EXPAND(hw,0) | HKWD64_TMASK ,0,0,0,0,0) : \
	(void) 0)
#define TRCHKL1(hw,a) (TRC_ISON(0) ? \
	(void) __UTRCHOOK(HKWD64_EXPAND(hw,8), (ulong_t)(a), 0,0,0,0) : \
	(void) 0)
#define TRCHKL1T(hw,a)	(TRC_ISON(0) ? \
	(void) __UTRCHOOK(HKWD64_EXPAND(hw,8) | HKWD64_TMASK,\
	  (ulong_t)(a), 0,0,0,0) : \
	(void) 0)
#define TRCHKL2(hw,a,b) (TRC_ISON(0) ? \
	(void) __UTRCHOOK(HKWD64_EXPAND(hw,16), \
	  (ulong_t)(a), (ulong_t)(b), 0, 0, 0) : \
	(void) 0)
#define TRCHKL2T(hw,a,b) (TRC_ISON(0) ? \
	(void) __UTRCHOOK(HKWD64_EXPAND(hw,16) | HKWD64_TMASK, \
	  (ulong_t)(a), (ulong_t)(b), 0, 0, 0) : \
	(void) 0)
#define TRCHKL3(hw,a,b,c) (TRC_ISON(0) ? \
	(void) __UTRCHOOK(HKWD64_EXPAND(hw,24), \
	  (ulong_t)(a), (ulong_t)(b), (ulong_t)(c), 0, 0) : \
	(void) 0)
#define TRCHKL3T(hw,a,b,c) (TRC_ISON(0) ? \
	(void) __UTRCHOOK(HKWD64_EXPAND(hw,24) | HKWD64_TMASK,\
	  (ulong_t)(a), (ulong_t)(b), (ulong_t)(c), 0, 0) : \
	(void) 0)
#define TRCHKL4(hw,a,b,c,d) (TRC_ISON(0) ? \
	(void) __UTRCHOOK(HKWD64_EXPAND(hw,32),\
	  (ulong_t)(a), (ulong_t)(b), (ulong_t)(c), (ulong_t)(d), 0) : \
	(void) 0)
#define TRCHKL4T(hw,a,b,c,d) (TRC_ISON(0) ? \
	(void) __UTRCHOOK(HKWD64_EXPAND(hw,32) | HKWD64_TMASK,\
	  (ulong_t)(a), (ulong_t)(b), (ulong_t)(c), (ulong_t)(d), 0) : \
	(void) 0)
#define TRCHKL5(hw,a,b,c,d,e) (TRC_ISON(0) ? \
	(void) __UTRCHOOK(HKWD64_EXPAND(hw,40),\
	  (ulong_t)(a), (ulong_t)(b), (ulong_t)(c), (ulong_t)(d),\
	    (ulong_t)(e)) : \
	(void) 0)
#define TRCHKL5T(hw,a,b,c,d,e) (TRC_ISON(0) ? \
	(void) __UTRCHOOK(HKWD64_EXPAND(hw,40) | HKWD64_TMASK,\
	  (ulong_t)(a), (ulong_t)(b), (ulong_t)(c), (ulong_t)(d),\
	    (ulong_t)(e)) :\
	(void) 0)
#endif /* _NO_PROTO */

/* Generic trace hook macros. */
#define TRCGEN(ch,hw,d1,len,buf)   (TRC_ISON(ch) ? \
	(void) __TRCGENCALL((int)(ch), (hw | HKWD64_GMASK), \
	  (ulong_t)(d1), (uint)(len), (char *)(buf)) : \
	(void) 0)
#define TRCGENT(ch,hw,d1,len,buf)  (TRC_ISON(ch) ? \
	(void) __TRCGENTCALL((int)(ch), (hw | HKWD64_GMASK), \
	  (ulong_t)(d1), (uint)(len), (char *)(buf)) : \
	(void) 0)
#else /* !__64BIT__ */
#ifdef _NO_PROTO
#define TRCHK(hw) (TRC_ISON(0) ? \
	(void) __UTRCHOOK(_TRCTMASK(hw)|HKTY_S) : \
	(void) 0)
#define TRCHKT(hw) (TRC_ISON(0) ? \
	(void) __UTRCHOOK(_TRCTMASK(hw)|HKTY_ST) : \
	(void) 0)
#define TRCHKL(hw,a) (TRC_ISON(0) ? \
	(void) __UTRCHOOK(_TRCTMASK(hw)|HKTY_L,a) : \
	(void) 0)
#define TRCHKLT(hw,a) (TRC_ISON(0) ? \
	(void) __UTRCHOOK(_TRCTMASK(hw)|HKTY_LT,a) : \
	(void) 0)
#define TRCHKG(hw,a,b,c,d,e) (TRC_ISON(0) ? \
	(void) __UTRCHOOK(_TRCTMASK(hw)|HKTY_G,a,b,c,d,e) : \
	(void) 0)
#define TRCHKGT(hw,a,b,c,d,e) (TRC_ISON(0) ? \
	(void) __UTRCHOOK(_TRCTMASK(hw)|HKTY_GT,a,b,c,d,e) :\
	(void) 0)
#else /* !_NO_PROTO */
#define TRCHK(hw) (TRC_ISON(0) ? \
	(void) __UTRCHOOK(_TRCTMASK(hw)|HKTY_S,0,0,0,0,0) : \
	(void) 0)
#define TRCHKT(hw) (TRC_ISON(0) ? \
	(void)__UTRCHOOK(_TRCTMASK(hw)|HKTY_ST,0,0,0,0,0) : \
	(void) 0)
#define TRCHKL(hw,a) (TRC_ISON(0) ? \
	(void) __UTRCHOOK(_TRCTMASK(hw)|HKTY_L, a, 0,0,0,0) : \
	(void) 0)
#define TRCHKLT(hw,a) (TRC_ISON(0) ? \
	(void) __UTRCHOOK(_TRCTMASK(hw)|HKTY_LT,  a, 0,0,0,0) : \
	(void) 0)
#define TRCHKG(hw,a,b,c,d,e) (TRC_ISON(0) ? \
	(void) __UTRCHOOK(_TRCTMASK(hw)|HKTY_G, a, b, c, d, e) : \
	(void) 0)
#define TRCHKGT(hw,a,b,c,d,e) (TRC_ISON(0) ? \
	(void) __UTRCHOOK(_TRCTMASK(hw)|HKTY_GT, a, b, c, d, e) : \
	(void) 0)
#endif /* _NO_PROTO */

/* Generic trace hook macros. */
#define TRCGEN(ch,hw,d1,len,buf) (TRC_ISON(ch) ? \
	(void) __TRCGENCALL(ch,hw,d1,len,buf) : \
	(void) 0)
#define TRCGENT(ch,hw,d1,len,buf) (TRC_ISON(ch) ? \
	(void) __TRCGENTCALL(ch,hw,d1,len,buf) : \
	(void) 0)
#endif /* __64BIT__ */

#endif /* _KERNEL */

#ifndef __64BIT__
/*
 * These are the preferred macros.
 */
#define TRCHKL0(hw) TRCHK(hw)
#define TRCHKL1(hw,D1) TRCHKL(hw,D1)
#define TRCHKL2(hw,D1,D2) TRCHKG(hw,D1,D2,0,0,0)
#define TRCHKL3(hw,D1,D2,D3) TRCHKG(hw,D1,D2,D3,0,0)
#define TRCHKL4(hw,D1,D2,D3,D4) TRCHKG(hw,D1,D2,D3,D4,0)
#define TRCHKL5(hw,D1,D2,D3,D4,D5) TRCHKG(hw,D1,D2,D3,D4,D5)

#define TRCHKL0T(hw) TRCHKT(hw)
#define TRCHKL1T(hw,D1) TRCHKLT(hw,D1)
#define TRCHKL2T(hw,D1,D2) TRCHKGT(hw,D1,D2,0,0,0)
#define TRCHKL3T(hw,D1,D2,D3) TRCHKGT(hw,D1,D2,D3,0,0)
#define TRCHKL4T(hw,D1,D2,D3,D4) TRCHKGT(hw,D1,D2,D3,D4,0)
#define TRCHKL5T(hw,D1,D2,D3,D4,D5) TRCHKGT(hw,D1,D2,D3,D4,D5)
#else /* __64BIT__ */
#define TRCHK(hw) TRCHKL0(hw)
#define TRCHKL(hw,a) TRCHKL1(hw, a)
#define TRCHKG(hw,a,b,c,d,e) TRCHKL5(hw, a, b, c, d, e)

#define TRCHKT(hw) TRCHKL0T(hw)
#define TRCHKLT(hw,a) TRCHKL1T(hw, a)
#define TRCHKGT(hw,a,b,c,d,e) TRCHKL5T(hw, a, b, c, d, e)
#endif /* __64BIT__ */

/*
 * Old 64-bit trace macros.
 * These are maintained for compatability only.
 */
#ifdef __64BIT__
#define TRCHK64L1(hw,d1) TRCHKL1(hw, d1)
#define TRCHK64L2(hw,d1,d2) TRCHKL2(hw, d1, d2)
#define TRCHK64L1T(hw,d1) TRCHKL1T(hw, d1)
#define TRCHK64L2T(hw,d1,d2) TRCHKL2T(hw, d1, d2)
#else /* !__64BIT__ */
#define TRCHK64L1(hw,d1) TRCHKG(hw,__TRCHI64(d1),__TRCLOW64(d1),0,0,0)
#define TRCHK64L2(hw,d1,d2) TRCHKG(hw,__TRCHI64(d1),__TRCLOW64(d1),\
		__TRCHI64(d2),__TRCLOW64(d2),0)
#define TRCHK64L1T(hw,d1) TRCHKGT(hw,__TRCHI64(d1),__TRCLOW64(d1),0,0,0)
#define TRCHK64L2T(hw,d1,d2) TRCHKGT(hw,__TRCHI64(d1),__TRCLOW64(d1),\
		__TRCHI64(d2),__TRCLOW64(d2),0)
#endif /* __64BIT__ */

#ifndef __RASLIBRTN
/* Redefine calls to the old interfaces to call the correct routine.  */
#define trchk(hw) TRCHK(hw)
#define trchkt(hw) TRCHKT(hw)
#define trchkl(hw,a) TRCHKL(hw,a)
#define trchklt(hw,a) TRCHKLT(hw,a)
#define trchkg(hw,a,b,c,d,e) TRCHKG(hw,a,b,c,d,e)
#define trchkgt(hw,a,b,c,d,e) TRCHKGT(hw,a,b,c,d,e)
#endif /* __RASLIBRTN */

#ifdef __cplusplus
}
#endif

#endif /* _H_TRCMACROS */
