#include <stdio.h>
#include <sys/types.h>
#include <signal.h>
#include "time.h"
#include "armdefs.h"
#include "dbg_rdi.h"
#include "communicate.h"
extern int debugsock;
extern int mumkid[2];
extern int kidmum[2];
extern int DebuggerARMul[2];
extern int nfds;
extern pid_t child;
void
parent ()
{
int i, j, k;
unsigned char message, CPnum, exreturn;
ARMword mask, nbytes, messagetype;
unsigned char c, d;
ARMword x, y;
int virgin = 1;
struct fd_set readfds;
#ifdef DEBUG
fprintf (stderr, "parent ()...\n");
#endif
panic_error:
if (!virgin)
{
#ifdef DEBUG
fprintf (stderr, "Arghh! What is going on?\n");
#endif
kill (child, SIGHUP);
MYwrite_char (debugsock, RDP_Reset);
}
virgin = 0;
while (1)
{
FD_ZERO (&readfds);
FD_SET (kidmum[0], &readfds);
FD_SET (debugsock, &readfds);
#ifdef DEBUG
fprintf (stderr, "Waiting for ARMulator or debugger... ");
#endif
while ((i = select (nfds, &readfds, (fd_set *) 0, (fd_set *) 0, 0)) < 0)
{
perror ("select");
}
#ifdef DEBUG
fprintf (stderr, "(%d/2)", i);
#endif
if (FD_ISSET (debugsock, &readfds))
{
#ifdef DEBUG
fprintf (stderr, "->debugger\n");
#endif
if (MYread_char (debugsock, &message))
goto panic_error;
switch (message)
{
case RDP_Start:
#ifdef DEBUG
fprintf (stderr, "RDP Open\n");
#endif
if (MYread_char (debugsock, &c))
goto panic_error;
if (MYread_word (debugsock, &x))
goto panic_error;
MYwrite_char (mumkid[1], message);
MYwrite_char (mumkid[1], c);
MYwrite_word (mumkid[1], x);
if (c & 0x2)
{
passon (debugsock, mumkid[1], 1);
}
break;
case RDP_End:
#ifdef DEBUG
fprintf (stderr, "RDP Close\n");
#endif
MYwrite_char (mumkid[1], message);
break;
case RDP_Read:
#ifdef DEBUG
fprintf (stderr, "RDP Read Memory\n");
#endif
MYwrite_char (mumkid[1], message);
if (passon (debugsock, mumkid[1], 4))
goto panic_error;
if (MYread_word (debugsock, &nbytes))
goto panic_error;
MYwrite_word (mumkid[1], nbytes);
break;
case RDP_Write:
#ifdef DEBUG
fprintf (stderr, "RDP Write Memory\n");
#endif
if (MYread_word (debugsock, &x))
goto panic_error;
if (MYread_word (debugsock, &y))
goto panic_error;
MYwrite_char (mumkid[1], message);
MYwrite_word (mumkid[1], x);
MYwrite_word (mumkid[1], y);
passon (debugsock, mumkid[1], y);
break;
case RDP_CPUread:
#ifdef DEBUG
fprintf (stderr, "RDP Read CPU\n");
#endif
if (MYread_char (debugsock, &c))
goto panic_error;
if (MYread_word (debugsock, &mask))
goto panic_error;
MYwrite_char (mumkid[1], message);
MYwrite_char (mumkid[1], c);
MYwrite_word (mumkid[1], mask);
break;
case RDP_CPUwrite:
#ifdef DEBUG
fprintf (stderr, "RDP Write CPU\n");
#endif
if (MYread_char (debugsock, &c))
goto panic_error;
if (MYread_word (debugsock, &x))
goto panic_error;
MYwrite_char (mumkid[1], message);
MYwrite_char (mumkid[1], c);
MYwrite_word (mumkid[1], x);
for (k = 1, j = 0; k != 0x80000000; k *= 2, j++)
if ((k & x) && passon (debugsock, mumkid[1], 4))
goto panic_error;
break;
case RDP_CPread:
#ifdef DEBUG
fprintf (stderr, "RDP Read CP state\n");
#endif
if (MYread_char (debugsock, &CPnum))
goto panic_error;
if (MYread_word (debugsock, &mask))
goto panic_error;
MYwrite_char (mumkid[1], message);
MYwrite_char (mumkid[1], CPnum);
MYwrite_word (mumkid[1], mask);
break;
case RDP_CPwrite:
#ifdef DEBUG
fprintf (stderr, "RDP Write CP state\n");
#endif
if (MYread_char (debugsock, &CPnum))
goto panic_error;
if (MYread_word (debugsock, &mask))
goto panic_error;
MYwrite_char (mumkid[1], message);
MYwrite_char (mumkid[1], c);
MYwrite_char (mumkid[1], x);
for (k = 1, j = 0; k != 0x80000000; k *= 2, j++)
if (k & x)
{
if ((c == 1 || c == 2) && k <= 128)
{
if (passon (debugsock, mumkid[1], 16))
goto panic_error;
}
else
{
if (passon (debugsock, mumkid[1], 4))
goto panic_error;
}
}
break;
case RDP_SetBreak:
#ifdef DEBUG
fprintf (stderr, "RDP Set Breakpoint\n");
#endif
if (MYread_word (debugsock, &x))
goto panic_error;
if (MYread_char (debugsock, &c))
goto panic_error;
MYwrite_char (mumkid[1], message);
MYwrite_word (mumkid[1], x);
MYwrite_char (mumkid[1], c);
if (((c & 0xf) >= 5) && passon (debugsock, mumkid[1], 4))
goto panic_error;
break;
case RDP_ClearBreak:
#ifdef DEBUG
fprintf (stderr, "RDP Clear Breakpoint\n");
#endif
MYwrite_char (mumkid[1], message);
if (passon (debugsock, mumkid[1], 4))
goto panic_error;
break;
case RDP_SetWatch:
#ifdef DEBUG
fprintf (stderr, "RDP Set Watchpoint\n");
#endif
if (MYread_word (debugsock, &x))
goto panic_error;
if (MYread_char (debugsock, &c))
goto panic_error;
if (MYread_char (debugsock, &d))
goto panic_error;
MYwrite_char (mumkid[1], message);
MYwrite_word (mumkid[1], x);
MYwrite_char (mumkid[1], c);
MYwrite_char (mumkid[1], d);
if (((c & 0xf) >= 5) && passon (debugsock, mumkid[1], 4))
goto panic_error;
break;
case RDP_ClearWatch:
#ifdef DEBUG
fprintf (stderr, "RDP Clear Watchpoint\n");
#endif
MYwrite_char (mumkid[1], message);
if (passon (debugsock, mumkid[1], 4))
goto panic_error;
break;
case RDP_Execute:
#ifdef DEBUG
fprintf (stderr, "RDP Execute\n");
#endif
if (MYread_char (debugsock, &c))
goto panic_error;
exreturn = c;
MYwrite_char (mumkid[1], message);
MYwrite_char (mumkid[1], c);
break;
case RDP_Step:
#ifdef DEBUG
fprintf (stderr, "RDP Step\n");
#endif
if (MYread_char (debugsock, &c))
goto panic_error;
if (MYread_word (debugsock, &x))
goto panic_error;
MYwrite_char (mumkid[1], message);
MYwrite_char (mumkid[1], c);
MYwrite_word (mumkid[1], x);
break;
case RDP_Info:
#ifdef DEBUG
fprintf (stderr, "RDP Info\n");
#endif
if (MYread_word (debugsock, &messagetype))
goto panic_error;
switch (messagetype)
{
case RDIInfo_Target:
MYwrite_char (mumkid[1], message);
MYwrite_word (mumkid[1], messagetype);
break;
case RDISet_RDILevel:
MYwrite_char (mumkid[1], message);
MYwrite_word (mumkid[1], messagetype);
if (passon (debugsock, mumkid[1], 1))
goto panic_error;
break;
case RDISet_Cmdline:
MYwrite_char (mumkid[1], message);
MYwrite_word (mumkid[1], messagetype);
do
{
if (MYread_char (debugsock, &c))
goto panic_error;
MYwrite_char (mumkid[1], c);
}
while (c);
break;
case RDISignal_Stop:
kill (child, SIGUSR1);
MYwrite_char (debugsock, RDP_Return);
MYwrite_char (debugsock, RDIError_UserInterrupt);
break;
case RDIVector_Catch:
MYread_word (debugsock, &x);
MYwrite_char (mumkid[1], message);
MYwrite_word (mumkid[1], messagetype);
MYwrite_word (mumkid[1], x);
break;
case RDIInfo_Step:
MYwrite_char (mumkid[1], message);
MYwrite_word (mumkid[1], messagetype);
break;
case RDIInfo_Points:
MYwrite_char (mumkid[1], message);
MYwrite_word (mumkid[1], messagetype);
break;
default:
fprintf (stderr, "Unrecognized RDIInfo request %d\n",
messagetype);
goto panic_error;
}
break;
case RDP_OSOpReply:
#ifdef DEBUG
fprintf (stderr, "RDP OS Reply\n");
#endif
MYwrite_char (mumkid[1], message);
if (MYread_char (debugsock, &message))
goto panic_error;
MYwrite_char (mumkid[1], message);
switch (message)
{
case 0:
break;
case 1:
if (MYread_char (debugsock, &c))
goto panic_error;
MYwrite_char (mumkid[1], c);
break;
case 2:
if (MYread_word (debugsock, &x))
goto panic_error;
MYwrite_word (mumkid[1], x);
break;
}
break;
case RDP_Reset:
#ifdef DEBUG
fprintf (stderr, "RDP Reset\n");
#endif
MYwrite_char (mumkid[1], message);
break;
default:
fprintf (stderr, "RDP Bad RDP request (%d)\n", message);
MYwrite_char (debugsock, RDP_Return);
MYwrite_char (debugsock, RDIError_UnimplementedMessage);
break;
}
}
if (FD_ISSET (kidmum[0], &readfds))
{
#ifdef DEBUG
fprintf (stderr, "->ARMulator\n");
#endif
passon (kidmum[0], debugsock, 1);
}
}
}