X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fremote-udi.c;h=6ade3e4804404caf30f4ff8ab962cbe24c68b3bf;hb=80948f392bb653cb29514db15c176d218c2f4c2d;hp=7f7d0d377733ef9e4ef32cfcb7fff3d7e1d7119b;hpb=199b2450f62ad6ffbe56ec34fc447716b811579d;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/remote-udi.c b/gdb/remote-udi.c index 7f7d0d3777..6ade3e4804 100644 --- a/gdb/remote-udi.c +++ b/gdb/remote-udi.c @@ -1,5 +1,5 @@ /* Remote debugging interface for AMD 29k interfaced via UDI, for GDB. - Copyright 1990, 1992 Free Software Foundation, Inc. + Copyright 1990, 1992, 1995 Free Software Foundation, Inc. Written by Daniel Mann. Contributed by AMD. This file is part of GDB. @@ -16,7 +16,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., 675 Mass Ave, Cambridge, MA 02139, USA. */ +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* This is like remote.c but uses the Universal Debug Interface (UDI) to talk to the target hardware (or simulator). UDI is a TCP/IP based @@ -32,6 +32,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ MiniMON interface with UDI-p interface. */ #include "defs.h" +#include "frame.h" #include "inferior.h" #include "wait.h" #include "value.h" @@ -39,7 +40,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include #include #include -#include +#include "gdb_string.h" #include "terminal.h" #include "target.h" #include "29k-share/udi/udiproc.h" @@ -52,7 +53,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ extern int stop_soon_quietly; /* for wait_for_inferior */ extern struct value *call_function_by_hand(); -static void udi_resume PARAMS ((int pid, int step, int sig)); +static void udi_resume PARAMS ((int pid, int step, enum target_signal sig)); static void udi_fetch_registers PARAMS ((int regno)); static void udi_load PARAMS ((char *args, int from_tty)); static void fetch_register PARAMS ((int regno)); @@ -84,6 +85,7 @@ extern struct target_ops udi_ops; /* Forward declaration */ starts. */ UDISessionId udi_session_id = -1; +static char *udi_config_id; CPUOffset IMemStart = 0; CPUSizeT IMemSize = 0; @@ -115,10 +117,6 @@ extern char dfe_errmsg[]; /* error string */ /* malloc'd name of the program on the remote system. */ static char *prog_name = NULL; -/* Number of SIGTRAPs we need to simulate. That is, the next - NEED_ARTIFICIAL_TRAP calls to udi_wait should just return - SIGTRAP without actually waiting for anything. */ - /* This is called not only when we first attach, but also when the user types "run" after having attached. */ @@ -143,8 +141,11 @@ udi_create_inferior (execfile, args, env) if (udi_session_id < 0) { - printf_unfiltered("UDI connection not open yet.\n"); - return; + /* If the TIP is not open, open it. */ + if (UDIConnect (udi_config_id, &udi_session_id)) + error("UDIConnect() failed: %s\n", dfe_errmsg); + /* We will need to download the program. */ + entry.Offset = 0; } inferior_pid = 40000; @@ -154,7 +155,19 @@ udi_create_inferior (execfile, args, env) args1 = alloca (strlen(execfile) + strlen(args) + 2); - strcpy (args1, execfile); + if (execfile[0] == '\0') + + /* It is empty. We need to quote it somehow, or else the target + will think there is no argument being passed here. According + to the UDI spec it is quoted "according to TIP OS rules" which + I guess means quoting it like the Unix shell should work + (sounds pretty bogus to me...). In fact it doesn't work (with + isstip anyway), but passing in two quotes as the argument seems + like a reasonable enough behavior anyway (I guess). */ + + strcpy (args1, "''"); + else + strcpy (args1, execfile); strcat (args1, " "); strcat (args1, args); @@ -167,7 +180,7 @@ udi_create_inferior (execfile, args, env) init_wait_for_inferior (); clear_proceed_status (); - proceed(-1,-1,0); + proceed (-1, TARGET_SIGNAL_DEFAULT, 0); } static void @@ -180,6 +193,9 @@ udi_mourn() to work between "target udi" and "run", so why not now? */ pop_target (); /* Pop back to no-child state */ #endif + /* But if we're going to want to run it again, we better remove the + breakpoints... */ + remove_breakpoints (); generic_mourn_inferior (); } @@ -192,7 +208,6 @@ udi_mourn() /* XXX - need cleanups for udiconnect for various failures!!! */ -static char *udi_config_id; static void udi_open (name, from_tty) char *name; @@ -224,6 +239,7 @@ udi_open (name, from_tty) udi_config_id = strdup (strtok (name, " \t")); if (UDIConnect (udi_config_id, &udi_session_id)) + /* FIXME: Should set udi_session_id to -1 here. */ error("UDIConnect() failed: %s\n", dfe_errmsg); push_target (&udi_ops); @@ -292,10 +308,15 @@ udi_close (quitting) /*FIXME: how is quitting used */ return; /* We should never get here if there isn't something valid in - udi_session_id. */ + udi_session_id. */ if (UDIDisconnect (udi_session_id, UDITerminateSession)) - error ("UDIDisconnect() failed in udi_close"); + { + if (quitting) + warning ("UDIDisconnect() failed in udi_close"); + else + error ("UDIDisconnect() failed in udi_close"); + } /* Do not try to close udi_session_id again, later in the program. */ udi_session_id = -1; @@ -321,6 +342,9 @@ udi_attach (args, from_tty) UDIBool HostEndian = 0; UDIError err; + if (args == NULL) + error_no_arg ("program to attach"); + if (udi_session_id < 0) error ("UDI connection not opened yet, use the 'target udi' command.\n"); @@ -349,10 +373,15 @@ udi_detach (args,from_tty) if (UDIDisconnect (udi_session_id, UDIContinueSession)) error ("UDIDisconnect() failed in udi_detach"); - pop_target(); /* calls udi_close to do the real work */ + /* Don't try to UDIDisconnect it again in udi_close, which is called from + pop_target. */ + udi_session_id = -1; + inferior_pid = 0; + + pop_target(); if (from_tty) - printf_unfiltered ("Ending remote debugging\n"); + printf_unfiltered ("Detaching from TIP\n"); } @@ -361,7 +390,8 @@ udi_detach (args,from_tty) static void udi_resume (pid, step, sig) - int pid, step, sig; + int pid, step; + enum target_signal sig; { UDIError tip_error; UDIUInt32 Steps = 1; @@ -389,7 +419,7 @@ udi_resume (pid, step, sig) static int udi_wait (pid, status) int pid; - WAITTYPE *status; + struct target_waitstatus *status; { UDIInt32 MaxTime; UDIPId PId; @@ -399,7 +429,8 @@ udi_wait (pid, status) int old_immediate_quit = immediate_quit; int i; - WSETEXIT ((*status), 0); + status->kind = TARGET_WAITKIND_EXITED; + status->value.integer = 0; /* wait for message to arrive. It should be: If the target stops executing, udi_wait() should return. @@ -416,17 +447,18 @@ udi_wait (pid, status) switch (StopReason & UDIGrossState) { - case UDIGdb_StdoutReady: - if (UDIGetGdb_Stdout (sbuf, (UDISizeT)SBUF_MAX, &CountDone)) + case UDIStdoutReady: + if (UDIGetStdout (sbuf, (UDISizeT)SBUF_MAX, &CountDone)) /* This is said to happen if the program tries to output a whole bunch of output (more than SBUF_MAX, I would guess). It doesn't seem to happen with the simulator. */ - warning ("UDIGetGdb_Stdout() failed in udi_wait"); + warning ("UDIGetStdout() failed in udi_wait"); fwrite (sbuf, 1, CountDone, gdb_stdout); gdb_flush(gdb_stdout); continue; - case UDIGdb_StderrReady: - UDIGetGdb_Stderr (sbuf, (UDISizeT)SBUF_MAX, &CountDone); + + case UDIStderrReady: + UDIGetStderr (sbuf, (UDISizeT)SBUF_MAX, &CountDone); fwrite (sbuf, 1, CountDone, gdb_stderr); gdb_flush(gdb_stderr); continue; @@ -462,21 +494,26 @@ udi_wait (pid, status) case UDITrapped: printf_unfiltered("Am290*0 received vector number %d\n", StopReason >> 24); - switch (StopReason >> 8) + switch ((StopReason >> 8 ) & 0xff) { case 0: /* Illegal opcode */ printf_unfiltered(" (break point)\n"); - WSETSTOP ((*status), SIGTRAP); + status->kind = TARGET_WAITKIND_STOPPED; + status->value.sig = TARGET_SIGNAL_TRAP; break; case 1: /* Unaligned Access */ - WSETSTOP ((*status), SIGBUS); + status->kind = TARGET_WAITKIND_STOPPED; + status->value.sig = TARGET_SIGNAL_BUS; break; case 3: case 4: - WSETSTOP ((*status), SIGFPE); + status->kind = TARGET_WAITKIND_STOPPED; + status->value.sig = TARGET_SIGNAL_FPE; break; case 5: /* Protection Violation */ - WSETSTOP ((*status), SIGILL); + status->kind = TARGET_WAITKIND_STOPPED; + /* Why not SEGV? What is a Protection Violation? */ + status->value.sig = TARGET_SIGNAL_ILL; break; case 6: case 7: @@ -484,17 +521,21 @@ udi_wait (pid, status) case 9: /* User Data Mapping Miss */ case 10: /* Supervisor Instruction Mapping Miss */ case 11: /* Supervisor Data Mapping Miss */ - WSETSTOP ((*status), SIGSEGV); + status->kind = TARGET_WAITKIND_STOPPED; + status->value.sig = TARGET_SIGNAL_SEGV; break; case 12: case 13: - WSETSTOP ((*status), SIGILL); + status->kind = TARGET_WAITKIND_STOPPED; + status->value.sig = TARGET_SIGNAL_ILL; break; case 14: /* Timer */ - WSETSTOP ((*status), SIGALRM); + status->kind = TARGET_WAITKIND_STOPPED; + status->value.sig = TARGET_SIGNAL_ALRM; break; case 15: /* Trace */ - WSETSTOP ((*status), SIGTRAP); + status->kind = TARGET_WAITKIND_STOPPED; + status->value.sig = TARGET_SIGNAL_TRAP; break; case 16: /* INTR0 */ case 17: /* INTR1 */ @@ -502,40 +543,52 @@ udi_wait (pid, status) case 19: /* INTR3/Internal */ case 20: /* TRAP0 */ case 21: /* TRAP1 */ - WSETSTOP ((*status), SIGINT); + status->kind = TARGET_WAITKIND_STOPPED; + status->value.sig = TARGET_SIGNAL_INT; break; case 22: /* Floating-Point Exception */ - WSETSTOP ((*status), SIGILL); + status->kind = TARGET_WAITKIND_STOPPED; + /* Why not FPE? */ + status->value.sig = TARGET_SIGNAL_ILL; break; case 77: /* assert 77 */ - WSETSTOP ((*status), SIGTRAP); + status->kind = TARGET_WAITKIND_STOPPED; + status->value.sig = TARGET_SIGNAL_TRAP; break; default: - WSETEXIT ((*status), 0); + status->kind = TARGET_WAITKIND_EXITED; + status->value.integer = 0; } break; case UDINotExecuting: - WSETSTOP ((*status), SIGTERM); + status->kind = TARGET_WAITKIND_STOPPED; + status->value.sig = TARGET_SIGNAL_TERM; break; case UDIStopped: - WSETSTOP ((*status), SIGTSTP); + status->kind = TARGET_WAITKIND_STOPPED; + status->value.sig = TARGET_SIGNAL_TSTP; break; case UDIWarned: - WSETSTOP ((*status), SIGURG); + status->kind = TARGET_WAITKIND_STOPPED; + status->value.sig = TARGET_SIGNAL_URG; break; case UDIStepped: case UDIBreak: - WSETSTOP ((*status), SIGTRAP); + status->kind = TARGET_WAITKIND_STOPPED; + status->value.sig = TARGET_SIGNAL_TRAP; break; case UDIWaiting: - WSETSTOP ((*status), SIGSTOP); + status->kind = TARGET_WAITKIND_STOPPED; + status->value.sig = TARGET_SIGNAL_STOP; break; case UDIHalted: - WSETSTOP ((*status), SIGKILL); + status->kind = TARGET_WAITKIND_STOPPED; + status->value.sig = TARGET_SIGNAL_KILL; break; case UDIExited: default: - WSETEXIT ((*status), 0); + status->kind = TARGET_WAITKIND_EXITED; + status->value.integer = 0; } timeout = old_timeout; /* Restore original timeout value */ @@ -890,8 +943,10 @@ udi_xfer_inferior_memory (memaddr, myaddr, len, write) static void udi_files_info () { - printf_unfiltered ("\tAttached to UDI socket to %s and running program %s.\n", - udi_config_id, prog_name); + printf_unfiltered ("\tAttached to UDI socket to %s", udi_config_id); + if (prog_name != NULL) + printf_unfiltered ("and running program %s", prog_name); + printf_unfiltered (".\n"); } /**************************************************** UDI_INSERT_BREAKPOINT */ @@ -969,10 +1024,23 @@ just invoke udi_close, which seems to get things right. if (from_tty) printf_unfiltered("Target has been stopped."); -#else +#endif /* 0 */ +#if 0 udi_close(0); -#endif pop_target(); +#endif /* 0 */ + + /* Keep the target around, e.g. so "run" can do the right thing when + we are already debugging something. */ + + if (UDIDisconnect (udi_session_id, UDITerminateSession)) + { + warning ("UDIDisconnect() failed"); + } + + /* Do not try to close udi_session_id again, later in the program. */ + udi_session_id = -1; + inferior_pid = 0; } /* @@ -1071,8 +1139,13 @@ download(load_arg_string, from_tty) pbfd = bfd_openr (filename, gnutarget); if (!pbfd) + /* FIXME: should be using bfd_errmsg, not assuming it was + bfd_error_system_call. */ perror_with_name (filename); + /* FIXME: should be checking for errors from bfd_close (for one thing, + on error it does not free all the storage associated with the + bfd). */ make_cleanup (bfd_close, pbfd); QUIT; @@ -1214,18 +1287,23 @@ download(load_arg_string, from_tty) immediate_quit--; } -/* User interface to download an image into the remote target. See download() - * for details on args. - */ +/* Function to download an image into the remote target. */ static void -udi_load(args, from_tty) +udi_load (args, from_tty) char *args; int from_tty; { download (args, from_tty); - symbol_file_add (strtok (args, " \t"), from_tty, 0, 0, 0, 0); + /* As a convenience, pick up any symbol info that is in the program + being loaded. Note that we assume that the program is the``mainline''; + if this is not always true, then this code will need to be augmented. */ + symbol_file_add (strtok (args, " \t"), from_tty, 0, 1, 0, 0); + + /* Getting new symbols may change our opinion about what is + frameless. */ + reinit_frame_cache (); } /*************************************************** UDI_WRITE_INFERIOR_MEMORY @@ -1253,7 +1331,7 @@ udi_write_inferior_memory (memaddr, myaddr, len) if (Count > MAXDATA) Count = MAXDATA; To.Offset = memaddr + nwritten; if(UDIWrite(From, To, Count, Size, &CountDone, HostEndian)) - { error("UDIWrite() failed in udi_write_inferrior_memory"); + { error("UDIWrite() failed in udi_write_inferior_memory"); break; } else @@ -1290,7 +1368,7 @@ udi_read_inferior_memory(memaddr, myaddr, len) if (Count > MAXDATA) Count = MAXDATA; From.Offset = memaddr + nread; if(err = UDIRead(From, To, Count, Size, &CountDone, HostEndian)) - { error("UDIRead() failed in udi_read_inferrior_memory"); + { error("UDIRead() failed in udi_read_inferior_memory"); break; } else @@ -1356,7 +1434,8 @@ fetch_register (regno) else if (regno>=FPE_REGNUM && regno<=EXO_REGNUM) { int val = -1; - supply_register(160 + (regno - FPE_REGNUM),(char *) &val); + /*supply_register(160 + (regno - FPE_REGNUM),(char *) &val);*/ + supply_register(regno, (char *) &val); return; /* Pretend Success */ } else @@ -1583,12 +1662,13 @@ Arguments are\n\ 0, /* terminal_ours */ 0, /* terminal_info */ udi_kill, /* FIXME, kill */ - udi_load, + udi_load, /* to_load */ 0, /* lookup_symbol */ udi_create_inferior, udi_mourn, /* mourn_inferior FIXME */ 0, /* can_run */ 0, /* notice_signals */ + 0, /* to_stop */ process_stratum, 0, /* next */ 1, /* has_all_memory */