X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=sim%2Farm%2Fkid.c;h=491f6c88117e3b87daf519b967d1399dd2dd9f0c;hb=00923338dec84505addaf9cdeca2e9c844757824;hp=10e3f35821eb6a40d4471603fdd8746749cf9c2a;hpb=1996fae84682e8ddd146215dd2959ad1ec924c09;p=deliverable%2Fbinutils-gdb.git diff --git a/sim/arm/kid.c b/sim/arm/kid.c index 10e3f35821..491f6c8811 100644 --- a/sim/arm/kid.c +++ b/sim/arm/kid.c @@ -3,7 +3,7 @@ This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or + the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, @@ -12,8 +12,7 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + along with this program; if not, see . */ /*****************************************************************/ /* The child process continues here... */ @@ -56,22 +55,27 @@ static int rdi_state = 0; /**************************************************************/ /* Signal handler that terminates excecution in the ARMulator */ /**************************************************************/ -void kid_handlesignal(int sig) { +void +kid_handlesignal (int sig) +{ #ifdef DEBUG - fprintf(stderr, "Terminate ARMulator excecution\n"); + fprintf (stderr, "Terminate ARMulator excecution\n"); #endif - if (sig != SIGUSR1) { - fprintf(stderr, "Unsupported signal.\n"); - return; - } - armul_rdi.info(RDISignal_Stop, (unsigned long *) 0, (unsigned long *) 0); + if (sig != SIGUSR1) + { + fprintf (stderr, "Unsupported signal.\n"); + return; + } + armul_rdi.info (RDISignal_Stop, (unsigned long *) 0, (unsigned long *) 0); } /********************************************************************/ /* Waits on a pipe from the socket demon for RDP and */ /* acts as an RDP to RDI interpreter on the front of the ARMulator. */ /********************************************************************/ -void kid() { +void +kid () +{ char *p, *q; int i, j, k; long outofthebag; @@ -84,342 +88,363 @@ void kid() { struct Dbg_MCState *MCState; char command_line[256]; struct fd_set readfds; - + /* Setup a signal handler for SIGUSR1 */ action.sa_handler = kid_handlesignal; action.sa_mask = 0; action.sa_flags = 0; - - sigaction(SIGUSR1, &action, (struct sigaction *) 0); - + + sigaction (SIGUSR1, &action, (struct sigaction *) 0); + while (1) - { - /* Wait for ever */ - FD_ZERO(&readfds); - FD_SET(mumkid[0], &readfds); - - i = select(nfds, &readfds, - (fd_set *) 0, - (fd_set *) 0, - (struct timeval *) 0); - - if (i < 0) { - perror("select"); - } - - if (read(mumkid[0], &message, 1) < 1) { - perror("read"); - } + { + /* Wait for ever */ + FD_ZERO (&readfds); + FD_SET (mumkid[0], &readfds); + + i = select (nfds, &readfds, + (fd_set *) 0, (fd_set *) 0, (struct timeval *) 0); - switch (message) { - case RDP_Start : - /* Open and/or Initialise */ - BAG_newbag(); - - MYread_char(mumkid[0], &c); /* type */ - MYread_word(mumkid[0], &x); /* memorysize */ - if (c & 0x2) MYread_char(mumkid[0], &d); /* speed */ - config.processor = 0; - config.memorysize = x; - config.bytesex = (c & 0x4) ? RDISex_Big : RDISex_Little; - if (c & 0x8) config.bytesex = RDISex_DontCare; - - hostif.dbgprint = myprint; - hostif.dbgpause = mypause; - hostif.dbgarg = stdout; - hostif.writec = mywritec; - hostif.readc = myreadc; - hostif.write = mywrite; - hostif.gets = mygets; - hostif.reset = mypause; /* do nothing */ - hostif.resetarg = "Do I love resetting or what!\n"; - - if (rdi_state) - { - /* we have restarted, so kill off the existing run. */ - /* armul_rdi.close(); */ - } - i = armul_rdi.open(c & 0x3, &config, &hostif, MCState); - rdi_state = 1; - - MYwrite_char(kidmum[1], RDP_Return); - MYwrite_char(kidmum[1], (unsigned char) i); - - x = ~0x4; - armul_rdi.info(RDIVector_Catch, &x, 0); - - break; - - case RDP_End : - /* Close and Finalise */ - i = armul_rdi.close(); - rdi_state = 0; - MYwrite_char(kidmum[1], RDP_Return); - MYwrite_char(kidmum[1], (unsigned char) i); - break; - - case RDP_Read : - /* Read Memory Address */ - MYread_word(mumkid[0], &x); /* address */ - MYread_word(mumkid[0], &y); /* nbytes */ - p = (char *) malloc(y); - i = armul_rdi.read(x, p, (unsigned *) &y); - MYwrite_char(kidmum[1], RDP_Return); - for (k = 0; k < y; k++) - MYwrite_char(kidmum[1], p[k]); - free(p); - MYwrite_char(kidmum[1], (unsigned char) i); - if (i) - MYwrite_word(kidmum[1], y); /* number of bytes sent without error */ - break; - - case RDP_Write : - /* Write Memory Address */ - MYread_word(mumkid[0], &x); /* address */ - MYread_word(mumkid[0], &y); /* nbytes */ - p = (char *) malloc(y); - for (k = 0; k < y; k++) - MYread_char(mumkid[0], &p[k]); - i = armul_rdi.write(p, x, (unsigned *) &y); - free(p); - MYwrite_char(kidmum[1], RDP_Return); - MYwrite_char(kidmum[1], (unsigned char) i); - if (i) - MYwrite_word(kidmum[1], y); /* number of bytes sent without error */ - break; - - case RDP_CPUread : - /* Read CPU State */ - MYread_char(mumkid[0], &c); /* mode */ - MYread_word(mumkid[0], &x); /* mask */ - p = (char *) malloc(4 * RDINumCPURegs); - i = armul_rdi.CPUread(c, x, (ARMword *) p); - MYwrite_char(kidmum[1], RDP_Return); - for (k = 1, j = 0; k != 0x80000000; k *= 2) - if (k & x) MYwrite_word(kidmum[1], ((ARMword *) p)[j++]); - free(p); - if (i) MYwrite_char(kidmum[1], (unsigned char) j); - MYwrite_char(kidmum[1], (unsigned char) i); - break; - - case RDP_CPUwrite : - /* Write CPU State */ - MYread_char(mumkid[0], &c); /* mode */ - MYread_word(mumkid[0], &x); /* mask */ - - p = (char *) malloc(4 * RDINumCPURegs); - for (k = 1, j = 0; k != 0x80000000; k *= 2) - if (k & x) MYread_word(mumkid[0], &(((ARMword *) p)[j++])); - i = armul_rdi.CPUwrite(c, x, (ARMword *) p); - MYwrite_char(kidmum[1], RDP_Return); - MYwrite_char(kidmum[1], (unsigned char) i); - free(p); - break; - - case RDP_CPread : - /* Read Co-Processor State */ - MYread_char(mumkid[0], &c); /* CPnum */ - MYread_word(mumkid[0], &x); /* mask */ - p = q = (char *) malloc(16 * RDINumCPRegs); - i = armul_rdi.CPread(c, x, (ARMword *) p); - MYwrite_char(kidmum[1], RDP_Return); - for (k = 1, j = 0; k != 0x80000000; k *= 2, j++) - if (k & x) { - if ((c == 1 || c == 2) && k <= 128) { - MYwrite_FPword(kidmum[1], q); - q += 16; - } - else { - MYwrite_word(kidmum[1], *q); - q += 4; - } + if (i < 0) + { + perror ("select"); } - free(p); - if (i) MYwrite_char(kidmum[1], (unsigned char) j); - MYwrite_char(kidmum[1], (unsigned char) i); - break; - - case RDP_CPwrite : - /* Write Co-Processor State */ - MYread_char(mumkid[0], &c); /* CPnum */ - MYread_word(mumkid[0], &x); /* mask */ - p = q = (char *) malloc(16 * RDINumCPURegs); - for (k = 1, j = 0; k != 0x80000000; k *= 2, j++) - if (k & x) { - if ((c == 1 || c == 2) && k <= 128) { - MYread_FPword(kidmum[1], q); - q += 16; - } - else { - MYread_word(mumkid[0], (ARMword *) q); - q += 4; - } + + if (read (mumkid[0], &message, 1) < 1) + { + perror ("read"); } - i = armul_rdi.CPwrite(c, x, (ARMword *) p); - MYwrite_char(kidmum[1], RDP_Return); - MYwrite_char(kidmum[1], (unsigned char) i); - free(p); - break; - - case RDP_SetBreak : - /* Set Breakpoint */ - MYread_word(mumkid[0], &x); /* address */ - MYread_char(mumkid[0], &c); /* type */ - if ((c & 0xf) >= 5) MYread_word(mumkid[0], &y); /* bound */ - i = armul_rdi.setbreak(x, c, y, &point); - if (!MYrdp_level) BAG_putpair((long) x, (long) point); - MYwrite_char(kidmum[1], RDP_Return); - if (MYrdp_level) MYwrite_word(kidmum[1], point); - MYwrite_char(kidmum[1], (unsigned char) i); - break; - - case RDP_ClearBreak : - /* Clear Breakpoint */ - MYread_word(mumkid[0], &point); /* PointHandle */ - if (!MYrdp_level) { - BAG_getsecond((long) point, &outofthebag); /* swap pointhandle for address */ - BAG_killpair_byfirst(outofthebag); - point = outofthebag; - } - i = armul_rdi.clearbreak(point); - MYwrite_char(kidmum[1], RDP_Return); - MYwrite_char(kidmum[1], (unsigned char) i); - break; - - case RDP_SetWatch : - /* Set Watchpoint */ - MYread_word(mumkid[0], &x); /* address */ - MYread_char(mumkid[0], &c); /* type */ - MYread_char(mumkid[0], &d); /* datatype */ - if ((c & 0xf) >= 5) MYread_word(mumkid[0], &y); /* bound */ - i = armul_rdi.setwatch(x, c, d, y, &point); - MYwrite_char(kidmum[1], RDP_Return); - MYwrite_word(kidmum[1], point); - MYwrite_char(kidmum[1], (unsigned char) i); - break; - - case RDP_ClearWatch : - /* Clear Watchpoint */ - MYread_word(mumkid[0], &point); /* PointHandle */ - i = armul_rdi.clearwatch(point); - MYwrite_char(kidmum[1], RDP_Return); - MYwrite_char(kidmum[1], (unsigned char) i); - break; - - case RDP_Execute : - /* Excecute */ - - MYread_char(mumkid[0], &c); /* return */ -#ifdef DEBUG - fprintf(stderr, "Starting execution\n"); -#endif - i = armul_rdi.execute(&point); -#ifdef DEBUG - fprintf(stderr, "Completed execution\n"); -#endif - MYwrite_char(kidmum[1], RDP_Return); - if (c & 0x80) MYwrite_word(kidmum[1], point); - MYwrite_char(kidmum[1], (unsigned char) i); - break; - - case RDP_Step : - /* Step */ - MYread_char(mumkid[0], &c); /* return */ - MYread_word(mumkid[0], &x); /* ninstr */ - point = 0x87654321; - i = armul_rdi.step(x, &point); - MYwrite_char(kidmum[1], RDP_Return); - if (c & 0x80) MYwrite_word(kidmum[1], point); - MYwrite_char(kidmum[1], (unsigned char) i); - break; - - case RDP_Info: - /* Info */ - MYread_word (mumkid[0], &x); - switch (x) + switch (message) { - case RDIInfo_Target: - i = armul_rdi.info (RDIInfo_Target, &y, &z); + case RDP_Start: + /* Open and/or Initialise */ + BAG_newbag (); + + MYread_char (mumkid[0], &c); /* type */ + MYread_word (mumkid[0], &x); /* memorysize */ + if (c & 0x2) + MYread_char (mumkid[0], &d); /* speed */ + config.processor = 0; + config.memorysize = x; + config.bytesex = (c & 0x4) ? RDISex_Big : RDISex_Little; + if (c & 0x8) + config.bytesex = RDISex_DontCare; + + hostif.dbgprint = myprint; + hostif.dbgpause = mypause; + hostif.dbgarg = stdout; + hostif.writec = mywritec; + hostif.readc = myreadc; + hostif.write = mywrite; + hostif.gets = mygets; + hostif.reset = mypause; /* do nothing */ + hostif.resetarg = "Do I love resetting or what!\n"; + + if (rdi_state) + { + /* we have restarted, so kill off the existing run. */ + /* armul_rdi.close(); */ + } + i = armul_rdi.open (c & 0x3, &config, &hostif, MCState); + rdi_state = 1; + MYwrite_char (kidmum[1], RDP_Return); - MYwrite_word (kidmum[1], y); /* Loads of info... */ - MYwrite_word (kidmum[1], z); /* Model */ MYwrite_char (kidmum[1], (unsigned char) i); + + x = ~0x4; + armul_rdi.info (RDIVector_Catch, &x, 0); + break; - case RDISet_RDILevel: - MYread_word (mumkid[0], &x); /* arg1, debug level */ - i = armul_rdi.info (RDISet_RDILevel, &x, 0); - if (i == RDIError_NoError) - MYrdp_level = x; + case RDP_End: + /* Close and Finalise */ + i = armul_rdi.close (); + rdi_state = 0; MYwrite_char (kidmum[1], RDP_Return); MYwrite_char (kidmum[1], (unsigned char) i); break; - case RDISet_Cmdline: - for (p = command_line; MYread_char (mumkid[0], p), *p; p++) - ; /* String */ - i = armul_rdi.info (RDISet_Cmdline, - (unsigned long *) command_line, 0); + case RDP_Read: + /* Read Memory Address */ + MYread_word (mumkid[0], &x); /* address */ + MYread_word (mumkid[0], &y); /* nbytes */ + p = (char *) malloc (y); + i = armul_rdi.read (x, p, (unsigned *) &y); MYwrite_char (kidmum[1], RDP_Return); + for (k = 0; k < y; k++) + MYwrite_char (kidmum[1], p[k]); + free (p); MYwrite_char (kidmum[1], (unsigned char) i); + if (i) + MYwrite_word (kidmum[1], y); /* number of bytes sent without error */ break; - case RDIInfo_Step: - i = armul_rdi.info (RDIInfo_Step, &x, 0); + case RDP_Write: + /* Write Memory Address */ + MYread_word (mumkid[0], &x); /* address */ + MYread_word (mumkid[0], &y); /* nbytes */ + p = (char *) malloc (y); + for (k = 0; k < y; k++) + MYread_char (mumkid[0], &p[k]); + i = armul_rdi.write (p, x, (unsigned *) &y); + free (p); MYwrite_char (kidmum[1], RDP_Return); - MYwrite_word (kidmum[1], x); MYwrite_char (kidmum[1], (unsigned char) i); + if (i) + MYwrite_word (kidmum[1], y); /* number of bytes sent without error */ break; - case RDIVector_Catch: - MYread_word (mumkid[0], &x); - i = armul_rdi.info (RDIVector_Catch, &x, 0); + case RDP_CPUread: + /* Read CPU State */ + MYread_char (mumkid[0], &c); /* mode */ + MYread_word (mumkid[0], &x); /* mask */ + p = (char *) malloc (4 * RDINumCPURegs); + i = armul_rdi.CPUread (c, x, (ARMword *) p); MYwrite_char (kidmum[1], RDP_Return); - MYwrite_char (kidmum[1], i); + for (k = 1, j = 0; k != 0x80000000; k *= 2) + if (k & x) + MYwrite_word (kidmum[1], ((ARMword *) p)[j++]); + free (p); + if (i) + MYwrite_char (kidmum[1], (unsigned char) j); + MYwrite_char (kidmum[1], (unsigned char) i); break; - case RDIInfo_Points: - i = armul_rdi.info (RDIInfo_Points, &x, 0); + case RDP_CPUwrite: + /* Write CPU State */ + MYread_char (mumkid[0], &c); /* mode */ + MYread_word (mumkid[0], &x); /* mask */ + + p = (char *) malloc (4 * RDINumCPURegs); + for (k = 1, j = 0; k != 0x80000000; k *= 2) + if (k & x) + MYread_word (mumkid[0], &(((ARMword *) p)[j++])); + i = armul_rdi.CPUwrite (c, x, (ARMword *) p); MYwrite_char (kidmum[1], RDP_Return); - MYwrite_word (kidmum[1], x); MYwrite_char (kidmum[1], (unsigned char) i); + free (p); break; + case RDP_CPread: + /* Read Co-Processor State */ + MYread_char (mumkid[0], &c); /* CPnum */ + MYread_word (mumkid[0], &x); /* mask */ + p = q = (char *) malloc (16 * RDINumCPRegs); + i = armul_rdi.CPread (c, x, (ARMword *) p); + MYwrite_char (kidmum[1], RDP_Return); + for (k = 1, j = 0; k != 0x80000000; k *= 2, j++) + if (k & x) + { + if ((c == 1 || c == 2) && k <= 128) + { + MYwrite_FPword (kidmum[1], q); + q += 16; + } + else + { + MYwrite_word (kidmum[1], *q); + q += 4; + } + } + free (p); + if (i) + MYwrite_char (kidmum[1], (unsigned char) j); + MYwrite_char (kidmum[1], (unsigned char) i); + break; + + case RDP_CPwrite: + /* Write Co-Processor State */ + MYread_char (mumkid[0], &c); /* CPnum */ + MYread_word (mumkid[0], &x); /* mask */ + p = q = (char *) malloc (16 * RDINumCPURegs); + for (k = 1, j = 0; k != 0x80000000; k *= 2, j++) + if (k & x) + { + if ((c == 1 || c == 2) && k <= 128) + { + MYread_FPword (kidmum[1], q); + q += 16; + } + else + { + MYread_word (mumkid[0], (ARMword *) q); + q += 4; + } + } + i = armul_rdi.CPwrite (c, x, (ARMword *) p); + MYwrite_char (kidmum[1], RDP_Return); + MYwrite_char (kidmum[1], (unsigned char) i); + free (p); + break; + + case RDP_SetBreak: + /* Set Breakpoint */ + MYread_word (mumkid[0], &x); /* address */ + MYread_char (mumkid[0], &c); /* type */ + if ((c & 0xf) >= 5) + MYread_word (mumkid[0], &y); /* bound */ + i = armul_rdi.setbreak (x, c, y, &point); + if (!MYrdp_level) + BAG_putpair ((long) x, (long) point); + MYwrite_char (kidmum[1], RDP_Return); + if (MYrdp_level) + MYwrite_word (kidmum[1], point); + MYwrite_char (kidmum[1], (unsigned char) i); + break; + + case RDP_ClearBreak: + /* Clear Breakpoint */ + MYread_word (mumkid[0], &point); /* PointHandle */ + if (!MYrdp_level) + { + BAG_getsecond ((long) point, &outofthebag); /* swap pointhandle for address */ + BAG_killpair_byfirst (outofthebag); + point = outofthebag; + } + i = armul_rdi.clearbreak (point); + MYwrite_char (kidmum[1], RDP_Return); + MYwrite_char (kidmum[1], (unsigned char) i); + break; + + case RDP_SetWatch: + /* Set Watchpoint */ + MYread_word (mumkid[0], &x); /* address */ + MYread_char (mumkid[0], &c); /* type */ + MYread_char (mumkid[0], &d); /* datatype */ + if ((c & 0xf) >= 5) + MYread_word (mumkid[0], &y); /* bound */ + i = armul_rdi.setwatch (x, c, d, y, &point); + MYwrite_char (kidmum[1], RDP_Return); + MYwrite_word (kidmum[1], point); + MYwrite_char (kidmum[1], (unsigned char) i); + break; + + case RDP_ClearWatch: + /* Clear Watchpoint */ + MYread_word (mumkid[0], &point); /* PointHandle */ + i = armul_rdi.clearwatch (point); + MYwrite_char (kidmum[1], RDP_Return); + MYwrite_char (kidmum[1], (unsigned char) i); + break; + + case RDP_Execute: + /* Excecute */ + + MYread_char (mumkid[0], &c); /* return */ + +#ifdef DEBUG + fprintf (stderr, "Starting execution\n"); +#endif + i = armul_rdi.execute (&point); +#ifdef DEBUG + fprintf (stderr, "Completed execution\n"); +#endif + MYwrite_char (kidmum[1], RDP_Return); + if (c & 0x80) + MYwrite_word (kidmum[1], point); + MYwrite_char (kidmum[1], (unsigned char) i); + break; + + case RDP_Step: + /* Step */ + MYread_char (mumkid[0], &c); /* return */ + MYread_word (mumkid[0], &x); /* ninstr */ + point = 0x87654321; + i = armul_rdi.step (x, &point); + MYwrite_char (kidmum[1], RDP_Return); + if (c & 0x80) + MYwrite_word (kidmum[1], point); + MYwrite_char (kidmum[1], (unsigned char) i); + break; + + case RDP_Info: + /* Info */ + MYread_word (mumkid[0], &x); + switch (x) + { + case RDIInfo_Target: + i = armul_rdi.info (RDIInfo_Target, &y, &z); + MYwrite_char (kidmum[1], RDP_Return); + MYwrite_word (kidmum[1], y); /* Loads of info... */ + MYwrite_word (kidmum[1], z); /* Model */ + MYwrite_char (kidmum[1], (unsigned char) i); + break; + + case RDISet_RDILevel: + MYread_word (mumkid[0], &x); /* arg1, debug level */ + i = armul_rdi.info (RDISet_RDILevel, &x, 0); + if (i == RDIError_NoError) + MYrdp_level = x; + MYwrite_char (kidmum[1], RDP_Return); + MYwrite_char (kidmum[1], (unsigned char) i); + break; + + case RDISet_Cmdline: + for (p = command_line; MYread_char (mumkid[0], p), *p; p++) + ; /* String */ + i = armul_rdi.info (RDISet_Cmdline, + (unsigned long *) command_line, 0); + MYwrite_char (kidmum[1], RDP_Return); + MYwrite_char (kidmum[1], (unsigned char) i); + break; + + case RDIInfo_Step: + i = armul_rdi.info (RDIInfo_Step, &x, 0); + MYwrite_char (kidmum[1], RDP_Return); + MYwrite_word (kidmum[1], x); + MYwrite_char (kidmum[1], (unsigned char) i); + break; + + case RDIVector_Catch: + MYread_word (mumkid[0], &x); + i = armul_rdi.info (RDIVector_Catch, &x, 0); + MYwrite_char (kidmum[1], RDP_Return); + MYwrite_char (kidmum[1], i); + break; + + case RDIInfo_Points: + i = armul_rdi.info (RDIInfo_Points, &x, 0); + MYwrite_char (kidmum[1], RDP_Return); + MYwrite_word (kidmum[1], x); + MYwrite_char (kidmum[1], (unsigned char) i); + break; + + default: + fprintf (stderr, "Unsupported info code %d\n", x); + break; + } + break; + + case RDP_OSOpReply: + /* OS Operation Reply */ + MYwrite_char (kidmum[1], RDP_Fatal); + break; + + case RDP_Reset: + /* Reset */ + for (i = 0; i < 50; i++) + MYwrite_char (kidmum[1], RDP_Reset); + p = (char *) malloc (MAXHOSTNAMELENGTH + 5 + 20); + sprintf (p, "Running on %s:%d\n", localhost, socketnumber); + MYwrite_string (kidmum[1], p); + free (p); + + break; default: - fprintf (stderr, "Unsupported info code %d\n", x); + fprintf (stderr, "Oh dear: Something is seriously wrong :-(\n"); + /* Hmm.. bad RDP operation */ break; } - break; - - case RDP_OSOpReply: - /* OS Operation Reply */ - MYwrite_char (kidmum[1], RDP_Fatal); - break; - - case RDP_Reset: - /* Reset */ - for (i = 0; i < 50; i++) - MYwrite_char(kidmum[1], RDP_Reset); - p = (char *) malloc(MAXHOSTNAMELENGTH + 5 + 20); - sprintf(p, "Running on %s:%d\n", localhost, socketnumber); - MYwrite_string(kidmum[1], p); - free(p); - - break; - default: - fprintf (stderr, "Oh dear: Something is seriously wrong :-(\n"); - /* Hmm.. bad RDP operation */ - break; } - } } /* Handles memory read operations until an OS Operation Reply Message is */ /* encounterd. It then returns the byte info value (0, 1, or 2) and fills */ /* in 'putinr0' with the data if appropriate. */ -int wait_for_osreply(ARMword *reply) +int +wait_for_osreply (ARMword * reply) { char *p, *q; int i, j, k; @@ -432,79 +457,83 @@ int wait_for_osreply(ARMword *reply) struct Dbg_MCState *MCState; char command_line[256]; struct fd_set readfds; - + #ifdef DEBUG - fprintf(stderr, "wait_for_osreply ().\n"); + fprintf (stderr, "wait_for_osreply ().\n"); #endif /* Setup a signal handler for SIGUSR1 */ action.sa_handler = kid_handlesignal; action.sa_mask = 0; action.sa_flags = 0; - - sigaction(SIGUSR1, &action, (struct sigaction *) 0); - + + sigaction (SIGUSR1, &action, (struct sigaction *) 0); + while (1) - { - /* Wait for ever */ - FD_ZERO(&readfds); - FD_SET(mumkid[0], &readfds); - - i = select(nfds, &readfds, - (fd_set *) 0, - (fd_set *) 0, - (struct timeval *) 0); - - if (i < 0) { - perror("select"); - } - - if (read(mumkid[0], &message, 1) < 1) { - perror("read"); - } - - switch (message) { - case RDP_Read : - /* Read Memory Address */ - MYread_word(mumkid[0], &x); /* address */ - MYread_word(mumkid[0], &y); /* nbytes */ - p = (char *) malloc(y); - i = armul_rdi.read(x, p, (unsigned *) &y); - MYwrite_char(kidmum[1], RDP_Return); - for (k = 0; k < y; k++) - MYwrite_char(kidmum[1], p[k]); - free(p); - MYwrite_char(kidmum[1], (unsigned char) i); - if (i) - MYwrite_word(kidmum[1], y); /* number of bytes sent without error */ - break; - - case RDP_Write : - /* Write Memory Address */ - MYread_word(mumkid[0], &x); /* address */ - MYread_word(mumkid[0], &y); /* nbytes */ - p = (char *) malloc(y); - for (k = 0; k < y; k++) - MYread_char(mumkid[0], &p[k]); - i = armul_rdi.write(p, x, (unsigned *) &y); - free(p); - MYwrite_char(kidmum[1], RDP_Return); - MYwrite_char(kidmum[1], (unsigned char) i); - if (i) - MYwrite_word(kidmum[1], y); /* number of bytes sent without error */ - break; - - case RDP_OSOpReply : - /* OS Operation Reply */ - MYread_char(mumkid[0], &c); - if (c == 1) MYread_char(mumkid[0], (char *) reply); - if (c == 2) MYread_word(mumkid[0], reply); - return c; - break; - - default : - fprintf(stderr, "HELP! Unaccounted-for message during OS request. \n"); - MYwrite_char(kidmum[1], RDP_Fatal); + { + /* Wait for ever */ + FD_ZERO (&readfds); + FD_SET (mumkid[0], &readfds); + + i = select (nfds, &readfds, + (fd_set *) 0, (fd_set *) 0, (struct timeval *) 0); + + if (i < 0) + { + perror ("select"); + } + + if (read (mumkid[0], &message, 1) < 1) + { + perror ("read"); + } + + switch (message) + { + case RDP_Read: + /* Read Memory Address */ + MYread_word (mumkid[0], &x); /* address */ + MYread_word (mumkid[0], &y); /* nbytes */ + p = (char *) malloc (y); + i = armul_rdi.read (x, p, (unsigned *) &y); + MYwrite_char (kidmum[1], RDP_Return); + for (k = 0; k < y; k++) + MYwrite_char (kidmum[1], p[k]); + free (p); + MYwrite_char (kidmum[1], (unsigned char) i); + if (i) + MYwrite_word (kidmum[1], y); /* number of bytes sent without error */ + break; + + case RDP_Write: + /* Write Memory Address */ + MYread_word (mumkid[0], &x); /* address */ + MYread_word (mumkid[0], &y); /* nbytes */ + p = (char *) malloc (y); + for (k = 0; k < y; k++) + MYread_char (mumkid[0], &p[k]); + i = armul_rdi.write (p, x, (unsigned *) &y); + free (p); + MYwrite_char (kidmum[1], RDP_Return); + MYwrite_char (kidmum[1], (unsigned char) i); + if (i) + MYwrite_word (kidmum[1], y); /* number of bytes sent without error */ + break; + + case RDP_OSOpReply: + /* OS Operation Reply */ + MYread_char (mumkid[0], &c); + if (c == 1) + MYread_char (mumkid[0], (char *) reply); + if (c == 2) + MYread_word (mumkid[0], reply); + return c; + break; + + default: + fprintf (stderr, + "HELP! Unaccounted-for message during OS request. \n"); + MYwrite_char (kidmum[1], RDP_Fatal); + } } - } }