⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 trclib.c

📁 vxworks的源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
	    {	    if (insn == (INST_PUSH_REG | 0xe0))		/* mov.l r14,@-r15 */		{		INSTR insnNext;		if ((vxMemProbe ((char *)(pscan - 1), VX_READ, 2,		    (char *)&insnNext) == OK) &&		    (insnNext == (INST_PUSH_REG | 0xd0)))							/* mov.l r13,@-r15 */		    {		    checkDiab = TRUE;		    break;		    }		}	    else		{		if (trcDebug) dsmInst (&insn, (int)pscan, NULL);		trcInfo.szFrame += 4;		}	    }	else if (insn == INST_PUSH_PR)			  /* sts.l pr,@-r15 */	    {	    INSTR insnNext;	    if ((vxMemProbe ((char *)(pscan - 1), VX_READ, 2,		(char *)&insnNext) == OK) &&		(insnNext == (INST_PUSH_REG | 0xe0)))	/* mov.l r14,@-r15 */		{		checkDiab = TRUE;		break;		}	    else		{		if (trcDebug) dsmInst (&insn, (int)pscan, NULL);		if (vxMemProbe ((char *)((int)sp + trcInfo.szFrame),			    VX_READ, 4, (char *)&trcInfo.returnTo) != OK)		    trcInfo.returnTo = NULL;		*pReturnTo  = trcInfo.returnTo;		*pFuncEntry = NULL;		*pFrameSize = trcInfo.szFrame + 4;		return;		}	    }	else if ((insn & MASK_ADD_IMM_SP) == INST_ADD_IMM_SP)							/* add #imm,r15 */	    {	    INSTR insnNext;	    if ((vxMemProbe ((char *)(pscan - 1), VX_READ, 2,		(char *)&insnNext) == OK) &&		((insnNext == (INST_PUSH_REG | 0xe0)) || /* mov.l r14,@-r15 */		(insnNext == INST_PUSH_PR)))		/* sts.l pr,@-r15 */		{		checkDiab = TRUE;		break;		}	    }	else if ((depth == 0) && (insn == INST_RESTORE_SP)) /* mov r14,r15 */	    {	    inEpilog = TRUE;	    break;	    }	else if ((depth == 0) && (insn == INST_POP_PR))	/* lds.l @r15+,pr */	    {	    inEpilog = TRUE;	    }	else if ((depth == 0) && ((insn & MASK_POP_REG) ==	    (INST_POP_REG | 0xe00)))			/* mov.l @r15+,r14 */	    {	    inEpilog = TRUE;	    }	}    /* Here we know that this is a C function, and the pc is NOT in prolog.     * Scan backward again until finding the end of prolog (mov r15,r14 or     * sts.l @r15+,pr) to see if a sub-stack frame is constructed after the     * prolog code.     */    pscan = pc - 1;    /* If pc is in epilog, scan back until the start of the epilog. */    if (inEpilog == TRUE)	{	TRC_DEBUG (("<backward scan #%d> pc %p in epilog\n", depth, pc));	for (trcInfo.foundAddFrame = FALSE;	    pscan > pc - MAX_SCAN_DEPTH && pscan >= pSymAhead;	    pscan--)	    {	    INSTR insn;	    if (vxMemProbe ((char *)pscan, VX_READ, 2, (char *)&insn) != OK)		{		*pReturnTo = NULL;		return;		}	    else if ((insn & MASK_ADD_IMM_SP) == INST_ADD_IMM_SP)		{		INT8 imm = insn & 0xff;		TRC_DEBUG (("%x  %04x        add        #%d,r15",		    (UINT)pscan, insn, imm));		if (trcInfo.foundAddFrame == FALSE)		    {		    trcInfo.foundAddFrame = TRUE;		    if (imm > 0)			/* add #+imm,r15 */			{			TRC_DEBUG ((" (add)\n"));			szSubFrameEpilog -= imm;			}		    else				/* add #-imm,r15 */			TRC_DEBUG ((" (skip)\n"));		    }		else		    TRC_DEBUG ((" (skip)\n"));		}	    else if (insn == INST_RESTORE_SP)		/* mov r14,r15 */		{		if (trcDebug) dsmInst (&insn, (int)pscan, NULL);		--pscan;		break;		}	    else if ((insn & MASK_ADD_REG_SP) == INST_ADD_REG_SP)							/* add rm,r15 */		{		if (trcDebug) dsmInst (&insn, (int)pscan, NULL);		trcInfo.frameReg = (insn & 0x00f0) >> 4;		}	    else if (trcInfo.frameReg != NONE &&		(insn & MASK_MOV_IMM16) == INST_MOV_IMM16 &&		(insn & 0x0f00) == trcInfo.frameReg << 8)						/* mov.w @(disp,PC),Rn*/		{		UINT16 disp = (insn & 0x00ff) << 1;		INT16 imm16;		if (trcDebug) dsmInst (&insn, (int)pscan, NULL);		if (vxMemProbe ((char *)(pscan + 2) + disp, VX_READ, 2,		    (char *)&imm16) != OK)		    imm16 = 0;		TRC_DEBUG (("<backward scan #%d> frame size %d\n", depth,		    imm16));		szSubFrameEpilog -= imm16;		}	    else if (insn == INST_POP_PR)		/* sts.l @r15+,pr */		{		if (trcDebug) dsmInst (&insn, (int)pscan, NULL);		szSubFrameEpilog -= 4;		prStoreCheck -= 1;		if (checkDiab == TRUE)		    {		    --pscan;		    break;		    }		}	    else if ((insn & MASK_POP_REG) == INST_POP_REG)							/* mov.l @r15+,rm */		{		UINT8 rm = (insn & 0x0f00) >> 8;		if (rm >= 8 && rm <= 14)		    {		    if (trcDebug) dsmInst (&insn, (int)pscan, NULL);		    szSubFrameEpilog -= 4;		    }		if ((rm == 14) && (checkDiab == TRUE))	/* mov.l @r15+,r14 */		    {		    INSTR insnNext;		    if ((vxMemProbe ((char *)(pscan - 1), VX_READ, 2,			(char *)&insnNext) == OK) &&			(insnNext != INST_POP_PR))	/* not sts.l @r15+,pr */			{			--pscan;			break;			}		    }		}	    }	}    /* Scan back until the end of the prolog. */    for (trcInfo.foundSubFrame = FALSE,	 trcInfo.foundAddFrame = FALSE,	 trcInfo.szSubFrame = 0;	 pscan > pc - MAX_SCAN_DEPTH && pscan >= pSymAhead;	 pscan--)	{	INSTR insn;	if (vxMemProbe ((char *)pscan, VX_READ, 2, (char *)&insn) != OK)	    {	    *pReturnTo = NULL;	    return;	    }	else if ((insn & MASK_ADD_IMM_SP) == INST_ADD_IMM_SP)	    {	    INT8 imm = insn & 0xff;	    TRC_DEBUG (("%x  %04x        add        #%d,r15",			(UINT)pscan, insn, imm));	    if (trcInfo.foundSubFrame == FALSE)		{		trcInfo.foundSubFrame = TRUE;		if (imm < 0)				/* add #-imm,r15 */		    {		    TRC_DEBUG ((" (sub)\n"));		    trcInfo.szSubFrame = - imm;		    }		else					/* add #+imm,r15 */		    TRC_DEBUG ((" (skip)\n"));		}	    else		TRC_DEBUG ((" (skip)\n"));	    }	else if (((insn & MASK_ADD_IMM_R14) == INST_ADD_IMM_R14) &&		(inEpilog == TRUE) && (checkDiab != TRUE))	    {	    INT8 imm = insn & 0xff;	    TRC_DEBUG (("%x  %04x        add        #%d,r14",		(UINT)pscan, insn, imm));	    if (trcInfo.foundAddFrame == FALSE)		{		trcInfo.foundAddFrame = TRUE;		if (imm > 0)				/* add #+imm,r14 */		    {		    TRC_DEBUG ((" (add)\n"));		    szSubFrameEpilog -= imm;		    }		else					/* add #-imm,r14 */		    TRC_DEBUG ((" (skip)\n"));		}	    }	else if (((insn & MASK_PUSH_REG) == INST_PUSH_REG) &&		(checkDiab == TRUE))			/* mov.l rm,@-r15 */	    {	    UINT8 rm = (insn & 0x00f0) >> 4;	    if (rm >= 8 && rm <= 14)		{		if (inEpilog == TRUE)		    {		    trcInfo.szSubFrame = szSubFrameEpilog;		    }		break;		}	    }	else if ((insn == INST_PUSH_PR) && (checkDiab == TRUE))							/* sts.l pr,@-r15 */	    {	    if (inEpilog == TRUE)		{		trcInfo.szSubFrame = szSubFrameEpilog;		}	    break;	    }	else if (insn == INST_SET_FP)			/* mov r15,r14 */	    {	    if (trcDebug) dsmInst (&insn, (int)pscan, NULL);	    if (inEpilog == TRUE)		{		trcInfo.szSubFrame = szSubFrameEpilog;		}	    --pscan;	    break;	    }	}    /* Scan backward the rest of prolog code.     */    for (trcInfo.entry = NULL,	 trcInfo.szNvRegs = 0,	 trcInfo.szFrame = 0,	 trcInfo.frameReg = NONE;	 pscan > pc - MAX_SCAN_DEPTH && pscan >= pSymAhead;	 pscan--)	{	INSTR insn;	if (vxMemProbe ((char *)pscan, VX_READ, 2, (char *)&insn) != OK)	    {	    *pReturnTo = NULL;	    return;	    }	else if ((insn & (MASK_ADD_IMM_SP | 0x80)) == (INST_ADD_IMM_SP | 0x80))							/* add   #-imm,r15 */	    {	    if (trcDebug) dsmInst (&insn, (int)pscan, NULL);	    trcInfo.szFrame -= (INT8)(insn & 0x00ff);	    }	else if ((insn & MASK_SUB_REG_SP) == INST_SUB_REG_SP) /* sub rm,r15 */	    {	    if (trcDebug) dsmInst (&insn, (int)pscan, NULL);	    trcInfo.frameReg = (insn & 0x00f0) >> 4;	    }	else if (trcInfo.frameReg != NONE &&		 (insn & MASK_MOV_IMM16) == INST_MOV_IMM16 &&		 (insn & 0x0f00) == trcInfo.frameReg << 8)							/* mov.w @(disp,PC),Rn*/	    {	    UINT16 disp = (insn & 0x00ff) << 1;	    INT16 imm16;	    if (trcDebug) dsmInst (&insn, (int)pscan, NULL);	    if (vxMemProbe ((char *)(pscan + 2) + disp, VX_READ, 2,			    (char *)&imm16) != OK)		imm16 = 0;	    TRC_DEBUG (("<backward scan #%d> frame size %d\n", depth, imm16));	    trcInfo.szFrame = imm16;	    }	else if (insn == INST_PUSH_PR)			/* sts.l pr,@-r15 */	    {	    if (trcDebug) dsmInst (&insn, (int)pscan, NULL);	    trcInfo.szNvRegs = 4;	    prStoreCheck += 1;	    }	else if ((insn & MASK_PUSH_REG) == INST_PUSH_REG) /* mov.l rm,@-r15 */	    {	    UINT8 rm = (insn & 0x00f0) >> 4;	    if (rm >= 8 && rm <= 14)		{		if (trcDebug) dsmInst (&insn, (int)pscan, NULL);		trcInfo.szNvRegs += 4;		}	    if (rm == 8)				/* mov.l r8,@-r15 */		{		trcInfo.entry = pscan;		break;		}	    }	}    /* get the return address on stack */    if (vxMemProbe ((char *)((int)sp + trcInfo.szFrame + trcInfo.szSubFrame),		    VX_READ, 4, (char *)&trcInfo.returnTo) != OK)	trcInfo.returnTo = NULL;    if ((depth == 0) && (prStoreCheck == 0))	*pReturnTo = regs->pr;    else	*pReturnTo = trcInfo.returnTo;    *pFuncEntry = trcInfo.entry;    *pFrameSize = trcInfo.szNvRegs + trcInfo.szFrame + trcInfo.szSubFrame;    }/********************************************************************************* trcDefaultPrint - print a function call** This routine is called by trcStack to print each level in turn.** If nargs is specified as 0, then a default number of args (trcDefaultArgs)* is printed in brackets ("[..]"), since this often indicates that the* number of args is unknown.*/LOCAL void trcDefaultPrint    (    INSTR *callAdrs,		/* address from which function was called */    INSTR *funcAdrs,		/* address of function called */    FAST int nargs,		/* number of arguments in function call */    int *args 			/* pointer to function args */    )    {    FAST int ix;    BOOL doingDefault = FALSE;    /* print call address and function address */    printErr ("%6x: %x (", callAdrs, funcAdrs);    /* if no args are specified, print out default number (see doc at top) */    if ((nargs == 0) && (trcDefaultArgs != 0))	{	doingDefault = TRUE;	nargs = trcDefaultArgs;	printErr ("[");	}    /* print args */    for (ix = 0; ix < nargs; ++ix)	{	if (ix != 0)	    printErr (", ");	printErr ("%x", args[ix]);	}    if (doingDefault)	printErr ("]");    printErr (")\n");    }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -