2019-05-29 22:18:02 +08:00
|
|
|
/* SPDX-License-Identifier: GPL-2.0-only */
|
2015-07-18 00:33:39 +08:00
|
|
|
/*
|
|
|
|
* intel_pt_log.h: Intel Processor Trace support
|
|
|
|
* Copyright (c) 2013-2014, Intel Corporation.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef INCLUDE__INTEL_PT_LOG_H__
|
|
|
|
#define INCLUDE__INTEL_PT_LOG_H__
|
|
|
|
|
2017-06-16 22:57:54 +08:00
|
|
|
#include <linux/compiler.h>
|
2015-07-18 00:33:39 +08:00
|
|
|
#include <stdint.h>
|
|
|
|
#include <inttypes.h>
|
|
|
|
|
|
|
|
struct intel_pt_pkt;
|
|
|
|
|
2018-11-05 15:35:04 +08:00
|
|
|
void *intel_pt_log_fp(void);
|
2015-07-18 00:33:39 +08:00
|
|
|
void intel_pt_log_enable(void);
|
|
|
|
void intel_pt_log_disable(void);
|
|
|
|
void intel_pt_log_set_name(const char *name);
|
|
|
|
|
2015-09-25 21:15:35 +08:00
|
|
|
void __intel_pt_log_packet(const struct intel_pt_pkt *packet, int pkt_len,
|
|
|
|
uint64_t pos, const unsigned char *buf);
|
2015-07-18 00:33:39 +08:00
|
|
|
|
|
|
|
struct intel_pt_insn;
|
|
|
|
|
2015-09-25 21:15:35 +08:00
|
|
|
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);
|
2015-07-18 00:33:39 +08:00
|
|
|
|
2017-06-16 22:57:54 +08:00
|
|
|
void __intel_pt_log(const char *fmt, ...) __printf(1, 2);
|
2015-09-25 21:15:35 +08:00
|
|
|
|
|
|
|
#define intel_pt_log(fmt, ...) \
|
|
|
|
do { \
|
|
|
|
if (intel_pt_enable_logging) \
|
|
|
|
__intel_pt_log(fmt, ##__VA_ARGS__); \
|
|
|
|
} while (0)
|
|
|
|
|
|
|
|
#define intel_pt_log_packet(arg, ...) \
|
|
|
|
do { \
|
|
|
|
if (intel_pt_enable_logging) \
|
|
|
|
__intel_pt_log_packet(arg, ##__VA_ARGS__); \
|
|
|
|
} while (0)
|
|
|
|
|
|
|
|
#define intel_pt_log_insn(arg, ...) \
|
|
|
|
do { \
|
|
|
|
if (intel_pt_enable_logging) \
|
|
|
|
__intel_pt_log_insn(arg, ##__VA_ARGS__); \
|
|
|
|
} while (0)
|
|
|
|
|
|
|
|
#define intel_pt_log_insn_no_data(arg, ...) \
|
|
|
|
do { \
|
|
|
|
if (intel_pt_enable_logging) \
|
|
|
|
__intel_pt_log_insn_no_data(arg, ##__VA_ARGS__); \
|
|
|
|
} while (0)
|
2015-07-18 00:33:39 +08:00
|
|
|
|
|
|
|
#define x64_fmt "0x%" PRIx64
|
|
|
|
|
2015-09-25 21:15:35 +08:00
|
|
|
extern bool intel_pt_enable_logging;
|
|
|
|
|
2015-07-18 00:33:39 +08:00
|
|
|
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);
|
|
|
|
}
|
|
|
|
|
perf intel-pt: Add VM Time Correlation to decoder
VM Time Correlation means determining if each TSC packet belongs to a VM
Guest or the Host. When the trace is "in context" that is indicated by
the NR flag in the PIP packet. However, when tracing kernel-only,
userspace only, or using address filters, the trace can be "out of context"
in which case timing packets are produced but not PIP packets.
Nevertheless, it is very unlikely the VM Guest timestamps will be in
the same range as the Host timestamps. Host time ranges are established
by a starting side-band event timestamp, and subsequently by the buffer
timestamp, written when the buffer is copied to the perf.data file.
This patch supports updating the VM Guest timestamp packets, assuming an
unchanging (during perf record) VMX TSC Offset and no VMX TSC scaling.
Furthermore, it is possible to determine what the VMX TSC Offset is,
although not necessarily at the start. The dry-run option lets that
information be determined so that the user can pass it to a subsequent
run. For more detail, refer to the example in the Intel PT documentation
in a subsequent patch.
VM Time Correlation is also performed on the TSC value in PEBs-via-PT
records.
Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
Reviewed-by: Andi Kleen <ak@linux.intel.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Link: https://lore.kernel.org/r/20210430070309.17624-12-adrian.hunter@intel.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2021-04-30 15:03:08 +08:00
|
|
|
#define intel_pt_log_var(var, fmt) intel_pt_log("%s: " #var " " fmt "\n", __func__, var)
|
|
|
|
|
|
|
|
#define intel_pt_log_x32(var) intel_pt_log_var(var, "%#x")
|
|
|
|
#define intel_pt_log_x64(var) intel_pt_log_var(var, "%#" PRIx64)
|
|
|
|
|
2015-07-18 00:33:39 +08:00
|
|
|
#endif
|