static void mips_close (int quitting);
-static void mips_detach (char *args, int from_tty);
+static void mips_detach (struct target_ops *ops, char *args, int from_tty);
static void mips_resume (ptid_t ptid, int step,
enum target_signal siggnal);
static ptid_t mips_wait (ptid_t ptid,
struct target_waitstatus *status);
-static int mips_map_regno (int regno);
+static int mips_map_regno (struct gdbarch *, int);
static void mips_fetch_registers (struct regcache *regcache, int regno);
static int mips_make_srec (char *buffer, int type, CORE_ADDR memaddr,
unsigned char *myaddr, int len);
-static int set_breakpoint (CORE_ADDR addr, int len, enum break_type type);
+static int mips_set_breakpoint (CORE_ADDR addr, int len, enum break_type type);
-static int clear_breakpoint (CORE_ADDR addr, int len, enum break_type type);
+static int mips_clear_breakpoint (CORE_ADDR addr, int len,
+ enum break_type type);
-static int common_breakpoint (int set, CORE_ADDR addr, int len,
- enum break_type type);
+static int mips_common_breakpoint (int set, CORE_ADDR addr, int len,
+ enum break_type type);
/* Forward declarations. */
extern struct target_ops mips_ops;
/* Clear all breakpoints: */
if ((mips_monitor == MON_IDT
- && clear_breakpoint (-1, 0, BREAK_UNUSED) == 0)
+ && mips_clear_breakpoint (-1, 0, BREAK_UNUSED) == 0)
|| mips_monitor == MON_LSI)
monitor_supports_breakpoints = 1;
else
/* Parse the serial port name, the optional TFTP name, and the
optional local TFTP name. */
- if ((argv = buildargv (name)) == NULL)
- nomem (0);
+ argv = gdb_buildargv (name);
make_cleanup_freeargv (argv);
serial_port_name = xstrdup (argv[0]);
mips_open (char *name, int from_tty)
{
const char *monitor_prompt = NULL;
- if (gdbarch_bfd_arch_info (current_gdbarch) != NULL
- && gdbarch_bfd_arch_info (current_gdbarch)->arch == bfd_arch_mips)
+ if (gdbarch_bfd_arch_info (target_gdbarch) != NULL
+ && gdbarch_bfd_arch_info (target_gdbarch)->arch == bfd_arch_mips)
{
- switch (gdbarch_bfd_arch_info (current_gdbarch)->mach)
+ switch (gdbarch_bfd_arch_info (target_gdbarch)->mach)
{
case bfd_mach_mips4100:
case bfd_mach_mips4300:
/* Detach from the remote board. */
static void
-mips_detach (char *args, int from_tty)
+mips_detach (struct target_ops *ops, char *args, int from_tty)
{
if (args)
error ("Argument given to \"detach\" when remotely debugging.");
#define REGNO_OFFSET 96
static int
-mips_map_regno (int regno)
+mips_map_regno (struct gdbarch *gdbarch, int regno)
{
if (regno < 32)
return regno;
- if (regno >= mips_regnum (current_gdbarch)->fp0
- && regno < mips_regnum (current_gdbarch)->fp0 + 32)
- return regno - mips_regnum (current_gdbarch)->fp0 + 32;
- else if (regno == mips_regnum (current_gdbarch)->pc)
+ if (regno >= mips_regnum (gdbarch)->fp0
+ && regno < mips_regnum (gdbarch)->fp0 + 32)
+ return regno - mips_regnum (gdbarch)->fp0 + 32;
+ else if (regno == mips_regnum (gdbarch)->pc)
return REGNO_OFFSET + 0;
- else if (regno == mips_regnum (current_gdbarch)->cause)
+ else if (regno == mips_regnum (gdbarch)->cause)
return REGNO_OFFSET + 1;
- else if (regno == mips_regnum (current_gdbarch)->hi)
+ else if (regno == mips_regnum (gdbarch)->hi)
return REGNO_OFFSET + 2;
- else if (regno == mips_regnum (current_gdbarch)->lo)
+ else if (regno == mips_regnum (gdbarch)->lo)
return REGNO_OFFSET + 3;
- else if (regno == mips_regnum (current_gdbarch)->fp_control_status)
+ else if (regno == mips_regnum (gdbarch)->fp_control_status)
return REGNO_OFFSET + 4;
- else if (regno == mips_regnum (current_gdbarch)->fp_implementation_revision)
+ else if (regno == mips_regnum (gdbarch)->fp_implementation_revision)
return REGNO_OFFSET + 5;
else
/* FIXME: Is there a way to get the status register? */
{
/* If PMON doesn't support this register, don't waste serial
bandwidth trying to read it. */
- int pmon_reg = mips_map_regno (regno);
+ int pmon_reg = mips_map_regno (gdbarch, regno);
if (regno != 0 && pmon_reg == 0)
val = 0;
else
}
regcache_cooked_read_unsigned (regcache, regno, &val);
- mips_request ('R', mips_map_regno (regno), val,
+ mips_request ('R', mips_map_regno (gdbarch, regno), val,
&err, mips_receive_wait, NULL);
if (err)
mips_error ("Can't write register %d: %s", regno, safe_strerror (errno));
mips_insert_breakpoint (struct bp_target_info *bp_tgt)
{
if (monitor_supports_breakpoints)
- return set_breakpoint (bp_tgt->placed_address, MIPS_INSN32_SIZE,
- BREAK_FETCH);
+ return mips_set_breakpoint (bp_tgt->placed_address, MIPS_INSN32_SIZE,
+ BREAK_FETCH);
else
return memory_insert_breakpoint (bp_tgt);
}
mips_remove_breakpoint (struct bp_target_info *bp_tgt)
{
if (monitor_supports_breakpoints)
- return clear_breakpoint (bp_tgt->placed_address, MIPS_INSN32_SIZE,
- BREAK_FETCH);
+ return mips_clear_breakpoint (bp_tgt->placed_address, MIPS_INSN32_SIZE,
+ BREAK_FETCH);
else
return memory_remove_breakpoint (bp_tgt);
}
int
mips_insert_watchpoint (CORE_ADDR addr, int len, int type)
{
- if (set_breakpoint (addr, len, type))
+ if (mips_set_breakpoint (addr, len, type))
return -1;
return 0;
int
mips_remove_watchpoint (CORE_ADDR addr, int len, int type)
{
- if (clear_breakpoint (addr, len, type))
+ if (mips_clear_breakpoint (addr, len, type))
return -1;
return 0;
/* Insert a breakpoint. */
static int
-set_breakpoint (CORE_ADDR addr, int len, enum break_type type)
+mips_set_breakpoint (CORE_ADDR addr, int len, enum break_type type)
{
- return common_breakpoint (1, addr, len, type);
+ return mips_common_breakpoint (1, addr, len, type);
}
/* Clear a breakpoint. */
static int
-clear_breakpoint (CORE_ADDR addr, int len, enum break_type type)
+mips_clear_breakpoint (CORE_ADDR addr, int len, enum break_type type)
{
- return common_breakpoint (0, addr, len, type);
+ return mips_common_breakpoint (0, addr, len, type);
}
print the warning text and return 0. If it's an error, print
the error text and return 1. <ADDR> is the address of the breakpoint
that was being set. <RERRFLG> is the error code returned by PMON.
- This is a helper function for common_breakpoint. */
+ This is a helper function for mips_common_breakpoint. */
static int
-check_lsi_error (CORE_ADDR addr, int rerrflg)
+mips_check_lsi_error (CORE_ADDR addr, int rerrflg)
{
struct lsi_error *err;
char *saddr = paddr_nz (addr); /* printable address string */
if ((err->code & rerrflg) == err->code)
{
found = 1;
- fprintf_unfiltered (gdb_stderr,
- "common_breakpoint (0x%s): Warning: %s\n",
+ fprintf_unfiltered (gdb_stderr, "\
+mips_common_breakpoint (0x%s): Warning: %s\n",
saddr,
err->string);
}
}
if (!found)
- fprintf_unfiltered (gdb_stderr,
- "common_breakpoint (0x%s): Unknown warning: 0x%x\n",
+ fprintf_unfiltered (gdb_stderr, "\
+mips_common_breakpoint (0x%s): Unknown warning: 0x%x\n",
saddr,
rerrflg);
}
{
if ((err->code & rerrflg) == err->code)
{
- fprintf_unfiltered (gdb_stderr,
- "common_breakpoint (0x%s): Error: %s\n",
+ fprintf_unfiltered (gdb_stderr, "\
+mips_common_breakpoint (0x%s): Error: %s\n",
saddr,
err->string);
return 1;
}
}
- fprintf_unfiltered (gdb_stderr,
- "common_breakpoint (0x%s): Unknown error: 0x%x\n",
+ fprintf_unfiltered (gdb_stderr, "\
+mips_common_breakpoint (0x%s): Unknown error: 0x%x\n",
saddr,
rerrflg);
return 1;
Return 0 if successful; otherwise 1. */
static int
-common_breakpoint (int set, CORE_ADDR addr, int len, enum break_type type)
+mips_common_breakpoint (int set, CORE_ADDR addr, int len, enum break_type type)
{
char buf[DATA_MAXLEN + 1];
char cmd, rcmd;
int rpid, rerrflg, rresponse, rlen;
int nfields;
- addr = gdbarch_addr_bits_remove (current_gdbarch, addr);
+ addr = gdbarch_addr_bits_remove (target_gdbarch, addr);
if (mips_monitor == MON_LSI)
{
/* Clear the table entry and tell PMON to clear the breakpoint. */
if (i == MAX_LSI_BREAKPOINTS)
{
- warning ("common_breakpoint: Attempt to clear bogus breakpoint at %s\n",
+ warning ("\
+mips_common_breakpoint: Attempt to clear bogus breakpoint at %s\n",
paddr_nz (addr));
return 1;
}
nfields = sscanf (buf, "0x%x b 0x0 0x%x", &rpid, &rerrflg);
if (nfields != 2)
- mips_error ("common_breakpoint: Bad response from remote board: %s", buf);
+ mips_error ("\
+mips_common_breakpoint: Bad response from remote board: %s",
+ buf);
- return (check_lsi_error (addr, rerrflg));
+ return (mips_check_lsi_error (addr, rerrflg));
}
else
/* set a breakpoint */
nfields = sscanf (buf, "0x%x %c 0x%x 0x%x",
&rpid, &rcmd, &rresponse, &rerrflg);
if (nfields != 4 || rcmd != cmd || rresponse > 255)
- mips_error ("common_breakpoint: Bad response from remote board: %s", buf);
+ mips_error ("\
+mips_common_breakpoint: Bad response from remote board: %s",
+ buf);
if (rerrflg != 0)
- if (check_lsi_error (addr, rerrflg))
+ if (mips_check_lsi_error (addr, rerrflg))
return 1;
/* rresponse contains PMON's breakpoint number. Record the
&rpid, &rcmd, &rerrflg, &rresponse);
if (nfields != 4 || rcmd != cmd)
- mips_error ("common_breakpoint: Bad response from remote board: %s",
+ mips_error ("\
+mips_common_breakpoint: Bad response from remote board: %s",
buf);
if (rerrflg != 0)
if (mips_monitor == MON_DDB)
rresponse = rerrflg;
if (rresponse != 22) /* invalid argument */
- fprintf_unfiltered (gdb_stderr,
- "common_breakpoint (0x%s): Got error: 0x%x\n",
+ fprintf_unfiltered (gdb_stderr, "\
+mips_common_breakpoint (0x%s): Got error: 0x%x\n",
paddr_nz (addr), rresponse);
return 1;
}
case 0x6: /* ACK */
return;
case 0x15: /* NACK */
- fprintf_unfiltered (gdb_stderr, "Download got a NACK at byte %s! Retrying.\n", paddr_u (addr));
+ fprintf_unfiltered (gdb_stderr, "Download got a NACK at byte 0x%s! Retrying.\n", paddr_nz (addr));
continue;
default:
error ("Download got unexpected ack char: 0x%x, retrying.\n", ch);
/* Work around problem where PMON monitor updates the PC after a load
to a different value than GDB thinks it has. The following ensures
that the write_pc() WILL update the PC value: */
- regcache_set_valid_p (get_current_regcache (),
- gdbarch_pc_regnum (current_gdbarch), 0);
+ struct regcache *regcache = get_current_regcache ();
+ regcache_set_valid_p (regcache,
+ gdbarch_pc_regnum (get_regcache_arch (regcache)),
+ 0);
}
if (exec_bfd)
write_pc (bfd_get_start_address (exec_bfd));