Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752028AbcLCIIx (ORCPT ); Sat, 3 Dec 2016 03:08:53 -0500 Received: from mx0b-001b2d01.pphosted.com ([148.163.158.5]:53104 "EHLO mx0a-001b2d01.pphosted.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751301AbcLCIIv (ORCPT ); Sat, 3 Dec 2016 03:08:51 -0500 Subject: Re: [PATCH 2/2] perf annotate: AArch64 support To: Arnaldo Carvalho de Melo References: <20161130092344.012e18e3e623bea395162f95@arm.com> Cc: Kim Phillips , Chris Ryder , Pawel Moll , Peter Zijlstra , Ingo Molnar , Alexander Shishkin , linux-perf-users@vger.kernel.org, Will Deacon , Mark Rutland , linux-kernel@vger.kernel.org, Ravi Bangoria From: Ravi Bangoria Date: Sat, 3 Dec 2016 13:38:37 +0530 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.5.1 MIME-Version: 1.0 In-Reply-To: <20161130092344.012e18e3e623bea395162f95@arm.com> Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-TM-AS-GCONF: 00 X-Content-Scanned: Fidelis XPS MAILER x-cbid: 16120308-0004-0000-0000-00001100A109 X-IBM-SpamModules-Scores: X-IBM-SpamModules-Versions: BY=3.00006184; HX=3.00000240; KW=3.00000007; PH=3.00000004; SC=3.00000193; SDB=6.00788665; UDB=6.00381655; IPR=6.00566350; BA=6.00004937; NDR=6.00000001; ZLA=6.00000005; ZF=6.00000009; ZB=6.00000000; ZP=6.00000000; ZH=6.00000000; ZU=6.00000002; MB=3.00013525; XFM=3.00000011; UTC=2016-12-03 08:08:48 X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused x-cbparentid: 16120308-0005-0000-0000-00007B1A05FF Message-Id: <58427D85.1010705@linux.vnet.ibm.com> X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:,, definitions=2016-12-03_06:,, signatures=0 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 spamscore=0 suspectscore=1 malwarescore=0 phishscore=0 adultscore=0 bulkscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1609300000 definitions=main-1612030140 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 6872 Lines: 170 Hi, Sorry, I replied little late. I see you already included patch in perf/core. I've tested this patch on powerpc with perf.data and vmlinux shared by Kim. Looks good to me. You can add my Tested-by. -Ravi. On Wednesday 30 November 2016 08:53 PM, Kim Phillips wrote: > This is a regex converted version from the original: > > https://lkml.org/lkml/2016/5/19/461 > > Add basic support to recognise AArch64 assembly. This allows perf to > identify AArch64 instructions that branch to other parts within the > same function, thereby properly annotating them. > > Rebased onto new cross-arch annotation bits: > > https://lkml.org/lkml/2016/11/25/546 > > Sample output: > > security_file_permission vmlinux > 5.80 │ ← ret ▒ > │70: ldr w0, [x21,#68] ▒ > 4.44 │ ↓ tbnz d0 ▒ > │ mov w0, #0x24 // #36 ▒ > 1.37 │ ands w0, w22, w0 ▒ > │ ↑ b.eq 60 ▒ > 1.37 │ ↓ tbnz e4 ▒ > │ mov w19, #0x20000 // #131072 ▒ > 1.02 │ ↓ tbz ec ▒ > │90:┌─→ldr x3, [x21,#24] ▒ > 1.37 │ │ add x21, x21, #0x10 ▒ > │ │ mov w2, w19 ▒ > 1.02 │ │ mov x0, x21 ▒ > │ │ mov x1, x3 ▒ > 1.71 │ │ ldr x20, [x3,#48] ▒ > │ │→ bl __fsnotify_parent ▒ > 0.68 │ │↑ cbnz 60 ▒ > │ │ mov x2, x21 ▒ > 1.37 │ │ mov w1, w19 ▒ > │ │ mov x0, x20 ▒ > 0.68 │ │ mov w5, #0x0 // #0 ▒ > │ │ mov x4, #0x0 // #0 ▒ > 1.71 │ │ mov w3, #0x1 // #1 ▒ > │ │→ bl fsnotify ▒ > 1.37 │ │↑ b 60 ▒ > │d0:│ mov w0, #0x0 // #0 ▒ > │ │ ldp x19, x20, [sp,#16] ▒ > │ │ ldp x21, x22, [sp,#32] ▒ > │ │ ldp x29, x30, [sp],#48 ▒ > │ │← ret ▒ > │e4:│ mov w19, #0x10000 // #65536 ▒ > │ └──b 90 ◆ > │ec: brk #0x800 ▒ > Press 'h' for help on key bindings > > Signed-off-by: Chris Ryder > Signed-off-by: Kim Phillips > Cc: Pawel Moll > Cc: Peter Zijlstra > Cc: Ingo Molnar > Cc: Arnaldo Carvalho de Melo > Cc: Alexander Shishkin > Cc: linux-perf-users@vger.kernel.org > Cc: Will Deacon > Cc: Mark Rutland > --- > tools/perf/arch/arm64/annotate/instructions.c | 62 +++++++++++++++++++++++++++ > tools/perf/util/annotate.c | 5 +++ > 2 files changed, 67 insertions(+) > create mode 100644 tools/perf/arch/arm64/annotate/instructions.c > > diff --git a/tools/perf/arch/arm64/annotate/instructions.c b/tools/perf/arch/arm64/annotate/instructions.c > new file mode 100644 > index 0000000..44eafd6 > --- /dev/null > +++ b/tools/perf/arch/arm64/annotate/instructions.c > @@ -0,0 +1,62 @@ > +#include > +#include > + > +struct arm64_annotate { > + regex_t call_insn, > + jump_insn; > +}; > + > +static struct ins_ops *arm64__associate_instruction_ops(struct arch *arch, const char *name) > +{ > + struct arm64_annotate *arm = arch->priv; > + struct ins_ops *ops; > + regmatch_t match[2]; > + > + if (!regexec(&arm->jump_insn, name, 2, match, 0)) > + ops = &jump_ops; > + else if (!regexec(&arm->call_insn, name, 2, match, 0)) > + ops = &call_ops; > + else if (!strcmp(name, "ret")) > + ops = &ret_ops; > + else > + return NULL; > + > + arch__associate_ins_ops(arch, name, ops); > + return ops; > +} > + > +static int arm64__annotate_init(struct arch *arch) > +{ > + struct arm64_annotate *arm; > + int err; > + > + if (arch->initialized) > + return 0; > + > + arm = zalloc(sizeof(*arm)); > + if (!arm) > + return -1; > + > + /* bl, blr */ > + err = regcomp(&arm->call_insn, "^blr?$", REG_EXTENDED); > + if (err) > + goto out_free_arm; > + /* b, b.cond, br, cbz/cbnz, tbz/tbnz */ > + err = regcomp(&arm->jump_insn, "^[ct]?br?\\.?(cc|cs|eq|ge|gt|hi|le|ls|lt|mi|ne|pl)?n?z?$", > + REG_EXTENDED); > + if (err) > + goto out_free_call; > + > + arch->initialized = true; > + arch->priv = arm; > + arch->associate_instruction_ops = arm64__associate_instruction_ops; > + arch->objdump.comment_char = ';'; > + arch->objdump.skip_functions_char = '+'; > + return 0; > + > +out_free_call: > + regfree(&arm->call_insn); > +out_free_arm: > + free(arm); > + return -1; > +} > diff --git a/tools/perf/util/annotate.c b/tools/perf/util/annotate.c > index 3e34ee0..76b8bbf 100644 > --- a/tools/perf/util/annotate.c > +++ b/tools/perf/util/annotate.c > @@ -105,6 +105,7 @@ static int arch__associate_ins_ops(struct arch* arch, const char *name, struct i > } > > #include "arch/arm/annotate/instructions.c" > +#include "arch/arm64/annotate/instructions.c" > #include "arch/x86/annotate/instructions.c" > #include "arch/powerpc/annotate/instructions.c" > > @@ -114,6 +115,10 @@ static struct arch architectures[] = { > .init = arm__annotate_init, > }, > { > + .name = "arm64", > + .init = arm64__annotate_init, > + }, > + { > .name = "x86", > .instructions = x86__instructions, > .nr_instructions = ARRAY_SIZE(x86__instructions),