X-Git-Url: https://repo.jachan.dev/binutils.git/blobdiff_plain/7d9884b92772d5b4fa0de57de5caca2d9308c16c..7fcf0be5e7d96c5813944e156518c64d2223ebec:/gdb/remote-eb.c diff --git a/gdb/remote-eb.c b/gdb/remote-eb.c index 1ab87ebf6e..baa4d24b55 100644 --- a/gdb/remote-eb.c +++ b/gdb/remote-eb.c @@ -1,5 +1,5 @@ /* Remote debugging interface for AMD 29000 EBMON on IBM PC, for GDB. - Copyright 1990-1991 Free Software Foundation, Inc. + Copyright 1990, 1991, 1992 Free Software Foundation, Inc. Contributed by Cygnus Support. Written by Jim Kingdon for Cygnus. This file is part of GDB. @@ -16,21 +16,21 @@ 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 is for an esoteric situation-- - having a 29k board in a PC hooked up to a unix machine with + having a a29k board in a PC hooked up to a unix machine with a serial line, and running ctty com1 on the PC, through which the unix machine can run ebmon. Not to mention that the PC has PC/NFS, so it can access the same executables that gdb can, over the net in real time. */ -#include -#include -#define TM_FILE_OVERRIDE #include "defs.h" -#include "tm-29k.h" +#include "gdb_string.h" + #include "inferior.h" +#include "bfd.h" +#include "symfile.h" #include "wait.h" #include "value.h" #include @@ -39,8 +39,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include #include "terminal.h" #include "target.h" - -extern struct value *call_function_by_hand(); +#include "gdbcore.h" extern struct target_ops eb_ops; /* Forward declaration */ @@ -51,7 +50,7 @@ static void eb_close(); FILE *log_file; #endif -static int timeout = 5; +static int timeout = 24; /* Descriptor for I/O to remote machine. Initialize it to -1 so that eb_open knows that we don't have a file open when the program @@ -199,7 +198,7 @@ get_hex_regs (n, regno) val = 0; for (j = 0; j < 8; j++) val = (val << 4) + get_hex_digit (j == 0); - supply_register (regno++, &val); + supply_register (regno++, (char *) &val); } } @@ -237,24 +236,56 @@ static int need_artificial_trap = 0; /* This is called not only when we first attach, but also when the user types "run" after having attached. */ -void -eb_start (inferior_args) -char *inferior_args; +static void +eb_create_inferior (execfile, args, env) + char *execfile; + char *args; + char **env; { - /* OK, now read in the file. Y=read, C=COFF, D=no symbols - 0=start address, %s=filename. */ + int entry_pt; - fprintf (eb_stream, "YC D,0:%s", prog_name); + if (args && *args) + error ("Can't pass arguments to remote EBMON process"); - if (inferior_args != NULL) - fprintf(eb_stream, " %s", inferior_args); + if (execfile == 0 || exec_bfd == 0) + error ("No exec file specified"); - fprintf (eb_stream, "\n"); - fflush (eb_stream); + entry_pt = (int) bfd_get_start_address (exec_bfd); - expect_prompt (); + { + /* OK, now read in the file. Y=read, C=COFF, D=no symbols + 0=start address, %s=filename. */ + + fprintf (eb_stream, "YC D,0:%s", prog_name); + + if (args != NULL) + fprintf(eb_stream, " %s", args); + + fprintf (eb_stream, "\n"); + fflush (eb_stream); + + expect_prompt (); - need_gi = 1; + need_gi = 1; + } + +/* The "process" (board) is already stopped awaiting our commands, and + the program is already downloaded. We just set its PC and go. */ + + clear_proceed_status (); + + /* Tell wait_for_inferior that we've started a new process. */ + init_wait_for_inferior (); + + /* Set up the "saved terminal modes" of the inferior + based on what modes we are starting it with. */ + target_terminal_init (); + + /* Install inferior's terminal modes. */ + target_terminal_inferior (); + + /* insert_step_breakpoint (); FIXME, do we need this? */ + proceed ((CORE_ADDR)entry_pt, TARGET_SIGNAL_DEFAULT, 0); /* Let 'er rip... */ } /* Translate baud rates from integers to damn B_codes. Unix should @@ -420,10 +451,12 @@ eb_close (quitting) eb_desc = -1; #if defined (LOG_FILE) - if (ferror (log_file)) - printf ("Error writing log file.\n"); - if (fclose (log_file) != 0) - printf ("Error closing log file.\n"); + if (log_file) { + if (ferror (log_file)) + printf ("Error writing log file.\n"); + if (fclose (log_file) != 0) + printf ("Error closing log file.\n"); + } #endif } @@ -442,8 +475,9 @@ eb_detach (from_tty) /* Tell the remote machine to resume. */ void -eb_resume (step, sig) - int step, sig; +eb_resume (pid, step, sig) + int pid, step; + enum target_signal sig; { if (step) { @@ -484,7 +518,7 @@ eb_resume (step, sig) int eb_wait (status) - WAITTYPE *status; + struct target_waitstatus *status; { /* Strings to look for. '?' means match any single character. Note that with the algorithm we use, the initial character @@ -509,11 +543,13 @@ eb_wait (status) int old_timeout = timeout; - WSETEXIT ((*status), 0); + status->kind = TARGET_WAITKIND_EXITED; + status->value.integer = 0; if (need_artificial_trap != 0) { - WSETSTOP ((*status), SIGTRAP); + status->kind = TARGET_WAITKIND_STOPPED; + status->value.sig = TARGET_SIGNAL_TRAP; need_artificial_trap--; return 0; } @@ -562,9 +598,15 @@ eb_wait (status) } expect_prompt (); if (*bp== '\0') - WSETSTOP ((*status), SIGTRAP); + { + status->kind = TARGET_WAITKIND_STOPPED; + status->value.sig = TARGET_SIGNAL_TRAP; + } else - WSETEXIT ((*status), 0); + { + status->kind = TARGET_WAITKIND_EXITED; + status->value.integer = 0; + } timeout = old_timeout; return 0; @@ -680,10 +722,10 @@ eb_fetch_registers () /* There doesn't seem to be any way to get these. */ { int val = -1; - supply_register (FPE_REGNUM, &val); - supply_register (INT_REGNUM, &val); - supply_register (FPS_REGNUM, &val); - supply_register (EXO_REGNUM, &val); + supply_register (FPE_REGNUM, (char *) &val); + supply_register (INTE_REGNUM, (char *) &val); + supply_register (FPS_REGNUM, (char *) &val); + supply_register (EXO_REGNUM, (char *) &val); } write (eb_desc, "dw gr1,gr1\n", 11); @@ -753,7 +795,7 @@ eb_store_registers () /* Store register REGNO, or all if REGNO == 0. Return errno value. */ -int +void eb_store_register (regno) int regno; { @@ -773,7 +815,6 @@ eb_store_register (regno) registers_changed (); expect_prompt (); } - return 0; } /* Get ready to modify the registers array. On machines which store @@ -788,7 +829,8 @@ eb_prepare_to_store () /* Do nothing, since we can store individual regs */ } -/* FIXME! Merge these two. */ + +/* FIXME-someday! Merge these two. */ int eb_xfer_inferior_memory (memaddr, myaddr, len, write, target) CORE_ADDR memaddr; @@ -800,7 +842,7 @@ eb_xfer_inferior_memory (memaddr, myaddr, len, write, target) if (write) return eb_write_inferior_memory (memaddr, myaddr, len); else - return eb_write_inferior_memory (memaddr, myaddr, len); + return eb_read_inferior_memory (memaddr, myaddr, len); } void @@ -811,7 +853,7 @@ eb_files_info () } /* Copy LEN bytes of data from debugger memory at MYADDR - to inferior's memory at MEMADDR. Returns errno value. */ + to inferior's memory at MEMADDR. Returns length moved. */ int eb_write_inferior_memory (memaddr, myaddr, len) CORE_ADDR memaddr; @@ -832,11 +874,11 @@ eb_write_inferior_memory (memaddr, myaddr, len) else fprintf (eb_stream, "%x,", ((unsigned char *)myaddr)[i]); } - return 0; + return len; } /* Read LEN bytes from inferior memory at MEMADDR. Put the result - at debugger address MYADDR. Returns errno value. */ + at debugger address MYADDR. Returns length moved. */ int eb_read_inferior_memory(memaddr, myaddr, len) CORE_ADDR memaddr; @@ -863,8 +905,10 @@ eb_read_inferior_memory(memaddr, myaddr, len) eb_read_bytes (CORE_ADDR_MAX - 3, foo, 4) doesn't need to work. Detect it and give up if there's an attempt to do that. */ - if (((memaddr - 1) + len) < memaddr) - return EIO; + if (((memaddr - 1) + len) < memaddr) { + errno = EIO; + return 0; + } startaddr = memaddr; count = 0; @@ -904,9 +948,30 @@ eb_read_inferior_memory(memaddr, myaddr, len) startaddr += len_this_pass; } - return 0; + return len; } +static void +eb_kill (args, from_tty) + char *args; + int from_tty; +{ + return; /* Ignore attempts to kill target system */ +} + +/* Clean up when a program exits. + + The program actually lives on in the remote processor's RAM, and may be + run again without a download. Don't leave it full of breakpoint + instructions. */ + +void +eb_mourn_inferior () +{ + remove_breakpoints (); + unpush_target (&eb_ops); + generic_mourn_inferior (); /* Do all the proper things now */ +} /* Define the target subroutine names */ struct target_ops eb_ops = { @@ -919,16 +984,18 @@ executable as it exists on the remote computer. For example,\n\ eb_open, eb_close, 0, eb_detach, eb_resume, eb_wait, eb_fetch_register, eb_store_register, - eb_prepare_to_store, 0, 0, /* conv_to, conv_from */ + eb_prepare_to_store, eb_xfer_inferior_memory, eb_files_info, 0, 0, /* Breakpoints */ 0, 0, 0, 0, 0, /* Terminal handling */ - 0, /* FIXME, kill */ - 0, /* load */ - call_function_by_hand, + eb_kill, + generic_load, /* load */ 0, /* lookup_symbol */ - 0, /* create_inferior FIXME, eb_start here or something? */ - 0, /* mourn_inferior FIXME */ + eb_create_inferior, + eb_mourn_inferior, + 0, /* can_run */ + 0, /* notice_signals */ + 0, /* to_stop */ process_stratum, 0, /* next */ 1, 1, 1, 1, 1, /* all mem, mem, stack, regs, exec */ 0, 0, /* Section pointers */