Support for bi-endian remote breakpoints.
* remote.c (big_break_insn, little_break_insn): New globals. (break_insn): Remove. (remote_insert_breakpoint, remote_remove_breakpoint): Use own code if REMOTE_BREAKPOINT defined, otherwise call memory breakpoint functions. * config/sh/tm-sh.h (REMOTE_BREAKPOINT): Remove. (BIG_REMOTE_BREAKPOINT, LITTLE_REMOTE_BREAKPOINT): Define.
This commit is contained in:
parent
5a2934b4be
commit
fea17b5545
3 changed files with 67 additions and 14 deletions
|
@ -1,5 +1,14 @@
|
|||
Sun Apr 28 15:08:05 1996 Stan Shebs <shebs@andros.cygnus.com>
|
||||
|
||||
Support for bi-endian remote breakpoints.
|
||||
* remote.c (big_break_insn, little_break_insn): New globals.
|
||||
(break_insn): Remove.
|
||||
(remote_insert_breakpoint, remote_remove_breakpoint): Use own
|
||||
code if REMOTE_BREAKPOINT defined, otherwise call memory
|
||||
breakpoint functions.
|
||||
* config/sh/tm-sh.h (REMOTE_BREAKPOINT): Remove.
|
||||
(BIG_REMOTE_BREAKPOINT, LITTLE_REMOTE_BREAKPOINT): Define.
|
||||
|
||||
* mon960-rom.c (mon960_cmds): Remove forward decl.
|
||||
(mon960_load): Use current_monitor instead of mon960_cmds.
|
||||
(mon960_regnames): Remove backslashes from line ends.
|
||||
|
|
|
@ -60,7 +60,9 @@ extern CORE_ADDR sh_skip_prologue ();
|
|||
|
||||
#define BREAKPOINT {0xc3, 0xc3} /* 0xc3c3 is trapa #c3, and it works in big
|
||||
and little endian modes */
|
||||
#define REMOTE_BREAKPOINT { 0xc3, 0x20}
|
||||
|
||||
#define BIG_REMOTE_BREAKPOINT { 0xc3, 0x20 }
|
||||
#define LITTLE_REMOTE_BREAKPOINT { 0x20, 0xc3 }
|
||||
|
||||
/* If your kernel resets the pc after the trap happens you may need to
|
||||
define this before including this file. */
|
||||
|
|
68
gdb/remote.c
68
gdb/remote.c
|
@ -308,6 +308,13 @@ serial_t remote_desc = NULL;
|
|||
#define PBUFSIZ (REGISTER_BYTES * 2 + 32)
|
||||
#endif
|
||||
|
||||
/* This variable sets the number of bytes to be written to the target
|
||||
in a single packet. Normally PBUFSIZ is satisfactory, but some
|
||||
targets need smaller values (perhaps because the receiving end
|
||||
is slow). */
|
||||
|
||||
static int remote_write_size = PBUFSIZ;
|
||||
|
||||
/* Should we try the 'P' request? If this is set to one when the stub
|
||||
doesn't support 'P', the only consequence is some unnecessary traffic. */
|
||||
static int stub_supports_P = 1;
|
||||
|
@ -1071,7 +1078,8 @@ remote_write_bytes (memaddr, myaddr, len)
|
|||
while (done < len)
|
||||
{
|
||||
int todo = len - done;
|
||||
int cando = PBUFSIZ /2 - 32; /* number of bytes that will fit. */
|
||||
int cando = min(remote_write_size, PBUFSIZ) / 2 - 32; /* num bytes that will fit */
|
||||
|
||||
if (todo > cando)
|
||||
todo = cando;
|
||||
|
||||
|
@ -1684,19 +1692,33 @@ extended_remote_create_inferior (exec_file, args, env)
|
|||
}
|
||||
|
||||
|
||||
/* On some machines, e.g. 68k, we may use a different breakpoint instruction
|
||||
than other targets; in those use REMOTE_BREAKPOINT instead of just
|
||||
BREAKPOINT. Also, bi-endian targets may define LITTLE_REMOTE_BREAKPOINT
|
||||
and BIG_REMOTE_BREAKPOINT. If none of these are defined, we just call
|
||||
the standard routines that are in mem-break.c. */
|
||||
|
||||
/* FIXME, these ought to be done in a more dynamic fashion. For instance,
|
||||
the choice of breakpoint instruction affects target program design and
|
||||
vice versa, and by making it user-tweakable, the special code here
|
||||
goes away and we need fewer special GDB configurations. */
|
||||
|
||||
#if defined (LITTLE_REMOTE_BREAKPOINT) && defined (BIG_REMOTE_BREAKPOINT) && !defined(REMOTE_BREAKPOINT)
|
||||
#define REMOTE_BREAKPOINT
|
||||
#endif
|
||||
|
||||
#ifdef REMOTE_BREAKPOINT
|
||||
|
||||
/* On some machines, e.g. 68k, we may use a different breakpoint instruction
|
||||
than other targets. */
|
||||
static unsigned char break_insn[] = REMOTE_BREAKPOINT;
|
||||
/* If the target isn't bi-endian, just pretend it is. */
|
||||
#if !defined (LITTLE_REMOTE_BREAKPOINT) && !defined (BIG_REMOTE_BREAKPOINT)
|
||||
#define LITTLE_REMOTE_BREAKPOINT REMOTE_BREAKPOINT
|
||||
#define BIG_REMOTE_BREAKPOINT REMOTE_BREAKPOINT
|
||||
#endif
|
||||
|
||||
#else /* No REMOTE_BREAKPOINT. */
|
||||
static unsigned char big_break_insn[] = BIG_REMOTE_BREAKPOINT;
|
||||
static unsigned char little_break_insn[] = LITTLE_REMOTE_BREAKPOINT;
|
||||
|
||||
/* Same old breakpoint instruction. This code does nothing different
|
||||
than mem-break.c. */
|
||||
static unsigned char break_insn[] = BREAKPOINT;
|
||||
|
||||
#endif /* No REMOTE_BREAKPOINT. */
|
||||
#endif /* REMOTE_BREAKPOINT */
|
||||
|
||||
/* Insert a breakpoint on targets that don't have any better breakpoint
|
||||
support. We read the contents of the target location and stash it,
|
||||
|
@ -1711,14 +1733,25 @@ remote_insert_breakpoint (addr, contents_cache)
|
|||
CORE_ADDR addr;
|
||||
char *contents_cache;
|
||||
{
|
||||
#ifdef REMOTE_BREAKPOINT
|
||||
int val;
|
||||
|
||||
val = target_read_memory (addr, contents_cache, sizeof break_insn);
|
||||
val = target_read_memory (addr, contents_cache, sizeof big_break_insn);
|
||||
|
||||
if (val == 0)
|
||||
val = target_write_memory (addr, (char *)break_insn, sizeof break_insn);
|
||||
{
|
||||
if (TARGET_BYTE_ORDER == BIG_ENDIAN)
|
||||
val = target_write_memory (addr, (char *) big_break_insn,
|
||||
sizeof big_break_insn);
|
||||
else
|
||||
val = target_write_memory (addr, (char *) little_break_insn,
|
||||
sizeof little_break_insn);
|
||||
}
|
||||
|
||||
return val;
|
||||
#else
|
||||
return memory_insert_breakpoint (addr, contents_cache);
|
||||
#endif /* REMOTE_BREAKPOINT */
|
||||
}
|
||||
|
||||
static int
|
||||
|
@ -1726,7 +1759,11 @@ remote_remove_breakpoint (addr, contents_cache)
|
|||
CORE_ADDR addr;
|
||||
char *contents_cache;
|
||||
{
|
||||
return target_write_memory (addr, contents_cache, sizeof break_insn);
|
||||
#ifdef REMOTE_BREAKPOINT
|
||||
return target_write_memory (addr, contents_cache, sizeof big_break_insn);
|
||||
#else
|
||||
return memory_remove_breakpoint (addr, contents_cache);
|
||||
#endif /* REMOTE_BREAKPOINT */
|
||||
}
|
||||
|
||||
/* Define the target subroutine names */
|
||||
|
@ -1836,4 +1873,9 @@ _initialize_remote ()
|
|||
var_integer, (char *)&remote_break,
|
||||
"Set whether to send break if interrupted.\n", &setlist),
|
||||
&showlist);
|
||||
|
||||
add_show_from_set (add_set_cmd ("remotewritesize", no_class,
|
||||
var_integer, (char *)&remote_write_size,
|
||||
"Set the maximum number of bytes in each memory write packet.\n", &setlist),
|
||||
&showlist);
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue