/* Remote debugging interface for AMD 29k interfaced via UDI, for GDB.
- Copyright 1990, 1992 Free Software Foundation, Inc.
+ Copyright 1990, 1992, 1995, 2000, 2001 Free Software Foundation, Inc.
Written by Daniel Mann. Contributed by AMD.
-This file is part of GDB.
+ This file is part of GDB.
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ 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. */
+ 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., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA. */
/* This is like remote.c but uses the Universal Debug Interface (UDI) to
talk to the target hardware (or simulator). UDI is a TCP/IP based
daemon talks UDI on one side, and talks to the hardware (typically
over a serial port) on the other side.
- - 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.
- - Daniel Mann at AMD took the 3.95 adaptions above and replaced
- MiniMON interface with UDI-p interface. */
-
+ - 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.
+ - Daniel Mann at AMD took the 3.95 adaptions above and replaced
+ MiniMON interface with UDI-p interface. */
+
#include "defs.h"
+#include "frame.h"
#include "inferior.h"
-#include "wait.h"
+#include "gdb_wait.h"
#include "value.h"
#include <ctype.h>
#include <fcntl.h>
#include <signal.h>
#include <errno.h>
-#include <string.h>
+#include "gdb_string.h"
#include "terminal.h"
#include "target.h"
#include "29k-share/udi/udiproc.h"
#include "gdbcmd.h"
#include "bfd.h"
-#include "gdbcore.h" /* For download function */
+#include "gdbcore.h" /* For download function */
/* access the register store directly, without going through
the normal handler functions. This avoids an extra data copy. */
-extern int stop_soon_quietly; /* for wait_for_inferior */
-extern struct value *call_function_by_hand();
-static void udi_resume PARAMS ((int pid, int step, enum target_signal 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));
-static void udi_store_registers PARAMS ((int regno));
-static int store_register PARAMS ((int regno));
-static int regnum_to_srnum PARAMS ((int regno));
-static void udi_close PARAMS ((int quitting));
-static CPUSpace udi_memory_space PARAMS ((CORE_ADDR addr));
-static int udi_write_inferior_memory PARAMS ((CORE_ADDR memaddr, char *myaddr,
- int len));
-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] = "";
+extern int stop_soon_quietly; /* for wait_for_inferior */
+extern struct value *call_function_by_hand ();
+static void udi_resume (int pid, int step, enum target_signal sig);
+static void udi_fetch_registers (int regno);
+static void udi_load (char *args, int from_tty);
+static void fetch_register (int regno);
+static void udi_store_registers (int regno);
+static int store_register (int regno);
+static int regnum_to_srnum (int regno);
+static void udi_close (int quitting);
+static CPUSpace udi_memory_space (CORE_ADDR addr);
+static int udi_write_inferior_memory (CORE_ADDR memaddr, char *myaddr,
+ int len);
+static int udi_read_inferior_memory (CORE_ADDR memaddr, char *myaddr,
+ int len);
+static void download (char *load_arg_string, int from_tty);
+char CoffFileName[100] = "";
#define FREEZE_MODE (read_register(CPS_REGNUM) & 0x400)
#define USE_SHADOW_PC ((processor_type == a29k_freeze_mode) && FREEZE_MODE)
static int timeout = 5;
-extern struct target_ops udi_ops; /* Forward declaration */
+extern struct target_ops udi_ops; /* Forward declaration */
/* Special register enumeration.
-*/
+ */
/******************************************************************* UDI DATA*/
-#define MAXDATA 2*1024 /* max UDI[read/write] byte size */
+#define MAXDATA 2*1024 /* max UDI[read/write] byte size */
/* Descriptor for I/O to remote machine. Initialize it to -1 so that
udi_open knows that we don't have a file open when the program
starts. */
UDIUInt32 CPUPRL;
UDIUInt32 CoProcPRL;
-UDIMemoryRange address_ranges[2]; /* Text and data */
-UDIResource entry = {0, 0}; /* Entry point */
+UDIMemoryRange address_ranges[2]; /* Text and data */
+UDIResource entry =
+{0, 0}; /* Entry point */
CPUSizeT stack_sizes[2]; /* Regular and memory stacks */
#define SBUF_MAX 1024 /* maximum size of string handling buffer */
char sbuf[SBUF_MAX];
-typedef struct bkpt_entry_str
-{
- UDIResource Addr;
- UDIUInt32 PassCount;
+typedef struct bkpt_entry_str
+ {
+ UDIResource Addr;
+ UDIUInt32 PassCount;
UDIBreakType Type;
unsigned int BreakId;
-} bkpt_entry_t;
+ }
+bkpt_entry_t;
#define BKPT_TABLE_SIZE 40
-static bkpt_entry_t bkpt_table[BKPT_TABLE_SIZE];
-extern char dfe_errmsg[]; /* error string */
+static bkpt_entry_t bkpt_table[BKPT_TABLE_SIZE];
+extern char dfe_errmsg[]; /* error string */
/* malloc'd name of the program on the remote system. */
static char *prog_name = NULL;
user types "run" after having attached. */
static void
-udi_create_inferior (execfile, args, env)
- char *execfile;
- char *args;
- char **env;
+udi_create_inferior (char *execfile, char *args, char **env)
{
char *args1;
if (execfile)
{
if (prog_name != NULL)
- free (prog_name);
+ xfree (prog_name);
prog_name = savestring (execfile, strlen (execfile));
}
else if (entry.Offset)
{
/* If the TIP is not open, open it. */
if (UDIConnect (udi_config_id, &udi_session_id))
- error("UDIConnect() failed: %s\n", dfe_errmsg);
+ error ("UDIConnect() failed: %s\n", dfe_errmsg);
+ /* We will need to download the program. */
+ entry.Offset = 0;
}
inferior_pid = 40000;
if (!entry.Offset)
- download(execfile, 0);
+ download (execfile, 0);
- args1 = alloca (strlen(execfile) + strlen(args) + 2);
+ args1 = alloca (strlen (execfile) + strlen (args) + 2);
if (execfile[0] == '\0')
strcat (args1, args);
UDIInitializeProcess (address_ranges, /* ProcessMemory[] */
- (UDIInt)2, /* NumberOfRanges */
- entry, /* EntryPoint */
- stack_sizes, /* *StackSizes */
- (UDIInt)2, /* NumberOfStacks */
- args1); /* ArgString */
+ (UDIInt) 2, /* NumberOfRanges */
+ entry, /* EntryPoint */
+ stack_sizes, /* *StackSizes */
+ (UDIInt) 2, /* NumberOfStacks */
+ args1); /* ArgString */
init_wait_for_inferior ();
clear_proceed_status ();
}
static void
-udi_mourn()
+udi_mourn (void)
{
#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 */
+ pop_target (); /* Pop back to no-child state */
#endif
/* But if we're going to want to run it again, we better remove the
breakpoints... */
/* XXX - need cleanups for udiconnect for various failures!!! */
static void
-udi_open (name, from_tty)
- char *name;
- int from_tty;
+udi_open (char *name, int from_tty)
{
unsigned int prl;
char *p;
UDIPId PId;
UDIUInt32 TIPId, TargetId, DFEId, DFE, TIP, DFEIPCId, TIPIPCId;
- target_preopen(from_tty);
- /* target_preopen calls target_kill to clean up the previous target. But
- udi_kill leaves it on the stack. So we pop it here (the call to udi_close
- is harmless now that udi_session_id is -1). */
- unpush_target (&udi_ops);
+ target_preopen (from_tty);
entry.Offset = 0;
bkpt_table[cnt].Type = 0;
if (udi_config_id)
- free (udi_config_id);
+ xfree (udi_config_id);
if (!name)
- error("Usage: target udi config_id, where config_id appears in udi_soc file");
+ error ("Usage: target udi config_id, where config_id appears in udi_soc file");
udi_config_id = strdup (strtok (name, " \t"));
if (UDIConnect (udi_config_id, &udi_session_id))
/* FIXME: Should set udi_session_id to -1 here. */
- error("UDIConnect() failed: %s\n", dfe_errmsg);
+ error ("UDIConnect() failed: %s\n", dfe_errmsg);
push_target (&udi_ops);
/*
- ** Initialize target configuration structure (global)
- */
+ ** Initialize target configuration structure (global)
+ */
if (UDIGetTargetConfig (KnownMemory, &NumberOfRanges,
ChipVersions, &NumberOfChips))
error ("UDIGetTargetConfig() failed");
if (NumberOfChips > 2)
- fprintf_unfiltered(gdb_stderr,"Target has more than one processor\n");
- for (cnt=0; cnt < NumberOfRanges; cnt++)
+ fprintf_unfiltered (gdb_stderr, "Target has more than one processor\n");
+ for (cnt = 0; cnt < NumberOfRanges; cnt++)
{
- switch(KnownMemory[cnt].Space)
+ switch (KnownMemory[cnt].Space)
{
default:
- fprintf_unfiltered(gdb_stderr, "UDIGetTargetConfig() unknown memory space\n");
+ fprintf_unfiltered (gdb_stderr, "UDIGetTargetConfig() unknown memory space\n");
break;
case UDI29KCP_S:
break;
a29k_get_processor_type ();
if (UDICreateProcess (&PId))
- fprintf_unfiltered(gdb_stderr, "UDICreateProcess() failed\n");
+ fprintf_unfiltered (gdb_stderr, "UDICreateProcess() failed\n");
/* Print out some stuff, letting the user now what's going on */
if (UDICapabilities (&TIPId, &TargetId, DFEId, DFE, &TIP, &DFEIPCId,
{
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",
- (DFEIPCId>>8)&0xf, (DFEIPCId>>4)&0xf, DFEIPCId&0xf,
- (TIPIPCId>>8)&0xf, (TIPIPCId>>4)&0xf, TIPIPCId&0xf,
- (TargetId>>8)&0xf, (TargetId>>4)&0xf, TargetId&0xf,
+ (DFEIPCId >> 8) & 0xf, (DFEIPCId >> 4) & 0xf, DFEIPCId & 0xf,
+ (TIPIPCId >> 8) & 0xf, (TIPIPCId >> 4) & 0xf, TIPIPCId & 0xf,
+ (TargetId >> 8) & 0xf, (TargetId >> 4) & 0xf, TargetId & 0xf,
sbuf);
}
}
Use this when you want to detach and do something else
with your gdb. */
static void
-udi_close (quitting) /*FIXME: how is quitting used */
- int quitting;
+udi_close ( /*FIXME: how is quitting used */
+ int quitting)
{
if (udi_session_id < 0)
return;
inferior_pid = 0;
printf_filtered (" Ending remote debugging\n");
-}
+}
/**************************************************************** UDI_ATACH */
/* Attach to a program that is already loaded and running
* Upon exiting the process's execution is stopped.
*/
static void
-udi_attach (args, from_tty)
- char *args;
- int from_tty;
+udi_attach (char *args, int from_tty)
{
- UDIResource From;
- UDIInt32 PC_adds;
- UDICount Count = 1;
- UDISizeT Size = 4;
- UDICount CountDone;
- UDIBool HostEndian = 0;
- UDIError err;
+ UDIResource From;
+ UDIInt32 PC_adds;
+ UDICount Count = 1;
+ UDISizeT Size = 4;
+ UDICount CountDone;
+ UDIBool HostEndian = 0;
+ UDIError err;
if (args == NULL)
error_no_arg ("program to attach");
if (udi_session_id < 0)
- error ("UDI connection not opened yet, use the 'target udi' command.\n");
-
+ error ("UDI connection not opened yet, use the 'target udi' command.\n");
+
if (from_tty)
- printf_unfiltered ("Attaching to remote program %s...\n", prog_name);
+ printf_unfiltered ("Attaching to remote program %s...\n", prog_name);
- UDIStop();
+ UDIStop ();
From.Space = UDI29KSpecialRegs;
From.Offset = 11;
- if (err = UDIRead(From, &PC_adds, Count, Size, &CountDone, HostEndian))
+ if (err = UDIRead (From, &PC_adds, Count, Size, &CountDone, HostEndian))
error ("UDIRead failed in udi_attach");
printf_unfiltered ("Remote process is now halted, pc1 = 0x%x.\n", PC_adds);
}
Use this when you want to detach and do something else
with your gdb. Leave remote process running (with no breakpoints set). */
static void
-udi_detach (args,from_tty)
- char *args;
- int from_tty;
+udi_detach (char *args, int from_tty)
{
- remove_breakpoints(); /* Just in case there were any left in */
+ remove_breakpoints (); /* Just in case there were any left in */
if (UDIDisconnect (udi_session_id, UDIContinueSession))
error ("UDIDisconnect() failed in udi_detach");
udi_session_id = -1;
inferior_pid = 0;
- pop_target();
+ pop_target ();
if (from_tty)
printf_unfiltered ("Detaching from TIP\n");
** Tell the remote machine to resume. */
static void
-udi_resume (pid, step, sig)
- int pid, step;
- enum target_signal sig;
+udi_resume (int pid, int step, enum target_signal sig)
{
UDIError tip_error;
UDIUInt32 Steps = 1;
UDIStepType StepType = UDIStepNatural;
UDIRange Range;
- if (step) /* step 1 instruction */
+ if (step) /* step 1 instruction */
{
tip_error = UDIStep (Steps, StepType, Range);
if (!tip_error)
return;
- fprintf_unfiltered (gdb_stderr, "UDIStep() error = %d\n", tip_error);
+ fprintf_unfiltered (gdb_stderr, "UDIStep() error = %d\n", tip_error);
error ("failed in udi_resume");
}
- if (UDIExecute())
+ if (UDIExecute ())
error ("UDIExecute() failed in udi_resume");
}
storing status in STATUS just as `wait' would. */
static int
-udi_wait (pid, status)
- int pid;
- struct target_waitstatus *status;
+udi_wait (int pid, struct target_waitstatus *status)
{
- UDIInt32 MaxTime;
- UDIPId PId;
- UDIInt32 StopReason;
- UDISizeT CountDone;
- int old_timeout = timeout;
- int old_immediate_quit = immediate_quit;
- int i;
+ UDIInt32 MaxTime;
+ UDIPId PId;
+ UDIInt32 StopReason;
+ UDISizeT CountDone;
+ int old_timeout = timeout;
+ int old_immediate_quit = immediate_quit;
+ int i;
status->kind = TARGET_WAITKIND_EXITED;
status->value.integer = 0;
/* wait for message to arrive. It should be:
- If the target stops executing, udi_wait() should return.
-*/
+ If the target stops executing, udi_wait() should return.
+ */
timeout = 0; /* Wait indefinetly for a message */
- immediate_quit = 1; /* Helps ability to QUIT */
+ immediate_quit = 1; /* Helps ability to QUIT */
- while(1)
+ while (1)
{
i = 0;
MaxTime = UDIWaitForever;
- UDIWait(MaxTime, &PId, &StopReason);
+ UDIWait (MaxTime, &PId, &StopReason);
QUIT; /* Let user quit if they want */
switch (StopReason & UDIGrossState)
{
case UDIStdoutReady:
- if (UDIGetStdout (sbuf, (UDISizeT)SBUF_MAX, &CountDone))
+ if (UDIGetStdout (sbuf, (UDISizeT) SBUF_MAX, &CountDone))
/* 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, gdb_stdout);
- gdb_flush(gdb_stdout);
+ fwrite (sbuf, 1, CountDone, stdout);
+ gdb_flush (gdb_stdout);
continue;
case UDIStderrReady:
- UDIGetStderr (sbuf, (UDISizeT)SBUF_MAX, &CountDone);
- fwrite (sbuf, 1, CountDone, gdb_stderr);
- gdb_flush(gdb_stderr);
+ UDIGetStderr (sbuf, (UDISizeT) SBUF_MAX, &CountDone);
+ fwrite (sbuf, 1, CountDone, stderr);
+ gdb_flush (gdb_stderr);
continue;
case UDIStdinNeeded:
if (ch == EOF)
break;
sbuf[i++] = ch;
- } while (i < SBUF_MAX && ch != '\n');
- UDIPutStdin (sbuf, (UDISizeT)i, &CountDone);
+ }
+ while (i < SBUF_MAX && ch != '\n');
+ UDIPutStdin (sbuf, (UDISizeT) i, &CountDone);
continue;
}
switch (StopReason & UDIGrossState)
{
case UDITrapped:
- printf_unfiltered("Am290*0 received vector number %d\n", StopReason >> 24);
-
- switch (StopReason >> 8)
+ printf_unfiltered ("Am290*0 received vector number %d\n", StopReason >> 24);
+
+ switch ((StopReason >> 8) & 0xff)
{
- case 0: /* Illegal opcode */
- printf_unfiltered(" (break point)\n");
+ case 0: /* Illegal opcode */
+ printf_unfiltered (" (break point)\n");
status->kind = TARGET_WAITKIND_STOPPED;
status->value.sig = TARGET_SIGNAL_TRAP;
break;
- case 1: /* Unaligned Access */
+ case 1: /* Unaligned Access */
status->kind = TARGET_WAITKIND_STOPPED;
status->value.sig = TARGET_SIGNAL_BUS;
break;
status->kind = TARGET_WAITKIND_STOPPED;
status->value.sig = TARGET_SIGNAL_FPE;
break;
- case 5: /* Protection Violation */
+ case 5: /* Protection Violation */
status->kind = TARGET_WAITKIND_STOPPED;
/* Why not SEGV? What is a Protection Violation? */
status->value.sig = TARGET_SIGNAL_ILL;
break;
case 6:
case 7:
- case 8: /* User Instruction Mapping Miss */
- case 9: /* User Data Mapping Miss */
+ case 8: /* User Instruction Mapping Miss */
+ case 9: /* User Data Mapping Miss */
case 10: /* Supervisor Instruction Mapping Miss */
case 11: /* Supervisor Data Mapping Miss */
status->kind = TARGET_WAITKIND_STOPPED;
#if 0
/* Handy for debugging */
-udi_pc()
+udi_pc (void)
{
- UDIResource From;
- UDIUInt32 *To;
- UDICount Count;
- UDISizeT Size = 4;
- UDICount CountDone;
- UDIBool HostEndian = 0;
- UDIError err;
+ UDIResource From;
+ UDIUInt32 *To;
+ UDICount Count;
+ UDISizeT Size = 4;
+ UDICount CountDone;
+ UDIBool HostEndian = 0;
+ UDIError err;
int pc[2];
unsigned long myregs[256];
int i;
From.Space = UDI29KPC;
From.Offset = 0;
- To = (UDIUInt32 *)pc;
+ To = (UDIUInt32 *) pc;
Count = 2;
- err = UDIRead(From, To, Count, Size, &CountDone, HostEndian);
+ err = UDIRead (From, To, Count, Size, &CountDone, HostEndian);
printf_unfiltered ("err = %d, CountDone = %d, pc[0] = 0x%x, pc[1] = 0x%x\n",
- err, CountDone, pc[0], pc[1]);
+ err, CountDone, pc[0], pc[1]);
- udi_fetch_registers(-1);
+ udi_fetch_registers (-1);
- printf_unfiltered("other pc1 = 0x%x, pc0 = 0x%x\n", *(int *)®isters[4 * PC_REGNUM],
- *(int *)®isters[4 * NPC_REGNUM]);
+ printf_unfiltered ("other pc1 = 0x%x, pc0 = 0x%x\n", *(int *) ®isters[4 * PC_REGNUM],
+ *(int *) ®isters[4 * NPC_REGNUM]);
/* Now, read all the registers globally */
From.Space = UDI29KGlobalRegs;
From.Offset = 0;
- err = UDIRead(From, myregs, 256, 4, &CountDone, HostEndian);
+ err = UDIRead (From, myregs, 256, 4, &CountDone, HostEndian);
printf ("err = %d, CountDone = %d\n", err, CountDone);
- printf("\n");
+ printf ("\n");
for (i = 0; i < 256; i += 2)
- printf("%d:\t%#10x\t%11d\t%#10x\t%11d\n", i, myregs[i], myregs[i],
- myregs[i+1], myregs[i+1]);
- printf("\n");
+ printf ("%d:\t%#10x\t%11d\t%#10x\t%11d\n", i, myregs[i], myregs[i],
+ myregs[i + 1], myregs[i + 1]);
+ printf ("\n");
return pc[0];
}
* Read a remote register 'regno'.
* If regno==-1 then read all the registers.
*/
-static void
-udi_fetch_registers (regno)
-int regno;
+static void
+udi_fetch_registers (int regno)
{
- UDIResource From;
- UDIUInt32 *To;
- UDICount Count;
- UDISizeT Size = 4;
- UDICount CountDone;
- UDIBool HostEndian = 0;
- UDIError err;
- int i;
-
- if (regno >= 0) {
- fetch_register(regno);
- return;
- }
+ UDIResource From;
+ UDIUInt32 *To;
+ UDICount Count;
+ UDISizeT Size = 4;
+ UDICount CountDone;
+ UDIBool HostEndian = 0;
+ UDIError err;
+ int i;
+
+ if (regno >= 0)
+ {
+ fetch_register (regno);
+ return;
+ }
/* Gr1/rsp */
From.Space = UDI29KGlobalRegs;
From.Offset = 1;
- To = (UDIUInt32 *)®isters[4 * GR1_REGNUM];
+ To = (UDIUInt32 *) & registers[4 * GR1_REGNUM];
Count = 1;
- if (err = UDIRead(From, To, Count, Size, &CountDone, HostEndian))
- error("UDIRead() failed in udi_fetch_registers");
+ if (err = UDIRead (From, To, Count, Size, &CountDone, HostEndian))
+ error ("UDIRead() failed in udi_fetch_registers");
register_valid[GR1_REGNUM] = 1;
#if defined(GR64_REGNUM) /* Read gr64-127 */
-/* Global Registers gr64-gr95 */
+/* Global Registers gr64-gr95 */
From.Space = UDI29KGlobalRegs;
From.Offset = 64;
- To = (UDIUInt32 *)®isters[4 * GR64_REGNUM];
+ To = (UDIUInt32 *) & registers[4 * GR64_REGNUM];
Count = 32;
- if (err = UDIRead(From, To, Count, Size, &CountDone, HostEndian))
- error("UDIRead() failed in udi_fetch_registers");
+ 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++)
register_valid[i] = 1;
-#endif /* GR64_REGNUM */
+#endif /* GR64_REGNUM */
-/* Global Registers gr96-gr127 */
+/* Global Registers gr96-gr127 */
From.Space = UDI29KGlobalRegs;
From.Offset = 96;
- To = (UDIUInt32 *)®isters[4 * GR96_REGNUM];
+ To = (UDIUInt32 *) & registers[4 * GR96_REGNUM];
Count = 32;
- if (err = UDIRead(From, To, Count, Size, &CountDone, HostEndian))
- error("UDIRead() failed in udi_fetch_registers");
+ 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++)
register_valid[i] = 1;
From.Space = UDI29KLocalRegs;
From.Offset = 0;
- To = (UDIUInt32 *)®isters[4 * LR0_REGNUM];
+ To = (UDIUInt32 *) & registers[4 * LR0_REGNUM];
Count = 128;
- if (err = UDIRead(From, To, Count, Size, &CountDone, HostEndian))
- error("UDIRead() failed in udi_fetch_registers");
+ 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++)
register_valid[i] = 1;
From.Space = UDI29KSpecialRegs;
From.Offset = 0;
- To = (UDIUInt32 *)®isters[4 * SR_REGNUM(0)];
+ To = (UDIUInt32 *) & registers[4 * SR_REGNUM (0)];
Count = 15;
- if (err = UDIRead(From, To, Count, Size, &CountDone, HostEndian))
- error("UDIRead() failed in udi_fetch_registers");
+ 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++)
+ for (i = SR_REGNUM (0); i < SR_REGNUM (0) + 15; i++)
register_valid[i] = 1;
- if (USE_SHADOW_PC) { /* Let regno_to_srnum() handle the register number */
- fetch_register(NPC_REGNUM);
- fetch_register(PC_REGNUM);
- fetch_register(PC2_REGNUM);
+ if (USE_SHADOW_PC)
+ { /* Let regno_to_srnum() handle the register number */
+ fetch_register (NPC_REGNUM);
+ fetch_register (PC_REGNUM);
+ fetch_register (PC2_REGNUM);
/* Unprotected Special Registers sr128-sr135 */
- From.Space = UDI29KSpecialRegs;
- From.Offset = 128;
- To = (UDIUInt32 *)®isters[4 * SR_REGNUM(128)];
- Count = 135-128 + 1;
- 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++)
- register_valid[i] = 1;
- }
+ From.Space = UDI29KSpecialRegs;
+ From.Offset = 128;
+ To = (UDIUInt32 *) & registers[4 * SR_REGNUM (128)];
+ Count = 135 - 128 + 1;
+ 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++)
+ register_valid[i] = 1;
+ }
if (remote_debug)
{
- printf_unfiltered("Fetching all registers\n");
- printf_unfiltered("Fetching PC0 = 0x%x, PC1 = 0x%x, PC2 = 0x%x\n",
- read_register(NPC_REGNUM), read_register(PC_REGNUM),
- read_register(PC2_REGNUM));
+ fprintf_unfiltered (gdb_stdlog, "Fetching all registers\n");
+ fprintf_unfiltered (gdb_stdlog,
+ "Fetching PC0 = 0x%x, PC1 = 0x%x, PC2 = 0x%x\n",
+ read_register (NPC_REGNUM),
+ read_register (PC_REGNUM),
+ read_register (PC2_REGNUM));
}
/* There doesn't seem to be any way to get these. */
*/
static void
-udi_store_registers (regno)
-int regno;
+udi_store_registers (int regno)
{
- UDIUInt32 *From;
- UDIResource To;
- UDICount Count;
- UDISizeT Size = 4;
- UDICount CountDone;
- UDIBool HostEndian = 0;
-
+ UDIUInt32 *From;
+ UDIResource To;
+ UDICount Count;
+ UDISizeT Size = 4;
+ UDICount CountDone;
+ UDIBool HostEndian = 0;
+
if (regno >= 0)
{
- store_register(regno);
+ store_register (regno);
return;
}
if (remote_debug)
{
- printf_unfiltered("Storing all registers\n");
- printf_unfiltered("PC0 = 0x%x, PC1 = 0x%x, PC2 = 0x%x\n", read_register(NPC_REGNUM),
- read_register(PC_REGNUM), read_register(PC2_REGNUM));
+ fprintf_unfiltered (gdb_stdlog, "Storing all registers\n");
+ fprintf_unfiltered (gdb_stdlog,
+ "PC0 = 0x%x, PC1 = 0x%x, PC2 = 0x%x\n",
+ read_register (NPC_REGNUM),
+ read_register (PC_REGNUM),
+ read_register (PC2_REGNUM));
}
/* Gr1/rsp */
- From = (UDIUInt32 *)®isters[4 * GR1_REGNUM];
+ From = (UDIUInt32 *) & registers[4 * GR1_REGNUM];
To.Space = UDI29KGlobalRegs;
To.Offset = 1;
Count = 1;
- if(UDIWrite(From, To, Count, Size, &CountDone, HostEndian))
- error("UDIWrite() failed in udi_store_regisetrs");
+ if (UDIWrite (From, To, Count, Size, &CountDone, HostEndian))
+ error ("UDIWrite() failed in udi_store_regisetrs");
#if defined(GR64_REGNUM)
/* Global registers gr64-gr95 */
- From = (UDIUInt32 *)®isters[4 * GR64_REGNUM];
+ From = (UDIUInt32 *) & registers[4 * GR64_REGNUM];
To.Space = UDI29KGlobalRegs;
To.Offset = 64;
Count = 32;
- if(UDIWrite(From, To, Count, Size, &CountDone, HostEndian))
- error("UDIWrite() failed in udi_store_regisetrs");
+ if (UDIWrite (From, To, Count, Size, &CountDone, HostEndian))
+ error ("UDIWrite() failed in udi_store_regisetrs");
-#endif /* GR64_REGNUM */
+#endif /* GR64_REGNUM */
/* Global registers gr96-gr127 */
- From = (UDIUInt32 *)®isters[4 * GR96_REGNUM];
+ From = (UDIUInt32 *) & registers[4 * GR96_REGNUM];
To.Space = UDI29KGlobalRegs;
To.Offset = 96;
Count = 32;
- if(UDIWrite(From, To, Count, Size, &CountDone, HostEndian))
- error("UDIWrite() failed in udi_store_regisetrs");
+ if (UDIWrite (From, To, Count, Size, &CountDone, HostEndian))
+ error ("UDIWrite() failed in udi_store_regisetrs");
/* Local Registers */
- From = (UDIUInt32 *)®isters[4 * LR0_REGNUM];
+ From = (UDIUInt32 *) & registers[4 * LR0_REGNUM];
To.Space = UDI29KLocalRegs;
To.Offset = 0;
Count = 128;
- if(UDIWrite(From, To, Count, Size, &CountDone, HostEndian))
- error("UDIWrite() failed in udi_store_regisetrs");
+ if (UDIWrite (From, To, Count, Size, &CountDone, HostEndian))
+ error ("UDIWrite() failed in udi_store_regisetrs");
-/* Protected Special Registers */ /* VAB through TMR */
+ /* Protected Special Registers *//* VAB through TMR */
- From = (UDIUInt32 *)®isters[4 * SR_REGNUM(0)];
+ From = (UDIUInt32 *) & registers[4 * SR_REGNUM (0)];
To.Space = UDI29KSpecialRegs;
To.Offset = 0;
Count = 10;
- if(UDIWrite(From, To, Count, Size, &CountDone, HostEndian))
- error("UDIWrite() failed in udi_store_regisetrs");
+ if (UDIWrite (From, To, Count, Size, &CountDone, HostEndian))
+ error ("UDIWrite() failed in udi_store_regisetrs");
/* PC0, PC1, PC2 possibly as shadow registers */
- From = (UDIUInt32 *)®isters[4 * SR_REGNUM(10)];
+ From = (UDIUInt32 *) & registers[4 * SR_REGNUM (10)];
To.Space = UDI29KSpecialRegs;
Count = 3;
- if (USE_SHADOW_PC)
- To.Offset = 20; /* SPC0 */
- else
- To.Offset = 10; /* PC0 */
- if(UDIWrite(From, To, Count, Size, &CountDone, HostEndian))
- error("UDIWrite() failed in udi_store_regisetrs");
+ if (USE_SHADOW_PC)
+ To.Offset = 20; /* SPC0 */
+ else
+ To.Offset = 10; /* PC0 */
+ if (UDIWrite (From, To, Count, Size, &CountDone, HostEndian))
+ error ("UDIWrite() failed in udi_store_regisetrs");
/* PC1 via UDI29KPC */
- From = (UDIUInt32 *)®isters[4 * PC_REGNUM];
+ From = (UDIUInt32 *) & registers[4 * PC_REGNUM];
To.Space = UDI29KPC;
- To.Offset = 0; /* PC1 */
+ To.Offset = 0; /* PC1 */
Count = 1;
if (UDIWrite (From, To, Count, Size, &CountDone, HostEndian))
error ("UDIWrite() failed in udi_store_regisetrs");
/* LRU and MMU */
- From = (UDIUInt32 *)®isters[4 * SR_REGNUM(13)];
+ From = (UDIUInt32 *) & registers[4 * SR_REGNUM (13)];
To.Space = UDI29KSpecialRegs;
To.Offset = 13;
Count = 2;
- if(UDIWrite(From, To, Count, Size, &CountDone, HostEndian))
- error("UDIWrite() failed in udi_store_regisetrs");
+ if (UDIWrite (From, To, Count, Size, &CountDone, HostEndian))
+ error ("UDIWrite() failed in udi_store_regisetrs");
-/* Unprotected Special Registers */
+/* Unprotected Special Registers */
- From = (UDIUInt32 *)®isters[4 * SR_REGNUM(128)];
+ From = (UDIUInt32 *) & registers[4 * SR_REGNUM (128)];
To.Space = UDI29KSpecialRegs;
To.Offset = 128;
- Count = 135-128 +1;
- if(UDIWrite(From, To, Count, Size, &CountDone, HostEndian))
- error("UDIWrite() failed in udi_store_regisetrs");
+ Count = 135 - 128 + 1;
+ if (UDIWrite (From, To, Count, Size, &CountDone, HostEndian))
+ error ("UDIWrite() failed in udi_store_regisetrs");
registers_changed ();
}
debugged. */
static void
-udi_prepare_to_store ()
+udi_prepare_to_store (void)
{
/* Do nothing, since we can store individual regs */
}
/********************************************************** TRANSLATE_ADDR */
static CORE_ADDR
-translate_addr(addr)
-CORE_ADDR addr;
+translate_addr (CORE_ADDR addr)
{
#if defined(ULTRA3) && defined(KERNEL_DEBUGGING)
- /* Check for a virtual address in the kernel */
- /* Assume physical address of ublock is in paddr_u register */
- /* FIXME: doesn't work for user virtual addresses */
- if (addr >= UVADDR) {
- /* PADDR_U register holds the physical address of the ublock */
- CORE_ADDR i = (CORE_ADDR)read_register(PADDR_U_REGNUM);
- return(i + addr - (CORE_ADDR)UVADDR);
- } else {
- return(addr);
- }
+ /* Check for a virtual address in the kernel */
+ /* Assume physical address of ublock is in paddr_u register */
+ /* FIXME: doesn't work for user virtual addresses */
+ if (addr >= UVADDR)
+ {
+ /* PADDR_U register holds the physical address of the ublock */
+ CORE_ADDR i = (CORE_ADDR) read_register (PADDR_U_REGNUM);
+ return (i + addr - (CORE_ADDR) UVADDR);
+ }
+ else
+ {
+ return (addr);
+ }
#else
- return(addr);
+ return (addr);
#endif
}
/************************************************* UDI_XFER_INFERIOR_MEMORY */
/* FIXME! Merge these two. */
static int
-udi_xfer_inferior_memory (memaddr, myaddr, len, write)
- CORE_ADDR memaddr;
- char *myaddr;
- int len;
- int write;
+udi_xfer_inferior_memory (CORE_ADDR memaddr, char *myaddr, int len, int write,
+ struct mem_attrib *attrib ATTRIBUTE_UNUSED,
+ struct target_ops *target ATTRIBUTE_UNUSED)
{
- memaddr = translate_addr(memaddr);
+ memaddr = translate_addr (memaddr);
if (write)
return udi_write_inferior_memory (memaddr, myaddr, len);
/********************************************************** UDI_FILES_INFO */
static void
-udi_files_info ()
+udi_files_info (struct target_ops *target)
{
printf_unfiltered ("\tAttached to UDI socket to %s", udi_config_id);
if (prog_name != NULL)
/**************************************************** UDI_INSERT_BREAKPOINT */
static int
-udi_insert_breakpoint (addr, contents_cache)
- CORE_ADDR addr;
- char *contents_cache;
+udi_insert_breakpoint (CORE_ADDR addr, char *contents_cache)
{
int cnt;
UDIError err;
for (cnt = 0; cnt < BKPT_TABLE_SIZE; cnt++)
- if (bkpt_table[cnt].Type == 0) /* Find first free slot */
+ if (bkpt_table[cnt].Type == 0) /* Find first free slot */
break;
- if(cnt >= BKPT_TABLE_SIZE)
- error("Too many breakpoints set");
+ if (cnt >= BKPT_TABLE_SIZE)
+ error ("Too many breakpoints set");
bkpt_table[cnt].Addr.Offset = addr;
- bkpt_table[cnt].Addr.Space = UDI29KIRAMSpace;
+ bkpt_table[cnt].Addr.Space = UDI29KIRAMSpace;
bkpt_table[cnt].PassCount = 1;
bkpt_table[cnt].Type = UDIBreakFlagExecute;
-
- err = UDISetBreakpoint(bkpt_table[cnt].Addr,
- bkpt_table[cnt].PassCount,
- bkpt_table[cnt].Type,
- &bkpt_table[cnt].BreakId);
- if (err == 0) return 0; /* Success */
+ err = UDISetBreakpoint (bkpt_table[cnt].Addr,
+ bkpt_table[cnt].PassCount,
+ bkpt_table[cnt].Type,
+ &bkpt_table[cnt].BreakId);
+
+ if (err == 0)
+ return 0; /* Success */
bkpt_table[cnt].Type = 0;
- error("UDISetBreakpoint returned error code %d\n", err);
+ error ("UDISetBreakpoint returned error code %d\n", err);
}
/**************************************************** UDI_REMOVE_BREAKPOINT */
static int
-udi_remove_breakpoint (addr, contents_cache)
- CORE_ADDR addr;
- char *contents_cache;
+udi_remove_breakpoint (CORE_ADDR addr, char *contents_cache)
{
int cnt;
UDIError err;
for (cnt = 0; cnt < BKPT_TABLE_SIZE; cnt++)
- if (bkpt_table[cnt].Addr.Offset == addr) /* Find matching breakpoint */
+ if (bkpt_table[cnt].Addr.Offset == addr) /* Find matching breakpoint */
break;
- if(cnt >= BKPT_TABLE_SIZE)
- error("Can't find breakpoint in table");
+ if (cnt >= BKPT_TABLE_SIZE)
+ error ("Can't find breakpoint in table");
bkpt_table[cnt].Type = 0;
- err = UDIClearBreakpoint(bkpt_table[cnt].BreakId);
- if (err == 0) return 0; /* Success */
+ err = UDIClearBreakpoint (bkpt_table[cnt].BreakId);
+ if (err == 0)
+ return 0; /* Success */
- error("UDIClearBreakpoint returned error code %d\n", err);
+ error ("UDIClearBreakpoint returned error code %d\n", err);
}
static void
-udi_kill(arg,from_tty)
- char *arg;
- int from_tty;
+udi_kill (void)
{
#if 0
/*
-UDIStop does not really work as advertised. It causes the TIP to close it's
-connection, which usually results in GDB dying with a SIGPIPE. For now, we
-just invoke udi_close, which seems to get things right.
-*/
- UDIStop();
+ UDIStop does not really work as advertised. It causes the TIP to close it's
+ connection, which usually results in GDB dying with a SIGPIPE. For now, we
+ just invoke udi_close, which seems to get things right.
+ */
+ UDIStop ();
udi_session_id = -1;
inferior_pid = 0;
if (from_tty)
- printf_unfiltered("Target has been stopped.");
+ printf_unfiltered ("Target has been stopped.");
#endif /* 0 */
#if 0
- udi_close(0);
- pop_target();
+ udi_close (0);
+ pop_target ();
#endif /* 0 */
/* Keep the target around, e.g. so "run" can do the right thing when
loaded code as arguments. (You need to use the `run' command to do that.)
The options are:
- -ms %d Set mem stack size to %d
- -rs %d Set regular stack size to %d
- -i send init info (default)
- -noi don't send init info
- -[tT] Load Text section
- -[dD] Load Data section
- -[bB] Load BSS section
- -[lL] Load Lit section
- */
+ -ms %d Set mem stack size to %d
+ -rs %d Set regular stack size to %d
+ -i send init info (default)
+ -noi don't send init info
+ -[tT] Load Text section
+ -[dD] Load Data section
+ -[bB] Load BSS section
+ -[lL] Load Lit section
+ */
static void
-download(load_arg_string, from_tty)
- char *load_arg_string;
- int from_tty;
+download (char *load_arg_string, int from_tty)
{
#define DEFAULT_MEM_STACK_SIZE 0x6000
#define DEFAULT_REG_STACK_SIZE 0x2000
dont_repeat ();
- filename = strtok(load_arg_string, " \t");
+ filename = strtok (load_arg_string, " \t");
if (!filename)
error ("Must specify at least a file name with the load command");
filename = tilde_expand (filename);
- make_cleanup (free, filename);
+ make_cleanup (xfree, filename);
while (token = strtok (NULL, " \t"))
{
load_lit = 1;
break;
default:
- error ("Unknown UDI load option -%s", token-1);
+ error ("Unknown UDI load option -%s", token - 1);
}
}
}
pbfd = bfd_openr (filename, gnutarget);
- if (!pbfd)
+ if (!pbfd)
+ /* FIXME: should be using bfd_errmsg, not assuming it was
+ bfd_error_system_call. */
perror_with_name (filename);
-
- make_cleanup (bfd_close, pbfd);
+
+ /* FIXME: should be checking for errors from bfd_close (for one thing,
+ on error it does not free all the storage associated with the
+ bfd). */
+ make_cleanup_bfd_close (pbfd);
QUIT;
immediate_quit++;
- if (!bfd_check_format (pbfd, bfd_object))
+ if (!bfd_check_format (pbfd, bfd_object))
error ("It doesn't seem to be an object file");
-
- for (section = pbfd->sections; section; section = section->next)
+
+ for (section = pbfd->sections; section; section = section->next)
{
if (bfd_get_section_flags (pbfd, section) & SEC_ALLOC)
{
below starts writing before it even checks the size. */
continue;
- printf_unfiltered("[Loading section %s at %x (%d bytes)]\n",
- section_name,
- To.Offset,
- section_size);
+ printf_unfiltered ("[Loading section %s at %x (%d bytes)]\n",
+ section_name,
+ To.Offset,
+ section_size);
if (bfd_get_section_flags (pbfd, section) & SEC_CODE)
{
- address_ranges[1].Offset);
}
- if (bfd_get_section_flags (pbfd, section) & SEC_LOAD) /* Text, data or lit */
+ if (bfd_get_section_flags (pbfd, section) & SEC_LOAD) /* Text, data or lit */
{
file_ptr fptr;
bfd_get_section_contents (pbfd, section, buffer, fptr,
Count);
- err = UDIWrite ((UDIHostMemPtr)buffer, /* From */
- To, /* To */
- Count, /* Count */
- (UDISizeT)1, /* Size */
- &Count, /* CountDone */
- (UDIBool)0); /* HostEndian */
+ err = UDIWrite ((UDIHostMemPtr) buffer, /* From */
+ To, /* To */
+ Count, /* Count */
+ (UDISizeT) 1, /* Size */
+ &Count, /* CountDone */
+ (UDIBool) 0); /* HostEndian */
if (err)
error ("UDIWrite failed, error = %d", err);
section_size -= Count;
}
}
- else /* BSS */
+ else
+ /* BSS */
{
UDIResource From;
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 */
- (UDISizeT)4, /* Size */
- &Count, /* CountDone */
- (UDIBool)0); /* HostEndian */
+ zero above). */
+ err = UDIWrite ((UDIHostMemPtr) & zero, /* From */
+ To, /* To */
+ (UDICount) 1, /* Count */
+ (UDISizeT) 4, /* Size */
+ &Count, /* CountDone */
+ (UDIBool) 0); /* HostEndian */
if (err)
error ("UDIWrite failed, error = %d", err);
From = To;
- To.Offset+=4;
+ To.Offset += 4;
/* Now, duplicate it for the length of the BSS */
- err = UDICopy (From, /* From */
- To, /* To */
- (UDICount)(section_size/4 - 1), /* Count */
- (UDISizeT)4, /* Size */
- &Count, /* CountDone */
- (UDIBool)1); /* Direction */
+ err = UDICopy (From, /* From */
+ To, /* To */
+ (UDICount) (section_size / 4 - 1), /* Count */
+ (UDISizeT) 4, /* Size */
+ &Count, /* CountDone */
+ (UDIBool) 1); /* Direction */
if (err)
{
char message[100];
int xerr;
- xerr = UDIGetErrorMsg(err, 100, message, &Count);
+ xerr = UDIGetErrorMsg (err, 100, message, &Count);
if (!xerr)
fprintf_unfiltered (gdb_stderr, "Error is %s\n", message);
else
entry.Space = UDI29KIRAMSpace;
entry.Offset = bfd_get_start_address (pbfd);
-
+
immediate_quit--;
}
-/* User interface to download an image into the remote target. See download()
- * for details on args.
- */
+/* Function to download an image into the remote target. */
static void
-udi_load(args, from_tty)
- char *args;
- int from_tty;
+udi_load (char *args, int from_tty)
{
download (args, from_tty);
- symbol_file_add (strtok (args, " \t"), from_tty, 0, 0, 0, 0);
+ /* As a convenience, pick up any symbol info that is in the program
+ being loaded. Note that we assume that the program is the``mainline'';
+ if this is not always true, then this code will need to be augmented. */
+ symbol_file_add (strtok (args, " \t"), from_tty, NULL, 1, 0);
+
+ /* Getting new symbols may change our opinion about what is
+ frameless. */
+ reinit_frame_cache ();
}
/*************************************************** UDI_WRITE_INFERIOR_MEMORY
** Copy LEN bytes of data from debugger memory at MYADDR
to inferior's memory at MEMADDR. Returns number of bytes written. */
static int
-udi_write_inferior_memory (memaddr, myaddr, len)
- CORE_ADDR memaddr;
- char *myaddr;
- int len;
+udi_write_inferior_memory (CORE_ADDR memaddr, char *myaddr, int len)
{
- int nwritten = 0;
- UDIUInt32 *From;
- UDIResource To;
- UDICount Count;
- UDISizeT Size = 1;
- UDICount CountDone = 0;
- UDIBool HostEndian = 0;
-
- To.Space = udi_memory_space(memaddr);
- From = (UDIUInt32*)myaddr;
+ int nwritten = 0;
+ UDIUInt32 *From;
+ UDIResource To;
+ UDICount Count;
+ UDISizeT Size = 1;
+ UDICount CountDone = 0;
+ UDIBool HostEndian = 0;
+
+ To.Space = udi_memory_space (memaddr);
+ From = (UDIUInt32 *) myaddr;
while (nwritten < len)
- { Count = len - nwritten;
- if (Count > MAXDATA) Count = MAXDATA;
- To.Offset = memaddr + nwritten;
- if(UDIWrite(From, To, Count, Size, &CountDone, HostEndian))
- { error("UDIWrite() failed in udi_write_inferrior_memory");
- break;
+ {
+ Count = len - nwritten;
+ if (Count > MAXDATA)
+ Count = MAXDATA;
+ To.Offset = memaddr + nwritten;
+ if (UDIWrite (From, To, Count, Size, &CountDone, HostEndian))
+ {
+ error ("UDIWrite() failed in udi_write_inferior_memory");
+ break;
}
- else
- { nwritten += CountDone;
- From += CountDone;
+ else
+ {
+ nwritten += CountDone;
+ From += CountDone;
}
- }
- return(nwritten);
+ }
+ return (nwritten);
}
/**************************************************** UDI_READ_INFERIOR_MEMORY
** Read LEN bytes from inferior memory at MEMADDR. Put the result
at debugger address MYADDR. Returns number of bytes read. */
static int
-udi_read_inferior_memory(memaddr, myaddr, len)
- CORE_ADDR memaddr;
- char *myaddr;
- int len;
+udi_read_inferior_memory (CORE_ADDR memaddr, char *myaddr, int len)
{
- int nread = 0;
- UDIResource From;
- UDIUInt32 *To;
- UDICount Count;
- UDISizeT Size = 1;
- UDICount CountDone = 0;
- UDIBool HostEndian = 0;
- UDIError err;
-
- From.Space = udi_memory_space(memaddr);
- To = (UDIUInt32*)myaddr;
+ int nread = 0;
+ UDIResource From;
+ UDIUInt32 *To;
+ UDICount Count;
+ UDISizeT Size = 1;
+ UDICount CountDone = 0;
+ UDIBool HostEndian = 0;
+ UDIError err;
+
+ From.Space = udi_memory_space (memaddr);
+ To = (UDIUInt32 *) myaddr;
while (nread < len)
- { Count = len - nread;
- if (Count > MAXDATA) Count = MAXDATA;
- From.Offset = memaddr + nread;
- if(err = UDIRead(From, To, Count, Size, &CountDone, HostEndian))
- { error("UDIRead() failed in udi_read_inferrior_memory");
- break;
+ {
+ Count = len - nread;
+ if (Count > MAXDATA)
+ Count = MAXDATA;
+ From.Offset = memaddr + nread;
+ if (err = UDIRead (From, To, Count, Size, &CountDone, HostEndian))
+ {
+ error ("UDIRead() failed in udi_read_inferior_memory");
+ break;
}
- else
- { nread += CountDone;
- To += CountDone;
+ else
+ {
+ nread += CountDone;
+ To += CountDone;
}
- }
- return(nread);
+ }
+ return (nread);
}
/********************************************************************* WARNING
*/
-udi_warning(num)
-int num;
+udi_warning (int num)
{
- error ("ERROR while loading program into remote TIP: $d\n", num);
+ error ("ERROR while loading program into remote TIP: $d\n", num);
}
-/*****************************************************************************/
+/*****************************************************************************/
/* Fetch a single register indicatated by 'regno'.
* Returns 0/-1 on success/failure.
*/
static void
-fetch_register (regno)
- int regno;
+fetch_register (int regno)
{
- UDIResource From;
- UDIUInt32 To;
- UDICount Count = 1;
- UDISizeT Size = 4;
- UDICount CountDone;
- UDIBool HostEndian = 0;
- UDIError err;
- int result;
+ UDIResource From;
+ UDIUInt32 To;
+ UDICount Count = 1;
+ UDISizeT Size = 4;
+ UDICount CountDone;
+ UDIBool HostEndian = 0;
+ UDIError err;
+ int result;
if (regno == GR1_REGNUM)
{
#if defined(GR64_REGNUM)
- else if (regno >= GR64_REGNUM && regno < GR64_REGNUM + 32 )
+ else if (regno >= GR64_REGNUM && regno < GR64_REGNUM + 32)
{
From.Space = UDI29KGlobalRegs;
From.Offset = (regno - GR64_REGNUM) + 64;
}
-#endif /* GR64_REGNUM */
+#endif /* GR64_REGNUM */
else if (regno >= LR0_REGNUM && regno < LR0_REGNUM + 128)
{
From.Space = UDI29KLocalRegs;
From.Offset = (regno - LR0_REGNUM);
}
- else if (regno>=FPE_REGNUM && regno<=EXO_REGNUM)
+ else if (regno >= FPE_REGNUM && regno <= EXO_REGNUM)
{
int val = -1;
- supply_register(160 + (regno - FPE_REGNUM),(char *) &val);
- return; /* Pretend Success */
+ /*supply_register(160 + (regno - FPE_REGNUM),(char *) &val); */
+ supply_register (regno, (char *) &val);
+ return; /* Pretend Success */
}
- else
+ else
{
From.Space = UDI29KSpecialRegs;
- From.Offset = regnum_to_srnum(regno);
+ From.Offset = regnum_to_srnum (regno);
}
- if (err = UDIRead(From, &To, Count, Size, &CountDone, HostEndian))
- error("UDIRead() failed in udi_fetch_registers");
+ if (err = UDIRead (From, &To, Count, Size, &CountDone, HostEndian))
+ error ("UDIRead() failed in udi_fetch_registers");
- supply_register(regno, (char *) &To);
+ supply_register (regno, (char *) &To);
if (remote_debug)
- printf_unfiltered("Fetching register %s = 0x%x\n", reg_names[regno], To);
+ fprintf_unfiltered (gdb_stdlog, "Fetching register %s = 0x%x\n",
+ REGISTER_NAME (regno), To);
}
-/*****************************************************************************/
+/*****************************************************************************/
/* Store a single register indicated by 'regno'.
* Returns 0/-1 on success/failure.
*/
static int
-store_register (regno)
- int regno;
+store_register (int regno)
{
- int result;
- UDIUInt32 From;
- UDIResource To;
- UDICount Count = 1;
- UDISizeT Size = 4;
- UDICount CountDone;
- UDIBool HostEndian = 0;
+ int result;
+ UDIUInt32 From;
+ UDIResource To;
+ UDICount Count = 1;
+ UDISizeT Size = 4;
+ UDICount CountDone;
+ UDIBool HostEndian = 0;
- From = read_register (regno); /* get data value */
+ From = read_register (regno); /* get data value */
if (remote_debug)
- printf_unfiltered("Storing register %s = 0x%x\n", reg_names[regno], From);
+ fprintf_unfiltered (gdb_stdlog, "Storing register %s = 0x%x\n",
+ REGISTER_NAME (regno), From);
if (regno == GR1_REGNUM)
{
To.Space = UDI29KGlobalRegs;
To.Offset = 1;
- result = UDIWrite(&From, To, Count, Size, &CountDone, HostEndian);
+ result = UDIWrite (&From, To, Count, Size, &CountDone, HostEndian);
/* Setting GR1 changes the numbers of all the locals, so invalidate the
* register cache. Do this *after* calling read_register, because we want
* read_register to return the value that write_register has just stuffed
registers_changed ();
}
#if defined(GR64_REGNUM)
- else if (regno >= GR64_REGNUM && regno < GR64_REGNUM + 32 )
+ else if (regno >= GR64_REGNUM && regno < GR64_REGNUM + 32)
{
To.Space = UDI29KGlobalRegs;
To.Offset = (regno - GR64_REGNUM) + 64;
- result = UDIWrite(&From, To, Count, Size, &CountDone, HostEndian);
+ result = UDIWrite (&From, To, Count, Size, &CountDone, HostEndian);
}
-#endif /* GR64_REGNUM */
+#endif /* GR64_REGNUM */
else if (regno >= GR96_REGNUM && regno < GR96_REGNUM + 32)
{
To.Space = UDI29KGlobalRegs;
To.Offset = (regno - GR96_REGNUM) + 96;
- result = UDIWrite(&From, To, Count, Size, &CountDone, HostEndian);
+ result = UDIWrite (&From, To, Count, Size, &CountDone, HostEndian);
}
else if (regno >= LR0_REGNUM && regno < LR0_REGNUM + 128)
{
To.Space = UDI29KLocalRegs;
To.Offset = (regno - LR0_REGNUM);
- result = UDIWrite(&From, To, Count, Size, &CountDone, HostEndian);
+ result = UDIWrite (&From, To, Count, Size, &CountDone, HostEndian);
}
- else if (regno >= FPE_REGNUM && regno <= EXO_REGNUM)
- return 0; /* Pretend Success */
+ else if (regno >= FPE_REGNUM && regno <= EXO_REGNUM)
+ return 0; /* Pretend Success */
else if (regno == PC_REGNUM)
- {
+ {
/* PC1 via UDI29KPC */
To.Space = UDI29KPC;
/* Writing to this loc actually changes the values of pc0 & pc1 */
- register_valid[PC_REGNUM] = 0; /* pc1 */
- register_valid[NPC_REGNUM] = 0; /* pc0 */
+ register_valid[PC_REGNUM] = 0; /* pc1 */
+ register_valid[NPC_REGNUM] = 0; /* pc0 */
}
- else /* An unprotected or protected special register */
+ else
+ /* An unprotected or protected special register */
{
To.Space = UDI29KSpecialRegs;
- To.Offset = regnum_to_srnum(regno);
- result = UDIWrite(&From, To, Count, Size, &CountDone, HostEndian);
+ To.Offset = regnum_to_srnum (regno);
+ result = UDIWrite (&From, To, Count, Size, &CountDone, HostEndian);
}
if (result != 0)
- error("UDIWrite() failed in store_registers");
+ error ("UDIWrite() failed in store_registers");
return 0;
}
* Convert a gdb special register number to a 29000 special register number.
*/
static int
-regnum_to_srnum(regno)
-int regno;
+regnum_to_srnum (int regno)
{
- switch(regno) {
- case VAB_REGNUM: return(0);
- case OPS_REGNUM: return(1);
- case CPS_REGNUM: return(2);
- case CFG_REGNUM: return(3);
- case CHA_REGNUM: return(4);
- case CHD_REGNUM: return(5);
- case CHC_REGNUM: return(6);
- case RBP_REGNUM: return(7);
- case TMC_REGNUM: return(8);
- case TMR_REGNUM: return(9);
- case NPC_REGNUM: return(USE_SHADOW_PC ? (20) : (10));
- case PC_REGNUM: return(USE_SHADOW_PC ? (21) : (11));
- case PC2_REGNUM: return(USE_SHADOW_PC ? (22) : (12));
- case MMU_REGNUM: return(13);
- case LRU_REGNUM: return(14);
- case IPC_REGNUM: return(128);
- case IPA_REGNUM: return(129);
- case IPB_REGNUM: return(130);
- case Q_REGNUM: return(131);
- case ALU_REGNUM: return(132);
- case BP_REGNUM: return(133);
- case FC_REGNUM: return(134);
- case CR_REGNUM: return(135);
- case FPE_REGNUM: return(160);
- case INTE_REGNUM: return(161);
- case FPS_REGNUM: return(162);
- case EXO_REGNUM:return(164);
- default:
- return(255); /* Failure ? */
- }
+ switch (regno)
+ {
+ case VAB_REGNUM:
+ return (0);
+ case OPS_REGNUM:
+ return (1);
+ case CPS_REGNUM:
+ return (2);
+ case CFG_REGNUM:
+ return (3);
+ case CHA_REGNUM:
+ return (4);
+ case CHD_REGNUM:
+ return (5);
+ case CHC_REGNUM:
+ return (6);
+ case RBP_REGNUM:
+ return (7);
+ case TMC_REGNUM:
+ return (8);
+ case TMR_REGNUM:
+ return (9);
+ case NPC_REGNUM:
+ return (USE_SHADOW_PC ? (20) : (10));
+ case PC_REGNUM:
+ return (USE_SHADOW_PC ? (21) : (11));
+ case PC2_REGNUM:
+ return (USE_SHADOW_PC ? (22) : (12));
+ case MMU_REGNUM:
+ return (13);
+ case LRU_REGNUM:
+ return (14);
+ case IPC_REGNUM:
+ return (128);
+ case IPA_REGNUM:
+ return (129);
+ case IPB_REGNUM:
+ return (130);
+ case Q_REGNUM:
+ return (131);
+ case ALU_REGNUM:
+ return (132);
+ case BP_REGNUM:
+ return (133);
+ case FC_REGNUM:
+ return (134);
+ case CR_REGNUM:
+ return (135);
+ case FPE_REGNUM:
+ return (160);
+ case INTE_REGNUM:
+ return (161);
+ case FPS_REGNUM:
+ return (162);
+ case EXO_REGNUM:
+ return (164);
+ default:
+ return (255); /* Failure ? */
+ }
}
/****************************************************************************/
/*
* FIXME: Doesn't know anything about I_CACHE/D_CACHE.
*/
static CPUSpace
-udi_memory_space(addr)
-CORE_ADDR addr;
+udi_memory_space (CORE_ADDR addr)
{
- UDIUInt32 tstart = IMemStart;
- UDIUInt32 tend = tstart + IMemSize;
- UDIUInt32 dstart = DMemStart;
- UDIUInt32 dend = tstart + DMemSize;
- UDIUInt32 rstart = RMemStart;
- UDIUInt32 rend = tstart + RMemSize;
-
- if (((UDIUInt32)addr >= tstart) && ((UDIUInt32)addr < tend)) {
- return UDI29KIRAMSpace;
- } else if (((UDIUInt32)addr >= dstart) && ((UDIUInt32)addr < dend)) {
- return UDI29KDRAMSpace;
- } else if (((UDIUInt32)addr >= rstart) && ((UDIUInt32)addr < rend)) {
- /* FIXME: how do we determine between D_ROM and I_ROM */
- return UDI29KIROMSpace;
- } else /* FIXME: what do me do now? */
- return UDI29KDRAMSpace; /* Hmmm! */
+ UDIUInt32 tstart = IMemStart;
+ UDIUInt32 tend = tstart + IMemSize;
+ UDIUInt32 dstart = DMemStart;
+ UDIUInt32 dend = tstart + DMemSize;
+ UDIUInt32 rstart = RMemStart;
+ UDIUInt32 rend = tstart + RMemSize;
+
+ if (((UDIUInt32) addr >= tstart) && ((UDIUInt32) addr < tend))
+ {
+ return UDI29KIRAMSpace;
+ }
+ else if (((UDIUInt32) addr >= dstart) && ((UDIUInt32) addr < dend))
+ {
+ return UDI29KDRAMSpace;
+ }
+ else if (((UDIUInt32) addr >= rstart) && ((UDIUInt32) addr < rend))
+ {
+ /* FIXME: how do we determine between D_ROM and I_ROM */
+ return UDI29KIROMSpace;
+ }
+ else /* FIXME: what do me do now? */
+ return UDI29KDRAMSpace; /* Hmmm! */
}
/*********************************************************************** STUBS
*/
-void convert16() {;}
-void convert32() {;}
-GDB_FILE * EchoFile = 0; /* used for debugging */
-int QuietMode = 0; /* used for debugging */
+void
+convert16 (void)
+{;
+}
+void
+convert32 (void)
+{;
+}
+struct ui_file *EchoFile = 0; /* used for debugging */
+int QuietMode = 0; /* used for debugging */
\f
#ifdef NO_HIF_SUPPORT
-service_HIF(msg)
- union msg_t *msg;
+service_HIF (union msg_t *msg)
{
- return(0); /* Emulate a failure */
+ return (0); /* Emulate a failure */
}
#endif
\f
The RS/6000 doesn't like "extern" followed by "static"; SunOS
/bin/cc doesn't like "static" twice. */
-struct target_ops udi_ops = {
- "udi",
- "Remote UDI connected TIP",
- "Remote debug an AMD 29k using UDI socket connection to TIP process.\n\
+struct target_ops udi_ops;
+
+static void
+init_udi_ops (void)
+{
+ udi_ops.to_shortname = "udi";
+ udi_ops.to_longname = "Remote UDI connected TIP";
+ udi_ops.to_doc = "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\
+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\
+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\
`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,
- udi_detach,
- udi_resume,
- udi_wait,
- udi_fetch_registers,
- udi_store_registers,
- udi_prepare_to_store,
- udi_xfer_inferior_memory,
- udi_files_info,
- udi_insert_breakpoint,
- udi_remove_breakpoint,
- 0, /* termial_init */
- 0, /* terminal_inferior */
- 0, /* terminal_ours_for_output */
- 0, /* terminal_ours */
- 0, /* terminal_info */
- udi_kill, /* FIXME, kill */
- udi_load,
- 0, /* lookup_symbol */
- udi_create_inferior,
- udi_mourn, /* mourn_inferior FIXME */
- 0, /* can_run */
- 0, /* notice_signals */
- process_stratum,
- 0, /* next */
- 1, /* has_all_memory */
- 1, /* has_memory */
- 1, /* has_stack */
- 1, /* has_registers */
- 1, /* has_execution */
- 0, /* sections */
- 0, /* sections_end */
- OPS_MAGIC, /* Always the last thing */
+ used to pick which line of the file to use.";
+ udi_ops.to_open = udi_open;
+ udi_ops.to_close = udi_close;
+ udi_ops.to_attach = udi_attach;
+ udi_ops.to_detach = udi_detach;
+ udi_ops.to_resume = udi_resume;
+ udi_ops.to_wait = udi_wait;
+ udi_ops.to_fetch_registers = udi_fetch_registers;
+ udi_ops.to_store_registers = udi_store_registers;
+ udi_ops.to_prepare_to_store = udi_prepare_to_store;
+ udi_ops.to_xfer_memory = udi_xfer_inferior_memory;
+ udi_ops.to_files_info = udi_files_info;
+ udi_ops.to_insert_breakpoint = udi_insert_breakpoint;
+ udi_ops.to_remove_breakpoint = udi_remove_breakpoint;
+ udi_ops.to_terminal_init = 0;
+ udi_ops.to_terminal_inferior = 0;
+ udi_ops.to_terminal_ours_for_output = 0;
+ udi_ops.to_terminal_ours = 0;
+ udi_ops.to_terminal_info = 0;
+ udi_ops.to_kill = udi_kill;
+ udi_ops.to_load = udi_load;
+ udi_ops.to_lookup_symbol = 0;
+ udi_ops.to_create_inferior = udi_create_inferior;
+ udi_ops.to_mourn_inferior = udi_mourn;
+ udi_ops.to_can_run = 0;
+ udi_ops.to_notice_signals = 0;
+ udi_ops.to_thread_alive = 0;
+ udi_ops.to_stop = 0;
+ udi_ops.to_stratum = process_stratum;
+ udi_ops.DONT_USE = 0;
+ udi_ops.to_has_all_memory = 1;
+ udi_ops.to_has_memory = 1;
+ udi_ops.to_has_stack = 1;
+ udi_ops.to_has_registers = 1;
+ udi_ops.to_has_execution = 1;
+ udi_ops.to_sections = 0;
+ udi_ops.to_sections_end = 0;
+ udi_ops.to_magic = OPS_MAGIC;
};
void
-_initialize_remote_udi ()
+_initialize_remote_udi (void)
{
+ init_udi_ops ();
add_target (&udi_ops);
}