📄 trclib.c
字号:
{ 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 + -