Messages in this thread | | | Date | Thu, 18 Jan 2024 12:00:42 +0800 | From | Changbin Du <> | Subject | Re: [PATCH v2 2/5] perf: util: use capstone disasm engine to show assembly instructions |
| |
On Wed, Jan 17, 2024 at 09:54:59AM +0100, Thomas Richter wrote: > On 1/17/24 06:11, Changbin Du wrote: > > 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 <changbin.du@huawei.com> > > --- > > tools/perf/builtin-script.c | 8 +-- > > tools/perf/util/Build | 1 + > > tools/perf/util/print_insn.c | 123 +++++++++++++++++++++++++++++++++++ > > tools/perf/util/print_insn.h | 14 ++++ > > 4 files changed, 141 insertions(+), 5 deletions(-) > > create mode 100644 tools/perf/util/print_insn.c > > create mode 100644 tools/perf/util/print_insn.h> > ... > > > diff --git a/tools/perf/util/print_insn.c b/tools/perf/util/print_insn.c > > new file mode 100644 > > index 000000000000..fe035efe8cf6 > > --- /dev/null > > +++ b/tools/perf/util/print_insn.c > > @@ -0,0 +1,123 @@ > > +// SPDX-License-Identifier: GPL-2.0 > > +/* > > + * Instruction binary disassembler based on capstone. > > + * > > + * Author(s): Changbin Du <changbin.du@huawei.com> > > + */ > > +#include "print_insn.h" > > +#include <stdlib.h> > > +#include <string.h> > > +#include <stdbool.h> > > +#include "util/debug.h" > > +#include "util/symbol.h" > > +#include "machine.h" > > + > > +size_t sample__fprintf_insn_raw(struct perf_sample *sample, FILE *fp) > > +{ > > + int printed = 0; > > + > > + for (int i = 0; i < sample->insn_len; i++) > > + printed += fprintf(fp, "%02x ", (unsigned char)sample->insn[i]); > > + return printed; > > +} > > + > > +#ifdef HAVE_LIBCAPSTONE_SUPPORT > > +#include <capstone/capstone.h> > > + > > +static int capstone_init(struct machine *machine, csh *cs_handle) > > +{ > > + cs_arch arch; > > + cs_mode mode; > > + > > + if (machine__is(machine, "x86_64")) { > > + arch = CS_ARCH_X86; > > + mode = CS_MODE_64; > > + } else if (machine__normalized_is(machine, "x86")) { > > + arch = CS_ARCH_X86; > > + mode = CS_MODE_32; > > + } else if (machine__normalized_is(machine, "arm64")) { > > + arch = CS_ARCH_ARM64; > > + mode = CS_MODE_ARM; > > + } else if (machine__normalized_is(machine, "arm")) { > > + arch = CS_ARCH_ARM; > > + mode = CS_MODE_ARM + CS_MODE_V8; > > + } else if (machine__normalized_is(machine, "s390x")) { > > } else if (machine__normalized_is(machine, "s390")) { > > > + arch = CS_ARCH_SYSZ; > > + mode = CS_MODE_BIG_ENDIAN; > > + } else { > > + return -1; > > + } > > I have debugged your reworked patch this morning and discovered that > it was not working. The issue turned out to be function machine__normalized_is(). > The first parameter is passed to several functions before the comparison. > The calls executed are > > machine__normhalized_is() > +--> perf_env__arch() --> called for first parameter. > +--> normalize_arch() --> always returns "s390" > > We need to change the second parameter to "s390" without the trailing x > as indicated above. Sorry for the confusion. > ok, will fix it later. Thanks.
> Thanks a lot. > Thomas Richter, Dept 3303, IBM s390 Linux Development, Boeblingen, Germany > -- > IBM Deutschland Research & Development GmbH > > Vorsitzender des Aufsichtsrats: Wolfgang Wendt > > Geschäftsführung: David Faller > > Sitz der Gesellschaft: Böblingen / Registergericht: Amtsgericht Stuttgart, HRB 243294 >
-- Cheers, Changbin Du
| |