Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/arch/x86/events/intel/pt.h
26481 views
1
/* SPDX-License-Identifier: GPL-2.0-only */
2
/*
3
* Intel(R) Processor Trace PMU driver for perf
4
* Copyright (c) 2013-2014, Intel Corporation.
5
*
6
* Intel PT is specified in the Intel Architecture Instruction Set Extensions
7
* Programming Reference:
8
* http://software.intel.com/en-us/intel-isa-extensions
9
*/
10
11
#ifndef __INTEL_PT_H__
12
#define __INTEL_PT_H__
13
14
/*
15
* Single-entry ToPA: when this close to region boundary, switch
16
* buffers to avoid losing data.
17
*/
18
#define TOPA_PMI_MARGIN 512
19
20
#define TOPA_SHIFT 12
21
22
static inline unsigned int sizes(unsigned int tsz)
23
{
24
return 1 << (tsz + TOPA_SHIFT);
25
};
26
27
struct topa_entry {
28
u64 end : 1;
29
u64 rsvd0 : 1;
30
u64 intr : 1;
31
u64 rsvd1 : 1;
32
u64 stop : 1;
33
u64 rsvd2 : 1;
34
u64 size : 4;
35
u64 rsvd3 : 2;
36
u64 base : 40;
37
u64 rsvd4 : 12;
38
};
39
40
struct pt_pmu {
41
struct pmu pmu;
42
u32 caps[PT_CPUID_REGS_NUM * PT_CPUID_LEAVES];
43
bool vmx;
44
bool branch_en_always_on;
45
unsigned long max_nonturbo_ratio;
46
unsigned int tsc_art_num;
47
unsigned int tsc_art_den;
48
};
49
50
/**
51
* struct pt_buffer - buffer configuration; one buffer per task_struct or
52
* cpu, depending on perf event configuration
53
* @tables: list of ToPA tables in this buffer
54
* @first: shorthand for first topa table
55
* @last: shorthand for last topa table
56
* @cur: current topa table
57
* @nr_pages: buffer size in pages
58
* @cur_idx: current output region's index within @cur table
59
* @output_off: offset within the current output region
60
* @data_size: running total of the amount of data in this buffer
61
* @lost: if data was lost/truncated
62
* @head: logical write offset inside the buffer
63
* @snapshot: if this is for a snapshot/overwrite counter
64
* @single: use Single Range Output instead of ToPA
65
* @wrapped: buffer advance wrapped back to the first topa table
66
* @stop_pos: STOP topa entry index
67
* @intr_pos: INT topa entry index
68
* @stop_te: STOP topa entry pointer
69
* @intr_te: INT topa entry pointer
70
* @data_pages: array of pages from perf
71
* @topa_index: table of topa entries indexed by page offset
72
*/
73
struct pt_buffer {
74
struct list_head tables;
75
struct topa *first, *last, *cur;
76
unsigned int cur_idx;
77
size_t output_off;
78
unsigned long nr_pages;
79
local_t data_size;
80
local64_t head;
81
bool snapshot;
82
bool single;
83
bool wrapped;
84
long stop_pos, intr_pos;
85
struct topa_entry *stop_te, *intr_te;
86
void **data_pages;
87
};
88
89
#define PT_FILTERS_NUM 4
90
91
/**
92
* struct pt_filter - IP range filter configuration
93
* @msr_a: range start, goes to RTIT_ADDRn_A
94
* @msr_b: range end, goes to RTIT_ADDRn_B
95
* @config: 4-bit field in RTIT_CTL
96
*/
97
struct pt_filter {
98
unsigned long msr_a;
99
unsigned long msr_b;
100
unsigned long config;
101
};
102
103
/**
104
* struct pt_filters - IP range filtering context
105
* @filter: filters defined for this context
106
* @nr_filters: number of defined filters in the @filter array
107
*/
108
struct pt_filters {
109
struct pt_filter filter[PT_FILTERS_NUM];
110
unsigned int nr_filters;
111
};
112
113
/**
114
* struct pt - per-cpu pt context
115
* @handle: perf output handle
116
* @filters: last configured filters
117
* @handle_nmi: do handle PT PMI on this cpu, there's an active event
118
* @vmx_on: 1 if VMX is ON on this cpu
119
* @pause_allowed: PERF_EF_PAUSE is allowed to stop tracing
120
* @resume_allowed: PERF_EF_RESUME is allowed to start tracing
121
* @output_base: cached RTIT_OUTPUT_BASE MSR value
122
* @output_mask: cached RTIT_OUTPUT_MASK MSR value
123
*/
124
struct pt {
125
struct perf_output_handle handle;
126
struct pt_filters filters;
127
int handle_nmi;
128
int vmx_on;
129
int pause_allowed;
130
int resume_allowed;
131
u64 output_base;
132
u64 output_mask;
133
};
134
135
#endif /* __INTEL_PT_H__ */
136
137