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