📄 ardi.c
字号:
}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 + -