From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 20957 invoked by alias); 27 Nov 2012 10:49:53 -0000 Received: (qmail 20825 invoked by uid 22791); 27 Nov 2012 10:49:49 -0000 X-SWARE-Spam-Status: No, hits=-8.0 required=5.0 tests=AWL,BAYES_00,KHOP_RCVD_UNTRUST,KHOP_THREADED,RCVD_IN_DNSWL_HI,RCVD_IN_HOSTKARMA_W,RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from mga09.intel.com (HELO mga09.intel.com) (134.134.136.24) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Tue, 27 Nov 2012 10:49:38 +0000 Received: from orsmga002.jf.intel.com ([10.7.209.21]) by orsmga102.jf.intel.com with ESMTP; 27 Nov 2012 02:48:45 -0800 X-ExtLoop1: 1 Received: from swsutil001.isw.intel.com ([10.237.237.11]) by orsmga002.jf.intel.com with ESMTP; 27 Nov 2012 02:49:25 -0800 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 qARAnORC002435; Tue, 27 Nov 2012 10:49:24 GMT Received: from ulslx001.iul.intel.com (localhost [127.0.0.1]) by ulslx001.iul.intel.com with ESMTP id qARAnO5k015229; Tue, 27 Nov 2012 11:49:24 +0100 Received: (from mmetzger@localhost) by ulslx001.iul.intel.com with id qARAnOPQ015225; Tue, 27 Nov 2012 11:49:24 +0100 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 v4 13/13] btrace, x86: restrict to Atom Date: Tue, 27 Nov 2012 10:50:00 -0000 Message-Id: <1354013351-14791-14-git-send-email-markus.t.metzger@intel.com> In-Reply-To: <1354013351-14791-1-git-send-email-markus.t.metzger@intel.com> References: <1354013351-14791-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-11/txt/msg00708.txt.bz2 From: Markus Metzger Restrict branch tracing support to Atom processors. 2012-11-27 Markus Metzger * amd64-linux-nat.c (amd64_linux_supports_btrace): New. (_initialize_amd64_linux_nat): Change supports_btrace method. * i386-linux-nat.c (i386_linux_supports_btrace): New. (_initialize_i386_linux_nat): Change supports_btrace method. gdbserver/ * linux-low.h (linux_target_ops): Add supports_btrace method. * linux-low.c (linux_low_supports_btrace): New. (linux_target_ops): Change supports_btrace method. * linux-x86-low.c (x86_supports_btrace): New. (the_low_target): Add supports_btrace method. --- gdb/amd64-linux-nat.c | 36 +++++++++++++++++++++++++++++++++++- gdb/gdbserver/linux-low.c | 15 ++++++++++++++- gdb/gdbserver/linux-low.h | 2 ++ gdb/gdbserver/linux-x86-low.c | 31 +++++++++++++++++++++++++++++++ gdb/i386-linux-nat.c | 36 +++++++++++++++++++++++++++++++++++- 5 files changed, 117 insertions(+), 3 deletions(-) diff --git a/gdb/amd64-linux-nat.c b/gdb/amd64-linux-nat.c index 0e38a57..a65285b 100644 --- a/gdb/amd64-linux-nat.c +++ b/gdb/amd64-linux-nat.c @@ -1081,6 +1081,40 @@ amd64_linux_read_description (struct target_ops *ops) } } +/* Check if the target supports branch tracing. */ +static int +amd64_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: + case 39: + return 1; + } + } + + return 0; +} + /* Enable branch tracing for @ptid. */ static struct btrace_target_info * amd64_linux_enable_btrace (ptid_t ptid) @@ -1162,7 +1196,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 = amd64_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 ffaa96f..99f347c 100644 --- a/gdb/gdbserver/linux-low.c +++ b/gdb/gdbserver/linux-low.c @@ -5795,6 +5795,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) @@ -5884,7 +5897,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 c12d94a..3f1e524 100644 --- a/gdb/i386-linux-nat.c +++ b/gdb/i386-linux-nat.c @@ -1010,6 +1010,40 @@ i386_linux_read_description (struct target_ops *ops) return tdesc_i386_linux; } +/* Check if the target supports branch tracing. */ +static 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: + case 39: + return 1; + } + } + + return 0; +} + /* Enable branch tracing for @ptid. */ static struct btrace_target_info * i386_linux_enable_btrace (ptid_t ptid) @@ -1086,7 +1120,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; -- 1.7.1