btrace: add format argument to supports_btrace

Add a format argument to the various supports_btrace functions to check
for support of a specific btrace format.  This is to prepare for a new
format.

Removed two redundant calls.  The check will be made in the subsequent
btrace_enable call.

2015-02-09  Markus Metzger  <markus.t.metzger@intel.com>

	* btrace.c (btrace_enable): Pass BTRACE_FORMAT_BTS.
	* record-btrace.c (record_btrace_open): Remove call to
	target_supports_btrace.
	* remote.c (remote_supports_btrace): Update parameters.
	* target.c (target_supports_btrace): Update parameters.
	* target.h (to_supports_btrace, target_supports_btrace): Update
	parameters.
	* target-delegates.c: Regenerate.
	* target-debug.h (target_debug_print_enum_btrace_format): New.
	* nat/linux-btrace.c
	(kernel_supports_btrace): Rename into ...
	(kernel_supports_bts): ... this.  Update users.  Update warning text.
	(intel_supports_btrace): Rename into ...
	(intel_supports_bts): ... this.  Update users.
	(cpu_supports_btrace): Rename into ...
	(cpu_supports_bts): ... this.  Update users.
	(linux_supports_btrace): Update parameters.  Split into this and ...
	(linux_supports_bts): ... this.
	* nat/linux-btrace.h (linux_supports_btrace): Update parameters.

gdbserver/
	* server.c (handle_btrace_general_set): Remove call to
	target_supports_btrace.
	(supported_btrace_packets): New.
	(handle_query): Call supported_btrace_packets.
	* target.h: include btrace-common.h.
	(btrace_target_info): Removed.
	(supports_btrace, target_supports_btrace): Update parameters.
This commit is contained in:
Markus Metzger 2014-01-17 13:29:19 +01:00
parent 734b0e4bda
commit 043c357797
13 changed files with 120 additions and 53 deletions

View file

@ -1,3 +1,25 @@
2015-02-09 Markus Metzger <markus.t.metzger@intel.com>
* btrace.c (btrace_enable): Pass BTRACE_FORMAT_BTS.
* record-btrace.c (record_btrace_open): Remove call to
target_supports_btrace.
* remote.c (remote_supports_btrace): Update parameters.
* target.c (target_supports_btrace): Update parameters.
* target.h (to_supports_btrace, target_supports_btrace): Update
parameters.
* target-delegates.c: Regenerate.
* target-debug.h (target_debug_print_enum_btrace_format): New.
* nat/linux-btrace.c
(kernel_supports_btrace): Rename into ...
(kernel_supports_bts): ... this. Update users. Update warning text.
(intel_supports_btrace): Rename into ...
(intel_supports_bts): ... this. Update users.
(cpu_supports_btrace): Rename into ...
(cpu_supports_bts): ... this. Update users.
(linux_supports_btrace): Update parameters. Split into this and ...
(linux_supports_bts): ... this.
* nat/linux-btrace.h (linux_supports_btrace): Update parameters.
2015-02-09 Markus Metzger <markus.t.metzger@intel.com> 2015-02-09 Markus Metzger <markus.t.metzger@intel.com>
* Makefile.in (SFILES): Add common/btrace-common.c. * Makefile.in (SFILES): Add common/btrace-common.c.

View file

@ -731,7 +731,7 @@ btrace_enable (struct thread_info *tp)
if (tp->btrace.target != NULL) if (tp->btrace.target != NULL)
return; return;
if (!target_supports_btrace ()) if (!target_supports_btrace (BTRACE_FORMAT_BTS))
error (_("Target does not support branch tracing.")); error (_("Target does not support branch tracing."));
DEBUG ("enable thread %d (%s)", tp->num, target_pid_to_str (tp->ptid)); DEBUG ("enable thread %d (%s)", tp->num, target_pid_to_str (tp->ptid));

View file

@ -1,3 +1,13 @@
2015-02-09 Markus Metzger <markus.t.metzger@intel.com>
* server.c (handle_btrace_general_set): Remove call to
target_supports_btrace.
(supported_btrace_packets): New.
(handle_query): Call supported_btrace_packets.
* target.h: include btrace-common.h.
(btrace_target_info): Removed.
(supports_btrace, target_supports_btrace): Update parameters.
2015-02-09 Markus Metzger <markus.t.metzger@intel.com> 2015-02-09 Markus Metzger <markus.t.metzger@intel.com>
* Makefile.in (SFILES): Add common/btrace-common.c. * Makefile.in (SFILES): Add common/btrace-common.c.

View file

@ -426,12 +426,6 @@ handle_btrace_general_set (char *own_buf)
op = own_buf + strlen ("Qbtrace:"); op = own_buf + strlen ("Qbtrace:");
if (!target_supports_btrace ())
{
strcpy (own_buf, "E.Target does not support branch tracing.");
return -1;
}
if (ptid_equal (general_thread, null_ptid) if (ptid_equal (general_thread, null_ptid)
|| ptid_equal (general_thread, minus_one_ptid)) || ptid_equal (general_thread, minus_one_ptid))
{ {
@ -1692,6 +1686,20 @@ crc32 (CORE_ADDR base, int len, unsigned int crc)
return (unsigned long long) crc; return (unsigned long long) crc;
} }
/* Add supported btrace packets to BUF. */
static void
supported_btrace_packets (char *buf)
{
if (target_supports_btrace (BTRACE_FORMAT_BTS))
strcat (buf, ";Qbtrace:bts+");
else
return;
strcat (buf, ";Qbtrace:off+");
strcat (buf, ";qXfer:btrace:read+");
}
/* Handle all of the extended 'q' packets. */ /* Handle all of the extended 'q' packets. */
void void
@ -1923,12 +1931,7 @@ handle_query (char *own_buf, int packet_len, int *new_packet_len_p)
if (target_supports_agent ()) if (target_supports_agent ())
strcat (own_buf, ";QAgent+"); strcat (own_buf, ";QAgent+");
if (target_supports_btrace ()) supported_btrace_packets (own_buf);
{
strcat (own_buf, ";Qbtrace:bts+");
strcat (own_buf, ";Qbtrace:off+");
strcat (own_buf, ";qXfer:btrace:read+");
}
return; return;
} }

View file

@ -26,9 +26,9 @@
#include "target/wait.h" #include "target/wait.h"
#include "target/waitstatus.h" #include "target/waitstatus.h"
#include "mem-break.h" #include "mem-break.h"
#include "btrace-common.h"
struct emit_ops; struct emit_ops;
struct btrace_target_info;
struct buffer; struct buffer;
struct process_info; struct process_info;
@ -355,7 +355,7 @@ struct target_ops
int (*supports_agent) (void); int (*supports_agent) (void);
/* Check whether the target supports branch tracing. */ /* Check whether the target supports branch tracing. */
int (*supports_btrace) (struct target_ops *); int (*supports_btrace) (struct target_ops *, enum btrace_format);
/* Enable branch tracing for @ptid and allocate a branch trace target /* Enable branch tracing for @ptid and allocate a branch trace target
information struct for reading and for disabling branch trace. */ information struct for reading and for disabling branch trace. */
@ -489,9 +489,9 @@ int kill_inferior (int);
(the_target->supports_agent ? \ (the_target->supports_agent ? \
(*the_target->supports_agent) () : 0) (*the_target->supports_agent) () : 0)
#define target_supports_btrace() \ #define target_supports_btrace(format) \
(the_target->supports_btrace \ (the_target->supports_btrace \
? (*the_target->supports_btrace) (the_target) : 0) ? (*the_target->supports_btrace) (the_target, format) : 0)
#define target_enable_btrace(ptid) \ #define target_enable_btrace(ptid) \
(*the_target->enable_btrace) (ptid) (*the_target->enable_btrace) (ptid)

View file

@ -248,10 +248,10 @@ perf_event_read_bts (struct btrace_target_info* tinfo, const uint8_t *begin,
return btrace; return btrace;
} }
/* Check whether the kernel supports branch tracing. */ /* Check whether the kernel supports BTS. */
static int static int
kernel_supports_btrace (void) kernel_supports_bts (void)
{ {
struct perf_event_attr attr; struct perf_event_attr attr;
pid_t child, pid; pid_t child, pid;
@ -262,14 +262,14 @@ kernel_supports_btrace (void)
switch (child) switch (child)
{ {
case -1: case -1:
warning (_("test branch tracing: cannot fork: %s."), strerror (errno)); warning (_("test bts: cannot fork: %s."), strerror (errno));
return 0; return 0;
case 0: case 0:
status = ptrace (PTRACE_TRACEME, 0, NULL, NULL); status = ptrace (PTRACE_TRACEME, 0, NULL, NULL);
if (status != 0) if (status != 0)
{ {
warning (_("test branch tracing: cannot PTRACE_TRACEME: %s."), warning (_("test bts: cannot PTRACE_TRACEME: %s."),
strerror (errno)); strerror (errno));
_exit (1); _exit (1);
} }
@ -277,7 +277,7 @@ kernel_supports_btrace (void)
status = raise (SIGTRAP); status = raise (SIGTRAP);
if (status != 0) if (status != 0)
{ {
warning (_("test branch tracing: cannot raise SIGTRAP: %s."), warning (_("test bts: cannot raise SIGTRAP: %s."),
strerror (errno)); strerror (errno));
_exit (1); _exit (1);
} }
@ -288,14 +288,14 @@ kernel_supports_btrace (void)
pid = waitpid (child, &status, 0); pid = waitpid (child, &status, 0);
if (pid != child) if (pid != child)
{ {
warning (_("test branch tracing: bad pid %ld, error: %s."), warning (_("test bts: bad pid %ld, error: %s."),
(long) pid, strerror (errno)); (long) pid, strerror (errno));
return 0; return 0;
} }
if (!WIFSTOPPED (status)) if (!WIFSTOPPED (status))
{ {
warning (_("test branch tracing: expected stop. status: %d."), warning (_("test bts: expected stop. status: %d."),
status); status);
return 0; return 0;
} }
@ -320,10 +320,10 @@ kernel_supports_btrace (void)
pid = waitpid (child, &status, 0); pid = waitpid (child, &status, 0);
if (pid != child) if (pid != child)
{ {
warning (_("test branch tracing: bad pid %ld, error: %s."), warning (_("test bts: bad pid %ld, error: %s."),
(long) pid, strerror (errno)); (long) pid, strerror (errno));
if (!WIFSIGNALED (status)) if (!WIFSIGNALED (status))
warning (_("test branch tracing: expected killed. status: %d."), warning (_("test bts: expected killed. status: %d."),
status); status);
} }
@ -331,10 +331,10 @@ kernel_supports_btrace (void)
} }
} }
/* Check whether an Intel cpu supports branch tracing. */ /* Check whether an Intel cpu supports BTS. */
static int static int
intel_supports_btrace (void) intel_supports_bts (void)
{ {
unsigned int cpuid, model, family; unsigned int cpuid, model, family;
@ -372,10 +372,10 @@ intel_supports_btrace (void)
return 1; return 1;
} }
/* Check whether the cpu supports branch tracing. */ /* Check whether the cpu supports BTS. */
static int static int
cpu_supports_btrace (void) cpu_supports_bts (void)
{ {
unsigned int ebx, ecx, edx; unsigned int ebx, ecx, edx;
@ -384,24 +384,24 @@ cpu_supports_btrace (void)
if (ebx == signature_INTEL_ebx && ecx == signature_INTEL_ecx if (ebx == signature_INTEL_ebx && ecx == signature_INTEL_ecx
&& edx == signature_INTEL_edx) && edx == signature_INTEL_edx)
return intel_supports_btrace (); return intel_supports_bts ();
/* Don't know about others. Let's assume they do. */ /* Don't know about others. Let's assume they do. */
return 1; return 1;
} }
/* See linux-btrace.h. */ /* Check whether the linux target supports BTS. */
int static int
linux_supports_btrace (struct target_ops *ops) linux_supports_bts (void)
{ {
static int cached; static int cached;
if (cached == 0) if (cached == 0)
{ {
if (!kernel_supports_btrace ()) if (!kernel_supports_bts ())
cached = -1; cached = -1;
else if (!cpu_supports_btrace ()) else if (!cpu_supports_bts ())
cached = -1; cached = -1;
else else
cached = 1; cached = 1;
@ -412,6 +412,23 @@ linux_supports_btrace (struct target_ops *ops)
/* See linux-btrace.h. */ /* See linux-btrace.h. */
int
linux_supports_btrace (struct target_ops *ops, enum btrace_format format)
{
switch (format)
{
case BTRACE_FORMAT_NONE:
return 0;
case BTRACE_FORMAT_BTS:
return linux_supports_bts ();
}
internal_error (__FILE__, __LINE__, _("Unknown branch trace format"));
}
/* See linux-btrace.h. */
struct btrace_target_info * struct btrace_target_info *
linux_enable_btrace (ptid_t ptid) linux_enable_btrace (ptid_t ptid)
{ {
@ -602,7 +619,7 @@ linux_read_btrace (struct btrace_data *btrace,
/* See linux-btrace.h. */ /* See linux-btrace.h. */
int int
linux_supports_btrace (struct target_ops *ops) linux_supports_btrace (struct target_ops *ops, enum btrace_format format)
{ {
return 0; return 0;
} }

View file

@ -61,7 +61,7 @@ struct btrace_target_info
}; };
/* See to_supports_btrace in target.h. */ /* See to_supports_btrace in target.h. */
extern int linux_supports_btrace (struct target_ops *); extern int linux_supports_btrace (struct target_ops *, enum btrace_format);
/* See to_enable_btrace in target.h. */ /* See to_enable_btrace in target.h. */
extern struct btrace_target_info *linux_enable_btrace (ptid_t ptid); extern struct btrace_target_info *linux_enable_btrace (ptid_t ptid);

View file

@ -199,9 +199,6 @@ record_btrace_open (const char *args, int from_tty)
if (!target_has_execution) if (!target_has_execution)
error (_("The program is not being run.")); error (_("The program is not being run."));
if (!target_supports_btrace ())
error (_("Target does not support branch tracing."));
if (non_stop) if (non_stop)
error (_("Record btrace can't debug inferior in non-stop mode.")); error (_("Record btrace can't debug inferior in non-stop mode."));

View file

@ -11324,16 +11324,23 @@ struct btrace_target_info
/* Check whether the target supports branch tracing. */ /* Check whether the target supports branch tracing. */
static int static int
remote_supports_btrace (struct target_ops *self) remote_supports_btrace (struct target_ops *self, enum btrace_format format)
{ {
if (packet_support (PACKET_Qbtrace_off) != PACKET_ENABLE) if (packet_support (PACKET_Qbtrace_off) != PACKET_ENABLE)
return 0; return 0;
if (packet_support (PACKET_Qbtrace_bts) != PACKET_ENABLE)
return 0;
if (packet_support (PACKET_qXfer_btrace) != PACKET_ENABLE) if (packet_support (PACKET_qXfer_btrace) != PACKET_ENABLE)
return 0; return 0;
return 1; switch (format)
{
case BTRACE_FORMAT_NONE:
return 0;
case BTRACE_FORMAT_BTS:
return (packet_support (PACKET_Qbtrace_bts) == PACKET_ENABLE);
}
internal_error (__FILE__, __LINE__, _("Unknown branch trace format"));
} }
/* Enable branch tracing. */ /* Enable branch tracing. */

View file

@ -146,6 +146,8 @@
target_debug_do_print (host_address_to_string (X)) target_debug_do_print (host_address_to_string (X))
#define target_debug_print_struct_btrace_data_p(X) \ #define target_debug_print_struct_btrace_data_p(X) \
target_debug_do_print (host_address_to_string (X)) target_debug_do_print (host_address_to_string (X))
#define target_debug_print_enum_btrace_format(X) \
target_debug_do_print (plongest (X))
static void static void
target_debug_print_struct_target_waitstatus_p (struct target_waitstatus *status) target_debug_print_struct_target_waitstatus_p (struct target_waitstatus *status)

View file

@ -3085,26 +3085,28 @@ debug_can_use_agent (struct target_ops *self)
} }
static int static int
delegate_supports_btrace (struct target_ops *self) delegate_supports_btrace (struct target_ops *self, enum btrace_format arg1)
{ {
self = self->beneath; self = self->beneath;
return self->to_supports_btrace (self); return self->to_supports_btrace (self, arg1);
} }
static int static int
tdefault_supports_btrace (struct target_ops *self) tdefault_supports_btrace (struct target_ops *self, enum btrace_format arg1)
{ {
return 0; return 0;
} }
static int static int
debug_supports_btrace (struct target_ops *self) debug_supports_btrace (struct target_ops *self, enum btrace_format arg1)
{ {
int result; int result;
fprintf_unfiltered (gdb_stdlog, "-> %s->to_supports_btrace (...)\n", debug_target.to_shortname); fprintf_unfiltered (gdb_stdlog, "-> %s->to_supports_btrace (...)\n", debug_target.to_shortname);
result = debug_target.to_supports_btrace (&debug_target); result = debug_target.to_supports_btrace (&debug_target, arg1);
fprintf_unfiltered (gdb_stdlog, "<- %s->to_supports_btrace (", debug_target.to_shortname); fprintf_unfiltered (gdb_stdlog, "<- %s->to_supports_btrace (", debug_target.to_shortname);
target_debug_print_struct_target_ops_p (&debug_target); target_debug_print_struct_target_ops_p (&debug_target);
fputs_unfiltered (", ", gdb_stdlog);
target_debug_print_enum_btrace_format (arg1);
fputs_unfiltered (") = ", gdb_stdlog); fputs_unfiltered (") = ", gdb_stdlog);
target_debug_print_int (result); target_debug_print_int (result);
fputs_unfiltered ("\n", gdb_stdlog); fputs_unfiltered ("\n", gdb_stdlog);

View file

@ -3389,6 +3389,14 @@ target_ranged_break_num_registers (void)
/* See target.h. */ /* See target.h. */
int
target_supports_btrace (enum btrace_format format)
{
return current_target.to_supports_btrace (&current_target, format);
}
/* See target.h. */
struct btrace_target_info * struct btrace_target_info *
target_enable_btrace (ptid_t ptid) target_enable_btrace (ptid_t ptid)
{ {

View file

@ -999,7 +999,7 @@ struct target_ops
TARGET_DEFAULT_RETURN (0); TARGET_DEFAULT_RETURN (0);
/* Check whether the target supports branch tracing. */ /* Check whether the target supports branch tracing. */
int (*to_supports_btrace) (struct target_ops *) int (*to_supports_btrace) (struct target_ops *, enum btrace_format)
TARGET_DEFAULT_RETURN (0); TARGET_DEFAULT_RETURN (0);
/* Enable branch tracing for PTID and allocate a branch trace target /* Enable branch tracing for PTID and allocate a branch trace target
@ -2215,8 +2215,7 @@ extern void update_target_permissions (void);
/* Imported from machine dependent code. */ /* Imported from machine dependent code. */
/* See to_supports_btrace in struct target_ops. */ /* See to_supports_btrace in struct target_ops. */
#define target_supports_btrace() \ extern int target_supports_btrace (enum btrace_format);
(current_target.to_supports_btrace (&current_target))
/* See to_enable_btrace in struct target_ops. */ /* See to_enable_btrace in struct target_ops. */
extern struct btrace_target_info *target_enable_btrace (ptid_t ptid); extern struct btrace_target_info *target_enable_btrace (ptid_t ptid);