X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fremote-eb.c;h=049e87a081ce3b240b79f9a3ccd6d590ed036ae8;hb=25286543da71d927d59a7479e7e1bd0a1b9e1321;hp=351eec337b6a275db90bd24dca5b771104509df8;hpb=19b66c0e72d569b4fa39a23f71eeb7b6283d3c58;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/remote-eb.c b/gdb/remote-eb.c index 351eec337b..049e87a081 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. @@ -19,18 +19,18 @@ along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, 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 #include "defs.h" -#include "tm-29k.h" -#include "param-no-tm.h" +#include + #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,60 @@ 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 (); +#ifdef CREATE_INFERIOR_HOOK + CREATE_INFERIOR_HOOK (0); /* No process-ID */ +#endif + + { + /* 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); - need_gi = 1; + fprintf (eb_stream, "\n"); + fflush (eb_stream); + + expect_prompt (); + + 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, -1, 0); /* Let 'er rip... */ } /* Translate baud rates from integers to damn B_codes. Unix should @@ -402,7 +437,7 @@ the baud rate, and the name of the program to run on the remote system."); /* Close out all files and local state before this target loses control. */ -void +static void eb_close (quitting) int quitting; { @@ -420,10 +455,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 +479,8 @@ 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, sig; { if (step) { @@ -680,10 +717,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); @@ -694,7 +731,7 @@ eb_fetch_registers () /* Fetch register REGNO, or all registers if REGNO is -1. Returns errno value. */ -int +void eb_fetch_register (regno) int regno; { @@ -709,7 +746,7 @@ eb_fetch_register (regno) get_hex_regs (1, regno); expect_prompt (); } - return 0; + return; } /* Store the remote registers from the contents of the block REGS. */ @@ -753,7 +790,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 +810,6 @@ eb_store_register (regno) registers_changed (); expect_prompt (); } - return 0; } /* Get ready to modify the registers array. On machines which store @@ -788,7 +824,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 +837,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 +848,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 +869,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 +900,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 +943,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 +979,17 @@ 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 */ process_stratum, 0, /* next */ 1, 1, 1, 1, 1, /* all mem, mem, stack, regs, exec */ 0, 0, /* Section pointers */