From patchwork Wed Oct 1 13:37:10 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Punit Agrawal X-Patchwork-Id: 5011871 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 23DEE9F32B for ; Wed, 1 Oct 2014 13:40:28 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 3EA20201CE for ; Wed, 1 Oct 2014 13:40:27 +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 4420920211 for ; Wed, 1 Oct 2014 13:40:26 +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 1XZK6t-0001gn-36; Wed, 01 Oct 2014 13:38:27 +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 1XZK6X-0001Cl-ED for linux-arm-kernel@lists.infradead.org; Wed, 01 Oct 2014 13:38:06 +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 s91DbdUk007298; Wed, 1 Oct 2014 14:37:39 +0100 Received: by e102309-lin (sSMTP sendmail emulation); Wed, 01 Oct 2014 14:37:39 +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 14:37:10 +0100 Message-Id: <1412170630-18408-6-git-send-email-punit.agrawal@arm.com> X-Mailer: git-send-email 1.7.10.4 In-Reply-To: <1412170630-18408-1-git-send-email-punit.agrawal@arm.com> References: <1412165279-8709-1-git-send-email-punit.agrawal@arm.com> <1412170630-18408-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_063805_840249_755FC5A5 X-CRM114-Status: GOOD ( 12.47 ) X-Spam-Score: -2.9 (--) Cc: arnd@arndb.de, catalin.marinas@arm.com, Punit Agrawal , will.deacon@arm.com, ghackmann@google.com, 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