X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fremote-udi.c;h=27023265fb61dabd0bca45294ac3ce719f7dbc92;hb=5573d7d4b1ed201ca3ac71dcdcf359d7eda8c3d3;hp=6b586cb7da7d667ff2d21bfdf50c3c96c95a5b51;hpb=023a56c9dfd95712228d513d1159d77a2d6a218d;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/remote-udi.c b/gdb/remote-udi.c index 6b586cb7da..27023265fb 100644 --- a/gdb/remote-udi.c +++ b/gdb/remote-udi.c @@ -27,12 +27,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ - Originally written by Daniel Mann at AMD for MiniMON and gdb 3.91.6. - David Wood (wood@lab.ultra.nyu.edu) at New York University adapted this file to gdb 3.95. I was unable to get this working on sun3os4 - with termio, only with sgtty. Because we are only attempting to - use this module to debug our kernel, which is already loaded when - gdb is started up, I did not code up the file downloading facilities. - As a result this module has only the stubs to download files. - You should get tagged at compile time if you need to make any - changes/additions. + with termio, only with sgtty. - Daniel Mann at AMD took the 3.95 adaptions above and replaced MiniMON interface with UDI-p interface. */ @@ -50,6 +45,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "29k-share/udi/udiproc.h" #include "gdbcmd.h" #include "bfd.h" +#include "gdbcore.h" /* For download function */ /* access the register store directly, without going through the normal handler functions. This avoids an extra data copy. */ @@ -57,7 +53,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ static int kiodebug; extern int stop_soon_quietly; /* for wait_for_inferior */ extern struct value *call_function_by_hand(); -static void udi_resume PARAMS ((int step, int sig)); +static void udi_resume PARAMS ((int pid, int step, int 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)); @@ -72,18 +68,11 @@ static int udi_read_inferior_memory PARAMS ((CORE_ADDR memaddr, char *myaddr, int len)); static void download PARAMS ((char *load_arg_string, int from_tty)); char CoffFileName[100] = ""; -/* - * Processor types. - */ -#define TYPE_UNKNOWN 0 -#define TYPE_A29000 1 -#define TYPE_A29030 2 -#define TYPE_A29050 3 -static char *processor_name[] = { "Unknown", "Am29000", "Am29030", "Am29050" }; -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 USE_SHADOW_PC ((processor_type == a29k_freeze_mode) && FREEZE_MODE) +/* FIXME: Replace with `set remotedebug'. Also, seems not to be used. */ #define LLOG_FILE "udi.log" #if defined (LOG_FILE) FILE *log_file; @@ -130,22 +119,6 @@ typedef struct bkpt_entry_str static bkpt_entry_t bkpt_table[BKPT_TABLE_SIZE]; extern char dfe_errmsg[]; /* error string */ -/* Called when SIGALRM signal sent due to alarm() timeout. */ -#ifndef HAVE_TERMIO - -volatile int n_alarms; - -static void -udi_timer () -{ -#if 0 - if (kiodebug) - printf ("udi_timer called\n"); -#endif - n_alarms++; -} -#endif /* HAVE_TERMIO */ - /* malloc'd name of the program on the remote system. */ static char *prog_name = NULL; @@ -207,8 +180,14 @@ udi_create_inferior (execfile, args, env) static void udi_mourn() { - pop_target (); /* Pop back to no-child state */ - generic_mourn_inferior (); +#if 0 + /* Requiring "target udi" each time you run is a major pain. I suspect + this was just blindy copied from remote.c, in which "target" and + "run" are combined. Having a udi target without an inferior seems + to work between "target udi" and "run", so why not now? */ + pop_target (); /* Pop back to no-child state */ +#endif + generic_mourn_inferior (); } /******************************************************************** UDI_OPEN @@ -256,19 +235,6 @@ udi_open (name, from_tty) push_target (&udi_ops); -#ifndef HAVE_TERMIO -#ifndef NO_SIGINTERRUPT - /* Cause SIGALRM's to make reads fail with EINTR instead of resuming - the read. */ - if (siginterrupt (SIGALRM, 1) != 0) - error ("udi_open: siginterrupt() %s", safe_strerror(errno)); -#endif - - /* Set up read timeout timer. */ - if ((void (*)) signal (SIGALRM, udi_timer) == (void (*)) -1) - error ("udi_open: signal() %s", safe_strerror(errno)); -#endif - #if defined (LOG_FILE) log_file = fopen (LOG_FILE, "w"); if (log_file == NULL) @@ -306,31 +272,8 @@ udi_open (name, from_tty) } } - /* Determine the processor revision level */ - prl = (unsigned int)read_register (CFG_REGNUM) >> 24; - if ((prl&0xe0) == 0) - { - fprintf_filtered (stderr, - "Remote debugging Am29000 rev %c\n",'A'+(prl&0x1f)); - processor_type = TYPE_A29000; - } - else if ((prl&0xe0) == 0x40) /* 29030 = 0x4* */ - { - fprintf_filtered (stderr, - "Remote debugging Am2903* rev %c\n",'A'+(prl&0x1f)); - processor_type = TYPE_A29030; - } - else if ((prl&0xe0) == 0x20) /* 29050 = 0x2* */ - { - fprintf_filtered (stderr, - "Remote debugging Am29050 rev %c\n",'A'+(prl&0x1f)); - processor_type = TYPE_A29050; - } - else - { - processor_type = TYPE_UNKNOWN; - fprintf_filtered (stderr,"WARNING: processor type unknown.\n"); - } + a29k_get_processor_type (); + if (UDICreateProcess (&PId)) fprintf(stderr, "UDICreateProcess() failed\n"); @@ -340,9 +283,8 @@ udi_open (name, from_tty) error ("UDICapabilities() failed"); if (from_tty) { - printf_filtered ("Remote debugging an %s connected via UDI socket,\n\ + printf_filtered ("Connected via UDI socket,\n\ DFE-IPC version %x.%x.%x TIP-IPC version %x.%x.%x TIP version %x.%x.%x\n %s\n", - processor_name[processor_type], (DFEIPCId>>8)&0xf, (DFEIPCId>>4)&0xf, DFEIPCId&0xf, (TIPIPCId>>8)&0xf, (TIPIPCId>>4)&0xf, TIPIPCId&0xf, (TargetId>>8)&0xf, (TargetId>>4)&0xf, TargetId&0xf, @@ -437,8 +379,8 @@ udi_detach (args,from_tty) ** Tell the remote machine to resume. */ static void -udi_resume (step, sig) - int step, sig; +udi_resume (pid, step, sig) + int pid, step, sig; { UDIError tip_error; UDIUInt32 Steps = 1; @@ -494,7 +436,10 @@ udi_wait (status) { case UDIStdoutReady: if (UDIGetStdout (sbuf, (UDISizeT)SBUF_MAX, &CountDone)) - error ("UDIGetStdout() failed in udi_wait"); + /* 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 ("UDIGetStdout() failed in udi_wait"); fwrite (sbuf, 1, CountDone, stdout); fflush(stdout); continue; @@ -503,11 +448,22 @@ udi_wait (status) fwrite (sbuf, 1, CountDone, stderr); fflush(stderr); continue; + case UDIStdinNeeded: - scanf ("%s", sbuf); - i = strlen (sbuf); - UDIPutStdin (sbuf, (UDISizeT)i, &CountDone); - continue; + { + int ch; + i = 0; + do + { + ch = getchar (); + if (ch == EOF) + break; + sbuf[i++] = ch; + } while (i < SBUF_MAX && ch != '\n'); + UDIPutStdin (sbuf, (UDISizeT)i, &CountDone); + continue; + } + case UDIRunning: /* In spite of the fact that we told UDIWait to wait forever, it will return spuriously sometimes. */ @@ -602,7 +558,7 @@ udi_wait (status) timeout = old_timeout; /* Restore original timeout value */ immediate_quit = old_immediate_quit; - return 0; + return inferior_pid; } /********************************************************** UDI_FETCH_REGISTERS @@ -1072,7 +1028,7 @@ download(load_arg_string, from_tty) } } - pbfd = bfd_openr (filename, 0); + pbfd = bfd_openr (filename, gnutarget); if (!pbfd) perror_with_name (filename); @@ -1108,6 +1064,11 @@ download(load_arg_string, from_tty) section_size = bfd_section_size (pbfd, section); section_end = To.Offset + section_size; + if (section_size == 0) + /* This is needed at least in the BSS case, where the code + below starts writing before it even checks the size. */ + continue; + printf("[Loading section %s at %x (%d bytes)]\n", section_name, To.Offset, @@ -1169,6 +1130,8 @@ download(load_arg_string, from_tty) unsigned long zero = 0; /* Write a zero byte at the vma */ + /* FIXME: Broken for sections of 1-3 bytes (we test for + zero above). */ err = UDIWrite ((UDIHostMemPtr)&zero, /* From */ To, /* To */ (UDICount)1, /* Count */ @@ -1510,15 +1473,34 @@ void convert16() {;} void convert32() {;} FILE* EchoFile = 0; /* used for debugging */ int QuietMode = 0; /* used for debugging */ + +/* Target_ops vector. Not static because there does not seem to be + any portable way to do a forward declaration of a static variable. + The RS/6000 doesn't like "extern" followed by "static"; SunOS + /bin/cc doesn't like "static" twice. */ -/****************************************************************************/ -/* - * Define the target subroutine names - */ -static struct target_ops udi_ops = { +struct target_ops udi_ops = { "udi", "Remote UDI connected TIP", - "Remote debug an AMD 29k using UDI socket connection to TIP process", + "Remote debug an AMD 29k using UDI socket connection to TIP process.\n\ +Arguments are\n\ +`configuration-id AF_INET hostname port-number'\n\ + To connect via the network, where hostname and port-number specify the\n\ + host and port where you can connect via UDI.\n\ + configuration-id is unused.\n\ +\n\ +`configuration-id AF_UNIX socket-name tip-program'\n\ + To connect using a local connection to the \"tip.exe\" program which is\n\ + supplied by AMD. If socket-name specifies an AF_UNIX socket then the\n\ + tip program must already be started; connect to it using that socket.\n\ + If not, start up tip-program, which should be the name of the tip\n\ + program. If appropriate, the PATH environment variable is searched.\n\ + configuration-id is unused.\n\ +\n\ +`configuration-id'\n\ + Look up the configuration in ./udi_soc or /etc/udi_soc, which\n\ + are files containing lines in the above formats. configuration-id is\n\ + used to pick which line of the file to use.", udi_open, udi_close, udi_attach,