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

📄 armrdi.c

📁 这个是LINUX下的GDB调度工具的源码
💻 C
📖 第 1 页 / 共 3 页
字号:
#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 + -