Received: by 2002:a05:6a10:f347:0:0:0:0 with SMTP id d7csp6997384pxu; Thu, 24 Dec 2020 21:31:46 -0800 (PST) X-Google-Smtp-Source: ABdhPJxqAMJCOibUPJqNXhAR5+pE8zr05TnyhJ3mLwIQ6ukru8fl3TE4NICGq7/CqnCxBszPeu6J X-Received: by 2002:a17:906:339a:: with SMTP id v26mr29928203eja.107.1608874306445; Thu, 24 Dec 2020 21:31:46 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1608874306; cv=none; d=google.com; s=arc-20160816; b=Q3OriiN8Qszoy252UDQaGX1zcOhrk69kabg111mIHnYzH6ONBgeACjZ3PzGIiI4Y+0 WTyh96qvak1es0xvlkCrF01R0OxFm/95KHTOgO9B+FmtuZd0Pvn1089sXdaeTih8mdCq n0mqjQv2tFbtn118ac/BDDuwiVLBwiKZDtYpA9wQoue24y0UKEmNiYIeXmoZlMiYMRts inlEgeauj0l16kM1TsaPnoNdswEcdjdNRy0mgslcl3csDtnQo6t1QGjC7tm3o0HTR8eY rO5qxry59eT8eMTnKNG2iHiiDxSsLzm0KgKyNVnkZDSXaNbPXF7JYmsqSQqTnP/WL7y+ 1FRQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:references:in-reply-to:message-id:date:subject :cc:to:from:dkim-signature; bh=QxEw73aH8htDNc2tPH/epFrL2eOdsg6Hp+cPBazlzqE=; b=WIbTa2aF0ghb8xpA2Xe5NaZetCSeWJU1R7VAGjLPc8wFa3yOGBVAvuMVH7YqFwVXwe Qe+QP3p39qgywlPRs8YQ37PEZ4kGXkZxm8WtaRroX3qpX4qWPoFbx9lP+AbTyBTXox33 gua2bxkA1932iCaCCvRyJpbfvS80HHlYA5r2ZAH6cZK3JtbCTGjYDGMGo2EequR1BY2e 8mvExa/CITERhf4HQmPDIr6+OODbGIJ5k9I4pgcS6QXzNdZuI78DGZjEmts5jeMuQV8S P6CzG61jglNzuZk0XS/ML+loifak89sqfHx2/YFOzEy0vrcqGIUfK33Qeq4s+Zyp1rsT ShxA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=BhA2tHDL; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id f17si16143926edx.585.2020.12.24.21.31.24; Thu, 24 Dec 2020 21:31:46 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=BhA2tHDL; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727372AbgLYF2z (ORCPT + 99 others); Fri, 25 Dec 2020 00:28:55 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:53892 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725554AbgLYF2y (ORCPT ); Fri, 25 Dec 2020 00:28:54 -0500 Received: from mail-pg1-x529.google.com (mail-pg1-x529.google.com [IPv6:2607:f8b0:4864:20::529]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 6D698C0613ED for ; Thu, 24 Dec 2020 21:28:14 -0800 (PST) Received: by mail-pg1-x529.google.com with SMTP id n7so2679772pgg.2 for ; Thu, 24 Dec 2020 21:28:14 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=QxEw73aH8htDNc2tPH/epFrL2eOdsg6Hp+cPBazlzqE=; b=BhA2tHDLnHDPPgpjtgASdT3Z6FwgjaCYNFHye6ROWmX8IpKNd+66sfLwRoMSGUAR6Z D/mpTUIIsu4aC6DaBVTsWkP8/Vb7nBiKTcdz286Qs4w11XfFTQh+h8hgJBjyOgWW7pfs n6c8pFULCW0aBQWnUAK1KOFfBDlELmjr7bDovUpF2QmNk5LhJ82JC6KUC6ss7le7qzw0 FMZwZMotPWVvRE6p+8FNoXSpYe6EpqQBWmFupZI4ypo1tMf1I3R6CuoxgnYGxjb+cTbM wWgxqFc4XhKpFcREb2KyWUGvBhTz1ue+L0/aUFIV/zSBQkMCbKn4A4rXDaGwrtY4IJVf k32Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=QxEw73aH8htDNc2tPH/epFrL2eOdsg6Hp+cPBazlzqE=; b=Khl26A9HD0m61i1YAbmDFTu4oWXmA+OFeyfFKpl2eqGTDByYpvCFszSIypik7BvzLz EI1ICrZFu2Ade9z2V2ar50J/5q7gl4VPxAXWHfJqvkkyIb+wR41776drB1n447asmAZF P+Z4Hsm0cQiacACMxlzj1E5hX2gnByZWuMDKHJcRfKCIuBz3VuqcxnFkYZ7LU6EKTmaI MCMRimi83kTIG/OsojLixtZ21Dxk8oqHU/MqUTMCD2UTCZbxh8tysZqnSfa0NXZdKRLW NpEgx/XQnWfibrC53+oBVP0DOsEbHOBOzZL6EydURcuw4eqHjGNXAcWl/DlhPdeax4kb mGXQ== X-Gm-Message-State: AOAM532f5OgrNoNCw+yc6IwYz4IAZbnYm4T3mDCXYCYEm2aMrmK8A7up lN/eaHbbHuTRz6IKl6MIZwSdNQ== X-Received: by 2002:a63:da4e:: with SMTP id l14mr13737064pgj.248.1608874093876; Thu, 24 Dec 2020 21:28:13 -0800 (PST) Received: from localhost ([45.137.216.7]) by smtp.gmail.com with ESMTPSA id l11sm29184800pgt.79.2020.12.24.21.28.12 (version=TLS1_2 cipher=ECDHE-ECDSA-CHACHA20-POLY1305 bits=256/256); Thu, 24 Dec 2020 21:28:13 -0800 (PST) From: Leo Yan To: Arnaldo Carvalho de Melo , John Garry , Will Deacon , Mathieu Poirier , Masami Hiramatsu , Peter Zijlstra , Ingo Molnar , Mark Rutland , Alexander Shishkin , Jiri Olsa , Namhyung Kim , Alexandre Truong , Ian Rogers , Thomas Richter , He Zhe , Sumanth Korikkar , Alexis Berlemont , linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org Cc: Leo Yan Subject: [PATCH v2 3/3] perf arm64: Add argument support for SDT Date: Fri, 25 Dec 2020 13:27:51 +0800 Message-Id: <20201225052751.24513-4-leo.yan@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20201225052751.24513-1-leo.yan@linaro.org> References: <20201225052751.24513-1-leo.yan@linaro.org> Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Now the two OP formats are used for SDT marker argument in Arm64 ELF, one format is general register xNUM (e.g. x1, x2, etc), another is for using stack pointer to access local variables (e.g. [sp], [sp, 8]). This patch adds support SDT marker argument for Arm64, it parses OP and converts to uprobe compatible format. Signed-off-by: Leo Yan Acked-by: Masami Hiramatsu --- tools/perf/arch/arm64/util/perf_regs.c | 94 ++++++++++++++++++++++++++ 1 file changed, 94 insertions(+) diff --git a/tools/perf/arch/arm64/util/perf_regs.c b/tools/perf/arch/arm64/util/perf_regs.c index 54efa12fdbea..2518cde18b34 100644 --- a/tools/perf/arch/arm64/util/perf_regs.c +++ b/tools/perf/arch/arm64/util/perf_regs.c @@ -1,4 +1,12 @@ // SPDX-License-Identifier: GPL-2.0 +#include +#include +#include +#include +#include + +#include "../../../util/debug.h" +#include "../../../util/event.h" #include "../../../util/perf_regs.h" const struct sample_reg sample_reg_masks[] = { @@ -37,3 +45,89 @@ const struct sample_reg sample_reg_masks[] = { SMPL_REG(pc, PERF_REG_ARM64_PC), SMPL_REG_END }; + +/* %xNUM */ +#define SDT_OP_REGEX1 "^(x[1-2]?[0-9]|3[0-1])$" + +/* [sp], [sp, NUM] */ +#define SDT_OP_REGEX2 "^\\[sp(, )?([0-9]+)?\\]$" + +static regex_t sdt_op_regex1, sdt_op_regex2; + +static int sdt_init_op_regex(void) +{ + static int initialized; + int ret = 0; + + if (initialized) + return 0; + + ret = regcomp(&sdt_op_regex1, SDT_OP_REGEX1, REG_EXTENDED); + if (ret) + goto error; + + ret = regcomp(&sdt_op_regex2, SDT_OP_REGEX2, REG_EXTENDED); + if (ret) + goto free_regex1; + + initialized = 1; + return 0; + +free_regex1: + regfree(&sdt_op_regex1); +error: + pr_debug4("Regex compilation error.\n"); + return ret; +} + +/* + * SDT marker arguments on Arm64 uses %xREG or [sp, NUM], currently + * support these two formats. + */ +int arch_sdt_arg_parse_op(char *old_op, char **new_op) +{ + int ret, new_len; + regmatch_t rm[5]; + + ret = sdt_init_op_regex(); + if (ret < 0) + return ret; + + if (!regexec(&sdt_op_regex1, old_op, 3, rm, 0)) { + /* Extract xNUM */ + new_len = 2; /* % NULL */ + new_len += (int)(rm[1].rm_eo - rm[1].rm_so); + + *new_op = zalloc(new_len); + if (!*new_op) + return -ENOMEM; + + scnprintf(*new_op, new_len, "%%%.*s", + (int)(rm[1].rm_eo - rm[1].rm_so), old_op + rm[1].rm_so); + } else if (!regexec(&sdt_op_regex2, old_op, 5, rm, 0)) { + /* [sp], [sp, NUM] or [sp,NUM] */ + new_len = 7; /* + ( % s p ) NULL */ + + /* If the arugment is [sp], need to fill offset '0' */ + if (rm[2].rm_so == -1) + new_len += 1; + else + new_len += (int)(rm[2].rm_eo - rm[2].rm_so); + + *new_op = zalloc(new_len); + if (!*new_op) + return -ENOMEM; + + if (rm[2].rm_so == -1) + scnprintf(*new_op, new_len, "+0(%%sp)"); + else + scnprintf(*new_op, new_len, "+%.*s(%%sp)", + (int)(rm[2].rm_eo - rm[2].rm_so), + old_op + rm[2].rm_so); + } else { + pr_debug4("Skipping unsupported SDT argument: %s\n", old_op); + return SDT_ARG_SKIP; + } + + return SDT_ARG_VALID; +} -- 2.17.1