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

📄 ardi.c

📁 这个是LINUX下的GDB调度工具的源码
💻 C
📖 第 1 页 / 共 5 页
字号:
    return err;  }  if(status == RDIError_NoError) {    for (i=0; i<j; i++)      buffer[i] = GET32LE(BUFFERDATA(packet->pk_buffer)+20+(i*4));    TracePrint(("angel_RDI_CPUread: mode=%.8x mask=%.8lx", mode, mask));    DevSW_FreePacket(packet);#ifdef RDI_VERBOSE    if (rdi_log & 1) {      unsigned k;      for (k = 0, j = 0 ; j <= 20 ; j++)        if (mask & (1L << j)) {          angel_DebugPrint("%c%.8lx",k%4==0?'\n':' ',                           (unsigned long)buffer[k]);          k++ ;        }      angel_DebugPrint("\n") ;    }#endif  }  return status;}/*----------------------------------------------------------------------*//*----angel_RDI_CPUwrite-------------------------------------------------*//*----------------------------------------------------------------------*//* Write CPU registers: use ADP_CPUwrite. */int angel_RDI_CPUwrite(unsigned mode, unsigned long mask,                      ARMword const *buffer){  unsigned i, j, c;  Packet *packet;  int status, reason, debugID, OSinfo1, OSinfo2, err, len;  TracePrint(("angel_RDI_CPUwrite: mode=%.8x mask=%.8lx", mode, mask));#ifdef RDI_VERBOSE if (rdi_log & 1) {    for (j = 0, i = 0 ; i <= 20 ; i++)       if (mask & (1L << i)) {          angel_DebugPrint("%c%.8lx",j%4==0?'\n':' ',                           (unsigned long)buffer[j]);          j++ ;          }    angel_DebugPrint("\n") ;    }#endif packet = (Packet *)DevSW_AllocatePacket(Armsd_BufferSize); for (i=0, j=0; i < RDINumCPURegs ; i++)   if (mask & (1L << i)) j++; /* count the number of registers */ len = msgbuild(BUFFERDATA(packet->pk_buffer), "%w%w%w%w%b%w",                ADP_CPUwrite | HtoT, 0,                ADP_HandleUnknown, ADP_HandleUnknown, mode, mask); for(c=0; c<j; c++)   PUT32LE(BUFFERDATA(packet->pk_buffer)+len+(c*4), buffer[c]); packet->pk_length = len+(j*4); register_debug_message_handler(); Adp_ChannelWrite(CI_HADP, packet); reason = ADP_CPUwrite | TtoH; err = wait_for_debug_message(&reason, &debugID, &OSinfo1, &OSinfo2,                             &status, &packet); unpack_message(BUFFERDATA(packet->pk_buffer), "%w%w%w%w%w", &reason, &debugID,                &OSinfo1, &OSinfo2, &status); DevSW_FreePacket(packet); if (err != RDIError_NoError)   return err;      /* Was there an error? */ else   return status; }/*----------------------------------------------------------------------*//*----angel_RDI_CPread---------------------------------------------------*//*----------------------------------------------------------------------*//* Read coprocessor's internal state.  See dbg_cp.h for help. * Use ADP_CPRead. * It would appear that the correct behaviour at this point is to leave * the unpacking to a the caller and to simply copy the stream of data * words into the buffer */int angel_RDI_CPread(unsigned CPnum, unsigned long mask, ARMword *buffer){  Packet *packet = NULL;  int i, j, status, reasoncode, OSinfo1, OSinfo2, err, debugID;  unsigned char *rmap = cpwords[CPnum];  int n;#ifdef DEBUG  angel_DebugPrint("DEBUG: Entered angel_RDI_CPread.\n");#endif  if (rmap == NULL) return RDIError_UnknownCoPro;  register_debug_message_handler();  n = rmap[-1];  msgsend(CI_HADP, "%w%w%w%w%b%w", ADP_CPread | HtoT, 0,          ADP_HandleUnknown, ADP_HandleUnknown, CPnum, mask);  reasoncode=ADP_CPread | TtoH;  err = wait_for_debug_message(&reasoncode, &debugID, &OSinfo1, &OSinfo2,                              &status, &packet);  if (err != RDIError_NoError) {    DevSW_FreePacket(packet);    return err;          /* Was there an error? */  }  for (j=i=0; i < n ; i++) /* count the number of registers */    if (mask & (1L << i)) {      j++;    }  for (i=0; i<j; i++)    buffer[i] = PREAD32(LE, BUFFERDATA(packet->pk_buffer) + 20 + (i*4));  DevSW_FreePacket(packet);  TracePrint(("angel_RDI_CPread: CPnum=%.8x mask=%.8lx\n", CPnum, mask));#ifdef RDI_VERBOSE  if (rdi_log & 1) {    for (i = 0, j = 0; j < n ; j++) {      if (mask & (1L << j)) {        int nw = rmap[j];        angel_DebugPrint("%2d ", j);        while (--nw > 0)          angel_DebugPrint("%.8lx ", (unsigned long)buffer[i++]);        angel_DebugPrint("%.8lx\n", (unsigned long)buffer[i++]);      }    }  }#endif  return status;}/*----------------------------------------------------------------------*//*----angel_RDI_CPwrite--------------------------------------------------*//*----------------------------------------------------------------------*//* Write coprocessor's internal state.  See dbg_cp.h for help. Use * ADP_CPwrite. */int angel_RDI_CPwrite(unsigned CPnum, unsigned long mask,                      ARMword const *buffer){  Packet *packet = NULL;  int i, j, len, status, reason, OSinfo1, OSinfo2, err, debugID;  unsigned char *rmap = cpwords[CPnum];  int n;  if (rmap == NULL) return RDIError_UnknownCoPro;  n = rmap[-1];  TracePrint(("angel_RDI_CPwrite: CPnum=%d mask=%.8lx\n", CPnum, mask));#ifdef RDI_VERBOSE if (rdi_log & 1) {    for (i = 0, j = 0; j < n ; j++)       if (mask & (1L << j)) {          int nw = rmap[j];          angel_DebugPrint("%2d ", j);          while (--nw > 0)             angel_DebugPrint("%.8lx ", (unsigned long)buffer[i++]);          angel_DebugPrint("%.8lx\n", (unsigned long)buffer[i++]);       } }#endif  for (j=i=0; i < n ; i++) /* Count the number of registers. */    if (mask & (1L << i)) j++;  packet = DevSW_AllocatePacket(Armsd_BufferSize);  len = msgbuild(BUFFERDATA(packet->pk_buffer), "%w%w%w%w%c%w",                 ADP_CPwrite | HtoT, 0,                 ADP_HandleUnknown, ADP_HandleUnknown, CPnum, mask);  for(i=0;  i<j; i++)    len+=msgbuild(BUFFERDATA(packet->pk_buffer) + len, "%w", buffer[i]);  packet->pk_length = len;  register_debug_message_handler();  Adp_ChannelWrite(CI_HADP, packet);    /* Transmit message. */  reason=ADP_CPwrite | TtoH;  err = wait_for_debug_message(&reason, &debugID, &OSinfo1, &OSinfo2,                              &status, &packet);  DevSW_FreePacket(packet);  if (err != RDIError_NoError)    return err;  else    return status;}/*----------------------------------------------------------------------*//*----angel_RDI_pointinq-------------------------------------------------*//*----------------------------------------------------------------------*//* Do test calls to ADP_SetBreak/ADP_SetWatch to see if resources exist to   carry out request. */int angel_RDI_pointinq(ARMword *address, unsigned type, unsigned datatype,                       ARMword *bound){  Packet *packet = NULL;  int len, status, reason, OSinfo1, OSinfo2, err=RDIError_NoError;       /* stop a compiler warning */  int debugID, pointhandle;  TracePrint(      ("angel_RDI_pointinq: address=%.8lx type=%d datatype=%d bound=%.8lx ",      (unsigned long)*address, type, datatype, (unsigned long)*bound));       /* for a buffer.  */  packet = DevSW_AllocatePacket(Armsd_BufferSize);  len = msgbuild(BUFFERDATA(packet->pk_buffer), "%w%w%w%w%w%b",                 ((datatype == 0) ? ADP_SetBreak : ADP_SetWatch) | HtoT, 0,                 ADP_HandleUnknown, ADP_HandleUnknown, address, type);  if (datatype == 0)    len += msgbuild(BUFFERDATA(packet->pk_buffer) + 21, "%w", bound);  else    len += msgbuild(BUFFERDATA(packet->pk_buffer) + 21, "%b%w", datatype, bound);  register_debug_message_handler();  packet->pk_length = len;  Adp_ChannelWrite(CI_HADP, packet);  reason = ((datatype == 0) ? ADP_SetBreak : ADP_SetWatch | TtoH);  err = wait_for_debug_message(&reason, &debugID, &OSinfo1, &OSinfo2,                              &status, &packet);  if (err != RDIError_NoError) {    DevSW_FreePacket(packet);    return err;        /* Was there an error? */  }  unpack_message(BUFFERDATA(packet->pk_buffer), "%w%w%w%w%w%w%w%w",                 &reason, &debugID, &OSinfo1, &OSinfo2, &status,                 &pointhandle, &address, &bound);  DevSW_FreePacket(packet);  return err;}/*----------------------------------------------------------------------*//*----angel_RDI_setbreak-------------------------------------------------*//*----------------------------------------------------------------------*//* Set a breakpoint: Use ADP_SetBreak */int angel_RDI_setbreak(ARMword address, unsigned type, ARMword bound,                      PointHandle *handle){  int status, reason, OSinfo1, OSinfo2, err, debugID;  int tmpval, tmpaddr, tmpbnd;  Packet *packet;  TracePrint(("angel_RDI_setbreak address=%.8lx type=%d bound=%.8lx \n",              (unsigned long)address, type, (unsigned long)bound));  register_debug_message_handler();  msgsend(CI_HADP, "%w%w%w%w%w%b%w",          ADP_SetBreak| HtoT, 0,  ADP_HandleUnknown,          ADP_HandleUnknown, address, type, bound);  reason = ADP_SetBreak |TtoH;  err = wait_for_debug_message(&reason, &debugID, &OSinfo1, &OSinfo2,                              &status, &packet);  if (err != RDIError_NoError) {    DevSW_FreePacket(packet);    return err;         /* Was there an error? */  }  /* Work around varargs problem... -sts */  unpack_message(BUFFERDATA(packet->pk_buffer), "%w%w%w%w%w%w%w%w",                 &reason, &debugID, &OSinfo1, &OSinfo2, &status,                 &tmpval, &tmpaddr, &tmpbnd);  *handle = tmpval;  address = tmpaddr;  bound = tmpbnd;  DevSW_FreePacket(packet);  if (status != RDIError_NoError) return status;  TracePrint(("returns handle %.8lx\n", (unsigned long)*handle));  return RDIError_NoError;}/*----------------------------------------------------------------------*//*----angel_RDI_clearbreak-----------------------------------------------*//*----------------------------------------------------------------------*//* Clear a breakpoint: Use ADP_ClearBreak. */int angel_RDI_clearbreak(PointHandle handle){  Packet *packet = NULL;  int status, reason, OSinfo1, OSinfo2, err, debugID;  TracePrint(("angel_RDI_clearbreak: handle=%.8lx\n", (unsigned long)handle));  register_debug_message_handler();  msgsend(CI_HADP, "%w%w%w%w%w",          ADP_ClearBreak| HtoT, 0,  ADP_HandleUnknown,          ADP_HandleUnknown, handle);  reason = ADP_ClearBreak|TtoH;  err = wait_for_debug_message(&reason, &debugID, &OSinfo1, &OSinfo2,                              &status, &packet);  if (err != RDIError_NoError) {    DevSW_FreePacket(packet);    angel_DebugPrint("***RECEIVE DEBUG MESSAGE RETURNED ERR = %d.\n", err);    return err;          /* Was there an error? */  }  unpack_message(BUFFERDATA(packet->pk_buffer), "%w%w%w%w%w",  &reason,                 &debugID, &OSinfo1, &OSinfo2, &status);  DevSW_FreePacket(packet);#ifdef DEBUG  angel_DebugPrint("DEBUG: Clear Break completed OK.\n");#endif  return RDIError_NoError;}/*----------------------------------------------------------------------*//*----angel_RDI_setwatch-------------------------------------------------*//*----------------------------------------------------------------------*//* Set a watchpoint: use ADP_SetWatch. */int angel_RDI_setwatch(ARMword address, unsigned type, unsigned datatype,                       ARMword bound, PointHandle *handle){  Packet *packet = NULL;  int status, reason, OSinfo1, OSinfo2, err, debugID;  TracePrint(("angel_RDI_setwatch: address=%.8lx type=%d bound=%.8lx ",              (unsigned long)address, type, (unsigned long)bound));  register_debug_message_handler();  msgsend(CI_HADP, "%w%w%w%w%w%b%b%w",          ADP_SetWatch| HtoT, 0,  ADP_HandleUnknown,          ADP_HandleUnknown, address, type, datatype, bound);  reason = ADP_SetWatch | TtoH;  err = wait_for_debug_message(&reason, &debugID, &OSinfo1, &OSinfo2,                              &status, &packet);  if (err != RDIError_NoError) {    DevSW_FreePacket(packet);    return err;        /* Was there an error? */  }  unpack_message(BUFFERDATA(packet->pk_buffer), "%w%w%w%w%w%w%w%w",                 &reason, &debugID, &OSinfo1, &OSinfo2, &status,                 handle, &address, &bound);  DevSW_FreePacket(packet);  TracePrint(("returns handle %.8lx\n", (unsigned long)*handle));  return RDIError_NoError;}/*----------------------------------------------------------------------*//*----angel_RDI_clearwatch-----------------------------------------------*//*----------------------------------------------------------------------*//* Clear a watchpoint: use ADP_ClearWatch. */int angel_RDI_clearwatch(PointHandle handle) {  int status, reason, OSinfo1, OSinfo2, err, debugID;  Packet *packet = NULL;  TracePrint(("angel_RDI_clearwatch: handle=%.8lx\n", (unsigned long)handle));  register_debug_message_handler();  msgsend(CI_HADP, "%w%w%w%w%w",          ADP_ClearWatch| HtoT, 0,  ADP_HandleUnknown,          ADP_HandleUnknown, handle);  reason = ADP_ClearWatch|TtoH;  err = wait_for_debug_message(&reason, &debugID, &OSinfo1, &OSinfo2,                              &status, &packet);  if (err != RDIError_NoError) {    DevSW_FreePacket(packet);    return err;        /* Was there an error? */  }  unpack_message(BUFFERDATA(packet->pk_buffer), "%w%w%w%w%w",  &reason, &debugID,                 &OSinfo1, &OSinfo2, &status);  DevSW_FreePacket(packet);  return RDIError_NoError;}typedef struct {  unsigned stopped_reason;  int stopped_status;  int data;} adp_stopped_struct;int angel_RDI_OnTargetStopping(angel_RDI_TargetStoppedProc *fn,                               void *arg){  stoppedProcListElement **lptr = &stopped_proc_list;  /* Find the address of the NULL ptr at the end of the list */  for (; *lptr!=NULL ; lptr = &((*lptr)->next))    ; /* Do nothing */  *lptr = (stoppedProcListElement *) malloc(sizeof(stoppedProcListElement));  if (*lptr == NULL) return RDIError_OutOfStore;  (*lptr)->fn = fn;  (*lptr)->arg = arg;  return RDIError_NoError;}static int CallStoppedProcs(unsigned reason){  stoppedProcListElement *p = stopped_proc_list;  int err=RDIError_NoError;    for (; p!=NULL ; p=p->next) {    int local_err = p->fn(reason, p->arg);    if (local_err != RDIError_NoError) err=local_err;  }  return err;}/*----------------------------------------------------------------------*//*----angel_RDI_execute--------------------------------------------------*//*----------------------------------------------------------------------*/static int HandleStoppedMessage(Packet *packet, void *stateptr) {  unsigned int err,  reason, debugID, OSinfo1, OSinfo2, count;

⌨️ 快捷键说明

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