Remove isize output argument from fast_tracepoint_valid_at
This patch removes the isize output argument from the fast_tracepoint_valid_at gdbarch hook. It was used to return the size of the instruction that needs to be replaced when installing a fast tracepoint. Instead of getting this value from the fast_tracepoint_valid_at hook, we can call the gdb_insn_length function. If we do not do this, then architectures which do not have a restriction on where to install the fast tracepoint will send uninitialized memory off to GDBserver. See remote_download_tracepoint: ~~~ int isize; if (gdbarch_fast_tracepoint_valid_at (target_gdbarch (), tpaddr, &isize, NULL)) xsnprintf (buf + strlen (buf), BUF_SIZE - strlen (buf), ":F%x", isize); ~~~ The default implementation of fast_tracepoint_valid_at will not set isize resulting in uninitialized memory being sent. Later on, GDBserver could use this information to compute a jump offset. gdb/ChangeLog: * arch-utils.c (default_fast_tracepoint_valid_at): Remove unused isize argument. * arch-utils.h (default_fast_tracepoint_valid_at): Likewise. * breakpoint.c (check_fast_tracepoint_sals): Adjust call to gdbarch_fast_tracepoint_valid_at. * gdbarch.sh (fast_tracepoint_valid_at): Remove isize argument. * gdbarch.h: Regenerate. * gdbarch.c: Regenerate. * i386-tdep.c (i386_fast_tracepoint_valid_at): Remove isize argument. Do not set it. * remote.c (remote_download_tracepoint): Adjust call to gdbarch_fast_tracepoint_valid_at. Call gdb_insn_length to get the instruction length.
This commit is contained in:
parent
e8b416815b
commit
6b940e6a06
@ -1,3 +1,19 @@
|
|||||||
|
2015-07-30 Pierre Langlois <pierre.langlois@arm.com>
|
||||||
|
|
||||||
|
* arch-utils.c (default_fast_tracepoint_valid_at): Remove unused
|
||||||
|
isize argument.
|
||||||
|
* arch-utils.h (default_fast_tracepoint_valid_at): Likewise.
|
||||||
|
* breakpoint.c (check_fast_tracepoint_sals): Adjust call to
|
||||||
|
gdbarch_fast_tracepoint_valid_at.
|
||||||
|
* gdbarch.sh (fast_tracepoint_valid_at): Remove isize argument.
|
||||||
|
* gdbarch.h: Regenerate.
|
||||||
|
* gdbarch.c: Regenerate.
|
||||||
|
* i386-tdep.c (i386_fast_tracepoint_valid_at): Remove isize
|
||||||
|
argument. Do not set it.
|
||||||
|
* remote.c (remote_download_tracepoint): Adjust call to
|
||||||
|
gdbarch_fast_tracepoint_valid_at. Call gdb_insn_length to get
|
||||||
|
the instruction length.
|
||||||
|
|
||||||
2015-07-30 Yao Qi <yao.qi@linaro.org>
|
2015-07-30 Yao Qi <yao.qi@linaro.org>
|
||||||
|
|
||||||
* arm-tdep.h (enum gdb_regnum): Move it to ...
|
* arm-tdep.h (enum gdb_regnum): Move it to ...
|
||||||
|
@ -795,8 +795,8 @@ default_has_shared_address_space (struct gdbarch *gdbarch)
|
|||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
default_fast_tracepoint_valid_at (struct gdbarch *gdbarch,
|
default_fast_tracepoint_valid_at (struct gdbarch *gdbarch, CORE_ADDR addr,
|
||||||
CORE_ADDR addr, int *isize, char **msg)
|
char **msg)
|
||||||
{
|
{
|
||||||
/* We don't know if maybe the target has some way to do fast
|
/* We don't know if maybe the target has some way to do fast
|
||||||
tracepoints that doesn't need gdbarch, so always say yes. */
|
tracepoints that doesn't need gdbarch, so always say yes. */
|
||||||
|
@ -161,8 +161,7 @@ extern struct gdbarch *get_current_arch (void);
|
|||||||
extern int default_has_shared_address_space (struct gdbarch *);
|
extern int default_has_shared_address_space (struct gdbarch *);
|
||||||
|
|
||||||
extern int default_fast_tracepoint_valid_at (struct gdbarch *gdbarch,
|
extern int default_fast_tracepoint_valid_at (struct gdbarch *gdbarch,
|
||||||
CORE_ADDR addr,
|
CORE_ADDR addr, char **msg);
|
||||||
int *isize, char **msg);
|
|
||||||
|
|
||||||
extern void default_remote_breakpoint_from_pc (struct gdbarch *,
|
extern void default_remote_breakpoint_from_pc (struct gdbarch *,
|
||||||
CORE_ADDR *pcptr, int *kindptr);
|
CORE_ADDR *pcptr, int *kindptr);
|
||||||
|
@ -9406,8 +9406,7 @@ check_fast_tracepoint_sals (struct gdbarch *gdbarch,
|
|||||||
associated with SAL. */
|
associated with SAL. */
|
||||||
if (sarch == NULL)
|
if (sarch == NULL)
|
||||||
sarch = gdbarch;
|
sarch = gdbarch;
|
||||||
rslt = gdbarch_fast_tracepoint_valid_at (sarch, sal->pc,
|
rslt = gdbarch_fast_tracepoint_valid_at (sarch, sal->pc, &msg);
|
||||||
NULL, &msg);
|
|
||||||
old_chain = make_cleanup (xfree, msg);
|
old_chain = make_cleanup (xfree, msg);
|
||||||
|
|
||||||
if (!rslt)
|
if (!rslt)
|
||||||
|
@ -4394,13 +4394,13 @@ set_gdbarch_has_shared_address_space (struct gdbarch *gdbarch,
|
|||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
gdbarch_fast_tracepoint_valid_at (struct gdbarch *gdbarch, CORE_ADDR addr, int *isize, char **msg)
|
gdbarch_fast_tracepoint_valid_at (struct gdbarch *gdbarch, CORE_ADDR addr, char **msg)
|
||||||
{
|
{
|
||||||
gdb_assert (gdbarch != NULL);
|
gdb_assert (gdbarch != NULL);
|
||||||
gdb_assert (gdbarch->fast_tracepoint_valid_at != NULL);
|
gdb_assert (gdbarch->fast_tracepoint_valid_at != NULL);
|
||||||
if (gdbarch_debug >= 2)
|
if (gdbarch_debug >= 2)
|
||||||
fprintf_unfiltered (gdb_stdlog, "gdbarch_fast_tracepoint_valid_at called\n");
|
fprintf_unfiltered (gdb_stdlog, "gdbarch_fast_tracepoint_valid_at called\n");
|
||||||
return gdbarch->fast_tracepoint_valid_at (gdbarch, addr, isize, msg);
|
return gdbarch->fast_tracepoint_valid_at (gdbarch, addr, msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -1310,8 +1310,8 @@ extern void set_gdbarch_has_shared_address_space (struct gdbarch *gdbarch, gdbar
|
|||||||
|
|
||||||
/* True if a fast tracepoint can be set at an address. */
|
/* True if a fast tracepoint can be set at an address. */
|
||||||
|
|
||||||
typedef int (gdbarch_fast_tracepoint_valid_at_ftype) (struct gdbarch *gdbarch, CORE_ADDR addr, int *isize, char **msg);
|
typedef int (gdbarch_fast_tracepoint_valid_at_ftype) (struct gdbarch *gdbarch, CORE_ADDR addr, char **msg);
|
||||||
extern int gdbarch_fast_tracepoint_valid_at (struct gdbarch *gdbarch, CORE_ADDR addr, int *isize, char **msg);
|
extern int gdbarch_fast_tracepoint_valid_at (struct gdbarch *gdbarch, CORE_ADDR addr, char **msg);
|
||||||
extern void set_gdbarch_fast_tracepoint_valid_at (struct gdbarch *gdbarch, gdbarch_fast_tracepoint_valid_at_ftype *fast_tracepoint_valid_at);
|
extern void set_gdbarch_fast_tracepoint_valid_at (struct gdbarch *gdbarch, gdbarch_fast_tracepoint_valid_at_ftype *fast_tracepoint_valid_at);
|
||||||
|
|
||||||
/* Return the "auto" target charset. */
|
/* Return the "auto" target charset. */
|
||||||
|
@ -1018,7 +1018,7 @@ v:int:has_global_breakpoints:::0:0::0
|
|||||||
m:int:has_shared_address_space:void:::default_has_shared_address_space::0
|
m:int:has_shared_address_space:void:::default_has_shared_address_space::0
|
||||||
|
|
||||||
# True if a fast tracepoint can be set at an address.
|
# True if a fast tracepoint can be set at an address.
|
||||||
m:int:fast_tracepoint_valid_at:CORE_ADDR addr, int *isize, char **msg:addr, isize, msg::default_fast_tracepoint_valid_at::0
|
m:int:fast_tracepoint_valid_at:CORE_ADDR addr, char **msg:addr, msg::default_fast_tracepoint_valid_at::0
|
||||||
|
|
||||||
# Return the "auto" target charset.
|
# Return the "auto" target charset.
|
||||||
f:const char *:auto_charset:void::default_auto_charset:default_auto_charset::0
|
f:const char *:auto_charset:void::default_auto_charset:default_auto_charset::0
|
||||||
|
@ -8045,8 +8045,8 @@ static const int i386_record_regmap[] =
|
|||||||
string. */
|
string. */
|
||||||
|
|
||||||
static int
|
static int
|
||||||
i386_fast_tracepoint_valid_at (struct gdbarch *gdbarch,
|
i386_fast_tracepoint_valid_at (struct gdbarch *gdbarch, CORE_ADDR addr,
|
||||||
CORE_ADDR addr, int *isize, char **msg)
|
char **msg)
|
||||||
{
|
{
|
||||||
int len, jumplen;
|
int len, jumplen;
|
||||||
static struct ui_file *gdb_null = NULL;
|
static struct ui_file *gdb_null = NULL;
|
||||||
@ -8078,8 +8078,6 @@ i386_fast_tracepoint_valid_at (struct gdbarch *gdbarch,
|
|||||||
|
|
||||||
/* Check for fit. */
|
/* Check for fit. */
|
||||||
len = gdb_print_insn (gdbarch, addr, gdb_null, NULL);
|
len = gdb_print_insn (gdbarch, addr, gdb_null, NULL);
|
||||||
if (isize)
|
|
||||||
*isize = len;
|
|
||||||
|
|
||||||
if (len < jumplen)
|
if (len < jumplen)
|
||||||
{
|
{
|
||||||
|
@ -44,6 +44,7 @@
|
|||||||
#include "gdb_bfd.h"
|
#include "gdb_bfd.h"
|
||||||
#include "filestuff.h"
|
#include "filestuff.h"
|
||||||
#include "rsp-low.h"
|
#include "rsp-low.h"
|
||||||
|
#include "disasm.h"
|
||||||
|
|
||||||
#include <sys/time.h>
|
#include <sys/time.h>
|
||||||
|
|
||||||
@ -11106,12 +11107,10 @@ remote_download_tracepoint (struct target_ops *self, struct bp_location *loc)
|
|||||||
target capabilities at definition time. */
|
target capabilities at definition time. */
|
||||||
if (remote_supports_fast_tracepoints ())
|
if (remote_supports_fast_tracepoints ())
|
||||||
{
|
{
|
||||||
int isize;
|
if (gdbarch_fast_tracepoint_valid_at (loc->gdbarch, tpaddr,
|
||||||
|
NULL))
|
||||||
if (gdbarch_fast_tracepoint_valid_at (target_gdbarch (),
|
|
||||||
tpaddr, &isize, NULL))
|
|
||||||
xsnprintf (buf + strlen (buf), BUF_SIZE - strlen (buf), ":F%x",
|
xsnprintf (buf + strlen (buf), BUF_SIZE - strlen (buf), ":F%x",
|
||||||
isize);
|
gdb_insn_length (loc->gdbarch, tpaddr));
|
||||||
else
|
else
|
||||||
/* If it passed validation at definition but fails now,
|
/* If it passed validation at definition but fails now,
|
||||||
something is very wrong. */
|
something is very wrong. */
|
||||||
|
Loading…
Reference in New Issue
Block a user