lkml.org 
[lkml]   [2015]   [Apr]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH V3 15/25] perf tools: Add Intel PT log
    Date
    Add a facility to log Intel Processor Trace
    decoding. The log is intended for debugging
    purposes only.

    The log file name is "intel_pt.log" and is
    opened in the current directory.

    Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
    ---
    tools/perf/util/intel-pt-decoder/Build | 2 +-
    tools/perf/util/intel-pt-decoder/intel-pt-log.c | 155 ++++++++++++++++++++++++
    tools/perf/util/intel-pt-decoder/intel-pt-log.h | 52 ++++++++
    3 files changed, 208 insertions(+), 1 deletion(-)
    create mode 100644 tools/perf/util/intel-pt-decoder/intel-pt-log.c
    create mode 100644 tools/perf/util/intel-pt-decoder/intel-pt-log.h

    diff --git a/tools/perf/util/intel-pt-decoder/Build b/tools/perf/util/intel-pt-decoder/Build
    index b608469..a8cf6df 100644
    --- a/tools/perf/util/intel-pt-decoder/Build
    +++ b/tools/perf/util/intel-pt-decoder/Build
    @@ -1,4 +1,4 @@
    -libperf-$(CONFIG_AUXTRACE) += intel-pt-pkt-decoder.o intel-pt-insn-decoder.o
    +libperf-$(CONFIG_AUXTRACE) += intel-pt-pkt-decoder.o intel-pt-insn-decoder.o intel-pt-log.o

    inat_tables_script = ../../arch/x86/tools/gen-insn-attr-x86.awk
    inat_tables_maps = ../../arch/x86/lib/x86-opcode-map.txt
    diff --git a/tools/perf/util/intel-pt-decoder/intel-pt-log.c b/tools/perf/util/intel-pt-decoder/intel-pt-log.c
    new file mode 100644
    index 0000000..d09c7d9
    --- /dev/null
    +++ b/tools/perf/util/intel-pt-decoder/intel-pt-log.c
    @@ -0,0 +1,155 @@
    +/*
    + * intel_pt_log.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 <stdint.h>
    +#include <inttypes.h>
    +#include <stdarg.h>
    +#include <stdbool.h>
    +#include <string.h>
    +
    +#include "intel-pt-log.h"
    +#include "intel-pt-insn-decoder.h"
    +
    +#include "intel-pt-pkt-decoder.h"
    +
    +#define MAX_LOG_NAME 256
    +
    +static FILE *f;
    +static char log_name[MAX_LOG_NAME];
    +static bool enable_logging;
    +
    +void intel_pt_log_enable(void)
    +{
    + enable_logging = true;
    +}
    +
    +void intel_pt_log_disable(void)
    +{
    + if (f)
    + fflush(f);
    + enable_logging = false;
    +}
    +
    +void intel_pt_log_set_name(const char *name)
    +{
    + strncpy(log_name, name, MAX_LOG_NAME - 5);
    + strcat(log_name, ".log");
    +}
    +
    +static void intel_pt_print_data(const unsigned char *buf, int len, uint64_t pos,
    + int indent)
    +{
    + int i;
    +
    + for (i = 0; i < indent; i++)
    + fprintf(f, " ");
    +
    + fprintf(f, " %08" PRIx64 ": ", pos);
    + for (i = 0; i < len; i++)
    + fprintf(f, " %02x", buf[i]);
    + for (; i < 16; i++)
    + fprintf(f, " ");
    + fprintf(f, " ");
    +}
    +
    +static void intel_pt_print_no_data(uint64_t pos, int indent)
    +{
    + int i;
    +
    + for (i = 0; i < indent; i++)
    + fprintf(f, " ");
    +
    + fprintf(f, " %08" PRIx64 ": ", pos);
    + for (i = 0; i < 16; i++)
    + fprintf(f, " ");
    + fprintf(f, " ");
    +}
    +
    +static int intel_pt_log_open(void)
    +{
    + if (!enable_logging)
    + return -1;
    +
    + if (f)
    + return 0;
    +
    + if (!log_name[0])
    + return -1;
    +
    + f = fopen(log_name, "w+");
    + if (!f) {
    + enable_logging = false;
    + return -1;
    + }
    +
    + return 0;
    +}
    +
    +void intel_pt_log_packet(const struct intel_pt_pkt *packet, int pkt_len,
    + uint64_t pos, const unsigned char *buf)
    +{
    + char desc[INTEL_PT_PKT_DESC_MAX];
    +
    + if (intel_pt_log_open())
    + return;
    +
    + intel_pt_print_data(buf, pkt_len, pos, 0);
    + intel_pt_pkt_desc(packet, desc, INTEL_PT_PKT_DESC_MAX);
    + fprintf(f, "%s\n", desc);
    +}
    +
    +void intel_pt_log_insn(struct intel_pt_insn *intel_pt_insn, uint64_t ip)
    +{
    + char desc[INTEL_PT_INSN_DESC_MAX];
    + size_t len = intel_pt_insn->length;
    +
    + if (intel_pt_log_open())
    + return;
    +
    + if (len > INTEL_PT_INSN_DBG_BUF_SZ)
    + len = INTEL_PT_INSN_DBG_BUF_SZ;
    + intel_pt_print_data(intel_pt_insn->buf, len, ip, 8);
    + if (intel_pt_insn_desc(intel_pt_insn, desc, INTEL_PT_INSN_DESC_MAX) > 0)
    + fprintf(f, "%s\n", desc);
    + else
    + fprintf(f, "Bad instruction!\n");
    +}
    +
    +void intel_pt_log_insn_no_data(struct intel_pt_insn *intel_pt_insn, uint64_t ip)
    +{
    + char desc[INTEL_PT_INSN_DESC_MAX];
    +
    + if (intel_pt_log_open())
    + return;
    +
    + intel_pt_print_no_data(ip, 8);
    + if (intel_pt_insn_desc(intel_pt_insn, desc, INTEL_PT_INSN_DESC_MAX) > 0)
    + fprintf(f, "%s\n", desc);
    + else
    + fprintf(f, "Bad instruction!\n");
    +}
    +
    +void intel_pt_log(const char *fmt, ...)
    +{
    + va_list args;
    +
    + if (intel_pt_log_open())
    + return;
    +
    + va_start(args, fmt);
    + vfprintf(f, fmt, args);
    + va_end(args);
    +}
    diff --git a/tools/perf/util/intel-pt-decoder/intel-pt-log.h b/tools/perf/util/intel-pt-decoder/intel-pt-log.h
    new file mode 100644
    index 0000000..db3942f
    --- /dev/null
    +++ b/tools/perf/util/intel-pt-decoder/intel-pt-log.h
    @@ -0,0 +1,52 @@
    +/*
    + * intel_pt_log.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_LOG_H__
    +#define INCLUDE__INTEL_PT_LOG_H__
    +
    +#include <stdint.h>
    +#include <inttypes.h>
    +
    +struct intel_pt_pkt;
    +
    +void intel_pt_log_enable(void);
    +void intel_pt_log_disable(void);
    +void intel_pt_log_set_name(const char *name);
    +
    +void intel_pt_log_packet(const struct intel_pt_pkt *packet, int pkt_len,
    + uint64_t pos, const unsigned char *buf);
    +
    +struct intel_pt_insn;
    +
    +void intel_pt_log_insn(struct intel_pt_insn *intel_pt_insn, uint64_t ip);
    +void intel_pt_log_insn_no_data(struct intel_pt_insn *intel_pt_insn,
    + uint64_t ip);
    +
    +__attribute__((format(printf, 1, 2)))
    +void intel_pt_log(const char *fmt, ...);
    +
    +#define x64_fmt "0x%" PRIx64
    +
    +static inline void intel_pt_log_at(const char *msg, uint64_t u)
    +{
    + intel_pt_log("%s at " x64_fmt "\n", msg, u);
    +}
    +
    +static inline void intel_pt_log_to(const char *msg, uint64_t u)
    +{
    + intel_pt_log("%s to " x64_fmt "\n", msg, u);
    +}
    +
    +#endif
    --
    1.9.1


    \
     
     \ /
      Last update: 2015-04-24 21:41    [W:4.227 / U:0.112 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site