X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fremote-udi.c;h=b796e90003b85b87205847dfa684dacff9eb4518;hb=25286543da71d927d59a7479e7e1bd0a1b9e1321;hp=681854c0f491dfb49fa457d76d77858834c8e3d7;hpb=b6113cc40821d1c8273dce275a94dc5adf09e97d;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/remote-udi.c b/gdb/remote-udi.c index 681854c0f4..b796e90003 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. */ @@ -57,7 +52,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)); @@ -81,7 +76,7 @@ char CoffFileName[100] = ""; #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 FREEZE_MODE (read_register(CPS_REGNUM) & 0x400) #define USE_SHADOW_PC ((processor_type == TYPE_A29050) && FREEZE_MODE) #define LLOG_FILE "udi.log" @@ -130,22 +125,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; @@ -238,6 +217,11 @@ udi_open (name, from_tty) target_preopen(from_tty); + entry.Offset = 0; + + for (cnt = 0; cnt < BKPT_TABLE_SIZE; cnt++) + bkpt_table[cnt].Type = 0; + if (udi_config_id) free (udi_config_id); @@ -251,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) @@ -391,6 +362,7 @@ udi_attach (args, from_tty) UDISizeT Size = 4; UDICount CountDone; UDIBool HostEndian = 0; + UDIError err; if (udi_session_id < 0) error ("UDI connection not opened yet, use the 'target udi' command.\n"); @@ -399,9 +371,9 @@ udi_attach (args, from_tty) printf ("Attaching to remote program %s...\n", prog_name); UDIStop(); - From.Space = 11; - From.Offset = UDI29KSpecialRegs; - if(UDIRead(From, &PC_adds, Count, Size, &CountDone, HostEndian)) + From.Space = UDI29KSpecialRegs; + From.Offset = 11; + if (err = UDIRead(From, &PC_adds, Count, Size, &CountDone, HostEndian)) error ("UDIRead failed in udi_attach"); printf ("Remote process is now halted, pc1 = 0x%x.\n", PC_adds); } @@ -431,8 +403,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; @@ -488,7 +460,7 @@ udi_wait (status) { case UDIStdoutReady: if (UDIGetStdout (sbuf, (UDISizeT)SBUF_MAX, &CountDone)) - error ("UDIGetStdin() failed in udi_wait"); + error ("UDIGetStdout() failed in udi_wait"); fwrite (sbuf, 1, CountDone, stdout); fflush(stdout); continue; @@ -498,9 +470,13 @@ udi_wait (status) fflush(stderr); continue; case UDIStdinNeeded: - printf("DEBUG: stdin requested ... continue\n"); - /* UDIPutStdin(sbuf, (UDISizeT)i, &CountDone); */ + scanf ("%s", sbuf); + i = strlen (sbuf); + 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. */ case UDIStdinModeX: continue; default: @@ -569,14 +545,11 @@ udi_wait (status) case UDINotExecuting: WSETSTOP ((*status), SIGTERM); break; - case UDIRunning: - WSETSTOP ((*status), SIGILL); - break; case UDIStopped: WSETSTOP ((*status), SIGTSTP); break; case UDIWarned: - WSETSTOP ((*status), SIGLOST); + WSETSTOP ((*status), SIGURG); break; case UDIStepped: case UDIBreak: @@ -612,6 +585,7 @@ int regno; UDISizeT Size = 4; UDICount CountDone; UDIBool HostEndian = 0; + UDIError err; int i; if (regno >= 0) { @@ -625,7 +599,7 @@ int regno; From.Offset = 1; To = (UDIUInt32 *)®isters[4 * GR1_REGNUM]; Count = 1; - if (UDIRead(From, To, Count, Size, &CountDone, HostEndian)) + if (err = UDIRead(From, To, Count, Size, &CountDone, HostEndian)) error("UDIRead() failed in udi_fetch_registers"); register_valid[GR1_REGNUM] = 1; @@ -638,7 +612,7 @@ int regno; From.Offset = 64; To = (UDIUInt32 *)®isters[4 * GR64_REGNUM]; Count = 32; - if (UDIRead(From, To, Count, Size, &CountDone, HostEndian)) + if (err = UDIRead(From, To, Count, Size, &CountDone, HostEndian)) error("UDIRead() failed in udi_fetch_registers"); for (i = GR64_REGNUM; i < GR64_REGNUM + 32; i++) @@ -652,7 +626,7 @@ int regno; From.Offset = 96; To = (UDIUInt32 *)®isters[4 * GR96_REGNUM]; Count = 32; - if (UDIRead(From, To, Count, Size, &CountDone, HostEndian)) + if (err = UDIRead(From, To, Count, Size, &CountDone, HostEndian)) error("UDIRead() failed in udi_fetch_registers"); for (i = GR96_REGNUM; i < GR96_REGNUM + 32; i++) @@ -664,7 +638,7 @@ int regno; From.Offset = 0; To = (UDIUInt32 *)®isters[4 * LR0_REGNUM]; Count = 128; - if (UDIRead(From, To, Count, Size, &CountDone, HostEndian)) + if (err = UDIRead(From, To, Count, Size, &CountDone, HostEndian)) error("UDIRead() failed in udi_fetch_registers"); for (i = LR0_REGNUM; i < LR0_REGNUM + 128; i++) @@ -676,7 +650,7 @@ int regno; From.Offset = 0; To = (UDIUInt32 *)®isters[4 * SR_REGNUM(0)]; Count = 15; - if (UDIRead(From, To, Count, Size, &CountDone, HostEndian)) + if (err = UDIRead(From, To, Count, Size, &CountDone, HostEndian)) error("UDIRead() failed in udi_fetch_registers"); for (i = SR_REGNUM(0); i < SR_REGNUM(0) + 15; i++) @@ -693,7 +667,7 @@ int regno; From.Offset = 128; To = (UDIUInt32 *)®isters[4 * SR_REGNUM(128)]; Count = 135-128 + 1; - if (UDIRead(From, To, Count, Size, &CountDone, HostEndian)) + if (err = UDIRead(From, To, Count, Size, &CountDone, HostEndian)) error("UDIRead() failed in udi_fetch_registers"); for (i = SR_REGNUM(128); i < SR_REGNUM(128) + 135-128+1; i++) @@ -1028,9 +1002,9 @@ download(load_arg_string, from_tty) { token++; - if (strcmp (token, "ms") == 0) + if (STREQ (token, "ms")) stack_sizes[1] = atol (strtok (NULL, " \t")); - else if (strcmp (token, "rs") == 0) + else if (STREQ (token, "rs")) stack_sizes[0] = atol (strtok (NULL, " \t")); else { @@ -1087,13 +1061,13 @@ download(load_arg_string, from_tty) const char *section_name; section_name = bfd_get_section_name (pbfd, section); - if (strcmp (section_name, ".text") == 0 && !load_text) + if (STREQ (section_name, ".text") && !load_text) continue; - else if (strcmp (section_name, ".data") == 0 && !load_data) + else if (STREQ (section_name, ".data") && !load_data) continue; - else if (strcmp (section_name, ".bss") == 0 && !load_bss) + else if (STREQ (section_name, ".bss") && !load_bss) continue; - else if (strcmp (section_name, ".lit") == 0 && !load_lit) + else if (STREQ (section_name, ".lit") && !load_lit) continue; To.Offset = bfd_get_section_vma (pbfd, section); @@ -1158,30 +1132,40 @@ download(load_arg_string, from_tty) else /* BSS */ { UDIResource From; - char zero = 0; + unsigned long zero = 0; /* Write a zero byte at the vma */ err = UDIWrite ((UDIHostMemPtr)&zero, /* From */ To, /* To */ (UDICount)1, /* Count */ - (UDISizeT)1, /* Size */ + (UDISizeT)4, /* Size */ &Count, /* CountDone */ (UDIBool)0); /* HostEndian */ if (err) error ("UDIWrite failed, error = %d", err); From = To; - To.Offset++; + To.Offset+=4; /* Now, duplicate it for the length of the BSS */ err = UDICopy (From, /* From */ To, /* To */ - (UDICount)section_size - 1, /* Count */ - (UDISizeT)1, /* Size */ + (UDICount)(section_size/4 - 1), /* Count */ + (UDISizeT)4, /* Size */ &Count, /* CountDone */ (UDIBool)1); /* Direction */ if (err) - error ("UDICopy failed, error = %d", err); + { + char message[100]; + int xerr; + + xerr = UDIGetErrorMsg(err, 100, message, &Count); + if (!xerr) + fprintf (stderr, "Error is %s\n", message); + else + fprintf (stderr, "xerr is %d\n", xerr); + error ("UDICopy failed, error = %d", err); + } } } @@ -1259,6 +1243,7 @@ udi_read_inferior_memory(memaddr, myaddr, len) UDISizeT Size = 1; UDICount CountDone = 0; UDIBool HostEndian = 0; + UDIError err; From.Space = udi_memory_space(memaddr); To = (UDIUInt32*)myaddr; @@ -1267,8 +1252,8 @@ udi_read_inferior_memory(memaddr, myaddr, len) { Count = len - nread; if (Count > MAXDATA) Count = MAXDATA; From.Offset = memaddr + nread; - if(UDIRead(From, To, Count, Size, &CountDone, HostEndian)) - { error("UDIWrite() failed in udi_read_inferrior_memory"); + if(err = UDIRead(From, To, Count, Size, &CountDone, HostEndian)) + { error("UDIRead() failed in udi_read_inferrior_memory"); break; } else @@ -1302,6 +1287,7 @@ fetch_register (regno) UDISizeT Size = 4; UDICount CountDone; UDIBool HostEndian = 0; + UDIError err; int result; if (regno == GR1_REGNUM) @@ -1342,7 +1328,7 @@ fetch_register (regno) From.Offset = regnum_to_srnum(regno); } - if (UDIRead(From, &To, Count, Size, &CountDone, HostEndian)) + if (err = UDIRead(From, &To, Count, Size, &CountDone, HostEndian)) error("UDIRead() failed in udi_fetch_registers"); supply_register(regno, (char *) &To); @@ -1498,7 +1484,25 @@ int QuietMode = 0; /* used for debugging */ static 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,