18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * Intel(R) Processor Trace PMU driver for perf 48c2ecf20Sopenharmony_ci * Copyright (c) 2013-2014, Intel Corporation. 58c2ecf20Sopenharmony_ci * 68c2ecf20Sopenharmony_ci * Intel PT is specified in the Intel Architecture Instruction Set Extensions 78c2ecf20Sopenharmony_ci * Programming Reference: 88c2ecf20Sopenharmony_ci * http://software.intel.com/en-us/intel-isa-extensions 98c2ecf20Sopenharmony_ci */ 108c2ecf20Sopenharmony_ci 118c2ecf20Sopenharmony_ci#ifndef __INTEL_PT_H__ 128c2ecf20Sopenharmony_ci#define __INTEL_PT_H__ 138c2ecf20Sopenharmony_ci 148c2ecf20Sopenharmony_ci/* 158c2ecf20Sopenharmony_ci * Single-entry ToPA: when this close to region boundary, switch 168c2ecf20Sopenharmony_ci * buffers to avoid losing data. 178c2ecf20Sopenharmony_ci */ 188c2ecf20Sopenharmony_ci#define TOPA_PMI_MARGIN 512 198c2ecf20Sopenharmony_ci 208c2ecf20Sopenharmony_ci#define TOPA_SHIFT 12 218c2ecf20Sopenharmony_ci 228c2ecf20Sopenharmony_cistatic inline unsigned int sizes(unsigned int tsz) 238c2ecf20Sopenharmony_ci{ 248c2ecf20Sopenharmony_ci return 1 << (tsz + TOPA_SHIFT); 258c2ecf20Sopenharmony_ci}; 268c2ecf20Sopenharmony_ci 278c2ecf20Sopenharmony_cistruct topa_entry { 288c2ecf20Sopenharmony_ci u64 end : 1; 298c2ecf20Sopenharmony_ci u64 rsvd0 : 1; 308c2ecf20Sopenharmony_ci u64 intr : 1; 318c2ecf20Sopenharmony_ci u64 rsvd1 : 1; 328c2ecf20Sopenharmony_ci u64 stop : 1; 338c2ecf20Sopenharmony_ci u64 rsvd2 : 1; 348c2ecf20Sopenharmony_ci u64 size : 4; 358c2ecf20Sopenharmony_ci u64 rsvd3 : 2; 368c2ecf20Sopenharmony_ci u64 base : 36; 378c2ecf20Sopenharmony_ci u64 rsvd4 : 16; 388c2ecf20Sopenharmony_ci}; 398c2ecf20Sopenharmony_ci 408c2ecf20Sopenharmony_ci/* TSC to Core Crystal Clock Ratio */ 418c2ecf20Sopenharmony_ci#define CPUID_TSC_LEAF 0x15 428c2ecf20Sopenharmony_ci 438c2ecf20Sopenharmony_cistruct pt_pmu { 448c2ecf20Sopenharmony_ci struct pmu pmu; 458c2ecf20Sopenharmony_ci u32 caps[PT_CPUID_REGS_NUM * PT_CPUID_LEAVES]; 468c2ecf20Sopenharmony_ci bool vmx; 478c2ecf20Sopenharmony_ci bool branch_en_always_on; 488c2ecf20Sopenharmony_ci unsigned long max_nonturbo_ratio; 498c2ecf20Sopenharmony_ci unsigned int tsc_art_num; 508c2ecf20Sopenharmony_ci unsigned int tsc_art_den; 518c2ecf20Sopenharmony_ci}; 528c2ecf20Sopenharmony_ci 538c2ecf20Sopenharmony_ci/** 548c2ecf20Sopenharmony_ci * struct pt_buffer - buffer configuration; one buffer per task_struct or 558c2ecf20Sopenharmony_ci * cpu, depending on perf event configuration 568c2ecf20Sopenharmony_ci * @tables: list of ToPA tables in this buffer 578c2ecf20Sopenharmony_ci * @first: shorthand for first topa table 588c2ecf20Sopenharmony_ci * @last: shorthand for last topa table 598c2ecf20Sopenharmony_ci * @cur: current topa table 608c2ecf20Sopenharmony_ci * @nr_pages: buffer size in pages 618c2ecf20Sopenharmony_ci * @cur_idx: current output region's index within @cur table 628c2ecf20Sopenharmony_ci * @output_off: offset within the current output region 638c2ecf20Sopenharmony_ci * @data_size: running total of the amount of data in this buffer 648c2ecf20Sopenharmony_ci * @lost: if data was lost/truncated 658c2ecf20Sopenharmony_ci * @head: logical write offset inside the buffer 668c2ecf20Sopenharmony_ci * @snapshot: if this is for a snapshot/overwrite counter 678c2ecf20Sopenharmony_ci * @single: use Single Range Output instead of ToPA 688c2ecf20Sopenharmony_ci * @stop_pos: STOP topa entry index 698c2ecf20Sopenharmony_ci * @intr_pos: INT topa entry index 708c2ecf20Sopenharmony_ci * @stop_te: STOP topa entry pointer 718c2ecf20Sopenharmony_ci * @intr_te: INT topa entry pointer 728c2ecf20Sopenharmony_ci * @data_pages: array of pages from perf 738c2ecf20Sopenharmony_ci * @topa_index: table of topa entries indexed by page offset 748c2ecf20Sopenharmony_ci */ 758c2ecf20Sopenharmony_cistruct pt_buffer { 768c2ecf20Sopenharmony_ci struct list_head tables; 778c2ecf20Sopenharmony_ci struct topa *first, *last, *cur; 788c2ecf20Sopenharmony_ci unsigned int cur_idx; 798c2ecf20Sopenharmony_ci size_t output_off; 808c2ecf20Sopenharmony_ci unsigned long nr_pages; 818c2ecf20Sopenharmony_ci local_t data_size; 828c2ecf20Sopenharmony_ci local64_t head; 838c2ecf20Sopenharmony_ci bool snapshot; 848c2ecf20Sopenharmony_ci bool single; 858c2ecf20Sopenharmony_ci long stop_pos, intr_pos; 868c2ecf20Sopenharmony_ci struct topa_entry *stop_te, *intr_te; 878c2ecf20Sopenharmony_ci void **data_pages; 888c2ecf20Sopenharmony_ci}; 898c2ecf20Sopenharmony_ci 908c2ecf20Sopenharmony_ci#define PT_FILTERS_NUM 4 918c2ecf20Sopenharmony_ci 928c2ecf20Sopenharmony_ci/** 938c2ecf20Sopenharmony_ci * struct pt_filter - IP range filter configuration 948c2ecf20Sopenharmony_ci * @msr_a: range start, goes to RTIT_ADDRn_A 958c2ecf20Sopenharmony_ci * @msr_b: range end, goes to RTIT_ADDRn_B 968c2ecf20Sopenharmony_ci * @config: 4-bit field in RTIT_CTL 978c2ecf20Sopenharmony_ci */ 988c2ecf20Sopenharmony_cistruct pt_filter { 998c2ecf20Sopenharmony_ci unsigned long msr_a; 1008c2ecf20Sopenharmony_ci unsigned long msr_b; 1018c2ecf20Sopenharmony_ci unsigned long config; 1028c2ecf20Sopenharmony_ci}; 1038c2ecf20Sopenharmony_ci 1048c2ecf20Sopenharmony_ci/** 1058c2ecf20Sopenharmony_ci * struct pt_filters - IP range filtering context 1068c2ecf20Sopenharmony_ci * @filter: filters defined for this context 1078c2ecf20Sopenharmony_ci * @nr_filters: number of defined filters in the @filter array 1088c2ecf20Sopenharmony_ci */ 1098c2ecf20Sopenharmony_cistruct pt_filters { 1108c2ecf20Sopenharmony_ci struct pt_filter filter[PT_FILTERS_NUM]; 1118c2ecf20Sopenharmony_ci unsigned int nr_filters; 1128c2ecf20Sopenharmony_ci}; 1138c2ecf20Sopenharmony_ci 1148c2ecf20Sopenharmony_ci/** 1158c2ecf20Sopenharmony_ci * struct pt - per-cpu pt context 1168c2ecf20Sopenharmony_ci * @handle: perf output handle 1178c2ecf20Sopenharmony_ci * @filters: last configured filters 1188c2ecf20Sopenharmony_ci * @handle_nmi: do handle PT PMI on this cpu, there's an active event 1198c2ecf20Sopenharmony_ci * @vmx_on: 1 if VMX is ON on this cpu 1208c2ecf20Sopenharmony_ci * @output_base: cached RTIT_OUTPUT_BASE MSR value 1218c2ecf20Sopenharmony_ci * @output_mask: cached RTIT_OUTPUT_MASK MSR value 1228c2ecf20Sopenharmony_ci */ 1238c2ecf20Sopenharmony_cistruct pt { 1248c2ecf20Sopenharmony_ci struct perf_output_handle handle; 1258c2ecf20Sopenharmony_ci struct pt_filters filters; 1268c2ecf20Sopenharmony_ci int handle_nmi; 1278c2ecf20Sopenharmony_ci int vmx_on; 1288c2ecf20Sopenharmony_ci u64 output_base; 1298c2ecf20Sopenharmony_ci u64 output_mask; 1308c2ecf20Sopenharmony_ci}; 1318c2ecf20Sopenharmony_ci 1328c2ecf20Sopenharmony_ci#endif /* __INTEL_PT_H__ */ 133