Files
2026-07-30 11:19:44 +05:30

158 lines
4.8 KiB
C

/* trcLibP.h - private trace library header file */
/*
* Copyright (c) 2004, 2007-2010, 2016 Wind River Systems, Inc.
*
* The right to copy, distribute or otherwise make use of this software
* may be licensed only pursuant to the terms of an applicable Wind River
* license agreement.
*/
/*
modification history
--------------------
01l,30sep16,rlp Added trcStackEx routine (VXW6-85718).
01k,07oct10,jmp Fixed TRC_MEM_INST_READ() macro to call
VXDBG_MEM_WIDTH_READ() without specifying a width since this
macro can be used on address which are not aligned on the
size of the specified type (CQ:WIND00234981).
01j,28apr10,pad Moved extern C statement after include statements.
01i,11feb10,rlp Added vxdbgLibP header file.
01h,07jul09,rlp Replaced VXDBG_MEM_READ macro with VXDBG_MEM_WIDTH_READ
(WIND000171075).
01h,13may09,jpb Updated for LP64 support.
01g,27aug08,jpb Renamed VSB config file.
01f,24jun08,jpb Added include path for kernel configurations options set in
vsb. Renamed _WRS_VX_SMP to _WRS_CONFIG_SMP.
01e,30apr07,jmp added TRC_MEM_INST_READ() and TRC_INST_CMP() macros.
01d,14may04,zl reordered TRC_LIB_FUNCS fields.
01c,02apr04,jmp added pc argument to TRC_LVL_ARGS_GET().
01b,19mar04,zl updated for user build.
01a,18feb04,zl created
*/
#ifndef __INCtrcLibPh
#define __INCtrcLibPh
#include <vxWorks.h>
#ifdef _WRS_KERNEL
#include <vsbConfig.h>
#include <regs.h>
#include <private/syscallLibP.h>
#include <private/vxdbgLibP.h>
#endif /* _WRS_KERNEL */
#ifdef __cplusplus
extern "C" {
#endif
/* defines */
/*
* Defines macros to read and compare the instruction at a given address.
* VXDBG_MEM_WIDTH_READ() is used to hide persistent breakpoints and/or
* dynamic printf that could be set at the address to read.
*
* NOTE: For now, VXDBG_MEM_WIDTH_READ() is only used in the kernel
* (_WRS_KERNEL).
* This means that invoking the stack trace library from user land
* can results in an incorrect stack trace if breakpoints (persistents,
* dynamic printf) are set on the code beeing traced.
* This issue could be fixed by creating a system call for vxdbgMemRead().
*/
#if (defined(_WRS_CONFIG_SMP) && defined (_WRS_KERNEL))
#define TRC_MEM_INST_READ(src,dest,type) \
VXDBG_MEM_WIDTH_READ((void *)src, \
(void *)dest,sizeof(type),0)
#else /* _WRS_CONFIG_SMP & _WRS_KERNEL */
#define TRC_MEM_INST_READ(src,dest,type) (*(type *)dest = *(type *)src)
#endif /* _WRS_CONFIG_SMP & _WRS_KERNEL */
#define TRC_INST_CMP(addr,inst,mask) ((*(addr) & (mask)) == (inst))
#ifndef _ASMLANGUAGE
/* structure passed to the arch primitives */
typedef struct trc_os_ctx
{
char * stackBase; /* stack base */
char * stackEnd; /* stack end */
STATUS (*pcValidateRtn) /* routine to validate PC */
(INSTR * pc, /* PC to validate */
struct trc_os_ctx * pCtx /* OS info structure */
);
#ifdef _WRS_KERNEL
REG_SET * pRegs; /* register set */
BOOL isSyscall; /* TRU if tracing a system call */
#endif
} TRC_OS_CTX;
/* structure passed to OS trace routine */
typedef struct trc_ctx
{
STATUS (*usrRtn)(INSTR * callAdrs, INSTR * funcAdrs, int nArgs,
_Vx_usr_arg_t * args, TASK_ID taskId, BOOL isKernelAdrs,
void * usrCtx);
TASK_ID taskId;
BOOL isKernelAdrs;
TRC_OS_CTX * pOsCtx;
void * usrCtx;
int nArgs;
_Vx_usr_arg_t * pArgs;
BOOL verbose;
} TRC_CTX;
/* primitives provided by architecture specific trace libraries */
typedef STATUS (* TRC_LVL_INFO_GET) (char * fp, INSTR * pc, TRC_OS_CTX * pCtx,
char ** pPrevFp, INSTR ** pPrevPc,
INSTR ** pFuncAddr);
typedef int (* TRC_LVL_ARGS_GET) (INSTR * pc, INSTR * funcAddr, char * fp,
_Vx_usr_arg_t pArgBuf[], int argMax,
_Vx_usr_arg_t ** ppArgs);
#ifdef _WRS_KERNEL
typedef STATUS (* TRC_TOP_INFO_GET) (TRC_OS_CTX * pCtx, char ** pFp,
char ** pPrevFp, INSTR ** pPrevPc,
INSTR ** pFuncAddr);
typedef void (* TRC_SYSCALL_CHECK) (SYSCALL_ENTRY_STATE * pScState,
TRC_OS_CTX * pCtx);
#endif
/* structure for trace library primitives */
typedef struct trc_lib_funcs
{
TRC_LVL_INFO_GET lvlInfoGet; /* routine to get frame info */
TRC_LVL_ARGS_GET lvlArgsGet; /* routine to get arguments */
#ifdef _WRS_KERNEL
TRC_TOP_INFO_GET topInfoGet; /* routine to get top frame info */
TRC_SYSCALL_CHECK syscallCheck; /* routine check if syscall */
#endif
} TRC_LIB_FUNCS;
/* private global variable declarations */
extern TRC_LIB_FUNCS trcLibFuncs;
/* private function declarations */
#ifdef _WRS_KERNEL
extern STATUS trcStackTrace (REG_SET * pRegs, TRC_CTX * pCtx);
extern void trcStackEx (REG_SET * pRegs, FUNCPTR printRtn, TASK_ID tid,
void * args);
#endif
#endif /* _ASMLANGUAGE */
#ifdef __cplusplus
}
#endif
#endif /* __INCtrcLibPh */