2019-05-29 17:18:02 +03:00
/* SPDX-License-Identifier: GPL-2.0-only */
2015-01-30 13:39:52 +03:00
/*
* Intel ( R ) Processor Trace PMU driver for perf
* Copyright ( c ) 2013 - 2014 , Intel Corporation .
*
* Intel PT is specified in the Intel Architecture Instruction Set Extensions
* Programming Reference :
* http : //software.intel.com/en-us/intel-isa-extensions
*/
# ifndef __INTEL_PT_H__
# define __INTEL_PT_H__
/*
* Single - entry ToPA : when this close to region boundary , switch
* buffers to avoid losing data .
*/
# define TOPA_PMI_MARGIN 512
2015-08-04 12:36:55 +03:00
# define TOPA_SHIFT 12
2015-01-30 13:39:52 +03:00
2015-08-04 12:36:55 +03:00
static inline unsigned int sizes ( unsigned int tsz )
2015-01-30 13:39:52 +03:00
{
2015-08-04 12:36:55 +03:00
return 1 < < ( tsz + TOPA_SHIFT ) ;
2015-01-30 13:39:52 +03:00
} ;
struct topa_entry {
u64 end : 1 ;
u64 rsvd0 : 1 ;
u64 intr : 1 ;
u64 rsvd1 : 1 ;
u64 stop : 1 ;
u64 rsvd2 : 1 ;
u64 size : 4 ;
u64 rsvd3 : 2 ;
u64 base : 36 ;
u64 rsvd4 : 16 ;
} ;
2015-08-19 17:02:10 +03:00
/* TSC to Core Crystal Clock Ratio */
# define CPUID_TSC_LEAF 0x15
2015-01-30 13:39:52 +03:00
struct pt_pmu {
struct pmu pmu ;
2015-08-04 12:36:55 +03:00
u32 caps [ PT_CPUID_REGS_NUM * PT_CPUID_LEAVES ] ;
2016-03-29 17:43:10 +03:00
bool vmx ;
2017-02-06 17:41:40 +03:00
bool branch_en_always_on ;
2015-08-19 17:02:10 +03:00
unsigned long max_nonturbo_ratio ;
unsigned int tsc_art_num ;
unsigned int tsc_art_den ;
2015-01-30 13:39:52 +03:00
} ;
/**
* struct pt_buffer - buffer configuration ; one buffer per task_struct or
* cpu , depending on perf event configuration
* @ tables : list of ToPA tables in this buffer
* @ first : shorthand for first topa table
* @ last : shorthand for last topa table
* @ cur : current topa table
* @ nr_pages : buffer size in pages
* @ cur_idx : current output region ' s index within @ cur table
* @ output_off : offset within the current output region
* @ data_size : running total of the amount of data in this buffer
* @ lost : if data was lost / truncated
* @ head : logical write offset inside the buffer
* @ snapshot : if this is for a snapshot / overwrite counter
2019-11-05 11:27:00 +03:00
* @ single : use Single Range Output instead of ToPA
2019-08-21 15:47:27 +03:00
* @ stop_pos : STOP topa entry index
* @ intr_pos : INT topa entry index
* @ stop_te : STOP topa entry pointer
* @ intr_te : INT topa entry pointer
2015-01-30 13:39:52 +03:00
* @ data_pages : array of pages from perf
* @ topa_index : table of topa entries indexed by page offset
*/
struct pt_buffer {
struct list_head tables ;
struct topa * first , * last , * cur ;
unsigned int cur_idx ;
size_t output_off ;
unsigned long nr_pages ;
local_t data_size ;
local64_t head ;
bool snapshot ;
2019-11-05 11:27:00 +03:00
bool single ;
2019-08-21 15:47:27 +03:00
long stop_pos , intr_pos ;
struct topa_entry * stop_te , * intr_te ;
2015-01-30 13:39:52 +03:00
void * * data_pages ;
} ;
2016-04-27 18:44:47 +03:00
# define PT_FILTERS_NUM 4
/**
* struct pt_filter - IP range filter configuration
* @ msr_a : range start , goes to RTIT_ADDRn_A
* @ msr_b : range end , goes to RTIT_ADDRn_B
* @ config : 4 - bit field in RTIT_CTL
*/
struct pt_filter {
unsigned long msr_a ;
unsigned long msr_b ;
unsigned long config ;
} ;
/**
* struct pt_filters - IP range filtering context
* @ filter : filters defined for this context
* @ nr_filters : number of defined filters in the @ filter array
*/
struct pt_filters {
struct pt_filter filter [ PT_FILTERS_NUM ] ;
unsigned int nr_filters ;
} ;
2015-01-30 13:39:52 +03:00
/**
* struct pt - per - cpu pt context
2019-11-05 11:27:01 +03:00
* @ handle : perf output handle
2016-04-27 18:44:47 +03:00
* @ filters : last configured filters
2019-11-05 11:27:01 +03:00
* @ handle_nmi : do handle PT PMI on this cpu , there ' s an active event
* @ vmx_on : 1 if VMX is ON on this cpu
* @ output_base : cached RTIT_OUTPUT_BASE MSR value
* @ output_mask : cached RTIT_OUTPUT_MASK MSR value
2015-01-30 13:39:52 +03:00
*/
struct pt {
struct perf_output_handle handle ;
2016-04-27 18:44:47 +03:00
struct pt_filters filters ;
2015-01-30 13:39:52 +03:00
int handle_nmi ;
2016-03-29 17:43:10 +03:00
int vmx_on ;
2019-11-05 11:27:01 +03:00
u64 output_base ;
u64 output_mask ;
2015-01-30 13:39:52 +03:00
} ;
# endif /* __INTEL_PT_H__ */