Received: by 2002:ac0:a5a6:0:0:0:0:0 with SMTP id m35-v6csp6295941imm; Mon, 27 Aug 2018 13:09:54 -0700 (PDT) X-Google-Smtp-Source: ANB0VdZxtlX9NdV7xcVZLb1m6GxKH4e5weyWGd6AzEH4CGocHWh1JfOrFVUlC+YH+ilvLkZ1h5zb X-Received: by 2002:a17:902:4a0c:: with SMTP id w12-v6mr14463193pld.289.1535400594587; Mon, 27 Aug 2018 13:09:54 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1535400594; cv=none; d=google.com; s=arc-20160816; b=0scY3ZI+mIQtSxsuCgfjpUf4FHcimnByMHLxX8XbMTRg4kRBhl3pid54dronuE4aIC 8bpC63tiFwWgoT5QKAggaRgm8oNmg9C0l4LANnDeYEIutQAXQdZsPYJSbTNFBUSrQqNo WL7R9mrTcNd3qtLUIIw/n3A1NnMhXJxGXyR3Zw/Etob7/pUQhp67vDZGFyJvkE3UxNHy NHm0LmJxNCKBL5E2si4Vuv69jlzUA6gDUVIOmimbw/mAuV+ELsKVkUIYt49W/ICB9ev/ B62DYEtPgooKCebc/YtqbL+S50e1o93fwrx1eDyNbeXPQCrBOhcCvky/PNOBku4LWJA4 LV8Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :organization:message-id:subject:cc:to:from:date :arc-authentication-results; bh=ZdPJsXZJ9meyyZscLki92XWx++mXgG1FxG3w0Ur8RdY=; b=oKabrhBH4mnZsGF3noZKiL+PUYLHeJ+BGopNfvcAFv/kd+shEqR90AcOdR/mPhVBnc +jPCcr4RgzrA6XA5u9mzKzG8kooxP4Jb1ZO+boQNLGDescuU/WyrccrAwKDuPUi0+NhN fb16mfPsQs4PqmEzejXdtLP/ESBjRdz+w7q25JBqkf5UzItz1Nzvq1Oi72JSShLsenDZ BQc9BzmMv7K2zxZnKEQ3NmfzkgIWLLDeiQxbqpRzrLl7jJH4hYZG5qGiNYlPNsrDF6Zn ZKnFCV0wGBnYDMKgG06IPqw1hO7LG8VqY36iFDYziSGZoAwEJXBoFG+kKHgsfs37Si7+ pOqg== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id c126-v6si150988pfa.130.2018.08.27.13.09.38; Mon, 27 Aug 2018 13:09:54 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727307AbeH0X4P (ORCPT + 99 others); Mon, 27 Aug 2018 19:56:15 -0400 Received: from usa-sjc-mx-foss1.foss.arm.com ([217.140.101.70]:56008 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727005AbeH0X4P (ORCPT ); Mon, 27 Aug 2018 19:56:15 -0400 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.72.51.249]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 9433080D; Mon, 27 Aug 2018 13:08:08 -0700 (PDT) Received: from dupont (dupont.austin.arm.com [10.118.16.87]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 081623F721; Mon, 27 Aug 2018 13:08:07 -0700 (PDT) Date: Mon, 27 Aug 2018 15:08:07 -0500 From: Kim Phillips To: Arnaldo Carvalho de Melo Cc: Peter Zijlstra , Ingo Molnar , Alexander Shishkin , Jiri Olsa , Namhyung Kim , Thomas Gleixner , Greg Kroah-Hartman , Thomas Richter , Hendrik Brueckner , linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, perf group Subject: [PATCH] perf annotate: Handle arm64 move instructions Message-Id: <20180827150807.304110d2e9919a17c832ca48@arm.com> Organization: Arm X-Mailer: Sylpheed 3.7.0 (GTK+ 2.24.32; x86_64-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Add default handler for non-jump instructions. This really only has an effect on instructions that compute a PC-relative address, such as 'adrp,' as seen in these couple of examples: BEFORE: adrp x0, ffff20000aa11000 AFTER: adrp x0, kallsyms_token_index+0xce000 BEFORE: adrp x23, ffff20000ae94000 <__per_cpu_load> AFTER: adrp x23, __per_cpu_load The implementation is identical to that of s390, but with a slight adjustment for objdump whitespace propagation (arm64 objdump puts spaces after commas, whereas s390's presumably doesn't). The mov__scnprintf() declaration is moved from s390's to arm64's instructions.c because arm64's gets included before s390's. Cc: Peter Zijlstra Cc: Ingo Molnar Cc: Arnaldo Carvalho de Melo Cc: Alexander Shishkin Cc: Jiri Olsa Cc: Namhyung Kim Cc: Thomas Gleixner Cc: Greg Kroah-Hartman Cc: Thomas Richter Cc: Hendrik Brueckner Signed-off-by: Kim Phillips --- tools/perf/arch/arm64/annotate/instructions.c | 59 ++++++++++++++++++- tools/perf/arch/s390/annotate/instructions.c | 2 - 2 files changed, 58 insertions(+), 3 deletions(-) diff --git a/tools/perf/arch/arm64/annotate/instructions.c b/tools/perf/arch/arm64/annotate/instructions.c index 6688977e4ac7..76c6345a57d5 100644 --- a/tools/perf/arch/arm64/annotate/instructions.c +++ b/tools/perf/arch/arm64/annotate/instructions.c @@ -8,6 +8,63 @@ struct arm64_annotate { jump_insn; }; +static int arm64_mov__parse(struct arch *arch __maybe_unused, + struct ins_operands *ops, + struct map_symbol *ms __maybe_unused) +{ + char *s = strchr(ops->raw, ','), *target, *endptr; + + if (s == NULL) + return -1; + + *s = '\0'; + ops->source.raw = strdup(ops->raw); + *s = ','; + + if (ops->source.raw == NULL) + return -1; + + target = ++s; + ops->target.raw = strdup(target); + if (ops->target.raw == NULL) + goto out_free_source; + + ops->target.addr = strtoull(target, &endptr, 16); + if (endptr == target) + goto out_free_target; + + s = strchr(endptr, '<'); + if (s == NULL) + goto out_free_target; + endptr = strchr(s + 1, '>'); + if (endptr == NULL) + goto out_free_target; + + *endptr = '\0'; + *s = ' '; + ops->target.name = strdup(s); + *s = '<'; + *endptr = '>'; + if (ops->target.name == NULL) + goto out_free_target; + + return 0; + +out_free_target: + zfree(&ops->target.raw); +out_free_source: + zfree(&ops->source.raw); + return -1; +} + +static int mov__scnprintf(struct ins *ins, char *bf, size_t size, + struct ins_operands *ops); + +static struct ins_ops arm64_mov_ops = { + .parse = arm64_mov__parse, + .scnprintf = mov__scnprintf, +}; + static struct ins_ops *arm64__associate_instruction_ops(struct arch *arch, const char *name) { struct arm64_annotate *arm = arch->priv; @@ -21,7 +78,7 @@ static struct ins_ops *arm64__associate_instruction_ops(struct arch *arch, const else if (!strcmp(name, "ret")) ops = &ret_ops; else - return NULL; + ops = &arm64_mov_ops; arch__associate_ins_ops(arch, name, ops); return ops; diff --git a/tools/perf/arch/s390/annotate/instructions.c b/tools/perf/arch/s390/annotate/instructions.c index cee4e2f7c057..de0dd66dbb48 100644 --- a/tools/perf/arch/s390/annotate/instructions.c +++ b/tools/perf/arch/s390/annotate/instructions.c @@ -100,8 +100,6 @@ static int s390_mov__parse(struct arch *arch __maybe_unused, return -1; } -static int mov__scnprintf(struct ins *ins, char *bf, size_t size, - struct ins_operands *ops); static struct ins_ops s390_mov_ops = { .parse = s390_mov__parse, -- 2.17.1