Received: by 2002:a05:6500:2018:b0:1fb:9675:f89d with SMTP id t24csp872961lqh; Fri, 31 May 2024 23:13:45 -0700 (PDT) X-Forwarded-Encrypted: i=3; AJvYcCXm00zCGvjTQW9iDWbtZMpOCP3jJBKHXMNNa8e0IYzjFH2SpriXTyLWwcL44iBs/9NpqDsjeq2Z+sdb3KV0nGljw2H3e7rBbaRLT3IoBA== X-Google-Smtp-Source: AGHT+IGe/6GQYHn+TaFbzSb/ULBrXSFteHe9eUmTd4IbFj2IIlY+THDnDvImkva2D56RdNucje8o X-Received: by 2002:a05:6808:6d5:b0:3c8:47a3:3cb5 with SMTP id 5614622812f47-3d1e349abdemr4202009b6e.24.1717222425554; Fri, 31 May 2024 23:13:45 -0700 (PDT) ARC-Seal: i=2; a=rsa-sha256; t=1717222425; cv=pass; d=google.com; s=arc-20160816; b=B6h6cxpfwbGhMojAtT4X49ZETAN5wp70R03K6xGZsv0/M2uDdlEJoozMNww5rj+aJZ TbV17gUkM+RW7OZK5oMkv8Mq0x50ygIhWiuMpVg0yg8BK0L0cANiQWy0/eId1kvIYM8O RmbV6mxIbwQEnxoXGzH/RutVtCsRsUoZwLEjzjl2U/rJw5NoDLh7V1KmqSaDt/HrmX2j /wi43/YAvviA7CfvKddgqk+6VzLDsRTDLw50Pm7n5nUFGtzTgyH0nB50lcuNnEb8PvQs 8zHDr8c6W8hM28JZAc9twPp5LJPtBrIPJuLdfQPPbPMhoq7s1StuabP+aGV83HykIkeo MAQw== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:references:in-reply-to:message-id :date:subject:cc:to:from:dkim-signature; bh=KWtCDxRFDH80qtDX1eEQGobXQV/6SEcVVVvgw+2HzL0=; fh=0PTwb2dctJdgxxdpEHLw2xTRIlYCAL+sOxDjzSKR2y4=; b=Zmpp4yMuc1alJGNdaM5GKX0Wgko+zmmPOMFr8dwfzimCdpD44y+p5o9VVeGjghOPZz jGWsh+hO2SEocG5+OoYlJV5d8y6vxrKBQSfd4IAxwo9RvuKZF2uc28R+bu3J9yrA2kFI XLN4ApDM+FZlhx6bhrroK1WzqJguYTYkRCPmeoXi7+pi3e1nbuknHXjhUdlnQu5anhLr bqSmkDx8he5Hw+4oC7I/MTdnRmgWBLErU+jGRivEyab5Xww9s+54bEwV1y8YC6Kj0L9j yX9HNfz4LHRKoq+NLH2VEA7yAKJ9LoKq5f+mUbszqtoJYChEFSP0l49XCnRegC45dbEn inrg==; dara=google.com ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@ibm.com header.s=pp1 header.b=JDpcxzCd; arc=pass (i=1 dkim=pass dkdomain=ibm.com dmarc=pass fromdomain=linux.vnet.ibm.com); spf=pass (google.com: domain of linux-kernel+bounces-197713-linux.lists.archive=gmail.com@vger.kernel.org designates 147.75.199.223 as permitted sender) smtp.mailfrom="linux-kernel+bounces-197713-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=REJECT sp=NONE dis=NONE) header.from=ibm.com Return-Path: Received: from ny.mirrors.kernel.org (ny.mirrors.kernel.org. [147.75.199.223]) by mx.google.com with ESMTPS id 6a1803df08f44-6ae4b404151si37284086d6.192.2024.05.31.23.13.45 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 31 May 2024 23:13:45 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel+bounces-197713-linux.lists.archive=gmail.com@vger.kernel.org designates 147.75.199.223 as permitted sender) client-ip=147.75.199.223; Authentication-Results: mx.google.com; dkim=pass header.i=@ibm.com header.s=pp1 header.b=JDpcxzCd; arc=pass (i=1 dkim=pass dkdomain=ibm.com dmarc=pass fromdomain=linux.vnet.ibm.com); spf=pass (google.com: domain of linux-kernel+bounces-197713-linux.lists.archive=gmail.com@vger.kernel.org designates 147.75.199.223 as permitted sender) smtp.mailfrom="linux-kernel+bounces-197713-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=REJECT sp=NONE dis=NONE) header.from=ibm.com Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ny.mirrors.kernel.org (Postfix) with ESMTPS id BB5F71C23673 for ; Sat, 1 Jun 2024 06:13:28 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 53C03757E5; Sat, 1 Jun 2024 06:10:49 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b="JDpcxzCd" Received: from mx0b-001b2d01.pphosted.com (mx0b-001b2d01.pphosted.com [148.163.158.5]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 98AE6171D2; Sat, 1 Jun 2024 06:10:46 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.163.158.5 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1717222248; cv=none; b=K5lXdCHK2A5d7U2yNXM1G+3z1pW4E+iIP+MmxgaTJvZkpC2QVedq/Ak3GDFsm4ggnMTk3JsKy5XLpAe5hMUechaFfk13TzW9G7JuwKX//rd5m1pzvdJPdhtt838HL30uyd42kbuenjVgHFnC78dVMU4q1kh0J9FYWjQQa9i0eLI= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1717222248; c=relaxed/simple; bh=O8D35icGuXIqWdZeP10fIJ5tMunzNKT1FIzxXQzEPLM=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=BxeCGEUAbQcCgHg7h1sx8rPVE6ByYqxapid9mqKJwGUSyzsFtL5SsT1mVqi+IYJM7XwtgBewyX+dG0G+cc8SmQExl93KUz56FU1SR1pHA9ONfv53mXbxrH9BjTJ6k5KE6s9O/mFPhPPJo4ixJ7+Ypa2ktjitV+7aKddoZoyv4XE= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.vnet.ibm.com; spf=none smtp.mailfrom=linux.vnet.ibm.com; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b=JDpcxzCd; arc=none smtp.client-ip=148.163.158.5 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.vnet.ibm.com Authentication-Results: smtp.subspace.kernel.org; spf=none smtp.mailfrom=linux.vnet.ibm.com Received: from pps.filterd (m0353722.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.17.1.19/8.17.1.19) with ESMTP id 4515wd4J016368; Sat, 1 Jun 2024 06:10:37 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc : content-transfer-encoding : date : from : in-reply-to : message-id : mime-version : references : subject : to; s=pp1; bh=KWtCDxRFDH80qtDX1eEQGobXQV/6SEcVVVvgw+2HzL0=; b=JDpcxzCdFSIvYKR9EDa7L2B983K64CD0KdS0heiLHfs9XNlxxq9YEBYVw/VZB+w5Cd+I PHxu95lLAkiCuKSOx0yBDU7LTwyhKQ4K0+IfH9Fy0qt0HC7Rw6JMWvpUGG4vXMXUQ/CC dnSqWkxTEehNTr5uB2K8dSttrBY1Huci4xXoX4p5SJGl8Z3pIMZd5LULkeY3IjoTxyaV lodAUoxzaPHJmtnCqUq+poUKeOvkRuLIhhvCkvMsY+7uifLI0mlTDfQBJkLVvd4jsrVp M760/kUTyIufj3v73GA9/g1usAgzDXTTNYCI6t6uwnDmOGVP4HIyfKY332wPLmfJSTys Xw== Received: from pps.reinject (localhost [127.0.0.1]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 3yfwxsr0ns-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Sat, 01 Jun 2024 06:10:37 +0000 Received: from m0353722.ppops.net (m0353722.ppops.net [127.0.0.1]) by pps.reinject (8.17.1.5/8.17.1.5) with ESMTP id 4516AaVc003872; Sat, 1 Jun 2024 06:10:36 GMT Received: from ppma22.wdc07v.mail.ibm.com (5c.69.3da9.ip4.static.sl-reverse.com [169.61.105.92]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 3yfwxsr0nm-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Sat, 01 Jun 2024 06:10:36 +0000 Received: from pps.filterd (ppma22.wdc07v.mail.ibm.com [127.0.0.1]) by ppma22.wdc07v.mail.ibm.com (8.17.1.19/8.17.1.19) with ESMTP id 4514JPdA003178; Sat, 1 Jun 2024 06:10:36 GMT Received: from smtprelay04.fra02v.mail.ibm.com ([9.218.2.228]) by ppma22.wdc07v.mail.ibm.com (PPS) with ESMTPS id 3yfv3j0j7f-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Sat, 01 Jun 2024 06:10:36 +0000 Received: from smtpav03.fra02v.mail.ibm.com (smtpav03.fra02v.mail.ibm.com [10.20.54.102]) by smtprelay04.fra02v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 4516AUIu33293006 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Sat, 1 Jun 2024 06:10:32 GMT Received: from smtpav03.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 439762004D; Sat, 1 Jun 2024 06:10:30 +0000 (GMT) Received: from smtpav03.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 1603D20040; Sat, 1 Jun 2024 06:10:27 +0000 (GMT) Received: from localhost.localdomain (unknown [9.43.41.43]) by smtpav03.fra02v.mail.ibm.com (Postfix) with ESMTP; Sat, 1 Jun 2024 06:10:25 +0000 (GMT) From: Athira Rajeev To: acme@kernel.org, jolsa@kernel.org, adrian.hunter@intel.com, irogers@google.com, namhyung@kernel.org, segher@kernel.crashing.org, christophe.leroy@csgroup.eu Cc: linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org, linuxppc-dev@lists.ozlabs.org, akanksha@linux.ibm.com, maddy@linux.ibm.com, atrajeev@linux.vnet.ibm.com, kjain@linux.ibm.com, disgoel@linux.vnet.ibm.com Subject: [PATCH V3 11/14] tools/perf: Add support to use libcapstone in powerpc Date: Sat, 1 Jun 2024 11:39:38 +0530 Message-Id: <20240601060941.13692-12-atrajeev@linux.vnet.ibm.com> X-Mailer: git-send-email 2.35.1 In-Reply-To: <20240601060941.13692-1-atrajeev@linux.vnet.ibm.com> References: <20240601060941.13692-1-atrajeev@linux.vnet.ibm.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-TM-AS-GCONF: 00 X-Proofpoint-ORIG-GUID: AL5sCQk530wyfd5M4maJrg_emPG6YyUU X-Proofpoint-GUID: MqwawGwaDCR42icxdg9_i0-vbsc8iH60 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1039,Hydra:6.0.650,FMLib:17.12.28.16 definitions=2024-06-01_01,2024-05-30_01,2024-05-17_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 mlxscore=0 adultscore=0 malwarescore=0 lowpriorityscore=0 suspectscore=0 mlxlogscore=662 spamscore=0 phishscore=0 priorityscore=1501 bulkscore=0 clxscore=1015 impostorscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2405010000 definitions=main-2406010045 Now perf uses the capstone library to disassemble the instructions in x86. capstone is used (if available) for perf annotate to speed up. Currently it only supports x86 architecture. Patch includes changes to enable this in powerpc. For now, only for data type sort keys, this method is used and only binary code (raw instruction) is read. This is because powerpc approach to understand instructions and reg fields uses raw instruction. The "cs_disasm" is currently not enabled. While attempting to do cs_disasm, observation is that some of the instructions were not identified (ex: extswsli, maddld) and it had to fallback to use objdump. Hence enabling "cs_disasm" is added in comment section as a TODO for powerpc. Signed-off-by: Athira Rajeev --- tools/perf/util/disasm.c | 148 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 146 insertions(+), 2 deletions(-) diff --git a/tools/perf/util/disasm.c b/tools/perf/util/disasm.c index d8b357055302..915508d2e197 100644 --- a/tools/perf/util/disasm.c +++ b/tools/perf/util/disasm.c @@ -1540,12 +1540,18 @@ static int open_capstone_handle(struct annotate_args *args, bool is_64bit, { struct annotation_options *opt = args->options; cs_mode mode = is_64bit ? CS_MODE_64 : CS_MODE_32; + int ret; /* TODO: support more architectures */ - if (!arch__is(args->arch, "x86")) + if ((!arch__is(args->arch, "x86")) && (!arch__is(args->arch, "powerpc"))) return -1; - if (cs_open(CS_ARCH_X86, mode, handle) != CS_ERR_OK) + if (arch__is(args->arch, "x86")) + ret = cs_open(CS_ARCH_X86, mode, handle); + else + ret = cs_open(CS_ARCH_PPC, mode, handle); + + if (ret != CS_ERR_OK) return -1; if (!opt->disassembler_style || @@ -1635,6 +1641,139 @@ static void print_capstone_detail(cs_insn *insn, char *buf, size_t len, } } +static int symbol__disassemble_capstone_powerpc(char *filename, struct symbol *sym, + struct annotate_args *args) +{ + struct annotation *notes = symbol__annotation(sym); + struct map *map = args->ms.map; + struct dso *dso = map__dso(map); + struct nscookie nsc; + u64 start = map__rip_2objdump(map, sym->start); + u64 end = map__rip_2objdump(map, sym->end); + u64 len = end - start; + u64 offset; + int i, fd, count; + bool is_64bit = false; + bool needs_cs_close = false; + u8 *buf = NULL; + struct find_file_offset_data data = { + .ip = start, + }; + csh handle; + char disasm_buf[512]; + struct disasm_line *dl; + u32 *line; + + if (args->options->objdump_path) + return -1; + + nsinfo__mountns_enter(dso->nsinfo, &nsc); + fd = open(filename, O_RDONLY); + nsinfo__mountns_exit(&nsc); + if (fd < 0) + return -1; + + if (file__read_maps(fd, /*exe=*/true, find_file_offset, &data, + &is_64bit) == 0) + goto err; + + if (open_capstone_handle(args, is_64bit, &handle) < 0) + goto err; + + needs_cs_close = true; + + buf = malloc(len); + if (buf == NULL) + goto err; + + count = pread(fd, buf, len, data.offset); + close(fd); + fd = -1; + + if ((u64)count != len) + goto err; + + line = (u32 *)buf; + + /* add the function address and name */ + scnprintf(disasm_buf, sizeof(disasm_buf), "%#"PRIx64" <%s>:", + start, sym->name); + + args->offset = -1; + args->line = disasm_buf; + args->line_nr = 0; + args->fileloc = NULL; + args->ms.sym = sym; + + dl = disasm_line__new(args); + if (dl == NULL) + goto err; + + annotation_line__add(&dl->al, ¬es->src->source); + + /* + * TODO: enable disassm for powerpc + * count = cs_disasm(handle, buf, len, start, len, &insn); + * + * For now, only binary code is saved in disassembled line + * to be used in "type" and "typeoff" sort keys. Each raw code + * is 32 bit instruction. So use "len/4" to get the number of + * entries. + */ + count = len/4; + + for (i = 0, offset = 0; i < count; i++) { + args->offset = offset; + sprintf(args->line, "%x", line[i]); + + dl = disasm_line__new(args); + if (dl == NULL) + goto err; + + annotation_line__add(&dl->al, ¬es->src->source); + + offset += 4; + } + + /* It failed in the middle */ + if (offset != len) { + struct list_head *list = ¬es->src->source; + + /* Discard all lines and fallback to objdump */ + while (!list_empty(list)) { + dl = list_first_entry(list, struct disasm_line, al.node); + + list_del_init(&dl->al.node); + disasm_line__free(dl); + } + count = -1; + } + +out: + if (needs_cs_close) + cs_close(&handle); + free(buf); + return count < 0 ? count : 0; + +err: + if (fd >= 0) + close(fd); + if (needs_cs_close) { + struct disasm_line *tmp; + + /* + * It probably failed in the middle of the above loop. + * Release any resources it might add. + */ + list_for_each_entry_safe(dl, tmp, ¬es->src->source, al.node) { + list_del(&dl->al.node); + free(dl); + } + } + count = -1; + goto out; +} + static int symbol__disassemble_capstone(char *filename, struct symbol *sym, struct annotate_args *args) { @@ -1987,6 +2126,11 @@ int symbol__disassemble(struct symbol *sym, struct annotate_args *args) err = symbol__disassemble_dso(symfs_filename, sym, args); if (err == 0) goto out_remove_tmp; +#ifdef HAVE_LIBCAPSTONE_SUPPORT + err = symbol__disassemble_capstone_powerpc(symfs_filename, sym, args); + if (err == 0) + goto out_remove_tmp; +#endif } } -- 2.43.0