X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fremote-adapt.c;h=8fcb1f70ac981348f76eee52fdd3a2bea26fbd8e;hb=8387d6dfd396b90f8b3393488099b71622a8eaad;hp=9241573eeced0df519d62968627a39f1ab9b037a;hpb=5ee4e16ca776d5dd8c3cdb63489c4da773fd9f5c;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/remote-adapt.c b/gdb/remote-adapt.c index 9241573eec..8fcb1f70ac 100644 --- a/gdb/remote-adapt.c +++ b/gdb/remote-adapt.c @@ -17,7 +17,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 is for an esoteric situation-- having a 29k board attached to an Adapt inline monitor. @@ -30,7 +30,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ 7/91 o - Freeze mode tracing can be done on a 29050. */ #include "defs.h" -#include +#include "gdb_string.h" #include "inferior.h" #include "wait.h" #include "value.h" @@ -54,33 +54,13 @@ static void adapt_store_registers (); static void adapt_close (); static int adapt_clear_breakpoints(); -/* - * Processor types. It is assumed that the adapt has the correct - * ROM for the given processor. - */ -#define TYPE_UNKNOWN 0 -#define TYPE_A29000 1 -#define TYPE_A29030 2 -#define TYPE_A29050 3 -static char *processor_name[] = { "Unknown", "A29000", "A29030", "A29050" }; -static int processor_type=TYPE_UNKNOWN; - #define FREEZE_MODE (read_register(CPS_REGNUM) && 0x400) -#define USE_SHADOW_PC ((processor_type == TYPE_A29050) && FREEZE_MODE) - - -/* #define DEBUG /* */ -#ifdef DEBUG -# define DENTER(NAME) (printf_filtered("Entering %s\n",NAME), fflush(stdout)) -# define DEXIT(NAME) (printf_filtered("Exiting %s\n",NAME), fflush(stdout)) -#else -# define DENTER(NAME) -# define DEXIT(NAME) -#endif +#define USE_SHADOW_PC ((processor_type == a29k_freeze_mode) && FREEZE_MODE) /* Can't seem to get binary coff working */ #define ASCII_COFF /* Adapt will be downloaded with ascii coff */ +/* FIXME: Replace with `set remotedebug'. */ #define LOG_FILE "adapt.log" #if defined (LOG_FILE) FILE *log_file=NULL; @@ -287,7 +267,7 @@ get_hex_regs (n, regno) long val; while (n--) { val = get_hex_word(); - supply_register(regno++,&val); + supply_register(regno++,(char *) &val); } } /* Called when SIGALRM signal sent due to alarm() timeout. */ @@ -325,11 +305,9 @@ adapt_kill(arg,from_tty) char *arg; int from_tty; { - DENTER("adapt_kill()"); fprintf (adapt_stream, "K"); fprintf (adapt_stream, "\r"); expect_prompt (); - DEXIT("adapt_kill()"); } /* * Download a file specified in 'args', to the adapt. @@ -344,7 +322,6 @@ int fromtty; int n; char buffer[1024]; - DENTER("adapt_load()"); if (!adapt_stream) { printf_filtered("Adapt not open. Use 'target' command to open adapt\n"); return; @@ -384,7 +361,6 @@ int fromtty; expect_prompt (); /* Skip garbage that comes out */ fprintf (adapt_stream, "\r"); expect_prompt (); - DEXIT("adapt_load()"); } /* This is called not only when we first attach, but also when the @@ -397,8 +373,6 @@ adapt_create_inferior (execfile, args, env) { int entry_pt; - DENTER("adapt_create_inferior()"); - if (args && *args) error ("Can't pass arguments to remote adapt process."); @@ -433,13 +407,12 @@ adapt_create_inferior (execfile, args, env) expect_prompt (); #else insert_breakpoints (); /* Needed to get correct instruction in cache */ - proceed(entry_pt, -1, 0); + proceed(entry_pt, TARGET_SIGNAL_DEFAULT, 0); #endif } else { printf_filtered("Adapt not open yet.\n"); } - DEXIT("adapt_create_inferior()"); } /* Translate baud rates from integers to damn B_codes. Unix should @@ -498,7 +471,6 @@ adapt_open (name, from_tty) unsigned int prl; char *p; - DENTER("adapt_open()"); /* Find the first whitespace character, it separates dev_name from prog_name. */ if (name == 0) @@ -512,7 +484,7 @@ erroid: error ("\ Please include the name of the device for the serial port,\n\ the baud rate, and the name of the program to run on the remote system."); - dev_name = (char*)malloc(p - name + 1); + dev_name = (char*)xmalloc(p - name + 1); strncpy (dev_name, name, p - name); dev_name[p - name] = '\0'; @@ -555,8 +527,6 @@ the baud rate, and the name of the program to run on the remote system."); adapt_stream = fdopen (adapt_desc, "r+"); push_target (&adapt_ops); - /* start_remote (); /* Initialize gdb process mechanisms */ - #ifndef HAVE_TERMIO #ifndef NO_SIGINTERRUPT @@ -590,32 +560,15 @@ the baud rate, and the name of the program to run on the remote system."); /* Clear any break points */ adapt_clear_breakpoints(); - /* Determine the processor revision level */ - prl = (unsigned int)read_register(CFG_REGNUM) >> 24; - if (prl == 0x03) { - processor_type = TYPE_A29000; - } else if ((prl&0xf0) == 0x40) { /* 29030 = 0x4* */ - processor_type = TYPE_A29030; - fprintf_filtered(stderr,"WARNING: debugging of A29030 not tested.\n"); - } else if ((prl&0xf0) == 0x20) { /* 29050 = 0x2* */ - processor_type = TYPE_A29050; - fprintf_filtered(stderr,"WARNING: debugging of A29050 not tested.\n"); - } else { - processor_type = TYPE_UNKNOWN; - fprintf_filtered(stderr,"WARNING: processor type unknown.\n"); - } - /* Print out some stuff, letting the user now what's going on */ - printf_filtered("Remote debugging on an %s connect to an Adapt via %s.\n", - processor_name[processor_type],dev_name); + printf_filtered("Connected to an Adapt via %s.\n", dev_name); /* FIXME: can this restriction be removed? */ printf_filtered("Remote debugging using virtual addresses works only\n"); printf_filtered("\twhen virtual addresses map 1:1 to physical addresses.\n"); - if (processor_type != TYPE_A29050) { + if (processor_type != a29k_freeze_mode) { fprintf_filtered(stderr, "Freeze-mode debugging not available, and can only be done on an A29050.\n"); } - DEXIT("adapt_open()"); } /* Close out all files and local state before this target loses control. */ @@ -625,8 +578,6 @@ adapt_close (quitting) int quitting; { - DENTER("adapt_close()"); - /* Clear any break points */ adapt_clear_breakpoints(); @@ -658,7 +609,6 @@ adapt_close (quitting) log_file = NULL; } #endif - DEXIT("adapt_close()"); } /* Attach to the target that is already loaded and possibly running */ @@ -668,26 +618,12 @@ adapt_attach (args, from_tty) int from_tty; { - DENTER("adapt_attach()"); if (from_tty) printf_filtered ("Attaching to remote program %s.\n", prog_name); - /* push_target(&adapt_ops); /* This done in adapt_open() */ - - mark_breakpoints_out (); - /* Send the adapt a kill. It is ok if it is not already running */ fprintf(adapt_stream, "K\r"); fflush(adapt_stream); expect_prompt(); /* Slurp the echo */ - - /* We will get a task spawn event immediately. */ - init_wait_for_inferior (); - clear_proceed_status (); - stop_soon_quietly = 1; - wait_for_inferior (); - stop_soon_quietly = 0; - normal_stop (); - DEXIT("adapt_attach()"); } @@ -699,7 +635,7 @@ adapt_detach (args,from_tty) char *args; int from_tty; { - DENTER("adapt_detach()"); + if (adapt_stream) { /* Send it on its way (tell it to continue) */ adapt_clear_breakpoints(); fprintf(adapt_stream,"G\r"); @@ -708,16 +644,15 @@ adapt_detach (args,from_tty) pop_target(); /* calls adapt_close to do the real work */ if (from_tty) printf_filtered ("Ending remote %s debugging\n", target_shortname); - DEXIT("adapt_detach()"); } /* Tell the remote machine to resume. */ void -adapt_resume (step, sig) - int step, sig; +adapt_resume (pid, step, sig) + int pid, step; + enum target_signal sig; { - DENTER("adapt_resume()"); if (step) { write (adapt_desc, "t 1,s\r", 6); @@ -739,7 +674,6 @@ adapt_resume (step, sig) /* Swallow the echo. */ expect_prompt(); } - DEXIT("adapt_resume()"); } /* Wait until the remote machine stops, then return, @@ -747,7 +681,7 @@ adapt_resume (step, sig) int adapt_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 @@ -772,13 +706,13 @@ adapt_wait (status) int old_timeout = timeout; int old_immediate_quit = immediate_quit; - DENTER("adapt_wait()"); - - 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; } @@ -819,12 +753,17 @@ adapt_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; immediate_quit = old_immediate_quit; - DEXIT("adapt_wait()"); return 0; } @@ -876,8 +815,6 @@ adapt_fetch_registers () int sreg_buf[16]; int i,j; - DENTER("adapt_fetch_registers()"); - /* * Global registers */ @@ -947,7 +884,7 @@ adapt_fetch_registers () sreg_buf[12] = read_register(PC2_REGNUM); /* pc2 */ } for (i=0 ; i<14 ; i++) /* Supply vab -> lru */ - supply_register(VAB_REGNUM+i,&sreg_buf[i]); + supply_register(VAB_REGNUM+i, (char *) &sreg_buf[i]); sprintf (tempbuf, "dw sr128\r"); write (adapt_desc, tempbuf, strlen (tempbuf)); for (i=0 ; i<2 ; i++) { /* SR128 - SR135 */ @@ -957,30 +894,28 @@ adapt_fetch_registers () sreg_buf[i*4 + j] = get_hex_word(); } expect_prompt(); - supply_register(IPC_REGNUM,&sreg_buf[0]); - supply_register(IPA_REGNUM,&sreg_buf[1]); - supply_register(IPB_REGNUM,&sreg_buf[2]); - supply_register(Q_REGNUM, &sreg_buf[3]); + supply_register(IPC_REGNUM,(char *) &sreg_buf[0]); + supply_register(IPA_REGNUM,(char *) &sreg_buf[1]); + supply_register(IPB_REGNUM,(char *) &sreg_buf[2]); + supply_register(Q_REGNUM, (char *) &sreg_buf[3]); /* Skip ALU */ - supply_register(BP_REGNUM, &sreg_buf[5]); - supply_register(FC_REGNUM, &sreg_buf[6]); - supply_register(CR_REGNUM, &sreg_buf[7]); + supply_register(BP_REGNUM, (char *) &sreg_buf[5]); + supply_register(FC_REGNUM, (char *) &sreg_buf[6]); + supply_register(CR_REGNUM, (char *) &sreg_buf[7]); /* There doesn't seem to be any way to get these. */ { int val = -1; - supply_register (FPE_REGNUM, &val); - supply_register (INTE_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 (adapt_desc, "dw gr1,gr1\r", 11); expect ("GR001 "); get_hex_regs (1, GR1_REGNUM); expect_prompt (); - - DEXIT("adapt_fetch_registers()"); } /* Fetch register REGNO, or all registers if REGNO is -1. @@ -989,7 +924,6 @@ static void adapt_fetch_register (regno) int regno; { - DENTER("adapt_fetch_register()"); if (regno == -1) adapt_fetch_registers (); else @@ -1001,7 +935,6 @@ adapt_fetch_register (regno) get_hex_regs (1, regno); expect_prompt (); } - DEXIT("adapt_fetch_register()"); } /* Store the remote registers from the contents of the block REGS. */ @@ -1011,7 +944,6 @@ adapt_store_registers () { int i, j; - DENTER("adapt_store_registers()"); fprintf (adapt_stream, "s gr1,%x\r", read_register (GR1_REGNUM)); expect_prompt (); @@ -1084,7 +1016,6 @@ adapt_store_register (regno) registers_changed (); expect_prompt (); } - DEXIT("adapt_store_registers()"); } /* Get ready to modify the registers array. On machines which store @@ -1157,9 +1088,7 @@ adapt_write_inferior_memory (memaddr, myaddr, len) int i; unsigned int cps; - /* DENTER("adapt_write_inferior_memory()"); */ - -/* Turn TU bit off so we can do 'sb' commands */ + /* Turn TU bit off so we can do 'sb' commands */ cps = read_register(CPS_REGNUM); if (cps & 0x00000800) write_register(CPS_REGNUM,cps&~(0x00000800)); @@ -1179,7 +1108,6 @@ adapt_write_inferior_memory (memaddr, myaddr, len) /* Restore the old value of cps if the TU bit was on */ if (cps & 0x00000800) write_register(CPS_REGNUM,cps); - /* DEXIT("adapt_write_inferior_memory()"); */ return len; } @@ -1211,7 +1139,6 @@ adapt_read_inferior_memory(memaddr, myaddr, len) adapt_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. */ - /* DENTER("adapt_read_inferior_memory()"); */ if (((memaddr - 1) + len) < memaddr) return EIO; @@ -1256,8 +1183,6 @@ adapt_read_inferior_memory(memaddr, myaddr, len) startaddr += len_this_pass; } - - /* DEXIT("adapt_read_inferior_memory()"); */ return count; } @@ -1268,18 +1193,15 @@ adapt_insert_breakpoint(addr, save) CORE_ADDR addr; char *save; /* Throw away, let adapt save instructions */ { - DENTER("adapt_insert_breakpoint()"); if (num_brkpts < MAX_BREAKS) { num_brkpts++; fprintf (adapt_stream, "B %x", addr); fprintf (adapt_stream, "\r"); expect_prompt (); - DEXIT("adapt_insert_breakpoint() success"); return(0); /* Success */ } else { fprintf_filtered(stderr, "Too many break points, break point not installed\n"); - DEXIT("adapt_insert_breakpoint() failure"); return(1); /* Failure */ } @@ -1289,7 +1211,6 @@ adapt_remove_breakpoint(addr, save) CORE_ADDR addr; char *save; /* Throw away, let adapt save instructions */ { - DENTER("adapt_remove_breakpoint()"); if (num_brkpts > 0) { num_brkpts--; fprintf (adapt_stream, "BR %x", addr); @@ -1297,7 +1218,6 @@ char *save; /* Throw away, let adapt save instructions */ fflush (adapt_stream); expect_prompt (); } - DEXIT("adapt_remove_breakpoint()"); return(0); } @@ -1305,7 +1225,6 @@ char *save; /* Throw away, let adapt save instructions */ static int adapt_clear_breakpoints() { - DENTER("adapt_clear_breakpoint()"); if (adapt_stream) { fprintf (adapt_stream, "BR"); /* Clear all break points */ fprintf (adapt_stream, "\r"); @@ -1313,16 +1232,13 @@ adapt_clear_breakpoints() expect_prompt (); } num_brkpts = 0; - DEXIT("adapt_clear_breakpoint()"); } static void adapt_mourn() { - DENTER("adapt_mourn()"); adapt_clear_breakpoints(); pop_target (); /* Pop back to no-child state */ generic_mourn_inferior (); - DEXIT("adapt_mourn()"); } /* Display everthing we read in from the adapt until we match/see the @@ -1398,7 +1314,7 @@ adapt_com (args, fromtty) break; /* Begin commands that take input in the form 'c x,y[,z...]' */ case 'S': /* Set memory or register */ - if (index(args,',')) { /* Assume it is properly formatted */ + if (strchr(args,',')) { /* Assume it is properly formatted */ write(adapt_desc,args,strlen(args)); write(adapt_desc,"\r",1); expect_prompt(); @@ -1426,6 +1342,8 @@ struct target_ops adapt_ops = { adapt_create_inferior, /* create_inferior */ adapt_mourn, /* mourn_inferior FIXME */ 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 */