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

📄 ardi.c

📁 这个是LINUX下的GDB调度工具的源码
💻 C
📖 第 1 页 / 共 5 页
字号:
}static int CheckSubMessageReply(int reason, int subreason) {  Packet *packet = NULL;  int status, debugID, OSinfo1, OSinfo2;  int err = RDIError_NoError;  reason |= TtoH;  err = wait_for_debug_message(&reason, &debugID, &OSinfo1, &OSinfo2,                               &status, &packet);  if (err != RDIError_NoError) {    status = err;  } else {    int sr;    unpack_message(BUFFERDATA(packet->pk_buffer), "%w%w%w%w%w%w", &reason, &debugID,                   &OSinfo1, &OSinfo2, &sr, &status);    if (subreason != sr) status = RDIError_Error;  }  DevSW_FreePacket(packet);  return status;}static int SendSubMessageAndCheckReply(int reason, int subreason) {  register_debug_message_handler();  msgsend(CI_HADP, "%w%w%w%w%w", reason | HtoT, 0,          ADP_HandleUnknown, ADP_HandleUnknown,          subreason);  return CheckSubMessageReply(reason, subreason);}static int SendSubMessageWordAndCheckReply(int reason, int subreason, ARMword word) {  register_debug_message_handler();  msgsend(CI_HADP, "%w%w%w%w%w%w", reason | HtoT, 0,          ADP_HandleUnknown, ADP_HandleUnknown,          subreason, word);  return CheckSubMessageReply(reason, subreason);}static int SendSubMessageGetWordAndCheckReply(int reason, int subreason, ARMword *resp) {  Packet *packet = NULL;  int status, debugID, OSinfo1, OSinfo2;  int err = RDIError_NoError;  register_debug_message_handler();  msgsend(CI_HADP, "%w%w%w%w%w", reason | HtoT, 0,          ADP_HandleUnknown, ADP_HandleUnknown,          subreason);  reason |= TtoH;  err = wait_for_debug_message(&reason, &debugID, &OSinfo1, &OSinfo2,                               &status, &packet);  if (err != RDIError_NoError) {    status = err;  } else {    int sr;    unpack_message(BUFFERDATA(packet->pk_buffer), "%w%w%w%w%w%w%w", &reason, &debugID,                   &OSinfo1, &OSinfo2,  &sr, &status, resp);    if (subreason != sr) status = RDIError_Error;  }  DevSW_FreePacket(packet);  return status;}static int const hostsex = 1;int angel_RDI_info(unsigned type, ARMword *arg1, ARMword *arg2) {  Packet *packet = NULL;  int len, status, c, reason, subreason, debugID, OSinfo1, OSinfo2;  int err=RDIError_NoError, cpnum=0;  struct Dbg_CoProDesc *cpd;  int count, i;  unsigned char *bp;#ifdef DEBUG  angel_DebugPrint("DEBUG: Entered angel_RDI_info.\n");#endif  switch (type) {  case RDIInfo_Target:#ifdef DEBUG    angel_DebugPrint("DEBUG: RDIInfo_Target.\n");#endif    register_debug_message_handler();    msgsend(CI_HADP, "%w%w%w%w%w", ADP_Info | HtoT, 0,                 ADP_HandleUnknown, ADP_HandleUnknown, ADP_Info_Target);    reason = ADP_Info |TtoH;    err = wait_for_debug_message(&reason, &debugID, &OSinfo1, &OSinfo2,                              &status, &packet);    if (err != RDIError_NoError) {      DevSW_FreePacket(packet);      return err;    }    unpack_message(BUFFERDATA(packet->pk_buffer), "%w%w%w%w%w%w%w%w", &reason,                   &debugID, &OSinfo1, &OSinfo2,  &subreason, &status,                   arg1, arg2);    DevSW_FreePacket(packet);    if (subreason !=  ADP_Info_Target)      return RDIError_Error;    else      return status;  case RDISignal_Stop:#ifdef DEBUG    angel_DebugPrint("DEBUG: RDISignal_Stop.\n");    if (interrupt_request)       angel_DebugPrint("       STILL WAITING to send previous interrupt request\n");#endif    interrupt_request = TRUE;    return RDIError_NoError;  case RDIInfo_Points:#ifdef DEBUG    angel_DebugPrint("DEBUG: RDIInfo_Points.\n");#endif    return SendSubMessageGetWordAndCheckReply(ADP_Info, ADP_Info_Points, arg1);  case RDIInfo_Step:#ifdef DEBUG    angel_DebugPrint("DEBUG: RDIInfo_Step.\n");#endif    return SendSubMessageGetWordAndCheckReply(ADP_Info, ADP_Info_Step, arg1);  case RDISet_Cmdline:#ifdef DEBUG    angel_DebugPrint("DEBUG: RDISet_Cmdline.\n");#endif    if (ardi_commandline != &dummycline)      free(ardi_commandline);    ardi_commandline = (char *)malloc(strlen((char*)arg1) + 1) ;    (void)strcpy(ardi_commandline, (char *)arg1) ;    return RDIError_NoError;  case RDIInfo_SetLog:#ifdef DEBUG    angel_DebugPrint("DEBUG: RDIInfo_SetLog.\n");#endif    rdi_log = (int) *arg1;    return RDIError_NoError;  case RDIInfo_Log:#ifdef DEBUG    angel_DebugPrint("DEBUG: RDIInfo_Log.\n");#endif    *arg1 = rdi_log;    return RDIError_NoError;  case RDIInfo_MMU:#ifdef DEBUG    angel_DebugPrint("DEBUG: RDIInfo_MMU.\n");#endif    return SendSubMessageGetWordAndCheckReply(ADP_Info, ADP_Info_MMU, arg1);  case RDIInfo_SemiHosting:#ifdef DEBUG    angel_DebugPrint("DEBUG: RDIInfo_SemiHosting.\n");#endif    return SendSubMessageAndCheckReply(ADP_Info, ADP_Info_SemiHosting);  case RDIInfo_CoPro:#ifdef DEBUG    angel_DebugPrint("DEBUG: RDIInfo_CoPro.\n");#endif    return SendSubMessageAndCheckReply(ADP_Info, ADP_Info_CoPro);  case RDICycles:#ifdef DEBUG    angel_DebugPrint("DEBUG: RDICycles.\n");#endif    register_debug_message_handler();    msgsend(CI_HADP, "%w%w%w%w%w", ADP_Info | HtoT, 0,            ADP_HandleUnknown, ADP_HandleUnknown, ADP_Info_Cycles);    reason = ADP_Info |TtoH;    err = wait_for_debug_message(&reason, &debugID, &OSinfo1, &OSinfo2,                              &status, &packet);    if (err != RDIError_NoError) {      DevSW_FreePacket(packet);      return err;    }    unpack_message(BUFFERDATA(packet->pk_buffer), "%w%w%w%w%w%w", &reason, &debugID,                 &OSinfo1, &OSinfo2,  &subreason, &status);    DevSW_FreePacket(packet);    if (subreason !=  ADP_Info_Cycles)      return RDIError_Error;    if (status != RDIError_NoError) return status;    for (c=0; c<12; c++)      arg1[c]=GET32LE(BUFFERDATA(packet->pk_buffer)+24+(c*4));    return status;  case RDIInfo_DescribeCoPro:#ifdef DEBUG    angel_DebugPrint("DEBUG: RDIInfo_DescribeCoPro.\n");#endif    cpnum = *(int *)arg1;    cpd = (struct Dbg_CoProDesc *)arg2;    packet = DevSW_AllocatePacket(Armsd_BufferSize);    if (angel_RDI_info(ADP_Info_CoPro, NULL, NULL) != RDIError_NoError)      return RDIError_Error;    len = msgbuild(BUFFERDATA(packet->pk_buffer), "%w%w%w%w%w", ADP_Info | HtoT, 0,                   ADP_HandleUnknown, ADP_HandleUnknown,                   ADP_Info_DescribeCoPro);    len +=msgbuild(BUFFERDATA(packet->pk_buffer)+20, "%b%b%b%b%b", cpnum,                   cpd->regdesc[cpnum].rmin, cpd->regdesc[cpnum].rmax,                   cpd->regdesc[cpnum].nbytes, cpd->regdesc[cpnum].access);    if ((cpd->regdesc[cpnum].access&0x3) == 0x3){      len += msgbuild(BUFFERDATA(packet->pk_buffer)+25, "%b%b%b%b%b",                      cpd->regdesc[cpnum].accessinst.cprt.read_b0,                      cpd->regdesc[cpnum].accessinst.cprt.read_b1,                      cpd->regdesc[cpnum].accessinst.cprt.write_b0,                      cpd->regdesc[cpnum].accessinst.cprt.write_b1, 0xff);    }    else {      len += msgbuild(BUFFERDATA(packet->pk_buffer)+25, "%b%b%b%b%b%",                      cpd->regdesc[cpnum].accessinst.cpdt.rdbits,                      cpd->regdesc[cpnum].accessinst.cpdt.nbit,0,0, 0xff);    }    register_debug_message_handler();    packet->pk_length = len;    Adp_ChannelWrite(CI_HADP, packet); /* Transmit message. */    reason = ADP_Info |TtoH;    err = wait_for_debug_message(&reason, &debugID, &OSinfo1, &OSinfo2,                                &status, &packet);    if (err != RDIError_NoError) {      DevSW_FreePacket(packet);      return err;    }    unpack_message(BUFFERDATA(packet->pk_buffer), "%w%w%w%w%w%w", &reason, &debugID,                   &OSinfo1, &OSinfo2, &subreason, &status);    DevSW_FreePacket(packet);    if (subreason != ADP_Info_DescribeCoPro)      return RDIError_Error;    else      return status;  case RDIInfo_RequestCoProDesc:#ifdef DEBUG    angel_DebugPrint("DEBUG: RDIInfo_RequestCoProDesc.\n");#endif    cpnum = *(int *)arg1;    cpd = (struct Dbg_CoProDesc *)arg2;    packet = DevSW_AllocatePacket(Armsd_BufferSize);    len = msgbuild(BUFFERDATA(packet->pk_buffer), "%w%w%w%w%w", ADP_Info | HtoT, 0,                   ADP_HandleUnknown, ADP_HandleUnknown,                   ADP_Info_RequestCoProDesc);    len += msgbuild(BUFFERDATA(packet->pk_buffer)+20, "%b", *(int *)arg1);    packet->pk_length = len;    register_debug_message_handler();    Adp_ChannelWrite(CI_HADP, packet); /* Transmit message. */    reason = ADP_Info |TtoH;    err = wait_for_debug_message(&reason, &debugID, &OSinfo1, &OSinfo2,                              &status, &packet);    if (err != RDIError_NoError) {      DevSW_FreePacket(packet);      return err;    }    count = unpack_message(BUFFERDATA(packet->pk_buffer), "%w%w%w%w%w%w", &reason,                           &debugID, &OSinfo1, &OSinfo2,  &subreason, &status);    if (subreason !=  ADP_Info_RequestCoProDesc) {      DevSW_FreePacket(packet);      return RDIError_Error;    } else if ( status != RDIError_NoError ) {      DevSW_FreePacket(packet);      return status;    } else {      bp = BUFFERDATA(packet->pk_buffer)+count;      for ( i = 0; *bp != 0xFF && i < cpd->entries; ++i ) {        cpd->regdesc[i].rmin = *bp++;        cpd->regdesc[i].rmax = *bp++;        cpd->regdesc[i].nbytes = *bp++;        cpd->regdesc[i].access = *bp++;      }      cpd->entries = i;      if ( *bp != 0xFF )        status = RDIError_BufferFull;      else        SetCPWords( cpnum, cpd );      DevSW_FreePacket(packet);      return status;    }  case RDIInfo_GetLoadSize:#ifdef DEBUG    angel_DebugPrint("DEBUG: ADP_Info_AngelBufferSize.\n");#endif    register_debug_message_handler();    msgsend(CI_HADP, "%w%w%w%w%w", ADP_Info | HtoT, 0,            ADP_HandleUnknown, ADP_HandleUnknown,            ADP_Info_AngelBufferSize);    reason = ADP_Info |TtoH;    err = wait_for_debug_message(&reason, &debugID, &OSinfo1, &OSinfo2,                              &status, &packet);    if (err != RDIError_NoError) {      DevSW_FreePacket(packet);      return err;    }    unpack_message(BUFFERDATA(packet->pk_buffer), "%w%w%w%w%w%w", &reason,                   &debugID, &OSinfo1, &OSinfo2,  &subreason, &status);    if (subreason !=  ADP_Info_AngelBufferSize) {      DevSW_FreePacket(packet);      return RDIError_Error;    }    else {      word defaultsize, longsize;      unpack_message(BUFFERDATA(packet->pk_buffer)+24, "%w%w",                     &defaultsize, &longsize);      *arg1 = longsize - ADP_WriteHeaderSize;   /* space for ADP header */#ifdef MONITOR_DOWNLOAD_PACKETS      angel_DebugPrint("DEBUG: ADP_Info_AngelBufferSize: got (%d, %d), returning %d.\n",             defaultsize, longsize, *arg1);#endif      DevSW_FreePacket(packet);      return status;    }  case RDIVector_Catch:#ifdef DEBUG    angel_DebugPrint("DEBUG: ADP_Ctrl_VectorCatch %lx.\n", *arg1);#endif    return SendSubMessageWordAndCheckReply(ADP_Control, ADP_Ctrl_VectorCatch, *arg1);  case RDISemiHosting_SetState:#ifdef DEBUG    angel_DebugPrint("DEBUG: ADP_Ctrl_SemiHosting_SetState %lx.\n", *arg1);#endif    return SendSubMessageWordAndCheckReply(ADP_Control, ADP_Ctrl_SemiHosting_SetState, *arg1);  case RDISemiHosting_GetState:#ifdef DEBUG    angel_DebugPrint("DEBUG: ADP_Ctrl_SemiHosting_GetState.\n");#endif    return SendSubMessageGetWordAndCheckReply(ADP_Control, ADP_Ctrl_SemiHosting_GetState, arg1);  case RDISemiHosting_SetVector:#ifdef DEBUG    angel_DebugPrint("DEBUG: ADP_Ctrl_SemiHosting_SetVector %lx.\n", *arg1);#endif    return SendSubMessageWordAndCheckReply(ADP_Control, ADP_Ctrl_SemiHosting_SetVector, *arg1);  case RDISemiHosting_GetVector:#ifdef DEBUG    angel_DebugPrint("DEBUG: ADP_Ctrl_SemiHosting_GetVector.\n");#endif    return SendSubMessageGetWordAndCheckReply(ADP_Control, ADP_Ctrl_SemiHosting_GetVector, arg1);  case RDISemiHosting_SetARMSWI:#ifdef DEBUG    angel_DebugPrint("DEBUG: ADP_Ctrl_SemiHosting_SetARMSWI.\n");#endif    return SendSubMessageWordAndCheckReply(ADP_Control, ADP_Ctrl_SemiHosting_SetARMSWI, *arg1);  case RDISemiHosting_GetARMSWI:#ifdef DEBUG    angel_DebugPrint("DEBUG: ADP_Ctrl_SemiHosting_GetARMSWI.\n");#endif    return SendSubMessageGetWordAndCheckReply(ADP_Control, ADP_Ctrl_SemiHosting_GetARMSWI, arg1);  case RDISemiHosting_SetThumbSWI:#ifdef DEBUG    angel_DebugPrint("DEBUG: ADP_Ctrl_SemiHosting_SetThumbSWI.\n");#endif    return SendSubMessageWordAndCheckReply(ADP_Control, ADP_Ctrl_SemiHosting_SetThumbSWI, *arg1);  case RDISemiHosting_GetThumbSWI:#ifdef DEBUG    angel_DebugPrint("DEBUG: ADP_Ctrl_SemiHosting_GetThumbSWI.\n");#endif    return SendSubMessageGetWordAndCheckReply(ADP_Control, ADP_Ctrl_SemiHosting_GetThumbSWI, arg1);  case RDIInfo_SetTopMem:#ifdef DEBUG    angel_DebugPrint("DEBUG: ADP_Ctrl_SetTopMem.\n");#endif    return SendSubMessageWordAndCheckReply(ADP_Control, ADP_Ctrl_SetTopMem, *arg1);  case RDIPointStatus_Watch:#ifdef DEBUG    angel_DebugPrint("DEBUG: ADP_Ctrl_PointStatus_Watch.\n");#endif    register_debug_message_handler();    msgsend(CI_HADP, "%w%w%w%w%w%w", ADP_Control | HtoT, 0,            ADP_HandleUnknown, ADP_HandleUnknown,            ADP_Ctrl_PointStatus_Watch, *arg1 );    reason = ADP_Control |TtoH;    err = wait_for_debug_message(&reason, &debugID, &OSinfo1, &OSinfo2,                              &status, &packet);    if (err != RDIError_NoError) {      DevSW_FreePacket(packet);      return err;    }    unpack_message(BUFFERDATA(packet->pk_buffer), "%w%w%w%w%w%w%w%w", &reason,                   &debugID, &OSinfo1, &OSinfo2,  &subreason, &status,                   arg1, arg2);    if (subreason !=  ADP_Ctrl_PointStatus_Watch) {      DevSW_FreePacket(packet);      return RDIError_Error;    }    else      return status;  case RDIPointStatus_Break:#ifdef DEBUG    angel_DebugPrint("DEBUG: ADP_Ctrl_PointStatus_Break.\n");#endif    register_debug_message_handler();    msgsend(CI_HADP, "%w%w%w%w%w%w", ADP_Control | HtoT, 0,            ADP_HandleUnknown, ADP_HandleUnknown,            ADP_Ctrl_PointStatus_Break, *arg1 );    reason = ADP_Control |TtoH;    err = wait_for_debug_message(&reason, &debugID, &OSinfo1, &OSinfo2

⌨️ 快捷键说明

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