All of lore.kernel.org
 help / color / mirror / Atom feed
From: Arnaldo Carvalho de Melo <acme@kernel.org>
To: Adrian Hunter <adrian.hunter@intel.com>
Cc: Ingo Molnar <mingo@kernel.org>,
	linux-kernel@vger.kernel.org, Jiri Olsa <jolsa@redhat.com>
Subject: Re: [PATCH V6 05/17] perf tools: Add Intel PT instruction decoder
Date: Thu, 18 Jun 2015 19:29:41 -0300	[thread overview]
Message-ID: <20150618222941.GJ3079@kernel.org> (raw)
In-Reply-To: <1432906425-9911-6-git-send-email-adrian.hunter@intel.com>

Em Fri, May 29, 2015 at 04:33:33PM +0300, Adrian Hunter escreveu:
> Add support for decoding instructions for Intel Processor Trace.  The
> kernel x86 instruction decoder is used for this.

Ok, but we don't access kernel header files directly, and:

[acme@zoo linux]$ find . -name "insn.h"
./arch/x86/include/asm/insn.h
./arch/arm64/include/asm/insn.h
./arch/arm/include/asm/insn.h
[acme@zoo linux]$ find /usr/include -name "insn.h"
[acme@zoo linux]$ 

But I need to look more into this patch to figure out if this is
something generated at build time, etc, but before that I found a
problem:

So:

> +inat_tables_script = ../../arch/x86/tools/gen-insn-attr-x86.awk
> +inat_tables_maps = ../../arch/x86/lib/x86-opcode-map.txt

These need to go into tools/perf/MANIFEST, so that:

[acme@zoo linux]$ make help | grep perf
  perf-tar-src-pkg    - Build perf-4.1.0-rc5.tar source tarball
  perf-targz-src-pkg  - Build perf-4.1.0-rc5.tar.gz source tarball
  perf-tarbz2-src-pkg - Build perf-4.1.0-rc5.tar.bz2 source tarball
  perf-tarxz-src-pkg  - Build perf-4.1.0-rc5.tar.xz source tarball
[acme@zoo linux]$ 

Continue to work, in fact, there is a test for that, that will run
when you do the build tests:

make -C tools/perf build-test

It is one of the last to be tested, so you may want to do it directly:

[acme@zoo linux]$ make -C tools/perf -f tests/make tarpkg
make: Entering directory '/home/git/linux/tools/perf'
- tarpkg: ./tests/perf-targz-src-pkg .
make: Leaving directory '/home/git/linux/tools/perf'
[acme@zoo linux]$

After I apply this patch, I get:

Applying: perf tools: Add Intel PT instruction decoder
[tmp.perf/pt 1ab14c4be64b] perf tools: Add Intel PT instruction decoder
 Author: Adrian Hunter <adrian.hunter@intel.com>
 Date: Fri May 29 16:33:33 2015 +0300
 6 files changed, 339 insertions(+), 3 deletions(-)
 rewrite tools/perf/util/intel-pt-decoder/Build (100%)
 create mode 100644 tools/perf/util/intel-pt-decoder/intel-pt-insn-decoder.c
 create mode 100644 tools/perf/util/intel-pt-decoder/intel-pt-insn-decoder.h
[acme@zoo linux]$ fg
bash: fg: current: no such job
[acme@zoo linux]$ make -C tools/perf -f tests/make tarpkg
make: Entering directory '/home/git/linux/tools/perf'
- tarpkg: ./tests/perf-targz-src-pkg .
tests/make:224: recipe for target 'tarpkg' failed
make: *** [tarpkg] Error 2
make: Leaving directory '/home/git/linux/tools/perf'
[acme@zoo linux]$ 

Doing it manually to see what happened:

[acme@zoo linux]$ make perf-tar-src-pkg
  TAR
[acme@zoo linux]$ ls -la perf-4.1.0-rc5.tar 
-rw-rw-r--. 1 acme acme 5027840 Jun 18 19:24 perf-4.1.0-rc5.tar
[acme@zoo linux]$ mv perf-4.1.0-rc5.tar /tmp
[acme@zoo linux]$ cd /tmp
[acme@zoo tmp]$ tar xf perf-4.1.0-rc5.tar 
[acme@zoo tmp]$ cd perf-4.1.0-rc5/
[acme@zoo perf-4.1.0-rc5]$ make -C tools/perf
make: Entering directory '/tmp/perf-4.1.0-rc5/tools/perf'
  BUILD:   Doing 'make -j4' parallel build

Auto-detecting system features:
...                         dwarf: [ on  ]
...                         glibc: [ on  ]
...                          gtk2: [ on  ]
...                      libaudit: [ on  ]
...                        libbfd: [ on  ]
...                        libelf: [ on  ]
...                       libnuma: [ on  ]
...                       libperl: [ on  ]
...                     libpython: [ on  ]
...                      libslang: [ on  ]
...                     libunwind: [ on  ]
...            libdw-dwarf-unwind: [ on  ]
...                          zlib: [ on  ]
...                          lzma: [ on  ]

  CC       util/abspath.o
  CC       fd/array.o
  PERF_VERSION = 4.1.rc5.g1ab14c
  CC       fs/fs.o
  CC       event-parse.o
  LD       fd/libapi-in.o
  CC       event-plugin.o
  CC       fs/debugfs.o
  CC       util/alias.o
  CC       trace-seq.o
<SNIP>
  CC       util/cloexec.o
  CC       util/thread-stack.o
  CC       builtin-kmem.o
  CC       builtin-lock.o
  CC       util/auxtrace.o
  CC       util/intel-pt-decoder/intel-pt-pkt-decoder.o
make[4]: *** No rule to make target '../../arch/x86/tools/gen-insn-attr-x86.awk', needed by 'util/intel-pt-decoder/inat-tables.c'.  Stop.
make[4]: *** Waiting for unfinished jobs....
  GEN      util/intel-pt-decoder/inat.c
cp: cannot stat ‘../../arch/x86/lib/inat.c’: No such file or directory
util/intel-pt-decoder/Build:10: recipe for target 'util/intel-pt-decoder/inat.c' failed
make[4]: *** [util/intel-pt-decoder/inat.c] Error 1
/tmp/perf-4.1.0-rc5/tools/build/Makefile.build:109: recipe for target 'intel-pt-decoder' failed
make[3]: *** [intel-pt-decoder] Error 2
make[3]: *** Waiting for unfinished jobs....
  CC       builtin-kvm.o
  CC       builtin-inject.o
/tmp/perf-4.1.0-rc5/tools/build/Makefile.build:109: recipe for target 'util' failed
make[2]: *** [util] Error 2
Makefile.perf:380: recipe for target 'libperf-in.o' failed
make[1]: *** [libperf-in.o] Error 2
make[1]: *** Waiting for unfinished jobs....
  CC       builtin-mem.o
  CC       builtin-data.o
  CC       builtin-trace.o
<SNIP>
  LD       tests/perf-in.o
  LD       perf-in.o
Makefile:68: recipe for target 'all' failed
make: *** [all] Error 2
make: Leaving directory '/tmp/perf-4.1.0-rc5/tools/perf'
[acme@zoo perf-4.1.0-rc5]$

The patch fixed up wrt some recent changes to .gitignore and the
makefiles is in my git tree at git.kernel.org, branch tmp.perf/pt.

Calling it a day, will continue on this tomorrow.

- Arnaldo

> This essentially provides intel_pt_get_insn() which takes a binary
> buffer, uses the kernel's x86 instruction decoder to get details
> of the instruction and then categorizes it for consumption by
> an Intel PT decoder.
> 
> Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
> ---
>  tools/build/Makefile.build                         |   2 +
>  tools/perf/.gitignore                              |   2 +
>  tools/perf/Makefile.perf                           |  12 +-
>  tools/perf/util/intel-pt-decoder/Build             |  15 +-
>  .../util/intel-pt-decoder/intel-pt-insn-decoder.c  | 246 +++++++++++++++++++++
>  .../util/intel-pt-decoder/intel-pt-insn-decoder.h  |  65 ++++++
>  6 files changed, 339 insertions(+), 3 deletions(-)
>  create mode 100644 tools/perf/util/intel-pt-decoder/intel-pt-insn-decoder.c
>  create mode 100644 tools/perf/util/intel-pt-decoder/intel-pt-insn-decoder.h
> 
> diff --git a/tools/build/Makefile.build b/tools/build/Makefile.build
> index 10df572..7ad74e4 100644
> --- a/tools/build/Makefile.build
> +++ b/tools/build/Makefile.build
> @@ -57,6 +57,8 @@ quiet_cmd_cc_i_c = CPP      $@
>  quiet_cmd_cc_s_c = AS       $@
>        cmd_cc_s_c = $(CC) $(c_flags) -S -o $@ $<
>  
> +quiet_cmd_gen = GEN      $@
> +
>  # Link agregate command
>  # If there's nothing to link, create empty $@ object.
>  quiet_cmd_ld_multi = LD       $@
> diff --git a/tools/perf/.gitignore b/tools/perf/.gitignore
> index 812f904..c88d5c5 100644
> --- a/tools/perf/.gitignore
> +++ b/tools/perf/.gitignore
> @@ -28,3 +28,5 @@ config.mak.autogen
>  *-flex.*
>  *.pyc
>  *.pyo
> +util/intel-pt-decoder/inat-tables.c
> +util/intel-pt-decoder/inat.c
> diff --git a/tools/perf/Makefile.perf b/tools/perf/Makefile.perf
> index 5816a3b..3ae3a8e 100644
> --- a/tools/perf/Makefile.perf
> +++ b/tools/perf/Makefile.perf
> @@ -76,6 +76,12 @@ include config/utilities.mak
>  #
>  # Define NO_AUXTRACE if you do not want AUX area tracing support
>  
> +# As per kernel Makefile, avoid funny character set dependencies
> +unexport LC_ALL
> +LC_COLLATE=C
> +LC_NUMERIC=C
> +export LC_COLLATE LC_NUMERIC
> +
>  ifeq ($(srctree),)
>  srctree := $(patsubst %/,%,$(dir $(shell pwd)))
>  srctree := $(patsubst %/,%,$(dir $(srctree)))
> @@ -122,6 +128,7 @@ INSTALL = install
>  FLEX    = flex
>  BISON   = bison
>  STRIP   = strip
> +AWK     = awk
>  
>  LIB_DIR          = $(srctree)/tools/lib/api/
>  TRACE_EVENT_DIR = $(srctree)/tools/lib/traceevent/
> @@ -272,7 +279,7 @@ strip: $(PROGRAMS) $(OUTPUT)perf
>  
>  PERF_IN := $(OUTPUT)perf-in.o
>  
> -export srctree OUTPUT RM CC LD AR CFLAGS V BISON FLEX
> +export srctree OUTPUT RM CC LD AR CFLAGS V BISON FLEX AWK
>  build := -f $(srctree)/tools/build/Makefile.build dir=. obj
>  
>  $(PERF_IN): $(OUTPUT)PERF-VERSION-FILE $(OUTPUT)common-cmds.h FORCE
> @@ -536,7 +543,8 @@ clean: $(LIBTRACEEVENT)-clean $(LIBAPI)-clean config-clean
>  	$(Q)find . -name '*.o' -delete -o -name '\.*.cmd' -delete -o -name '\.*.d' -delete
>  	$(Q)$(RM) .config-detected
>  	$(call QUIET_CLEAN, core-progs) $(RM) $(ALL_PROGRAMS) perf perf-read-vdso32 perf-read-vdsox32
> -	$(call QUIET_CLEAN, core-gen)   $(RM)  *.spec *.pyc *.pyo */*.pyc */*.pyo $(OUTPUT)common-cmds.h TAGS tags cscope* $(OUTPUT)PERF-VERSION-FILE $(OUTPUT)FEATURE-DUMP $(OUTPUT)util/*-bison* $(OUTPUT)util/*-flex*
> +	$(call QUIET_CLEAN, core-gen)   $(RM)  *.spec *.pyc *.pyo */*.pyc */*.pyo $(OUTPUT)common-cmds.h TAGS tags cscope* $(OUTPUT)PERF-VERSION-FILE $(OUTPUT)FEATURE-DUMP $(OUTPUT)util/*-bison* $(OUTPUT)util/*-flex* \
> +		$(OUTPUT)util/intel-pt-decoder/inat.c $(OUTPUT)util/intel-pt-decoder/inat-tables.c
>  	$(QUIET_SUBDIR0)Documentation $(QUIET_SUBDIR1) clean
>  	$(python-clean)
>  
> diff --git a/tools/perf/util/intel-pt-decoder/Build b/tools/perf/util/intel-pt-decoder/Build
> index 9d67381..f5f7f87 100644
> --- a/tools/perf/util/intel-pt-decoder/Build
> +++ b/tools/perf/util/intel-pt-decoder/Build
> @@ -1 +1,14 @@
> -libperf-$(CONFIG_AUXTRACE) += intel-pt-pkt-decoder.o
> +libperf-$(CONFIG_AUXTRACE) += intel-pt-pkt-decoder.o intel-pt-insn-decoder.o
> +
> +inat_tables_script = ../../arch/x86/tools/gen-insn-attr-x86.awk
> +inat_tables_maps = ../../arch/x86/lib/x86-opcode-map.txt
> +
> +$(OUTPUT)util/intel-pt-decoder/inat-tables.c: $(inat_tables_script) $(inat_tables_maps)
> +	@$(call echo-cmd,gen)$(AWK) -f $(inat_tables_script) $(inat_tables_maps) > $@ || rm -f $@
> +
> +$(OUTPUT)util/intel-pt-decoder/inat.c:
> +	@$(call echo-cmd,gen)cp ../../arch/x86/lib/inat.c $(OUTPUT)util/intel-pt-decoder/inat.c
> +
> +$(OUTPUT)util/intel-pt-decoder/intel-pt-insn-decoder.o: $(OUTPUT)util/intel-pt-decoder/inat.c $(OUTPUT)util/intel-pt-decoder/inat-tables.c
> +
> +CFLAGS_intel-pt-insn-decoder.o += -I../../arch/x86/include -I$(OUTPUT)util/intel-pt-decoder -I../../arch/x86/lib -Wno-override-init
> diff --git a/tools/perf/util/intel-pt-decoder/intel-pt-insn-decoder.c b/tools/perf/util/intel-pt-decoder/intel-pt-insn-decoder.c
> new file mode 100644
> index 0000000..2fa82c5
> --- /dev/null
> +++ b/tools/perf/util/intel-pt-decoder/intel-pt-insn-decoder.c
> @@ -0,0 +1,246 @@
> +/*
> + * intel_pt_insn_decoder.c: Intel Processor Trace support
> + * Copyright (c) 2013-2014, Intel Corporation.
> + *
> + * This program is free software; you can redistribute it and/or modify it
> + * under the terms and conditions of the GNU General Public License,
> + * version 2, as published by the Free Software Foundation.
> + *
> + * This program is distributed in the hope it will be useful, but WITHOUT
> + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
> + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
> + * more details.
> + *
> + */
> +
> +#include <stdio.h>
> +#include <string.h>
> +#include <endian.h>
> +#include <byteswap.h>
> +
> +#include "event.h"
> +
> +#include <asm/insn.h>
> +
> +#include "inat.c"
> +#include <insn.c>
> +
> +#include "intel-pt-insn-decoder.h"
> +
> +/* Based on branch_type() from perf_event_intel_lbr.c */
> +static void intel_pt_insn_decoder(struct insn *insn,
> +				  struct intel_pt_insn *intel_pt_insn)
> +{
> +	enum intel_pt_insn_op op = INTEL_PT_OP_OTHER;
> +	enum intel_pt_insn_branch branch = INTEL_PT_BR_NO_BRANCH;
> +	int ext;
> +
> +	if (insn_is_avx(insn)) {
> +		intel_pt_insn->op = INTEL_PT_OP_OTHER;
> +		intel_pt_insn->branch = INTEL_PT_BR_NO_BRANCH;
> +		intel_pt_insn->length = insn->length;
> +		return;
> +	}
> +
> +	switch (insn->opcode.bytes[0]) {
> +	case 0xf:
> +		switch (insn->opcode.bytes[1]) {
> +		case 0x05: /* syscall */
> +		case 0x34: /* sysenter */
> +			op = INTEL_PT_OP_SYSCALL;
> +			branch = INTEL_PT_BR_INDIRECT;
> +			break;
> +		case 0x07: /* sysret */
> +		case 0x35: /* sysexit */
> +			op = INTEL_PT_OP_SYSRET;
> +			branch = INTEL_PT_BR_INDIRECT;
> +			break;
> +		case 0x80 ... 0x8f: /* jcc */
> +			op = INTEL_PT_OP_JCC;
> +			branch = INTEL_PT_BR_CONDITIONAL;
> +			break;
> +		default:
> +			break;
> +		}
> +		break;
> +	case 0x70 ... 0x7f: /* jcc */
> +		op = INTEL_PT_OP_JCC;
> +		branch = INTEL_PT_BR_CONDITIONAL;
> +		break;
> +	case 0xc2: /* near ret */
> +	case 0xc3: /* near ret */
> +	case 0xca: /* far ret */
> +	case 0xcb: /* far ret */
> +		op = INTEL_PT_OP_RET;
> +		branch = INTEL_PT_BR_INDIRECT;
> +		break;
> +	case 0xcf: /* iret */
> +		op = INTEL_PT_OP_IRET;
> +		branch = INTEL_PT_BR_INDIRECT;
> +		break;
> +	case 0xcc ... 0xce: /* int */
> +		op = INTEL_PT_OP_INT;
> +		branch = INTEL_PT_BR_INDIRECT;
> +		break;
> +	case 0xe8: /* call near rel */
> +		op = INTEL_PT_OP_CALL;
> +		branch = INTEL_PT_BR_UNCONDITIONAL;
> +		break;
> +	case 0x9a: /* call far absolute */
> +		op = INTEL_PT_OP_CALL;
> +		branch = INTEL_PT_BR_INDIRECT;
> +		break;
> +	case 0xe0 ... 0xe2: /* loop */
> +		op = INTEL_PT_OP_LOOP;
> +		branch = INTEL_PT_BR_CONDITIONAL;
> +		break;
> +	case 0xe3: /* jcc */
> +		op = INTEL_PT_OP_JCC;
> +		branch = INTEL_PT_BR_CONDITIONAL;
> +		break;
> +	case 0xe9: /* jmp */
> +	case 0xeb: /* jmp */
> +		op = INTEL_PT_OP_JMP;
> +		branch = INTEL_PT_BR_UNCONDITIONAL;
> +		break;
> +	case 0xea: /* far jmp */
> +		op = INTEL_PT_OP_JMP;
> +		branch = INTEL_PT_BR_INDIRECT;
> +		break;
> +	case 0xff: /* call near absolute, call far absolute ind */
> +		ext = (insn->modrm.bytes[0] >> 3) & 0x7;
> +		switch (ext) {
> +		case 2: /* near ind call */
> +		case 3: /* far ind call */
> +			op = INTEL_PT_OP_CALL;
> +			branch = INTEL_PT_BR_INDIRECT;
> +			break;
> +		case 4:
> +		case 5:
> +			op = INTEL_PT_OP_JMP;
> +			branch = INTEL_PT_BR_INDIRECT;
> +			break;
> +		default:
> +			break;
> +		}
> +		break;
> +	default:
> +		break;
> +	}
> +
> +	intel_pt_insn->op = op;
> +	intel_pt_insn->branch = branch;
> +	intel_pt_insn->length = insn->length;
> +
> +	if (branch == INTEL_PT_BR_CONDITIONAL ||
> +	    branch == INTEL_PT_BR_UNCONDITIONAL) {
> +#if __BYTE_ORDER == __BIG_ENDIAN
> +		switch (insn->immediate.nbytes) {
> +		case 1:
> +			intel_pt_insn->rel = insn->immediate.value;
> +			break;
> +		case 2:
> +			intel_pt_insn->rel =
> +					bswap_16((short)insn->immediate.value);
> +			break;
> +		case 4:
> +			intel_pt_insn->rel = bswap_32(insn->immediate.value);
> +			break;
> +		}
> +#else
> +		intel_pt_insn->rel = insn->immediate.value;
> +#endif
> +	}
> +}
> +
> +int intel_pt_get_insn(const unsigned char *buf, size_t len, int x86_64,
> +		      struct intel_pt_insn *intel_pt_insn)
> +{
> +	struct insn insn;
> +
> +	insn_init(&insn, buf, len, x86_64);
> +	insn_get_length(&insn);
> +	if (!insn_complete(&insn) || insn.length > len)
> +		return -1;
> +	intel_pt_insn_decoder(&insn, intel_pt_insn);
> +	if (insn.length < INTEL_PT_INSN_DBG_BUF_SZ)
> +		memcpy(intel_pt_insn->buf, buf, insn.length);
> +	else
> +		memcpy(intel_pt_insn->buf, buf, INTEL_PT_INSN_DBG_BUF_SZ);
> +	return 0;
> +}
> +
> +const char *branch_name[] = {
> +	[INTEL_PT_OP_OTHER]	= "Other",
> +	[INTEL_PT_OP_CALL]	= "Call",
> +	[INTEL_PT_OP_RET]	= "Ret",
> +	[INTEL_PT_OP_JCC]	= "Jcc",
> +	[INTEL_PT_OP_JMP]	= "Jmp",
> +	[INTEL_PT_OP_LOOP]	= "Loop",
> +	[INTEL_PT_OP_IRET]	= "IRet",
> +	[INTEL_PT_OP_INT]	= "Int",
> +	[INTEL_PT_OP_SYSCALL]	= "Syscall",
> +	[INTEL_PT_OP_SYSRET]	= "Sysret",
> +};
> +
> +const char *intel_pt_insn_name(enum intel_pt_insn_op op)
> +{
> +	return branch_name[op];
> +}
> +
> +int intel_pt_insn_desc(const struct intel_pt_insn *intel_pt_insn, char *buf,
> +		       size_t buf_len)
> +{
> +	switch (intel_pt_insn->branch) {
> +	case INTEL_PT_BR_CONDITIONAL:
> +	case INTEL_PT_BR_UNCONDITIONAL:
> +		return snprintf(buf, buf_len, "%s %s%d",
> +				intel_pt_insn_name(intel_pt_insn->op),
> +				intel_pt_insn->rel > 0 ? "+" : "",
> +				intel_pt_insn->rel);
> +	case INTEL_PT_BR_NO_BRANCH:
> +	case INTEL_PT_BR_INDIRECT:
> +		return snprintf(buf, buf_len, "%s",
> +				intel_pt_insn_name(intel_pt_insn->op));
> +	default:
> +		break;
> +	}
> +	return 0;
> +}
> +
> +size_t intel_pt_insn_max_size(void)
> +{
> +	return MAX_INSN_SIZE;
> +}
> +
> +int intel_pt_insn_type(enum intel_pt_insn_op op)
> +{
> +	switch (op) {
> +	case INTEL_PT_OP_OTHER:
> +		return 0;
> +	case INTEL_PT_OP_CALL:
> +		return PERF_IP_FLAG_BRANCH | PERF_IP_FLAG_CALL;
> +	case INTEL_PT_OP_RET:
> +		return PERF_IP_FLAG_BRANCH | PERF_IP_FLAG_RETURN;
> +	case INTEL_PT_OP_JCC:
> +		return PERF_IP_FLAG_BRANCH | PERF_IP_FLAG_CONDITIONAL;
> +	case INTEL_PT_OP_JMP:
> +		return PERF_IP_FLAG_BRANCH;
> +	case INTEL_PT_OP_LOOP:
> +		return PERF_IP_FLAG_BRANCH | PERF_IP_FLAG_CONDITIONAL;
> +	case INTEL_PT_OP_IRET:
> +		return PERF_IP_FLAG_BRANCH | PERF_IP_FLAG_RETURN |
> +		       PERF_IP_FLAG_INTERRUPT;
> +	case INTEL_PT_OP_INT:
> +		return PERF_IP_FLAG_BRANCH | PERF_IP_FLAG_CALL |
> +		       PERF_IP_FLAG_INTERRUPT;
> +	case INTEL_PT_OP_SYSCALL:
> +		return PERF_IP_FLAG_BRANCH | PERF_IP_FLAG_CALL |
> +		       PERF_IP_FLAG_SYSCALLRET;
> +	case INTEL_PT_OP_SYSRET:
> +		return PERF_IP_FLAG_BRANCH | PERF_IP_FLAG_RETURN |
> +		       PERF_IP_FLAG_SYSCALLRET;
> +	default:
> +		return 0;
> +	}
> +}
> diff --git a/tools/perf/util/intel-pt-decoder/intel-pt-insn-decoder.h b/tools/perf/util/intel-pt-decoder/intel-pt-insn-decoder.h
> new file mode 100644
> index 0000000..b0adbf3
> --- /dev/null
> +++ b/tools/perf/util/intel-pt-decoder/intel-pt-insn-decoder.h
> @@ -0,0 +1,65 @@
> +/*
> + * intel_pt_insn_decoder.h: Intel Processor Trace support
> + * Copyright (c) 2013-2014, Intel Corporation.
> + *
> + * This program is free software; you can redistribute it and/or modify it
> + * under the terms and conditions of the GNU General Public License,
> + * version 2, as published by the Free Software Foundation.
> + *
> + * This program is distributed in the hope it will be useful, but WITHOUT
> + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
> + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
> + * more details.
> + *
> + */
> +
> +#ifndef INCLUDE__INTEL_PT_INSN_DECODER_H__
> +#define INCLUDE__INTEL_PT_INSN_DECODER_H__
> +
> +#include <stddef.h>
> +#include <stdint.h>
> +
> +#define INTEL_PT_INSN_DESC_MAX		32
> +#define INTEL_PT_INSN_DBG_BUF_SZ	16
> +
> +enum intel_pt_insn_op {
> +	INTEL_PT_OP_OTHER,
> +	INTEL_PT_OP_CALL,
> +	INTEL_PT_OP_RET,
> +	INTEL_PT_OP_JCC,
> +	INTEL_PT_OP_JMP,
> +	INTEL_PT_OP_LOOP,
> +	INTEL_PT_OP_IRET,
> +	INTEL_PT_OP_INT,
> +	INTEL_PT_OP_SYSCALL,
> +	INTEL_PT_OP_SYSRET,
> +};
> +
> +enum intel_pt_insn_branch {
> +	INTEL_PT_BR_NO_BRANCH,
> +	INTEL_PT_BR_INDIRECT,
> +	INTEL_PT_BR_CONDITIONAL,
> +	INTEL_PT_BR_UNCONDITIONAL,
> +};
> +
> +struct intel_pt_insn {
> +	enum intel_pt_insn_op		op;
> +	enum intel_pt_insn_branch	branch;
> +	int				length;
> +	int32_t				rel;
> +	unsigned char			buf[INTEL_PT_INSN_DBG_BUF_SZ];
> +};
> +
> +int intel_pt_get_insn(const unsigned char *buf, size_t len, int x86_64,
> +		      struct intel_pt_insn *intel_pt_insn);
> +
> +const char *intel_pt_insn_name(enum intel_pt_insn_op op);
> +
> +int intel_pt_insn_desc(const struct intel_pt_insn *intel_pt_insn, char *buf,
> +		       size_t buf_len);
> +
> +size_t intel_pt_insn_max_size(void);
> +
> +int intel_pt_insn_type(enum intel_pt_insn_op op);
> +
> +#endif
> -- 
> 1.9.1

  reply	other threads:[~2015-06-18 22:29 UTC|newest]

Thread overview: 47+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-05-29 13:33 [PATCH V6 00/17] perf tools: Introduce an abstraction for AUX Area and Instruction Tracing Adrian Hunter
2015-05-29 13:33 ` [PATCH V6 01/17] perf db-export: Fix thread ref-counting Adrian Hunter
2015-05-29 18:35   ` [tip:perf/core] " tip-bot for Adrian Hunter
2015-05-29 13:33 ` [PATCH V6 02/17] perf tools: Ensure thread-stack is flushed Adrian Hunter
2015-06-18 21:56   ` Arnaldo Carvalho de Melo
2015-06-19  5:50     ` Adrian Hunter
2015-06-19 23:15   ` [tip:perf/core] " tip-bot for Adrian Hunter
2015-05-29 13:33 ` [PATCH V6 03/17] perf auxtrace: Add Intel PT as an AUX area tracing type Adrian Hunter
2015-05-29 13:33 ` [PATCH V6 04/17] perf tools: Add Intel PT packet decoder Adrian Hunter
2015-05-29 13:33 ` [PATCH V6 05/17] perf tools: Add Intel PT instruction decoder Adrian Hunter
2015-06-18 22:29   ` Arnaldo Carvalho de Melo [this message]
2015-06-19 15:44     ` Arnaldo Carvalho de Melo
2015-06-22 12:40       ` Adrian Hunter
2015-05-29 13:33 ` [PATCH V6 06/17] perf tools: Add Intel PT log Adrian Hunter
2015-05-29 13:33 ` [PATCH V6 07/17] perf tools: Add Intel PT decoder Adrian Hunter
2015-05-29 13:33 ` [PATCH V6 08/17] perf tools: Add Intel PT support Adrian Hunter
2015-06-19 16:04   ` Arnaldo Carvalho de Melo
2015-06-19 16:22     ` Arnaldo Carvalho de Melo
2015-06-19 19:33     ` Adrian Hunter
2015-06-19 19:41       ` Arnaldo Carvalho de Melo
2015-06-22 18:24         ` Arnaldo Carvalho de Melo
2015-06-22 20:26           ` Adrian Hunter
2015-06-22 23:00             ` Arnaldo Carvalho de Melo
2015-06-23  6:29               ` Adrian Hunter
2015-06-23 15:15                 ` Arnaldo Carvalho de Melo
2015-06-25 13:37                   ` Adrian Hunter
2015-06-25 13:45                     ` Arnaldo Carvalho de Melo
2015-06-25 23:56                       ` Arnaldo Carvalho de Melo
2015-06-26  0:09                         ` Arnaldo Carvalho de Melo
2015-06-26  6:48                           ` Adrian Hunter
2015-06-26 13:41                             ` Arnaldo Carvalho de Melo
2015-06-26 13:47                               ` Adrian Hunter
2015-06-26 15:08                                 ` Arnaldo Carvalho de Melo
2015-06-26 20:34                             ` Arnaldo Carvalho de Melo
2015-05-29 13:33 ` [PATCH V6 09/17] perf tools: Take Intel PT into use Adrian Hunter
2015-05-29 13:33 ` [PATCH V6 10/17] perf tools: Allow auxtrace data alignment Adrian Hunter
2015-06-25  7:58   ` [tip:perf/core] " tip-bot for Adrian Hunter
2015-05-29 13:33 ` [PATCH V6 11/17] perf tools: Add Intel BTS support Adrian Hunter
2015-05-29 13:33 ` [PATCH V6 12/17] perf tools: Output sample flags and insn_len from intel_pt Adrian Hunter
2015-05-29 13:33 ` [PATCH V6 13/17] perf tools: Output sample flags and insn_len from intel_bts Adrian Hunter
2015-05-29 13:33 ` [PATCH V6 14/17] perf tools: Intel PT to always update thread stack trace number Adrian Hunter
2015-05-29 13:33 ` [PATCH V6 15/17] perf tools: Intel BTS " Adrian Hunter
2015-06-19 16:11   ` Arnaldo Carvalho de Melo
2015-06-22 12:38     ` Adrian Hunter
2015-06-22 14:33       ` Arnaldo Carvalho de Melo
2015-05-29 13:33 ` [PATCH V6 16/17] perf tools: Put itrace options into an asciidoc include Adrian Hunter
2015-05-29 13:33 ` [PATCH V6 17/17] perf tools: Add example call-graph script Adrian Hunter

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20150618222941.GJ3079@kernel.org \
    --to=acme@kernel.org \
    --cc=adrian.hunter@intel.com \
    --cc=jolsa@redhat.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.