diff options
author | Stan Shebs <shebs@codesourcery.com> | 1999-04-16 01:34:07 +0000 |
---|---|---|
committer | Stan Shebs <shebs@codesourcery.com> | 1999-04-16 01:34:07 +0000 |
commit | 071ea11e85eb9d529cc5eb3d35f6247466a21b99 (patch) | |
tree | 5deda65b8d7b04d1f4cbc534c3206d328e1267ec /sim/arm/kid.c | |
parent | 1730ec6b1848f0f32154277f788fb29f88d8475b (diff) | |
download | ppe42-binutils-071ea11e85eb9d529cc5eb3d35f6247466a21b99.tar.gz ppe42-binutils-071ea11e85eb9d529cc5eb3d35f6247466a21b99.zip |
Initial creation of sourceware repository
Diffstat (limited to 'sim/arm/kid.c')
-rw-r--r-- | sim/arm/kid.c | 510 |
1 files changed, 0 insertions, 510 deletions
diff --git a/sim/arm/kid.c b/sim/arm/kid.c deleted file mode 100644 index 7a0a5210ff..0000000000 --- a/sim/arm/kid.c +++ /dev/null @@ -1,510 +0,0 @@ -/* kid.c -- ARMulator RDP/RDI interface: ARM6 Instruction Emulator. - Copyright (C) 1994 Advanced RISC Machines Ltd. - - 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 - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - 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., 675 Mass Ave, Cambridge, MA 02139, USA. */ - -/*****************************************************************/ -/* The child process continues here... */ -/* It waits on a pipe from the parent and translates the RDP */ -/* messages into RDI calls to the ARMulator passing RDP replies */ -/* back up a pipe to the parent. */ -/*****************************************************************/ - -#include <sys/types.h> -#include <signal.h> - -#include "armdefs.h" -#include "dbg_conf.h" -#include "dbg_hif.h" -#include "dbg_rdi.h" -#include "gdbhost.h" -#include "communicate.h" - -/* The pipes between the two processes */ -extern int mumkid[2]; -extern int kidmum[2]; - -/* The maximum number of file descriptors */ -extern int nfds; - -/* The machine name */ -#define MAXHOSTNAMELENGTH 64 -extern char localhost[MAXHOSTNAMELENGTH + 1]; - -/* The socket number */ -extern unsigned int socketnumber; - -/* RDI interface */ -extern const struct RDIProcVec armul_rdi; - -static int MYrdp_level = 0; - -static int rdi_state = 0; - -/**************************************************************/ -/* Signal handler that terminates excecution in the ARMulator */ -/**************************************************************/ -void kid_handlesignal(int sig) { -#ifdef DEBUG - 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); -} - -/********************************************************************/ -/* 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() { - char *p, *q; - int i, j, k; - long outofthebag; - unsigned char c, d, message; - ARMword x, y, z; - struct sigaction action; - PointHandle point; - Dbg_ConfigBlock config; - Dbg_HostosInterface hostif; - 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); - - 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_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; - } - } - 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, "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) -{ - char *p, *q; - int i, j, k; - unsigned char c, d, message; - ARMword x, y, z; - struct sigaction action; - PointHandle point; - Dbg_ConfigBlock config; - Dbg_HostosInterface hostif; - struct Dbg_MCState *MCState; - char command_line[256]; - struct fd_set readfds; - -#ifdef DEBUG - 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); - - 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); - } - } -} |