From nobody Tue Dec 16 19:57:31 2025 Received: from szxga07-in.huawei.com (szxga07-in.huawei.com [45.249.212.35]) (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 65E141C2A6; Sat, 17 Feb 2024 07:41:29 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=45.249.212.35 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1708155692; cv=none; b=k1ZCTQxADJK5NqQf7Uu4atWS0VNF8yoZkHQclOKTmxkMDdc7184t0zL/8JLk46MZfUXn+dAaQ5cvVq4IlHFlASJVvSqCRwSFPd6+N/L5VnkXHWYk3V7CkSPwHnZKCy+42mBUwEkNOaDzuQnH3O9UmquCSjGinLzHP/SWymSSleA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1708155692; c=relaxed/simple; bh=xnUfh5tNvpXi9BR+N3yxZpocjCbyoo7Gh9VK7eqqUzI=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=dtbTlHjDuqwACtb1RuwJIIX0wH+VkjXL3ahxeoRwwzZp6iy1xWloWtf2FjqVn4qnBXhbHzTcIo1OvtAkkiQ/61SQGYvwAly5qQkaaGJaFMsM9oa9xVEZ+5Nv8ws23XKA0YrtCKXgptuGSaMFLix1tnNmjHJmpDXG/bR46GGyeeg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=huawei.com; spf=pass smtp.mailfrom=huawei.com; arc=none smtp.client-ip=45.249.212.35 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=huawei.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=huawei.com Received: from mail.maildlp.com (unknown [172.19.88.163]) by szxga07-in.huawei.com (SkyGuard) with ESMTP id 4TcLKP0CWlz1Q90Y; Sat, 17 Feb 2024 15:39:21 +0800 (CST) Received: from kwepemd100002.china.huawei.com (unknown [7.221.188.184]) by mail.maildlp.com (Postfix) with ESMTPS id 8C39B18001B; Sat, 17 Feb 2024 15:41:26 +0800 (CST) Received: from M910t.huawei.com (10.110.54.157) by kwepemd100002.china.huawei.com (7.221.188.184) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.2.1258.28; Sat, 17 Feb 2024 15:41:25 +0800 From: Changbin Du To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo CC: Mark Rutland , Alexander Shishkin , Jiri Olsa , Namhyung Kim , Ian Rogers , Adrian Hunter , , , Andi Kleen , Thomas Richter , , Changbin Du Subject: [PATCH v8 1/5] perf: build: introduce the libcapstone Date: Sat, 17 Feb 2024 15:40:42 +0800 Message-ID: <20240217074046.4100789-2-changbin.du@huawei.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20240217074046.4100789-1-changbin.du@huawei.com> References: <20240217074046.4100789-1-changbin.du@huawei.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: dggems704-chm.china.huawei.com (10.3.19.181) To kwepemd100002.china.huawei.com (7.221.188.184) Content-Type: text/plain; charset="utf-8" Later we will use libcapstone to disassemble instructions of samples. Signed-off-by: Changbin Du Reviewed-by: Adrian Hunter --- v3: - display with perf version --build-options. (Adrian Hunter) - exclude libcapstone from make_minimal. v2: - change tools/perf/tests/make also. --- tools/build/Makefile.feature | 2 ++ tools/build/feature/Makefile | 4 ++++ tools/build/feature/test-all.c | 4 ++++ tools/build/feature/test-libcapstone.c | 11 +++++++++++ tools/perf/Makefile.config | 21 +++++++++++++++++++++ tools/perf/Makefile.perf | 3 +++ tools/perf/builtin-version.c | 1 + tools/perf/tests/make | 4 +++- 8 files changed, 49 insertions(+), 1 deletion(-) create mode 100644 tools/build/feature/test-libcapstone.c diff --git a/tools/build/Makefile.feature b/tools/build/Makefile.feature index 64df118376df..1e2ab148d5db 100644 --- a/tools/build/Makefile.feature +++ b/tools/build/Makefile.feature @@ -87,6 +87,7 @@ FEATURE_TESTS_EXTRA :=3D \ gtk2-infobar \ hello \ libbabeltrace \ + libcapstone \ libbfd-liberty \ libbfd-liberty-z \ libopencsd \ @@ -134,6 +135,7 @@ FEATURE_DISPLAY ?=3D \ libcrypto \ libunwind \ libdw-dwarf-unwind \ + libcapstone \ zlib \ lzma \ get_cpuid \ diff --git a/tools/build/feature/Makefile b/tools/build/feature/Makefile index 37722e509eb9..ed54cef450f5 100644 --- a/tools/build/feature/Makefile +++ b/tools/build/feature/Makefile @@ -54,6 +54,7 @@ FILES=3D \ test-timerfd.bin \ test-libdw-dwarf-unwind.bin \ test-libbabeltrace.bin \ + test-libcapstone.bin \ test-compile-32.bin \ test-compile-x32.bin \ test-zlib.bin \ @@ -286,6 +287,9 @@ $(OUTPUT)test-libdw-dwarf-unwind.bin: $(OUTPUT)test-libbabeltrace.bin: $(BUILD) # -lbabeltrace provided by $(FEATURE_CHECK_LDFLAGS-libbabeltrace) =20 +$(OUTPUT)test-libcapstone.bin: + $(BUILD) # -lcapstone provided by $(FEATURE_CHECK_LDFLAGS-libcapstone) + $(OUTPUT)test-compile-32.bin: $(CC) -m32 -o $@ test-compile.c =20 diff --git a/tools/build/feature/test-all.c b/tools/build/feature/test-all.c index 6f4bf386a3b5..dd0a18c2ef8f 100644 --- a/tools/build/feature/test-all.c +++ b/tools/build/feature/test-all.c @@ -134,6 +134,10 @@ #undef main #endif =20 +#define main main_test_libcapstone +# include "test-libcapstone.c" +#undef main + #define main main_test_lzma # include "test-lzma.c" #undef main diff --git a/tools/build/feature/test-libcapstone.c b/tools/build/feature/t= est-libcapstone.c new file mode 100644 index 000000000000..fbe8dba189e9 --- /dev/null +++ b/tools/build/feature/test-libcapstone.c @@ -0,0 +1,11 @@ +// SPDX-License-Identifier: GPL-2.0 + +#include + +int main(void) +{ + csh handle; + + cs_open(CS_ARCH_X86, CS_MODE_64, &handle); + return 0; +} diff --git a/tools/perf/Makefile.config b/tools/perf/Makefile.config index aa55850fbc21..3e1072c59757 100644 --- a/tools/perf/Makefile.config +++ b/tools/perf/Makefile.config @@ -191,6 +191,15 @@ endif FEATURE_CHECK_CFLAGS-libbabeltrace :=3D $(LIBBABELTRACE_CFLAGS) FEATURE_CHECK_LDFLAGS-libbabeltrace :=3D $(LIBBABELTRACE_LDFLAGS) -lbabelt= race-ctf =20 +# for linking with debug library, run like: +# make DEBUG=3D1 LIBCAPSTONE_DIR=3D/opt/capstone/ +ifdef LIBCAPSTONE_DIR + LIBCAPSTONE_CFLAGS :=3D -I$(LIBCAPSTONE_DIR)/include + LIBCAPSTONE_LDFLAGS :=3D -L$(LIBCAPSTONE_DIR)/ +endif +FEATURE_CHECK_CFLAGS-libcapstone :=3D $(LIBCAPSTONE_CFLAGS) +FEATURE_CHECK_LDFLAGS-libcapstone :=3D $(LIBCAPSTONE_LDFLAGS) -lcapstone + ifdef LIBZSTD_DIR LIBZSTD_CFLAGS :=3D -I$(LIBZSTD_DIR)/lib LIBZSTD_LDFLAGS :=3D -L$(LIBZSTD_DIR)/lib @@ -1094,6 +1103,18 @@ ifndef NO_LIBBABELTRACE endif endif =20 +ifndef NO_CAPSTONE + $(call feature_check,libcapstone) + ifeq ($(feature-libcapstone), 1) + CFLAGS +=3D -DHAVE_LIBCAPSTONE_SUPPORT $(LIBCAPSTONE_CFLAGS) + LDFLAGS +=3D $(LICAPSTONE_LDFLAGS) + EXTLIBS +=3D -lcapstone + $(call detected,CONFIG_LIBCAPSTONE) + else + msg :=3D $(warning No libcapstone found, disables disasm engine suppor= t for 'perf script', please install libcapstone-dev/capstone-devel); + endif +endif + ifndef NO_AUXTRACE ifeq ($(SRCARCH),x86) ifeq ($(feature-get_cpuid), 0) diff --git a/tools/perf/Makefile.perf b/tools/perf/Makefile.perf index f8774a9b1377..c2134cf456ef 100644 --- a/tools/perf/Makefile.perf +++ b/tools/perf/Makefile.perf @@ -84,6 +84,9 @@ include ../scripts/utilities.mak # Define NO_LIBBABELTRACE if you do not want libbabeltrace support # for CTF data format. # +# Define NO_CAPSTONE if you do not want libcapstone support +# for disasm engine. +# # Define NO_LZMA if you do not want to support compressed (xz) kernel modu= les # # Define NO_AUXTRACE if you do not want AUX area tracing support diff --git a/tools/perf/builtin-version.c b/tools/perf/builtin-version.c index ac20c2b9bbc2..afd409130238 100644 --- a/tools/perf/builtin-version.c +++ b/tools/perf/builtin-version.c @@ -73,6 +73,7 @@ static void library_status(void) STATUS(HAVE_LIBCRYPTO_SUPPORT, libcrypto); STATUS(HAVE_LIBUNWIND_SUPPORT, libunwind); STATUS(HAVE_DWARF_SUPPORT, libdw-dwarf-unwind); + STATUS(HAVE_LIBCAPSTONE_SUPPORT, libcapstone); STATUS(HAVE_ZLIB_SUPPORT, zlib); STATUS(HAVE_LZMA_SUPPORT, lzma); STATUS(HAVE_AUXTRACE_SUPPORT, get_cpuid); diff --git a/tools/perf/tests/make b/tools/perf/tests/make index 8a4da7eb637a..a1f8adf85367 100644 --- a/tools/perf/tests/make +++ b/tools/perf/tests/make @@ -83,6 +83,7 @@ make_no_libelf :=3D NO_LIBELF=3D1 make_no_libunwind :=3D NO_LIBUNWIND=3D1 make_no_libdw_dwarf_unwind :=3D NO_LIBDW_DWARF_UNWIND=3D1 make_no_backtrace :=3D NO_BACKTRACE=3D1 +make_no_libcapstone :=3D NO_CAPSTONE=3D1 make_no_libnuma :=3D NO_LIBNUMA=3D1 make_no_libaudit :=3D NO_LIBAUDIT=3D1 make_no_libbionic :=3D NO_LIBBIONIC=3D1 @@ -122,7 +123,7 @@ make_minimal +=3D NO_DEMANGLE=3D1 NO_LIBELF=3D1 = NO_LIBUNWIND=3D1 NO_BACKTRACE=3D1 make_minimal +=3D NO_LIBNUMA=3D1 NO_LIBAUDIT=3D1 NO_LIBBIONIC=3D1 make_minimal +=3D NO_LIBDW_DWARF_UNWIND=3D1 NO_AUXTRACE=3D1 NO_LIBB= PF=3D1 make_minimal +=3D NO_LIBCRYPTO=3D1 NO_SDT=3D1 NO_JVMTI=3D1 NO_LIBZS= TD=3D1 -make_minimal +=3D NO_LIBCAP=3D1 NO_SYSCALL_TABLE=3D1 +make_minimal +=3D NO_LIBCAP=3D1 NO_SYSCALL_TABLE=3D1 NO_CAPSTONE=3D1 =20 # $(run) contains all available tests run :=3D make_pure @@ -152,6 +153,7 @@ run +=3D make_no_libelf run +=3D make_no_libunwind run +=3D make_no_libdw_dwarf_unwind run +=3D make_no_backtrace +run +=3D make_no_libcapstone run +=3D make_no_libnuma run +=3D make_no_libaudit run +=3D make_no_libbionic --=20 2.25.1 From nobody Tue Dec 16 19:57:31 2025 Received: from szxga06-in.huawei.com (szxga06-in.huawei.com [45.249.212.32]) (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 F32831CAB5; Sat, 17 Feb 2024 07:41:29 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=45.249.212.32 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1708155692; cv=none; b=uSs9qwpzFnyYh4pSj3pv0FOawK1Bxj6nCCWeJZovxUsA/cLRTngNbrPC0TIRak3dehA4W762oxqfOGCo12iuZf0gUl/CvXCS1BMTMRZgMMdVHyk8KX6pUepdwqCfiU946ziY/fk+eGaDpoIjnq7nL039gwu8YDYwaSZkYyVAa5c= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1708155692; c=relaxed/simple; bh=ta1KYqK1TaJ9nUhobs6EBjNfT5lITc8ZsH9QoBs0S+s=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=m5u5pRFV+WH/YkbferT31csMxeQ18oBRNZbheTo4PiWmAv4rRw6wbeA4KySKNtdxZ6YDr6PDIF3zhp7sOYqtVCfsoxIqlEb8tdj2NaQMvxM1d3T0IiN3z0buMvQOD8RX67fSUFpbMrDFyHIqoCfVW3rsswyagxZ9rlc7oQWxDvU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=huawei.com; spf=pass smtp.mailfrom=huawei.com; arc=none smtp.client-ip=45.249.212.32 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=huawei.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=huawei.com Received: from mail.maildlp.com (unknown [172.19.163.17]) by szxga06-in.huawei.com (SkyGuard) with ESMTP id 4TcLMC2sSHz1vtgL; Sat, 17 Feb 2024 15:40:55 +0800 (CST) Received: from kwepemd100002.china.huawei.com (unknown [7.221.188.184]) by mail.maildlp.com (Postfix) with ESMTPS id C0AEA1A0178; Sat, 17 Feb 2024 15:41:27 +0800 (CST) Received: from M910t.huawei.com (10.110.54.157) by kwepemd100002.china.huawei.com (7.221.188.184) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.2.1258.28; Sat, 17 Feb 2024 15:41:26 +0800 From: Changbin Du To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo CC: Mark Rutland , Alexander Shishkin , Jiri Olsa , Namhyung Kim , Ian Rogers , Adrian Hunter , , , Andi Kleen , Thomas Richter , , Changbin Du Subject: [PATCH v8 2/5] perf: util: use capstone disasm engine to show assembly instructions Date: Sat, 17 Feb 2024 15:40:43 +0800 Message-ID: <20240217074046.4100789-3-changbin.du@huawei.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20240217074046.4100789-1-changbin.du@huawei.com> References: <20240217074046.4100789-1-changbin.du@huawei.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: dggems704-chm.china.huawei.com (10.3.19.181) To kwepemd100002.china.huawei.com (7.221.188.184) Content-Type: text/plain; charset="utf-8" Currently, the instructions of samples are shown as raw hex strings which are hard to read. x86 has a special option '--xed' to disassemble the hex string via intel XED tool. Here we use capstone as our disassembler engine to give more friendly instructions. We select libcapstone because capstone can provide more insn details. Perf will fallback to raw instructions if libcapstone is not available. The advantages compared to XED tool: * Support arm, arm64, x86-32, x86_64 (more could be supported), xed only for x86_64. * Immediate address operands are shown as symbol+offs. Signed-off-by: Changbin Du Reviewed-by: Adrian Hunter --- v4: - fix conflicting header bpf.h problem, aka, capstone/bpf.h and uapi/linux/bpf.h. (Namhyung Kim, Adrian Hunter) v3: - show warning msg if libcapstone is not available. v2: - line up the output by preceding two tabs. (Adrian Hunter) - removed the tailing space. (Adrian Hunter) - forward declaration for perf_sample, thread, machine. (Adrian Hunter) - other trivial fixes (Adrian Hunter) --- tools/perf/builtin-script.c | 8 +-- tools/perf/util/Build | 1 + tools/perf/util/print_insn.c | 135 +++++++++++++++++++++++++++++++++++ tools/perf/util/print_insn.h | 16 +++++ tools/perf/util/thread.h | 1 - 5 files changed, 155 insertions(+), 6 deletions(-) create mode 100644 tools/perf/util/print_insn.c create mode 100644 tools/perf/util/print_insn.h diff --git a/tools/perf/builtin-script.c b/tools/perf/builtin-script.c index b1f57401ff23..4817a37f16e2 100644 --- a/tools/perf/builtin-script.c +++ b/tools/perf/builtin-script.c @@ -34,6 +34,7 @@ #include "util/event.h" #include "ui/ui.h" #include "print_binary.h" +#include "print_insn.h" #include "archinsn.h" #include #include @@ -1511,11 +1512,8 @@ static int perf_sample__fprintf_insn(struct perf_sam= ple *sample, if (PRINT_FIELD(INSNLEN)) printed +=3D fprintf(fp, " ilen: %d", sample->insn_len); if (PRINT_FIELD(INSN) && sample->insn_len) { - int i; - - printed +=3D fprintf(fp, " insn:"); - for (i =3D 0; i < sample->insn_len; i++) - printed +=3D fprintf(fp, " %02x", (unsigned char)sample->insn[i]); + printed +=3D fprintf(fp, " insn: "); + printed +=3D sample__fprintf_insn_raw(sample, fp); } if (PRINT_FIELD(BRSTACKINSN) || PRINT_FIELD(BRSTACKINSNLEN)) printed +=3D perf_sample__fprintf_brstackinsn(sample, thread, attr, mach= ine, fp); diff --git a/tools/perf/util/Build b/tools/perf/util/Build index 8027f450fa3e..2cbeeb79b6ef 100644 --- a/tools/perf/util/Build +++ b/tools/perf/util/Build @@ -32,6 +32,7 @@ perf-y +=3D perf_regs.o perf-y +=3D perf-regs-arch/ perf-y +=3D path.o perf-y +=3D print_binary.o +perf-y +=3D print_insn.o perf-y +=3D rlimit.o perf-y +=3D argv_split.o perf-y +=3D rbtree.o diff --git a/tools/perf/util/print_insn.c b/tools/perf/util/print_insn.c new file mode 100644 index 000000000000..459e0e93d7b1 --- /dev/null +++ b/tools/perf/util/print_insn.c @@ -0,0 +1,135 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Instruction binary disassembler based on capstone. + * + * Author(s): Changbin Du + */ +#include +#include +#include "debug.h" +#include "sample.h" +#include "symbol.h" +#include "machine.h" +#include "thread.h" +#include "print_insn.h" + +size_t sample__fprintf_insn_raw(struct perf_sample *sample, FILE *fp) +{ + int printed =3D 0; + + for (int i =3D 0; i < sample->insn_len; i++) { + printed +=3D fprintf(fp, "%02x", (unsigned char)sample->insn[i]); + if (sample->insn_len - i > 1) + printed +=3D fprintf(fp, " "); + } + return printed; +} + +#ifdef HAVE_LIBCAPSTONE_SUPPORT +#include + +static int capstone_init(struct machine *machine, csh *cs_handle) +{ + cs_arch arch; + cs_mode mode; + + if (machine__is(machine, "x86_64")) { + arch =3D CS_ARCH_X86; + mode =3D CS_MODE_64; + } else if (machine__normalized_is(machine, "x86")) { + arch =3D CS_ARCH_X86; + mode =3D CS_MODE_32; + } else if (machine__normalized_is(machine, "arm64")) { + arch =3D CS_ARCH_ARM64; + mode =3D CS_MODE_ARM; + } else if (machine__normalized_is(machine, "arm")) { + arch =3D CS_ARCH_ARM; + mode =3D CS_MODE_ARM + CS_MODE_V8; + } else if (machine__normalized_is(machine, "s390")) { + arch =3D CS_ARCH_SYSZ; + mode =3D CS_MODE_BIG_ENDIAN; + } else { + return -1; + } + + if (cs_open(arch, mode, cs_handle) !=3D CS_ERR_OK) { + pr_warning_once("cs_open failed\n"); + return -1; + } + + if (machine__normalized_is(machine, "x86")) { + cs_option(*cs_handle, CS_OPT_SYNTAX, CS_OPT_SYNTAX_ATT); + /* + * Resolving address operands to symbols is implemented + * on x86 by investigating instruction details. + */ + cs_option(*cs_handle, CS_OPT_DETAIL, CS_OPT_ON); + } + + return 0; +} + +static size_t print_insn_x86(struct perf_sample *sample, struct thread *th= read, + cs_insn *insn, FILE *fp) +{ + struct addr_location al; + size_t printed =3D 0; + + if (insn->detail && insn->detail->x86.op_count =3D=3D 1) { + cs_x86_op *op =3D &insn->detail->x86.operands[0]; + + addr_location__init(&al); + if (op->type =3D=3D X86_OP_IMM && + thread__find_symbol(thread, sample->cpumode, op->imm, &al)) { + printed +=3D fprintf(fp, "%s ", insn[0].mnemonic); + printed +=3D symbol__fprintf_symname_offs(al.sym, &al, fp); + addr_location__exit(&al); + return printed; + } + addr_location__exit(&al); + } + + printed +=3D fprintf(fp, "%s %s", insn[0].mnemonic, insn[0].op_str); + return printed; +} + +size_t sample__fprintf_insn_asm(struct perf_sample *sample, struct thread = *thread, + struct machine *machine, FILE *fp) +{ + csh cs_handle; + cs_insn *insn; + size_t count; + size_t printed =3D 0; + int ret; + + /* TODO: Try to initiate capstone only once but need a proper place. */ + ret =3D capstone_init(machine, &cs_handle); + if (ret < 0) { + /* fallback */ + return sample__fprintf_insn_raw(sample, fp); + } + + count =3D cs_disasm(cs_handle, (uint8_t *)sample->insn, sample->insn_len, + sample->ip, 1, &insn); + if (count > 0) { + if (machine__normalized_is(machine, "x86")) + printed +=3D print_insn_x86(sample, thread, &insn[0], fp); + else + printed +=3D fprintf(fp, "%s %s", insn[0].mnemonic, insn[0].op_str); + cs_free(insn, count); + } else { + printed +=3D fprintf(fp, "illegal instruction"); + } + + cs_close(&cs_handle); + return printed; +} +#else +size_t sample__fprintf_insn_asm(struct perf_sample *sample __maybe_unused, + struct thread *thread __maybe_unused, + struct machine *machine __maybe_unused, + FILE *fp __maybe_unused) +{ + return 0; +} +#endif diff --git a/tools/perf/util/print_insn.h b/tools/perf/util/print_insn.h new file mode 100644 index 000000000000..465bdcfcc2fd --- /dev/null +++ b/tools/perf/util/print_insn.h @@ -0,0 +1,16 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#ifndef PERF_PRINT_INSN_H +#define PERF_PRINT_INSN_H + +#include +#include + +struct perf_sample; +struct thread; +struct machine; + +size_t sample__fprintf_insn_asm(struct perf_sample *sample, struct thread = *thread, + struct machine *machine, FILE *fp); +size_t sample__fprintf_insn_raw(struct perf_sample *sample, FILE *fp); + +#endif /* PERF_PRINT_INSN_H */ diff --git a/tools/perf/util/thread.h b/tools/perf/util/thread.h index 0df775b5c110..df344262eaee 100644 --- a/tools/perf/util/thread.h +++ b/tools/perf/util/thread.h @@ -13,7 +13,6 @@ #include #include #include "rwsem.h" -#include "event.h" #include "callchain.h" #include =20 --=20 2.25.1 From nobody Tue Dec 16 19:57:31 2025 Received: from szxga04-in.huawei.com (szxga04-in.huawei.com [45.249.212.190]) (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 6D59E1CD07; Sat, 17 Feb 2024 07:41:30 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=45.249.212.190 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1708155693; cv=none; b=Q8QCQfWx9buncnJ0U8UF11zGq2OmjnK+ulQovR80HnSYmCmrqeHXkWVhIRRs4Rahqdrs16BUuqtBYAdUEFBBhI0eRTEdVvsEiR51N1RiBqgbOjBCtP/ZBjAOpk1E+QF/+JW3w3F0RDRk3HO9/zZNZoctWQGa/LzeDQkrCs3V1Nk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1708155693; c=relaxed/simple; bh=Erd0plscaM1fNIfpMjva0QETCJ1XaeURSSfLXhFXv04=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=UYtbyh9D+QK1vdC7LtzZlhTpZfevumjk5pTSpJKi0ZUG/PPZSOHnVFWcOD36gXHlbX/2c0+vGLLYna2vixbacPQ2+C+h2CeOTavP6gqLmCio6DnQ0ro/o+S4ETayQzolwQ8Nk/MdlPpFYfArLcqlwVzvBSpKLLsZMz8NonFcUmc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=huawei.com; spf=pass smtp.mailfrom=huawei.com; arc=none smtp.client-ip=45.249.212.190 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=huawei.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=huawei.com Received: from mail.maildlp.com (unknown [172.19.88.234]) by szxga04-in.huawei.com (SkyGuard) with ESMTP id 4TcLLL612Vz1xnZp; Sat, 17 Feb 2024 15:40:10 +0800 (CST) Received: from kwepemd100002.china.huawei.com (unknown [7.221.188.184]) by mail.maildlp.com (Postfix) with ESMTPS id 00CFC1400FD; Sat, 17 Feb 2024 15:41:29 +0800 (CST) Received: from M910t.huawei.com (10.110.54.157) by kwepemd100002.china.huawei.com (7.221.188.184) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.2.1258.28; Sat, 17 Feb 2024 15:41:27 +0800 From: Changbin Du To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo CC: Mark Rutland , Alexander Shishkin , Jiri Olsa , Namhyung Kim , Ian Rogers , Adrian Hunter , , , Andi Kleen , Thomas Richter , , Changbin Du Subject: [PATCH v8 3/5] perf: script: add field 'disasm' to display mnemonic instructions Date: Sat, 17 Feb 2024 15:40:44 +0800 Message-ID: <20240217074046.4100789-4-changbin.du@huawei.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20240217074046.4100789-1-changbin.du@huawei.com> References: <20240217074046.4100789-1-changbin.du@huawei.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: dggems704-chm.china.huawei.com (10.3.19.181) To kwepemd100002.china.huawei.com (7.221.188.184) Content-Type: text/plain; charset="utf-8" In addition to the 'insn' field, this adds a new field 'disasm' to display mnemonic instructions instead of the raw code. $ sudo perf script -F +disasm perf-exec 1443864 [006] 2275506.209848: psb: psb offs: 0 = 0 [unknown] ([unknown]) perf-exec 1443864 [006] 2275506.209848: cbr: cbr: 41 freq:= 4100 MHz (114%) 0 [unknown] ([unknown]) ls 1443864 [006] 2275506.209905: 1 branches:uH: = 7f216b426100 _start+0x0 (/usr/lib/x86_64-linux-gnu/ld-2.31.so) movq %rsp,= %rdi ls 1443864 [006] 2275506.209908: 1 branches:uH: = 7f216b426103 _start+0x3 (/usr/lib/x86_64-linux-gnu/ld-2.31.so) callq _dl_= start+0x0 Signed-off-by: Changbin Du Reviewed-by: Adrian Hunter --- v2: - make '-F +disasm' fatal if libcapstone is not supported. v2: - update Documentation. --- tools/perf/Documentation/perf-script.txt | 13 +++++++------ tools/perf/builtin-script.c | 15 ++++++++++++++- 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/tools/perf/Documentation/perf-script.txt b/tools/perf/Document= ation/perf-script.txt index ff9a52e44688..578fa59f51a5 100644 --- a/tools/perf/Documentation/perf-script.txt +++ b/tools/perf/Documentation/perf-script.txt @@ -132,9 +132,10 @@ OPTIONS Comma separated list of fields to print. Options are: comm, tid, pid, time, cpu, event, trace, ip, sym, dso, dsoff, addr= , symoff, srcline, period, iregs, uregs, brstack, brstacksym, flags, bpf-out= put, - brstackinsn, brstackinsnlen, brstackoff, callindent, insn, insnlen= , synth, - phys_addr, metric, misc, srccode, ipc, data_page_size, code_page_s= ize, ins_lat, - machine_pid, vcpu, cgroup, retire_lat. + brstackinsn, brstackinsnlen, brstackoff, callindent, insn, disasm, + insnlen, synth, phys_addr, metric, misc, srccode, ipc, data_page_s= ize, + code_page_size, ins_lat, machine_pid, vcpu, cgroup, retire_lat. + Field list can be prepended with the type, trace, sw or hw, to indicate to which event type the field list applies. e.g., -F sw:comm,tid,time,ip,sym and -F trace:time,cpu,trace @@ -217,9 +218,9 @@ OPTIONS Instruction Trace decoding. For calls and returns, it will display the name of the symbol indented with spaces to reflect the stack depth. =20 - When doing instruction trace decoding insn and insnlen give the - instruction bytes and the instruction length of the current - instruction. + When doing instruction trace decoding, insn, disasm and insnlen give the + instruction bytes, disassembled instructions (requires libcapstone suppor= t) + and the instruction length of the current instruction respectively. =20 The synth field is used by synthesized events which may be created when Instruction Trace decoding. diff --git a/tools/perf/builtin-script.c b/tools/perf/builtin-script.c index 4817a37f16e2..a7b0213c9b94 100644 --- a/tools/perf/builtin-script.c +++ b/tools/perf/builtin-script.c @@ -135,6 +135,7 @@ enum perf_output_field { PERF_OUTPUT_CGROUP =3D 1ULL << 39, PERF_OUTPUT_RETIRE_LAT =3D 1ULL << 40, PERF_OUTPUT_DSOFF =3D 1ULL << 41, + PERF_OUTPUT_DISASM =3D 1ULL << 42, }; =20 struct perf_script { @@ -190,6 +191,7 @@ struct output_option { {.str =3D "bpf-output", .field =3D PERF_OUTPUT_BPF_OUTPUT}, {.str =3D "callindent", .field =3D PERF_OUTPUT_CALLINDENT}, {.str =3D "insn", .field =3D PERF_OUTPUT_INSN}, + {.str =3D "disasm", .field =3D PERF_OUTPUT_DISASM}, {.str =3D "insnlen", .field =3D PERF_OUTPUT_INSNLEN}, {.str =3D "brstackinsn", .field =3D PERF_OUTPUT_BRSTACKINSN}, {.str =3D "brstackoff", .field =3D PERF_OUTPUT_BRSTACKOFF}, @@ -1515,6 +1517,10 @@ static int perf_sample__fprintf_insn(struct perf_sam= ple *sample, printed +=3D fprintf(fp, " insn: "); printed +=3D sample__fprintf_insn_raw(sample, fp); } + if (PRINT_FIELD(DISASM) && sample->insn_len) { + printed +=3D fprintf(fp, "\t\t"); + printed +=3D sample__fprintf_insn_asm(sample, thread, machine, fp); + } if (PRINT_FIELD(BRSTACKINSN) || PRINT_FIELD(BRSTACKINSNLEN)) printed +=3D perf_sample__fprintf_brstackinsn(sample, thread, attr, mach= ine, fp); =20 @@ -3106,6 +3112,13 @@ static int parse_output_fields(const struct option *= opt __maybe_unused, rc =3D -EINVAL; goto out; } +#ifndef HAVE_LIBCAPSTONE_SUPPORT + if (change !=3D REMOVE && strcmp(tok, "disasm") =3D=3D 0) { + fprintf(stderr, "Field \"disasm\" requires perf to be built with libcap= stone support.\n"); + rc =3D -EINVAL; + goto out; + } +#endif =20 if (type =3D=3D -1) { /* add user option to all events types for @@ -3900,7 +3913,7 @@ int cmd_script(int argc, const char **argv) "Fields: comm,tid,pid,time,cpu,event,trace,ip,sym,dso,dsoff," "addr,symoff,srcline,period,iregs,uregs,brstack," "brstacksym,flags,data_src,weight,bpf-output,brstackinsn," - "brstackinsnlen,brstackoff,callindent,insn,insnlen,synth," + "brstackinsnlen,brstackoff,callindent,insn,disasm,insnlen,synth," "phys_addr,metric,misc,srccode,ipc,tod,data_page_size," "code_page_size,ins_lat,machine_pid,vcpu,cgroup,retire_lat", parse_output_fields), --=20 2.25.1 From nobody Tue Dec 16 19:57:31 2025 Received: from szxga05-in.huawei.com (szxga05-in.huawei.com [45.249.212.191]) (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 278D11CF9B; Sat, 17 Feb 2024 07:41:32 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=45.249.212.191 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1708155695; cv=none; b=DhrWRVSOglYPlRn6FMz1FKMXwVFsmzMutW2ScTt3aAGnHosrxihTObF5JMpyKElHt7nTRcY+AJiEuCEfcUA0r5E20GwUQJkKx6hM0TpPd3vj4H+W3yjKVjT/NNZ8bpsZfSIhlvKpFGrVbh4Fi8NoxIkMRePzCSpZ28DE8RUHgmU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1708155695; c=relaxed/simple; bh=X0DFxaAa0zlTFTZ090bSfmxwSp4bqQH3CYz1cMcQ+S8=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=Hsewx0DIbxTMQjqBLmrrJzHPttnVnLWUkpbOAkIBuqBTWK3GmyIY6nlN6CtZJMGefR+RcmARpImc8iRqWmv9j4E1tAj3CEEQNxjvwOjzIKoyJztkfLHM6Pna32ZzfcuU1WXru9Fc/jFjxwXSpWHQdbYKPfoHhzz4ObZ015HGx9g= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=huawei.com; spf=pass smtp.mailfrom=huawei.com; arc=none smtp.client-ip=45.249.212.191 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=huawei.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=huawei.com Received: from mail.maildlp.com (unknown [172.19.163.17]) by szxga05-in.huawei.com (SkyGuard) with ESMTP id 4TcLGL6stkz1FKpf; Sat, 17 Feb 2024 15:36:42 +0800 (CST) Received: from kwepemd100002.china.huawei.com (unknown [7.221.188.184]) by mail.maildlp.com (Postfix) with ESMTPS id 382D01A0172; Sat, 17 Feb 2024 15:41:30 +0800 (CST) Received: from M910t.huawei.com (10.110.54.157) by kwepemd100002.china.huawei.com (7.221.188.184) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.2.1258.28; Sat, 17 Feb 2024 15:41:28 +0800 From: Changbin Du To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo CC: Mark Rutland , Alexander Shishkin , Jiri Olsa , Namhyung Kim , Ian Rogers , Adrian Hunter , , , Andi Kleen , Thomas Richter , , Changbin Du Subject: [PATCH v8 4/5] perf: script: add raw|disasm arguments to --insn-trace option Date: Sat, 17 Feb 2024 15:40:45 +0800 Message-ID: <20240217074046.4100789-5-changbin.du@huawei.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20240217074046.4100789-1-changbin.du@huawei.com> References: <20240217074046.4100789-1-changbin.du@huawei.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: dggems704-chm.china.huawei.com (10.3.19.181) To kwepemd100002.china.huawei.com (7.221.188.184) Content-Type: text/plain; charset="utf-8" Now '--insn-trace' accept a argument to specify the output format: - raw: display raw instructions. - disasm: display mnemonic instructions (if capstone is installed). $ sudo perf script --insn-trace=3Draw ls 1443864 [006] 2275506.209908875: 7f216b426100 _start+= 0x0 (/usr/lib/x86_64-linux-gnu/ld-2.31.so) insn: 48 89 e7 ls 1443864 [006] 2275506.209908875: 7f216b426103 _start+= 0x3 (/usr/lib/x86_64-linux-gnu/ld-2.31.so) insn: e8 e8 0c 00 00 ls 1443864 [006] 2275506.209908875: 7f216b426df0 _dl_sta= rt+0x0 (/usr/lib/x86_64-linux-gnu/ld-2.31.so) insn: f3 0f 1e fa $ sudo perf script --insn-trace=3Ddisasm ls 1443864 [006] 2275506.209908875: 7f216b426100 _start+= 0x0 (/usr/lib/x86_64-linux-gnu/ld-2.31.so) movq %rsp, %rdi ls 1443864 [006] 2275506.209908875: 7f216b426103 _start+= 0x3 (/usr/lib/x86_64-linux-gnu/ld-2.31.so) callq _dl_start+0x0 ls 1443864 [006] 2275506.209908875: 7f216b426df0 _dl_sta= rt+0x0 (/usr/lib/x86_64-linux-gnu/ld-2.31.so) illegal instruction ls 1443864 [006] 2275506.209908875: 7f216b426df4 _dl_sta= rt+0x4 (/usr/lib/x86_64-linux-gnu/ld-2.31.so) pushq %rbp ls 1443864 [006] 2275506.209908875: 7f216b426df5 _dl_sta= rt+0x5 (/usr/lib/x86_64-linux-gnu/ld-2.31.so) movq %rsp, %rbp ls 1443864 [006] 2275506.209908875: 7f216b426df8 _dl_sta= rt+0x8 (/usr/lib/x86_64-linux-gnu/ld-2.31.so) pushq %r15 Signed-off-by: Changbin Du Reviewed-by: Adrian Hunter --- v2: - update Documentation (Adrian Hunter) --- tools/perf/Documentation/perf-script.txt | 7 ++++--- tools/perf/builtin-script.c | 22 ++++++++++++++++++---- 2 files changed, 22 insertions(+), 7 deletions(-) diff --git a/tools/perf/Documentation/perf-script.txt b/tools/perf/Document= ation/perf-script.txt index 578fa59f51a5..005e51df855e 100644 --- a/tools/perf/Documentation/perf-script.txt +++ b/tools/perf/Documentation/perf-script.txt @@ -442,9 +442,10 @@ include::itrace.txt[] will be printed. Each entry has function name and file/line. Enabled by default, disable with --no-inline. =20 ---insn-trace:: - Show instruction stream for intel_pt traces. Combine with --xed to - show disassembly. +--insn-trace[=3D]:: + Show instruction stream in bytes (raw) or disassembled (disasm) + for intel_pt traces. The default is 'raw'. To use xed, combine + 'raw' with --xed to show disassembly done by xed. =20 --xed:: Run xed disassembler on output. Requires installing the xed disassembler. diff --git a/tools/perf/builtin-script.c b/tools/perf/builtin-script.c index a7b0213c9b94..0dd311a72c7e 100644 --- a/tools/perf/builtin-script.c +++ b/tools/perf/builtin-script.c @@ -3776,10 +3776,24 @@ static int perf_script__process_auxtrace_info(struc= t perf_session *session, #endif =20 static int parse_insn_trace(const struct option *opt __maybe_unused, - const char *str __maybe_unused, - int unset __maybe_unused) + const char *str, int unset __maybe_unused) { - parse_output_fields(NULL, "+insn,-event,-period", 0); + const char *fields =3D "+insn,-event,-period"; + int ret; + + if (str) { + if (strcmp(str, "disasm") =3D=3D 0) + fields =3D "+disasm,-event,-period"; + else if (strlen(str) !=3D 0 && strcmp(str, "raw") !=3D 0) { + fprintf(stderr, "Only accept raw|disasm\n"); + return -EINVAL; + } + } + + ret =3D parse_output_fields(NULL, fields, 0); + if (ret < 0) + return ret; + itrace_parse_synth_opts(opt, "i0ns", 0); symbol_conf.nanosecs =3D true; return 0; @@ -3925,7 +3939,7 @@ int cmd_script(int argc, const char **argv) "only consider these symbols"), OPT_INTEGER(0, "addr-range", &symbol_conf.addr_range, "Use with -S to list traced records within address range"), - OPT_CALLBACK_OPTARG(0, "insn-trace", &itrace_synth_opts, NULL, NULL, + OPT_CALLBACK_OPTARG(0, "insn-trace", &itrace_synth_opts, NULL, "raw|disas= m", "Decode instructions from itrace", parse_insn_trace), OPT_CALLBACK_OPTARG(0, "xed", NULL, NULL, NULL, "Run xed disassembler on output", parse_xed), --=20 2.25.1 From nobody Tue Dec 16 19:57:31 2025 Received: from szxga04-in.huawei.com (szxga04-in.huawei.com [45.249.212.190]) (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 A88641D526; Sat, 17 Feb 2024 07:41:33 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=45.249.212.190 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1708155695; cv=none; b=Wx73OWi76J6ct66nSnQ5WksZEx6S92Ler89plC9ygzu+VvDhomeFdd8GnJUTAtSLpGEAfEVHcVTB5b1JuSnrrwg1y9FgaGbG30/hDaPRiquAkKh/lmq/3wrdRqXdaWwBYQnjyObEDapQTvnUYSQLD1Eu4nkmm3IPUtESqKVCHhM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1708155695; c=relaxed/simple; bh=L+pZSq0Y2ocTmSe9NysyU/JS36LXhGL7+0Fxp73TbbE=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=jN21R4RXzKd9+sBDiNsFbQll3h2w+pBjXMBykVgn5JsdGOBkkJnX5SY6Ih00lkie20XdyO+u05BSwsVJpUrreTFYIlFk8rHCFaDCL5cyMvJ+8cGI0JbkwuG6EoLe5VnShngpHTM/8Bw84AgXIJvCHua6Ijqipcsk+idBMlr3+GU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=huawei.com; spf=pass smtp.mailfrom=huawei.com; arc=none smtp.client-ip=45.249.212.190 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=huawei.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=huawei.com Received: from mail.maildlp.com (unknown [172.19.163.44]) by szxga04-in.huawei.com (SkyGuard) with ESMTP id 4TcLLP1yFnz1xnl6; Sat, 17 Feb 2024 15:40:13 +0800 (CST) Received: from kwepemd100002.china.huawei.com (unknown [7.221.188.184]) by mail.maildlp.com (Postfix) with ESMTPS id 68AC3140485; Sat, 17 Feb 2024 15:41:31 +0800 (CST) Received: from M910t.huawei.com (10.110.54.157) by kwepemd100002.china.huawei.com (7.221.188.184) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.2.1258.28; Sat, 17 Feb 2024 15:41:30 +0800 From: Changbin Du To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo CC: Mark Rutland , Alexander Shishkin , Jiri Olsa , Namhyung Kim , Ian Rogers , Adrian Hunter , , , Andi Kleen , Thomas Richter , , Changbin Du Subject: [PATCH v8 5/5] perf: script: prefer capstone to XED Date: Sat, 17 Feb 2024 15:40:46 +0800 Message-ID: <20240217074046.4100789-6-changbin.du@huawei.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20240217074046.4100789-1-changbin.du@huawei.com> References: <20240217074046.4100789-1-changbin.du@huawei.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: dggems704-chm.china.huawei.com (10.3.19.181) To kwepemd100002.china.huawei.com (7.221.188.184) Content-Type: text/plain; charset="utf-8" Now perf can show assembly instructions with libcapstone for x86, and the capstone is better in general. Signed-off-by: Changbin Du Reviewed-by: Adrian Hunter --- v2: - update Documentation. (Adrian Hunter) - fix typo. --- tools/perf/Documentation/perf-intel-pt.txt | 14 +++++++++----- tools/perf/ui/browsers/res_sample.c | 2 +- tools/perf/ui/browsers/scripts.c | 2 +- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/tools/perf/Documentation/perf-intel-pt.txt b/tools/perf/Docume= ntation/perf-intel-pt.txt index 2109690b0d5f..59ab1ff9d75f 100644 --- a/tools/perf/Documentation/perf-intel-pt.txt +++ b/tools/perf/Documentation/perf-intel-pt.txt @@ -115,9 +115,13 @@ toggle respectively. =20 perf script also supports higher level ways to dump instruction traces: =20 + perf script --insn-trace=3Ddisasm + +or to use the xed disassembler, which requires installing the xed tool +(see XED below): + perf script --insn-trace --xed =20 -Dump all instructions. This requires installing the xed tool (see XED belo= w) Dumping all instructions in a long trace can be fairly slow. It is usually= better to start with higher level decoding, like =20 @@ -130,12 +134,12 @@ or and then select a time range of interest. The time range can then be exami= ned in detail with =20 - perf script --time starttime,stoptime --insn-trace --xed + perf script --time starttime,stoptime --insn-trace=3Ddisasm =20 While examining the trace it's also useful to filter on specific CPUs using the -C option =20 - perf script --time starttime,stoptime --insn-trace --xed -C 1 + perf script --time starttime,stoptime --insn-trace=3Ddisasm -C 1 =20 Dump all instructions in time range on CPU 1. =20 @@ -1306,7 +1310,7 @@ Without timestamps, --per-thread must be specified to= distinguish threads. =20 perf script can be used to provide an instruction trace =20 - $ perf script --guestkallsyms $KALLSYMS --insn-trace --xed -F+ipc | grep = -C10 vmresume | head -21 + $ perf script --guestkallsyms $KALLSYMS --insn-trace=3Ddisasm -F+ipc | gr= ep -C10 vmresume | head -21 CPU 0/KVM 1440 ffffffff82133cdd __vmx_vcpu_run+0x3d ([kernel.kall= syms]) movq 0x48(%rax), %r9 CPU 0/KVM 1440 ffffffff82133ce1 __vmx_vcpu_run+0x41 ([kernel.kall= syms]) movq 0x50(%rax), %r10 CPU 0/KVM 1440 ffffffff82133ce5 __vmx_vcpu_run+0x45 ([kernel.kall= syms]) movq 0x58(%rax), %r11 @@ -1407,7 +1411,7 @@ There were none. =20 'perf script' can be used to provide an instruction trace showing timestam= ps =20 - $ perf script -i perf.data.kvm --guestkallsyms $KALLSYMS --insn-trace --x= ed -F+ipc | grep -C10 vmresume | head -21 + $ perf script -i perf.data.kvm --guestkallsyms $KALLSYMS --insn-trace=3Dd= isasm -F+ipc | grep -C10 vmresume | head -21 CPU 1/KVM 17006 [001] 11500.262865593: ffffffff82133cdd __vmx_vcpu= _run+0x3d ([kernel.kallsyms]) movq 0x48(%rax), %r9 CPU 1/KVM 17006 [001] 11500.262865593: ffffffff82133ce1 __vmx_vcpu= _run+0x41 ([kernel.kallsyms]) movq 0x50(%rax), %r10 CPU 1/KVM 17006 [001] 11500.262865593: ffffffff82133ce5 __vmx_vcpu= _run+0x45 ([kernel.kallsyms]) movq 0x58(%rax), %r11 diff --git a/tools/perf/ui/browsers/res_sample.c b/tools/perf/ui/browsers/r= es_sample.c index 7cb2d6678039..5f60e515b12e 100644 --- a/tools/perf/ui/browsers/res_sample.c +++ b/tools/perf/ui/browsers/res_sample.c @@ -83,7 +83,7 @@ int res_sample_browse(struct res_sample *res_samples, int= num_res, r->tid ? "--tid " : "", r->tid ? (sprintf(tidbuf, "%d", r->tid), tidbuf) : "", extra_format, - rstype =3D=3D A_ASM ? "-F +insn --xed" : + rstype =3D=3D A_ASM ? "-F +disasm" : rstype =3D=3D A_SOURCE ? "-F +srcline,+srccode" : "", symbol_conf.inline_name ? "--inline" : "", "--show-lost-events ", diff --git a/tools/perf/ui/browsers/scripts.c b/tools/perf/ui/browsers/scri= pts.c index 50d45054ed6c..e437d7889de6 100644 --- a/tools/perf/ui/browsers/scripts.c +++ b/tools/perf/ui/browsers/scripts.c @@ -107,7 +107,7 @@ static int list_scripts(char *script_name, bool *custom, if (evsel) attr_to_script(scriptc.extra_format, &evsel->core.attr); add_script_option("Show individual samples", "", &scriptc); - add_script_option("Show individual samples with assembler", "-F +insn --x= ed", + add_script_option("Show individual samples with assembler", "-F +disasm", &scriptc); add_script_option("Show individual samples with source", "-F +srcline,+sr= ccode", &scriptc); --=20 2.25.1