From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 23892 invoked by alias); 14 Aug 2012 13:01:04 -0000 Received: (qmail 23691 invoked by uid 22791); 14 Aug 2012 13:00:56 -0000 X-SWARE-Spam-Status: No, hits=-7.8 required=5.0 tests=AWL,BAYES_00,KHOP_RCVD_UNTRUST,KHOP_THREADED,RCVD_IN_DNSWL_HI,RCVD_IN_HOSTKARMA_W,T_RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from mga02.intel.com (HELO mga02.intel.com) (134.134.136.20) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Tue, 14 Aug 2012 13:00:38 +0000 Received: from orsmga002.jf.intel.com ([10.7.209.21]) by orsmga101.jf.intel.com with ESMTP; 14 Aug 2012 06:00:15 -0700 X-ExtLoop1: 1 Received: from swsutil001.isw.intel.com ([10.237.237.11]) by orsmga002.jf.intel.com with ESMTP; 14 Aug 2012 05:59:55 -0700 Received: from ulslx001.iul.intel.com (ulslx001.iul.intel.com [172.28.207.63]) by swsutil001.isw.intel.com (8.13.6/8.13.6/MailSET/Hub) with ESMTP id q7ECxscD029087; Tue, 14 Aug 2012 13:59:55 +0100 Received: from ulslx001.iul.intel.com (localhost [127.0.0.1]) by ulslx001.iul.intel.com with ESMTP id q7ECxsTj009991; Tue, 14 Aug 2012 14:59:54 +0200 Received: (from mmetzger@localhost) by ulslx001.iul.intel.com with id q7ECxsMu009987; Tue, 14 Aug 2012 14:59:54 +0200 From: markus.t.metzger@intel.com To: gdb-patches@sourceware.org Cc: markus.t.metzger@gmail.com, jan.kratochvil@redhat.com, palves@redhat.com, tromey@redhat.com, kettenis@gnu.org, Markus Metzger Subject: [patch v3 16/16] btrace, x86: restrict to Atom Date: Tue, 14 Aug 2012 13:01:00 -0000 Message-Id: <1344949171-9545-17-git-send-email-markus.t.metzger@intel.com> In-Reply-To: <1344949171-9545-1-git-send-email-markus.t.metzger@intel.com> References: <1344949171-9545-1-git-send-email-markus.t.metzger@intel.com> X-IsSubscribed: yes Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2012-08/txt/msg00398.txt.bz2 From: Markus Metzger Restrict branch tracing support to Atom processors. 2012-08-14 Markus Metzger * amd64-linux-nat.c (_initialize_amd64_linux_nat): Change supports_btrace method. * i386-linux-nat.c (_initialize_i386_linux_nat): Change supports_btrace method. * i386-linux-tdep.h (i386_linux_supports_btrace): New function. * i386-linux-tdep.c: Add linux-btrace.h include. (i386_linux_supports_btrace): New function. gdbserver/ * linux-low.h (linux_target_ops): Add supports_btrace method. * linux-low.c (linux_low_supports_btrace): New function. (linux_target_ops): Change supports_btrace method. * linux-x86-low.c (x86_supports_btrace): New function. (the_low_target): Add supports_btrace method. --- gdb/amd64-linux-nat.c | 2 +- gdb/gdbserver/linux-low.c | 15 ++++++++++++++- gdb/gdbserver/linux-low.h | 2 ++ gdb/gdbserver/linux-x86-low.c | 31 +++++++++++++++++++++++++++++++ gdb/i386-linux-nat.c | 2 +- gdb/i386-linux-tdep.c | 34 ++++++++++++++++++++++++++++++++++ gdb/i386-linux-tdep.h | 3 +++ 7 files changed, 86 insertions(+), 3 deletions(-) diff --git a/gdb/amd64-linux-nat.c b/gdb/amd64-linux-nat.c index 3cfa45c..b411beb 100644 --- a/gdb/amd64-linux-nat.c +++ b/gdb/amd64-linux-nat.c @@ -1162,7 +1162,7 @@ _initialize_amd64_linux_nat (void) t->to_read_description = amd64_linux_read_description; /* Add btrace methods. */ - t->to_supports_btrace = linux_supports_btrace; + t->to_supports_btrace = i386_linux_supports_btrace; t->to_enable_btrace = amd64_linux_enable_btrace; t->to_disable_btrace = amd64_linux_disable_btrace; t->to_btrace_has_changed = linux_btrace_has_changed; diff --git a/gdb/gdbserver/linux-low.c b/gdb/gdbserver/linux-low.c index 20b1ca5..77ecbe0 100644 --- a/gdb/gdbserver/linux-low.c +++ b/gdb/gdbserver/linux-low.c @@ -5793,6 +5793,19 @@ linux_qxfer_libraries_svr4 (const char *annex, unsigned char *readbuf, return len; } +/* See linux-low.h. */ +static int +linux_low_supports_btrace (void) +{ + if (!linux_supports_btrace ()) + return 0; + + if (*the_low_target.supports_btrace == NULL) + return 0; + + return (*the_low_target.supports_btrace) (); +} + /* Read branch trace data for @tinfo as btrace xml document into @buffer. */ static void linux_low_read_btrace (struct btrace_target_info *tinfo, struct buffer *buffer) @@ -5882,7 +5895,7 @@ static struct target_ops linux_target_ops = { linux_get_min_fast_tracepoint_insn_len, linux_qxfer_libraries_svr4, linux_supports_agent, - linux_supports_btrace, + linux_low_supports_btrace, linux_enable_btrace, linux_disable_btrace, linux_btrace_has_changed, diff --git a/gdb/gdbserver/linux-low.h b/gdb/gdbserver/linux-low.h index 99d882a..5768a77 100644 --- a/gdb/gdbserver/linux-low.h +++ b/gdb/gdbserver/linux-low.h @@ -169,6 +169,8 @@ struct linux_target_ops for use as a fast tracepoint. */ int (*get_min_fast_tracepoint_insn_len) (void); + /* Returns true if the low target supports btrace. */ + int (*supports_btrace) (void); }; extern struct linux_target_ops the_low_target; diff --git a/gdb/gdbserver/linux-x86-low.c b/gdb/gdbserver/linux-x86-low.c index 1215bae..e12fccb 100644 --- a/gdb/gdbserver/linux-x86-low.c +++ b/gdb/gdbserver/linux-x86-low.c @@ -1859,6 +1859,36 @@ x86_get_min_fast_tracepoint_insn_len (void) } } +/* See linux-low.h. */ +static int +x86_supports_btrace (void) +{ + unsigned int cpuid, model, family; + + __asm__ __volatile__ ("movl $1, %%eax;" + "cpuid;" + : "=a" (cpuid) + :: "%ebx", "%ecx", "%edx"); + + family = (cpuid >> 8) & 0xf; + model = (cpuid >> 4) & 0xf; + + switch (family) + { + case 6: + model += (cpuid >> 12) & 0xf0; + + switch (model) + { + case 28: /* Atom. */ + case 38: + return 1; + } + } + + return 0; +} + static void add_insns (unsigned char *start, int len) { @@ -3214,4 +3244,5 @@ struct linux_target_ops the_low_target = x86_install_fast_tracepoint_jump_pad, x86_emit_ops, x86_get_min_fast_tracepoint_insn_len, + x86_supports_btrace, }; diff --git a/gdb/i386-linux-nat.c b/gdb/i386-linux-nat.c index 0248fd7..35bc477 100644 --- a/gdb/i386-linux-nat.c +++ b/gdb/i386-linux-nat.c @@ -1086,7 +1086,7 @@ _initialize_i386_linux_nat (void) t->to_read_description = i386_linux_read_description; /* Add btrace methods. */ - t->to_supports_btrace = linux_supports_btrace; + t->to_supports_btrace = i386_linux_supports_btrace; t->to_enable_btrace = i386_linux_enable_btrace; t->to_disable_btrace = i386_linux_disable_btrace; t->to_btrace_has_changed = linux_btrace_has_changed; diff --git a/gdb/i386-linux-tdep.c b/gdb/i386-linux-tdep.c index 8475d7a..b0f7b43 100644 --- a/gdb/i386-linux-tdep.c +++ b/gdb/i386-linux-tdep.c @@ -37,6 +37,7 @@ #include "symtab.h" #include "arch-utils.h" #include "xml-syscall.h" +#include "linux-btrace.h" #include "i387-tdep.h" #include "i386-xstate.h" @@ -704,6 +705,39 @@ i386_linux_displaced_step_copy_insn (struct gdbarch *gdbarch, return closure; } +/* See i386-linux-tdep.h. */ +int +i386_linux_supports_btrace (void) +{ + unsigned int cpuid, model, family; + + if (!linux_supports_btrace ()) + return 0; + + __asm__ __volatile__ ("movl $1, %%eax;" + "cpuid;" + : "=a" (cpuid) + :: "%ebx", "%ecx", "%edx"); + + family = (cpuid >> 8) & 0xf; + model = (cpuid >> 4) & 0xf; + + switch (family) + { + case 6: + model += (cpuid >> 12) & 0xf0; + + switch (model) + { + case 28: /* Atom. */ + case 38: + return 1; + } + } + + return 0; +} + static void i386_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) { diff --git a/gdb/i386-linux-tdep.h b/gdb/i386-linux-tdep.h index c3a316f..45bdece 100644 --- a/gdb/i386-linux-tdep.h +++ b/gdb/i386-linux-tdep.h @@ -66,4 +66,7 @@ extern struct target_desc *tdesc_i386_avx_linux; extern int i386_linux_gregset_reg_offset[]; +/* Return 1 if target supports btrace. */ +extern int i386_linux_supports_btrace (void); + #endif /* i386-linux-tdep.h */ -- 1.7.1