From patchwork Wed Oct 1 12:07:59 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Punit Agrawal X-Patchwork-Id: 5011641 Return-Path: X-Original-To: patchwork-linux-arm@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork1.web.kernel.org (Postfix) with ESMTP id 427B09F327 for ; Wed, 1 Oct 2014 12:11:39 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 5361820263 for ; Wed, 1 Oct 2014 12:11:38 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) (using TLSv1.2 with cipher DHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id AC420201CE for ; Wed, 1 Oct 2014 12:11:32 +0000 (UTC) Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.80.1 #2 (Red Hat Linux)) id 1XZIj3-0003On-Tg; Wed, 01 Oct 2014 12:09:45 +0000 Received: from fw-tnat.cambridge.arm.com ([217.140.96.21] helo=cam-smtp0.cambridge.arm.com) by bombadil.infradead.org with esmtps (Exim 4.80.1 #2 (Red Hat Linux)) id 1XZIik-0002yt-BP for linux-arm-kernel@lists.infradead.org; Wed, 01 Oct 2014 12:09:27 +0000 Received: from e102309-lin (e102309-lin.cambridge.arm.com [10.1.195.161]) by cam-smtp0.cambridge.arm.com (8.13.8/8.13.8) with SMTP id s91C8tbY031950; Wed, 1 Oct 2014 13:08:55 +0100 Received: by e102309-lin (sSMTP sendmail emulation); Wed, 01 Oct 2014 13:08:55 +0100 From: Punit Agrawal To: linux-arm-kernel@lists.infradead.org Subject: [PATCHv2 5/5] arm64: Trace emulation of AArch32 legacy instructions Date: Wed, 1 Oct 2014 13:07:59 +0100 Message-Id: <1412165279-8709-6-git-send-email-punit.agrawal@arm.com> X-Mailer: git-send-email 1.7.10.4 In-Reply-To: <1412165279-8709-1-git-send-email-punit.agrawal@arm.com> References: <1412165279-8709-1-git-send-email-punit.agrawal@arm.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20141001_050926_759690_04663A5C X-CRM114-Status: GOOD ( 12.47 ) X-Spam-Score: -3.0 (---) Cc: catalin.marinas@arm.com, Punit Agrawal , will.deacon@arm.com, ghackmann@google.com, arnd@arnd.be, Steven Rostedt , riandrews@google.com X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.18-1 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org X-Spam-Status: No, score=-2.5 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_NONE, RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Introduce an event to trace the usage of emulated instructions. The trace event is intended to help identify and encourage the migration of legacy software using the emulation features. Use this event to trace usage of swp and CP15 barrier emulation. Cc: Steven Rostedt Signed-off-by: Punit Agrawal --- arch/arm64/kernel/armv8_deprecated.c | 19 ++++++++++++++++-- include/trace/events/emulation.h | 35 ++++++++++++++++++++++++++++++++++ 2 files changed, 52 insertions(+), 2 deletions(-) create mode 100644 include/trace/events/emulation.h diff --git a/arch/arm64/kernel/armv8_deprecated.c b/arch/arm64/kernel/armv8_deprecated.c index 53a6252..1726b3f 100644 --- a/arch/arm64/kernel/armv8_deprecated.c +++ b/arch/arm64/kernel/armv8_deprecated.c @@ -16,6 +16,9 @@ #include #include +#define CREATE_TRACE_POINTS +#include + #include #include #include @@ -189,6 +192,11 @@ static int swp_handler(struct pt_regs *regs, u32 instr) regs->user_regs.regs[destreg] = data; ret: + if (type == TYPE_SWPB) + trace_instruction_emulation("swpb", regs->pc); + else + trace_instruction_emulation("swp", regs->pc); + pr_warn_ratelimited("\"%s\" (%ld) uses obsolete SWP{B} instruction at 0x%llx\n", current->comm, (unsigned long)current->pid, regs->pc); @@ -283,16 +291,23 @@ static int cp15barrier_handler(struct pt_regs *regs, u32 instr) * dmb - mcr p15, 0, Rt, c7, c10, 5 * dsb - mcr p15, 0, Rt, c7, c10, 4 */ - if (aarch32_insn_mcr_extract_opc2(instr) == 5) + if (aarch32_insn_mcr_extract_opc2(instr) == 5) { dmb(sy); - else + trace_instruction_emulation( + "mcr p15, 0, Rt, c7, c10, 5", regs->pc); + } else { dsb(sy); + trace_instruction_emulation( + "mcr p15, 0, Rt, c7, c10, 4", regs->pc); + } break; case 5: /* * isb - mcr p15, 0, Rt, c7, c5, 4 */ isb(); + trace_instruction_emulation( + "mcr p15, 0, Rt, c7, c5, 4", regs->pc); break; } diff --git a/include/trace/events/emulation.h b/include/trace/events/emulation.h new file mode 100644 index 0000000..e77726a --- /dev/null +++ b/include/trace/events/emulation.h @@ -0,0 +1,35 @@ +#undef TRACE_SYSTEM +#define TRACE_SYSTEM emulation + +#if !defined(_TRACE_EMULATION_H) || defined(TRACE_HEADER_MULTI_READ) +#define _TRACE_EMULATION_H + +#include + +TRACE_EVENT(instruction_emulation, + + TP_PROTO(const char *instr, u64 addr), + TP_ARGS(instr, addr), + + TP_STRUCT__entry( + __array(char, comm, TASK_COMM_LEN) + __field(pid_t, pid) + __string(instr, instr) + __field(u64, addr) + ), + + TP_fast_assign( + memcpy(__entry->comm, current->comm, TASK_COMM_LEN); + __entry->pid = current->pid; + __assign_str(instr, instr); + __entry->addr = addr; + ), + + TP_printk("instr=%s comm=%s pid=%d addr=0x%llx", __get_str(instr), + __entry->comm, __entry->pid, __entry->addr) +); + +#endif /* _TRACE_EMULATION_H */ + +/* This part must be outside protection */ +#include