📄 armrdi.c
字号:
#ifdef RDI_VERBOSE if (rdi_log & 1) { for (upto = 0, i = 0; i <= 20; i++) if (mask & (1L << i)) { ARMul_DebugPrint (state, "%c%.8lx", upto % 4 == 0 ? '\n' : ' ', buffer[upto]); upto++; } ARMul_DebugPrint (state, "\n"); }#endif if (mode == RDIMode_Curr) mode = (unsigned) (ARMul_GetCPSR (state) & MODEBITS); for (upto = 0, i = 0; i < 15; i++) if (mask & (1L << i)) ARMul_SetReg (state, mode, i, buffer[upto++]); if (mask & RDIReg_R15) ARMul_SetR15 (state, buffer[upto++]); if (mask & RDIReg_PC) { ARMul_SetPC (state, buffer[upto++]); } if (mask & RDIReg_CPSR) ARMul_SetCPSR (state, buffer[upto++]); if (mask & RDIReg_SPSR) ARMul_SetSPSR (state, mode, buffer[upto++]); return (RDIError_NoError);}/***************************************************************************\* RDI_CPread *\***************************************************************************/static intRDI_CPread (unsigned CPnum, unsigned long mask, ARMword buffer[]){ ARMword fpregsaddr, word[4]; unsigned r, w; unsigned upto; if (CPnum != 1 && CPnum != 2) { unsigned char const *rmap = state->CPRegWords[CPnum]; if (rmap == NULL) return (RDIError_UnknownCoPro); for (upto = 0, r = 0; r < rmap[-1]; r++) if (mask & (1L << r)) { (void) state->CPRead[CPnum] (state, r, &buffer[upto]); upto += rmap[r]; } TracePrint ((state, "RDI_CPread: CPnum=%d mask=%.8lx", CPnum, mask));#ifdef RDI_VERBOSE if (rdi_log & 1) { w = 0; for (upto = 0, r = 0; r < rmap[-1]; r++) if (mask & (1L << r)) { int words = rmap[r]; ARMul_DebugPrint (state, "%c%2d", (w >= 4 ? (w = 0, '\n') : ' '), r); while (--words >= 0) { ARMul_DebugPrint (state, " %.8lx", buffer[upto++]); w++; } } ARMul_DebugPrint (state, "\n"); }#endif return RDIError_NoError; }#ifdef NOFPE return RDIError_UnknownCoPro;#else if (FPRegsAddr == 0) { fpregsaddr = ARMul_ReadWord (state, 4L); if ((fpregsaddr & 0xff800000) != 0xea000000) /* Must be a forward branch */ return RDIError_UnknownCoPro; fpregsaddr = ((fpregsaddr & 0xffffff) << 2) + 8; /* address in __fp_decode - 4 */ if ((fpregsaddr < FPESTART) || (fpregsaddr >= FPEEND)) return RDIError_UnknownCoPro; fpregsaddr = ARMul_ReadWord (state, fpregsaddr); /* pointer to fp registers */ FPRegsAddr = fpregsaddr; } else fpregsaddr = FPRegsAddr; if (fpregsaddr == 0) return RDIError_UnknownCoPro; for (upto = 0, r = 0; r < 8; r++) if (mask & (1L << r)) { for (w = 0; w < 4; w++) word[w] = ARMul_ReadWord (state, fpregsaddr + (ARMword) r * 16 + (ARMword) w * 4); switch ((int) (word[3] >> 29)) { case 0: case 2: case 4: case 6: /* its unpacked, convert to extended */ buffer[upto++] = 2; /* mark as extended */ buffer[upto++] = (word[3] & 0x7fff) | (word[0] & 0x80000000); /* exp and sign */ buffer[upto++] = word[1]; /* mantissa 1 */ buffer[upto++] = word[2]; /* mantissa 2 */ break; case 1: /* packed single */ buffer[upto++] = 0; /* mark as single */ buffer[upto++] = word[0]; /* sign, exp and mantissa */ buffer[upto++] = word[1]; /* padding */ buffer[upto++] = word[2]; /* padding */ break; case 3: /* packed double */ buffer[upto++] = 1; /* mark as double */ buffer[upto++] = word[0]; /* sign, exp and mantissa1 */ buffer[upto++] = word[1]; /* mantissa 2 */ buffer[upto++] = word[2]; /* padding */ break; case 5: /* packed extended */ buffer[upto++] = 2; /* mark as extended */ buffer[upto++] = word[0]; /* sign and exp */ buffer[upto++] = word[1]; /* mantissa 1 */ buffer[upto++] = word[2]; /* mantissa 2 */ break; case 7: /* packed decimal */ buffer[upto++] = 3; /* mark as packed decimal */ buffer[upto++] = word[0]; /* sign, exp and mantissa1 */ buffer[upto++] = word[1]; /* mantissa 2 */ buffer[upto++] = word[2]; /* mantissa 3 */ break; } } if (mask & (1L << r)) buffer[upto++] = ARMul_ReadWord (state, fpregsaddr + 128); /* fpsr */ if (mask & (1L << (r + 1))) buffer[upto++] = 0; /* fpcr */ TracePrint ((state, "RDI_CPread: CPnum=%d mask=%.8lx\n", CPnum, mask));#ifdef RDI_VERBOSE if (rdi_log & 1) { for (upto = 0, r = 0; r < 9; r++) if (mask & (1L << r)) { if (r != 8) { ARMul_DebugPrint (state, "%08lx ", buffer[upto++]); ARMul_DebugPrint (state, "%08lx ", buffer[upto++]); ARMul_DebugPrint (state, "%08lx ", buffer[upto++]); } ARMul_DebugPrint (state, "%08lx\n", buffer[upto++]); } ARMul_DebugPrint (state, "\n"); }#endif return (RDIError_NoError);#endif /* NOFPE */}/***************************************************************************\* RDI_CPwrite *\***************************************************************************/static intRDI_CPwrite (unsigned CPnum, unsigned long mask, ARMword const buffer[]){ unsigned r; unsigned upto; ARMword fpregsaddr; if (CPnum != 1 && CPnum != 2) { unsigned char const *rmap = state->CPRegWords[CPnum]; if (rmap == NULL) return (RDIError_UnknownCoPro); TracePrint ((state, "RDI_CPwrite: CPnum=%d mask=%.8lx", CPnum, mask));#ifdef RDI_VERBOSE if (rdi_log & 1) { int w = 0; for (upto = 0, r = 0; r < rmap[-1]; r++) if (mask & (1L << r)) { int words = rmap[r]; ARMul_DebugPrint (state, "%c%2d", (w >= 4 ? (w = 0, '\n') : ' '), r); while (--words >= 0) { ARMul_DebugPrint (state, " %.8lx", buffer[upto++]); w++; } } ARMul_DebugPrint (state, "\n"); }#endif for (upto = 0, r = 0; r < rmap[-1]; r++) if (mask & (1L << r)) { (void) state->CPWrite[CPnum] (state, r, &buffer[upto]); upto += rmap[r]; } return RDIError_NoError; }#ifdef NOFPE return RDIError_UnknownCoPro;#else TracePrint ((state, "RDI_CPwrite: CPnum=%d mask=%.8lx", CPnum, mask));#ifdef RDI_VERBOSE if (rdi_log & 1) { for (upto = 0, r = 0; r < 9; r++) if (mask & (1L << r)) { if (r != 8) { ARMul_DebugPrint (state, "%08lx ", buffer[upto++]); ARMul_DebugPrint (state, "%08lx ", buffer[upto++]); ARMul_DebugPrint (state, "%08lx ", buffer[upto++]); } ARMul_DebugPrint (state, "%08lx\n", buffer[upto++]); } ARMul_DebugPrint (state, "\n"); }#endif if (FPRegsAddr == 0) { fpregsaddr = ARMul_ReadWord (state, 4L); if ((fpregsaddr & 0xff800000) != 0xea000000) /* Must be a forward branch */ return RDIError_UnknownCoPro; fpregsaddr = ((fpregsaddr & 0xffffff) << 2) + 8; /* address in __fp_decode - 4 */ if ((fpregsaddr < FPESTART) || (fpregsaddr >= FPEEND)) return RDIError_UnknownCoPro; fpregsaddr = ARMul_ReadWord (state, fpregsaddr); /* pointer to fp registers */ FPRegsAddr = fpregsaddr; } else fpregsaddr = FPRegsAddr; if (fpregsaddr == 0) return RDIError_UnknownCoPro; for (upto = 0, r = 0; r < 8; r++) if (mask & (1L << r)) { ARMul_WriteWord (state, fpregsaddr + (ARMword) r * 16, buffer[upto + 1]); ARMul_WriteWord (state, fpregsaddr + (ARMword) r * 16 + 4, buffer[upto + 2]); ARMul_WriteWord (state, fpregsaddr + (ARMword) r * 16 + 8, buffer[upto + 3]); ARMul_WriteWord (state, fpregsaddr + (ARMword) r * 16 + 12, (buffer[upto] * 2 + 1) << 29); /* mark type */ upto += 4; } if (mask & (1L << r)) ARMul_WriteWord (state, fpregsaddr + 128, buffer[upto++]); /* fpsr */ return (RDIError_NoError);#endif /* NOFPE */}static voiddeletebreaknode (BreakNode ** prevp){ BreakNode *p = *prevp; *prevp = p->next; ARMul_WriteWord (state, p->address, p->inst); free ((char *) p); BreaksSet--; state->CallDebug--;}static intremovebreak (ARMword address, unsigned type){ BreakNode *p, **prevp = &BreakList; for (; (p = *prevp) != NULL; prevp = &p->next) if (p->address == address && p->type == type) { deletebreaknode (prevp); return TRUE; } return FALSE;}/* This routine installs a breakpoint into the breakpoint table */static BreakNode *installbreak (ARMword address, unsigned type, ARMword bound){ BreakNode *p = (BreakNode *) malloc (sizeof (BreakNode)); p->next = BreakList; BreakList = p; p->address = address; p->type = type; p->bound = bound; p->inst = ARMul_ReadWord (state, address); ARMul_WriteWord (state, address, 0xee000000L); return p;}/***************************************************************************\* RDI_setbreak *\***************************************************************************/static intRDI_setbreak (ARMword address, unsigned type, ARMword bound, PointHandle * handle){ BreakNode *p; TracePrint ((state, "RDI_setbreak: address=%.8lx type=%d bound=%.8lx\n", address, type, bound)); removebreak (address, type); p = installbreak (address, type, bound); BreaksSet++; state->CallDebug++; *handle = (PointHandle) p; TracePrint ((state, " returns %.8lx\n", *handle)); return RDIError_NoError;}/***************************************************************************\* RDI_clearbreak *\***************************************************************************/static intRDI_clearbreak (PointHandle handle){ TracePrint ((state, "RDI_clearbreak: address=%.8lx\n", handle)); { BreakNode *p, **prevp = &BreakList; for (; (p = *prevp) != NULL; prevp = &p->next) if (p == (BreakNode *) handle) break; if (p == NULL) return RDIError_NoSuchPoint; deletebreaknode (prevp); return RDIError_NoError; }}/***************************************************************************\* Internal functions for breakpoint table manipulation *\***************************************************************************/static voiddeletewatchnode (WatchNode ** prevp){ WatchNode *p = *prevp; if (p->datatype & Watch_AnyRead) state->MemReadDebug--; if (p->datatype & Watch_AnyWrite) state->MemWriteDebug--; *prevp = p->next; free ((char *) p);}intremovewatch (ARMword address, unsigned type){ WatchNode *p, **prevp = &WatchList; for (; (p = *prevp) != NULL; prevp = &p->next) if (p->address == address && p->type == type) { /* found a match */ deletewatchnode (prevp); return TRUE; } return FALSE; /* never found a match */}static WatchNode *installwatch (ARMword address, unsigned type, unsigned datatype, ARMword bound){ WatchNode *p = (WatchNode *) malloc (sizeof (WatchNode)); p->next = WatchList; WatchList = p; p->address = address; p->type = type; p->datatype = datatype; p->bound = bound; return p;}/***************************************************************************\* RDI_setwatch *\***************************************************************************/static intRDI_setwatch (ARMword address, unsigned type, unsigned datatype, ARMword bound, PointHandle * handle){ WatchNode *p; TracePrint ( (state, "RDI_setwatch: address=%.8lx type=%d datatype=%d bound=%.8lx", address, type, datatype, bound));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -