From nobody Thu Dec 18 08:13:57 2025 Received: from mail-pl1-f179.google.com (mail-pl1-f179.google.com [209.85.214.179]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 49D1F1FA8EF for ; Tue, 17 Dec 2024 23:52:32 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.179 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1734479556; cv=none; b=XgqoR1HGILd4TO2I1AxVyl6M1TDrumI2JNZg2i/d6dHxHvTqzi0ysX2EuPg9+R50R1n39btn0Au0P/LGVLH1kpkNyZKkC+VjK40wH/K5X0KgqXwUPPwSorc398TB8kk+Pk7Z1MviCgcyR2IFrxaGYXmvaVPoYAjJ5+FFCwVaUMU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1734479556; c=relaxed/simple; bh=GMyLH59PFYiUYCKLwxtQUm2kAygEyDToR1S9m0WZNeM=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:To:Cc; b=SjsY7DHIHJiku4tV28a9PyXugINSEP9Pc4Q+hidVvNbxdoTAgtuBv6D3IOZ84aW/iWkMQRVJQ8oYjEmt4OCvthUlVwmTW8c3fGbQdlVu/2Q9eZFHG2shAng5TXlfD/ekPuV+PN+jXeECdYQFjiB3yNtZOMV1R7haKoEWmITil4U= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=rivosinc.com; spf=pass smtp.mailfrom=rivosinc.com; dkim=pass (2048-bit key) header.d=rivosinc-com.20230601.gappssmtp.com header.i=@rivosinc-com.20230601.gappssmtp.com header.b=vvNpsJBc; arc=none smtp.client-ip=209.85.214.179 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=rivosinc.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=rivosinc.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=rivosinc-com.20230601.gappssmtp.com header.i=@rivosinc-com.20230601.gappssmtp.com header.b="vvNpsJBc" Received: by mail-pl1-f179.google.com with SMTP id d9443c01a7336-2164b1f05caso54589435ad.3 for ; Tue, 17 Dec 2024 15:52:32 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=rivosinc-com.20230601.gappssmtp.com; s=20230601; t=1734479550; x=1735084350; darn=vger.kernel.org; h=cc:to:message-id:content-transfer-encoding:mime-version:subject :date:from:from:to:cc:subject:date:message-id:reply-to; bh=GeOVEdFEHGFM6Kz0Pkc246HNNIx9K1qYWLTokvWzItw=; b=vvNpsJBcLxL/mL0t6Mg6rDaaFIvVe95EyOngQ4T++01w5kfCAgbKJ/nANzherosaRC XtZ9dx6+/PPfnmrI5QO5CL8gSzv/q2QKFWsqc2LkMnm0wYAAo6WXNNkD1E1ZKNOZBkr5 CRLEbcT1heanAbv3qY5TkMJjhL3sZBoD6cvKCjanU8f3yTTYMutOuprNftl2GWXcIyP9 AwSqfR4xne/u7RifwafCkudL5KFDgAxY8zQ2ou3/pjka4m4UOXciQ0/sd1U5IsdL86Ih +pnuEEY6MEikKNV7doHm29Nw6EiI2qdl2ov9ShOzSGIYyEn66Alt7HLFryrXVKtaGAmb QobQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1734479550; x=1735084350; h=cc:to:message-id:content-transfer-encoding:mime-version:subject :date:from:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=GeOVEdFEHGFM6Kz0Pkc246HNNIx9K1qYWLTokvWzItw=; b=R9XMJd+sDCXxlHDZSHCkGTcUldJZejRo076lWNSeuGZYvDu9slF3meWUDqc9YqROUy k0kJHuAbjeYv+0JF6jRvMa3wcLPszxBbly7hZfF1h7mzmEpY+O6d0xdLBsiXLAJmQK4E yAzF9gfYRf69cIXHbMOE4KgrTyCSG8mvchSDG2ASH2MddyutMUUq6lKDVPR90uGQLPpH JzicZH4YAFahy3Xr5bqYoQ+LSIqRL2eBRKwtmqDyzuCjM9ZWiFBkprJBL8LW5RXpnqrh oz/TviZSLwnvaEenHF5mE9RkebuZjmO9wGp6yr3gPp8NEXWsDc7bN+Zx7G7kN9VpWNil nfDQ== X-Forwarded-Encrypted: i=1; AJvYcCXu8lPPbwu+kAHhCbiHUbKvc9K5X354M9COlT0lWqqAiYG8d/2Z1tAIGC8vsI2zYNdXp511iQIePUATknI=@vger.kernel.org X-Gm-Message-State: AOJu0Ywo8giJQqOkyZKSlx+P0Fjp6xv3nqgZvu/J6JcnIyBgGEN9NOiM 2K5UHns+M6bZ2rmtL1f8u1Gu3TwZ8uQeM898St9NO0Ttg5oSg1sw3lcTstLr9Kg= X-Gm-Gg: ASbGncuK3welsUwNqW3SYjw2Ii3h4iStdAEYh6r16Ze/gqnUBLThXdBdymJkzw0CvWW U4bhZaFyVKiTEYT80vMLC31/BKU0Uvw9lKp5rLCFLvjiEO2WgrSQAmMnxxgZ37411CqB5UPHeqM ug7Tm4gnVPOFG9njYsFTVS1rvmeU8XtvE93KZB0VWl+bPOB6QxjktCqXqAO67IFYXmNq5h6AZRM AcRSlhAHl8KjVYe4PvDSya4VTqGICVDmD6ahHHtQDMKciVhGATrLmMxrx0X1eQxIXt+cxfF X-Google-Smtp-Source: AGHT+IE8h+7wsOokGyz0BX6sDCEqaDaSYl7MWAZYjl0KKibeho6DEXkEcxCW4CpVQzh0X1E5CaXGpQ== X-Received: by 2002:a17:902:f542:b0:216:554a:212c with SMTP id d9443c01a7336-218d725b78dmr9314985ad.46.1734479549811; Tue, 17 Dec 2024 15:52:29 -0800 (PST) Received: from charlie.ba.rivosinc.com ([64.71.180.162]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-218a1e72111sm64343085ad.271.2024.12.17.15.52.27 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 17 Dec 2024 15:52:28 -0800 (PST) From: Charlie Jenkins Date: Tue, 17 Dec 2024 15:52:08 -0800 Subject: [PATCH v2] tools: perf: tests: Fix code reading for riscv Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20241217-perf_fix_riscv_obj_reading-v2-1-58f81b7b4c7d@rivosinc.com> X-B4-Tracking: v=1; b=H4sIAKcOYmcC/33NQQrCMBCF4auUrI0kqY22K+8hJSTptB3BpEwkK KV3NxbcuvwfwzcrS0AIiXXVyggyJoyhhDpUzM82TMBxKM2UUCepZM0XoNGM+DKEyWcT3d0Q2AH DxL11o1AOan9pWAEWgnK447e+9IzpGem9/8ryu/5Y/Y/Nkgvuzk2rldbCtu5KmGPC4I8+Pli/b dsHwq9MS8cAAAA= X-Change-ID: 20241213-perf_fix_riscv_obj_reading-cabf02be3c85 To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Mark Rutland , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , Paul Walmsley , Palmer Dabbelt , Albert Ou , Nathan Chancellor , Nick Desaulniers , Bill Wendling , Justin Stitt Cc: linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org, linux-riscv@lists.infradead.org, Charlie Jenkins X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=4291; i=charlie@rivosinc.com; h=from:subject:message-id; bh=GMyLH59PFYiUYCKLwxtQUm2kAygEyDToR1S9m0WZNeM=; b=owGbwMvMwCHWx5hUnlvL8Y3xtFoSQ3oS35br/zZf3zjl/K08fqNMNTNh4+5rr9IOWK2SE21/J +rxaKNkRykLgxgHg6yYIgvPtQbm1jv6ZUdFyybAzGFlAhnCwMUpABP5tZPhv+9tu8bk+LXGbEva 4wLbtZ47VNut59c7cejYjuf8R+tsvzMyvNENX8gTEHAlW3OV0v/I1CDe634fLnwyTFP7kbH/8uJ tPAA= X-Developer-Key: i=charlie@rivosinc.com; a=openpgp; fpr=7D834FF11B1D8387E61C776FFB10D1F27D6B1354 After binutils commit e43d876 which was first included in binutils 2.41, riscv no longer supports dumping in the middle of instructions. Increase the objdump window by 2-bytes to ensure that any instruction that sits on the boundary of the specified stop-address is not cut in half. Signed-off-by: Charlie Jenkins Reviewed-by: Ian Rogers --- A binutils patch has been sent as well to fix this in objdump [1]. Link: https://sourceware.org/pipermail/binutils/2024-December/138139.html [1] --- Changes in v2: - Do objdump version detection at runtime (Ian) - Link to v1: https://lore.kernel.org/r/20241216-perf_fix_riscv_obj_reading= -v1-0-b75962660a9b@rivosinc.com --- tools/perf/tests/code-reading.c | 84 +++++++++++++++++++++++++++++++++++++= +++- 1 file changed, 83 insertions(+), 1 deletion(-) diff --git a/tools/perf/tests/code-reading.c b/tools/perf/tests/code-readin= g.c index 27c82cfb7e7de42284bf5af9cf7594a3a963052e..7e24d10a543ac18ac2be70b829d= 088874e0edfd5 100644 --- a/tools/perf/tests/code-reading.c +++ b/tools/perf/tests/code-reading.c @@ -1,5 +1,6 @@ // SPDX-License-Identifier: GPL-2.0 #include +#include #include #include #include @@ -176,6 +177,66 @@ static int read_objdump_output(FILE *f, void *buf, siz= e_t *len, u64 start_addr) return err; } =20 +/* + * Only gets GNU objdump version. Returns 0 for llvm-objdump. + */ +static int objdump_version(void) +{ + size_t line_len; + char cmd[PATH_MAX * 2]; + char *line =3D NULL; + const char *fmt; + FILE *f; + int ret; + + int version_tmp, version_num =3D 0; + char *version =3D 0, *token; + + fmt =3D "%s --version"; + ret =3D snprintf(cmd, sizeof(cmd), fmt, test_objdump_path); + if (ret <=3D 0 || (size_t)ret >=3D sizeof(cmd)) + return -1; + /* Ignore objdump errors */ + strcat(cmd, " 2>/dev/null"); + f =3D popen(cmd, "r"); + if (!f) { + pr_debug("popen failed\n"); + return -1; + } + /* Get first line of objdump --version output */ + ret =3D getline(&line, &line_len, f); + pclose(f); + if (ret < 0) { + pr_debug("getline failed\n"); + return -1; + } + + token =3D strsep(&line, " "); + if (token !=3D NULL && !strcmp(token, "GNU")) { + // version is last part of first line of objdump --version output. + while ((token =3D strsep(&line, " "))) + version =3D token; + + // Convert version into a format we can compare with + token =3D strsep(&version, "."); + version_num =3D atoi(token); + if (version_num) + version_num *=3D 10000; + + token =3D strsep(&version, "."); + version_tmp =3D atoi(token); + if (token) + version_num +=3D version_tmp * 100; + + token =3D strsep(&version, "."); + version_tmp =3D atoi(token); + if (token) + version_num +=3D version_tmp; + } + + return version_num; +} + static int read_via_objdump(const char *filename, u64 addr, void *buf, size_t len) { @@ -183,9 +244,30 @@ static int read_via_objdump(const char *filename, u64 = addr, void *buf, const char *fmt; FILE *f; int ret; + u64 stop_address =3D addr + len; + + if (IS_ENABLED(__riscv)) { + int version =3D objdump_version(); + + /* Default to this workaround if version parsing fails */ + if (version < 0 || version > 24100) { + /* + * Starting at riscv objdump version 2.41, dumping in + * the middle of an instruction is not supported. riscv + * instructions are aligned along 2-byte intervals and + * can be either 2-bytes or 4-bytes. This makes it + * possible that the stop-address lands in the middle of + * a 4-byte instruction. Increase the stop_address by + * two to ensure an instruction is not cut in half, but + * leave the len as-is so only the expected number of + * bytes are collected. + */ + stop_address +=3D 2; + } + } =20 fmt =3D "%s -z -d --start-address=3D0x%"PRIx64" --stop-address=3D0x%"PRIx= 64" %s"; - ret =3D snprintf(cmd, sizeof(cmd), fmt, test_objdump_path, addr, addr + l= en, + ret =3D snprintf(cmd, sizeof(cmd), fmt, test_objdump_path, addr, stop_add= ress, filename); if (ret <=3D 0 || (size_t)ret >=3D sizeof(cmd)) return -1; --- base-commit: fac04efc5c793dccbd07e2d59af9f90b7fc0dca4 change-id: 20241213-perf_fix_riscv_obj_reading-cabf02be3c85 --=20 - Charlie