__  __    __   __  _____      _            _          _____ _          _ _ 
 |  \/  |   \ \ / / |  __ \    (_)          | |        / ____| |        | | |
 | \  / |_ __\ V /  | |__) | __ ___   ____ _| |_ ___  | (___ | |__   ___| | |
 | |\/| | '__|> <   |  ___/ '__| \ \ / / _` | __/ _ \  \___ \| '_ \ / _ \ | |
 | |  | | |_ / . \  | |   | |  | |\ V / (_| | ||  __/  ____) | | | |  __/ | |
 |_|  |_|_(_)_/ \_\ |_|   |_|  |_| \_/ \__,_|\__\___| |_____/|_| |_|\___V 2.1
 if you need WebShell for Seo everyday contact me on Telegram
 Telegram Address : @jackleet
        
        
For_More_Tools: Telegram: @jackleet | Bulk Smtp support mail sender | Business Mail Collector | Mail Bouncer All Mail | Bulk Office Mail Validator | Html Letter private



Upload:

Command:

[email protected]: ~ $
/* SPDX-License-Identifier: GPL-2.0 */
#ifndef _ASM_X86_PERF_EVENT_H
#define _ASM_X86_PERF_EVENT_H

#include <linux/static_call.h>

/*
 * Performance event hw details:
 */

#define INTEL_PMC_MAX_GENERIC				       32
#define INTEL_PMC_MAX_FIXED				       16
#define INTEL_PMC_IDX_FIXED				       32

#define X86_PMC_IDX_MAX					       64

#define MSR_ARCH_PERFMON_PERFCTR0			      0xc1
#define MSR_ARCH_PERFMON_PERFCTR1			      0xc2

#define MSR_ARCH_PERFMON_EVENTSEL0			     0x186
#define MSR_ARCH_PERFMON_EVENTSEL1			     0x187

#define ARCH_PERFMON_EVENTSEL_EVENT			0x000000FFULL
#define ARCH_PERFMON_EVENTSEL_UMASK			0x0000FF00ULL
#define ARCH_PERFMON_EVENTSEL_USR			(1ULL << 16)
#define ARCH_PERFMON_EVENTSEL_OS			(1ULL << 17)
#define ARCH_PERFMON_EVENTSEL_EDGE			(1ULL << 18)
#define ARCH_PERFMON_EVENTSEL_PIN_CONTROL		(1ULL << 19)
#define ARCH_PERFMON_EVENTSEL_INT			(1ULL << 20)
#define ARCH_PERFMON_EVENTSEL_ANY			(1ULL << 21)
#define ARCH_PERFMON_EVENTSEL_ENABLE			(1ULL << 22)
#define ARCH_PERFMON_EVENTSEL_INV			(1ULL << 23)
#define ARCH_PERFMON_EVENTSEL_CMASK			0xFF000000ULL
#define ARCH_PERFMON_EVENTSEL_BR_CNTR			(1ULL << 35)
#define ARCH_PERFMON_EVENTSEL_EQ			(1ULL << 36)
#define ARCH_PERFMON_EVENTSEL_UMASK2			(0xFFULL << 40)

#define INTEL_FIXED_BITS_MASK				0xFULL
#define INTEL_FIXED_BITS_STRIDE			4
#define INTEL_FIXED_0_KERNEL				(1ULL << 0)
#define INTEL_FIXED_0_USER				(1ULL << 1)
#define INTEL_FIXED_0_ANYTHREAD			(1ULL << 2)
#define INTEL_FIXED_0_ENABLE_PMI			(1ULL << 3)
#define INTEL_FIXED_3_METRICS_CLEAR			(1ULL << 2)

#define HSW_IN_TX					(1ULL << 32)
#define HSW_IN_TX_CHECKPOINTED				(1ULL << 33)
#define ICL_EVENTSEL_ADAPTIVE				(1ULL << 34)
#define ICL_FIXED_0_ADAPTIVE				(1ULL << 32)

#define intel_fixed_bits_by_idx(_idx, _bits)			\
	((_bits) << ((_idx) * INTEL_FIXED_BITS_STRIDE))

#define AMD64_EVENTSEL_INT_CORE_ENABLE			(1ULL << 36)
#define AMD64_EVENTSEL_GUESTONLY			(1ULL << 40)
#define AMD64_EVENTSEL_HOSTONLY				(1ULL << 41)

#define AMD64_EVENTSEL_INT_CORE_SEL_SHIFT		37
#define AMD64_EVENTSEL_INT_CORE_SEL_MASK		\
	(0xFULL << AMD64_EVENTSEL_INT_CORE_SEL_SHIFT)

#define AMD64_EVENTSEL_EVENT	\
	(ARCH_PERFMON_EVENTSEL_EVENT | (0x0FULL << 32))
#define INTEL_ARCH_EVENT_MASK	\
	(ARCH_PERFMON_EVENTSEL_UMASK | ARCH_PERFMON_EVENTSEL_EVENT)

#define AMD64_L3_SLICE_SHIFT				48
#define AMD64_L3_SLICE_MASK				\
	(0xFULL << AMD64_L3_SLICE_SHIFT)
#define AMD64_L3_SLICEID_MASK				\
	(0x7ULL << AMD64_L3_SLICE_SHIFT)

#define AMD64_L3_THREAD_SHIFT				56
#define AMD64_L3_THREAD_MASK				\
	(0xFFULL << AMD64_L3_THREAD_SHIFT)
#define AMD64_L3_F19H_THREAD_MASK			\
	(0x3ULL << AMD64_L3_THREAD_SHIFT)

#define AMD64_L3_EN_ALL_CORES				BIT_ULL(47)
#define AMD64_L3_EN_ALL_SLICES				BIT_ULL(46)

#define AMD64_L3_COREID_SHIFT				42
#define AMD64_L3_COREID_MASK				\
	(0x7ULL << AMD64_L3_COREID_SHIFT)

#define X86_RAW_EVENT_MASK		\
	(ARCH_PERFMON_EVENTSEL_EVENT |	\
	 ARCH_PERFMON_EVENTSEL_UMASK |	\
	 ARCH_PERFMON_EVENTSEL_EDGE  |	\
	 ARCH_PERFMON_EVENTSEL_INV   |	\
	 ARCH_PERFMON_EVENTSEL_CMASK)
#define X86_ALL_EVENT_FLAGS  			\
	(ARCH_PERFMON_EVENTSEL_EDGE |  		\
	 ARCH_PERFMON_EVENTSEL_INV | 		\
	 ARCH_PERFMON_EVENTSEL_CMASK | 		\
	 ARCH_PERFMON_EVENTSEL_ANY | 		\
	 ARCH_PERFMON_EVENTSEL_PIN_CONTROL | 	\
	 HSW_IN_TX | 				\
	 HSW_IN_TX_CHECKPOINTED)
#define AMD64_RAW_EVENT_MASK		\
	(X86_RAW_EVENT_MASK          |  \
	 AMD64_EVENTSEL_EVENT)
#define AMD64_RAW_EVENT_MASK_NB		\
	(AMD64_EVENTSEL_EVENT        |  \
	 ARCH_PERFMON_EVENTSEL_UMASK)

#define AMD64_PERFMON_V2_EVENTSEL_EVENT_NB	\
	(AMD64_EVENTSEL_EVENT	|		\
	 GENMASK_ULL(37, 36))

#define AMD64_PERFMON_V2_EVENTSEL_UMASK_NB	\
	(ARCH_PERFMON_EVENTSEL_UMASK	|	\
	 GENMASK_ULL(27, 24))

#define AMD64_PERFMON_V2_RAW_EVENT_MASK_NB		\
	(AMD64_PERFMON_V2_EVENTSEL_EVENT_NB	|	\
	 AMD64_PERFMON_V2_EVENTSEL_UMASK_NB)

#define AMD64_PERFMON_V2_ENABLE_UMC			BIT_ULL(31)
#define AMD64_PERFMON_V2_EVENTSEL_EVENT_UMC		GENMASK_ULL(7, 0)
#define AMD64_PERFMON_V2_EVENTSEL_RDWRMASK_UMC		GENMASK_ULL(9, 8)
#define AMD64_PERFMON_V2_RAW_EVENT_MASK_UMC		\
	(AMD64_PERFMON_V2_EVENTSEL_EVENT_UMC	|	\
	 AMD64_PERFMON_V2_EVENTSEL_RDWRMASK_UMC)

#define AMD64_NUM_COUNTERS				4
#define AMD64_NUM_COUNTERS_CORE				6
#define AMD64_NUM_COUNTERS_NB				4

#define ARCH_PERFMON_UNHALTED_CORE_CYCLES_SEL		0x3c
#define ARCH_PERFMON_UNHALTED_CORE_CYCLES_UMASK		(0x00 << 8)
#define ARCH_PERFMON_UNHALTED_CORE_CYCLES_INDEX		0
#define ARCH_PERFMON_UNHALTED_CORE_CYCLES_PRESENT \
		(1 << (ARCH_PERFMON_UNHALTED_CORE_CYCLES_INDEX))

#define ARCH_PERFMON_BRANCH_MISSES_RETIRED		6
#define ARCH_PERFMON_EVENTS_COUNT			7

#define PEBS_DATACFG_MEMINFO	BIT_ULL(0)
#define PEBS_DATACFG_GP	BIT_ULL(1)
#define PEBS_DATACFG_XMMS	BIT_ULL(2)
#define PEBS_DATACFG_LBRS	BIT_ULL(3)
#define PEBS_DATACFG_LBR_SHIFT	24

/* Steal the highest bit of pebs_data_cfg for SW usage */
#define PEBS_UPDATE_DS_SW	BIT_ULL(63)

/*
 * Intel "Architectural Performance Monitoring" CPUID
 * detection/enumeration details:
 */
union cpuid10_eax {
	struct {
		unsigned int version_id:8;
		unsigned int num_counters:8;
		unsigned int bit_width:8;
		unsigned int mask_length:8;
	} split;
	unsigned int full;
};

union cpuid10_ebx {
	struct {
		unsigned int no_unhalted_core_cycles:1;
		unsigned int no_instructions_retired:1;
		unsigned int no_unhalted_reference_cycles:1;
		unsigned int no_llc_reference:1;
		unsigned int no_llc_misses:1;
		unsigned int no_branch_instruction_retired:1;
		unsigned int no_branch_misses_retired:1;
	} split;
	unsigned int full;
};

union cpuid10_edx {
	struct {
		unsigned int num_counters_fixed:5;
		unsigned int bit_width_fixed:8;
		unsigned int reserved1:2;
		unsigned int anythread_deprecated:1;
		unsigned int reserved2:16;
	} split;
	unsigned int full;
};

/*
 * Intel "Architectural Performance Monitoring extension" CPUID
 * detection/enumeration details:
 */
#define ARCH_PERFMON_EXT_LEAF			0x00000023
#define ARCH_PERFMON_NUM_COUNTER_LEAF		0x1

union cpuid35_eax {
	struct {
		unsigned int	leaf0:1;
		/* Counters Sub-Leaf */
		unsigned int    cntr_subleaf:1;
		/* Auto Counter Reload Sub-Leaf */
		unsigned int    acr_subleaf:1;
		/* Events Sub-Leaf */
		unsigned int    events_subleaf:1;
		unsigned int	reserved:28;
	} split;
	unsigned int            full;
};

union cpuid35_ebx {
	struct {
		/* UnitMask2 Supported */
		unsigned int    umask2:1;
		/* EQ-bit Supported */
		unsigned int    eq:1;
		unsigned int	reserved:30;
	} split;
	unsigned int            full;
};

/*
 * Intel Architectural LBR CPUID detection/enumeration details:
 */
union cpuid28_eax {
	struct {
		/* Supported LBR depth values */
		unsigned int	lbr_depth_mask:8;
		unsigned int	reserved:22;
		/* Deep C-state Reset */
		unsigned int	lbr_deep_c_reset:1;
		/* IP values contain LIP */
		unsigned int	lbr_lip:1;
	} split;
	unsigned int		full;
};

union cpuid28_ebx {
	struct {
		/* CPL Filtering Supported */
		unsigned int    lbr_cpl:1;
		/* Branch Filtering Supported */
		unsigned int    lbr_filter:1;
		/* Call-stack Mode Supported */
		unsigned int    lbr_call_stack:1;
	} split;
	unsigned int            full;
};

union cpuid28_ecx {
	struct {
		/* Mispredict Bit Supported */
		unsigned int    lbr_mispred:1;
		/* Timed LBRs Supported */
		unsigned int    lbr_timed_lbr:1;
		/* Branch Type Field Supported */
		unsigned int    lbr_br_type:1;
		unsigned int	reserved:13;
		/* Branch counters (Event Logging) Supported */
		unsigned int	lbr_counters:4;
	} split;
	unsigned int            full;
};

/*
 * AMD "Extended Performance Monitoring and Debug" CPUID
 * detection/enumeration details:
 */
union cpuid_0x80000022_ebx {
	struct {
		/* Number of Core Performance Counters */
		unsigned int	num_core_pmc:4;
		/* Number of available LBR Stack Entries */
		unsigned int	lbr_v2_stack_sz:6;
		/* Number of Data Fabric Counters */
		unsigned int	num_df_pmc:6;
		/* Number of Unified Memory Controller Counters */
		unsigned int	num_umc_pmc:6;
	} split;
	unsigned int		full;
};

struct x86_pmu_capability {
	int		version;
	int		num_counters_gp;
	int		num_counters_fixed;
	int		bit_width_gp;
	int		bit_width_fixed;
	unsigned int	events_mask;
	int		events_mask_len;
	unsigned int	pebs_ept	:1;
};

/*
 * Fixed-purpose performance events:
 */

/* RDPMC offset for Fixed PMCs */
#define INTEL_PMC_FIXED_RDPMC_BASE		(1 << 30)
#define INTEL_PMC_FIXED_RDPMC_METRICS		(1 << 29)

/*
 * All the fixed-mode PMCs are configured via this single MSR:
 */
#define MSR_ARCH_PERFMON_FIXED_CTR_CTRL	0x38d

/*
 * There is no event-code assigned to the fixed-mode PMCs.
 *
 * For a fixed-mode PMC, which has an equivalent event on a general-purpose
 * PMC, the event-code of the equivalent event is used for the fixed-mode PMC,
 * e.g., Instr_Retired.Any and CPU_CLK_Unhalted.Core.
 *
 * For a fixed-mode PMC, which doesn't have an equivalent event, a
 * pseudo-encoding is used, e.g., CPU_CLK_Unhalted.Ref and TOPDOWN.SLOTS.
 * The pseudo event-code for a fixed-mode PMC must be 0x00.
 * The pseudo umask-code is 0xX. The X equals the index of the fixed
 * counter + 1, e.g., the fixed counter 2 has the pseudo-encoding 0x0300.
 *
 * The counts are available in separate MSRs:
 */

/* Instr_Retired.Any: */
#define MSR_ARCH_PERFMON_FIXED_CTR0	0x309
#define INTEL_PMC_IDX_FIXED_INSTRUCTIONS	(INTEL_PMC_IDX_FIXED + 0)

/* CPU_CLK_Unhalted.Core: */
#define MSR_ARCH_PERFMON_FIXED_CTR1	0x30a
#define INTEL_PMC_IDX_FIXED_CPU_CYCLES	(INTEL_PMC_IDX_FIXED + 1)

/* CPU_CLK_Unhalted.Ref: event=0x00,umask=0x3 (pseudo-encoding) */
#define MSR_ARCH_PERFMON_FIXED_CTR2	0x30b
#define INTEL_PMC_IDX_FIXED_REF_CYCLES	(INTEL_PMC_IDX_FIXED + 2)
#define INTEL_PMC_MSK_FIXED_REF_CYCLES	(1ULL << INTEL_PMC_IDX_FIXED_REF_CYCLES)

/* TOPDOWN.SLOTS: event=0x00,umask=0x4 (pseudo-encoding) */
#define MSR_ARCH_PERFMON_FIXED_CTR3	0x30c
#define INTEL_PMC_IDX_FIXED_SLOTS	(INTEL_PMC_IDX_FIXED + 3)
#define INTEL_PMC_MSK_FIXED_SLOTS	(1ULL << INTEL_PMC_IDX_FIXED_SLOTS)

/* TOPDOWN_BAD_SPECULATION.ALL: fixed counter 4 (Atom only) */
/* TOPDOWN_FE_BOUND.ALL: fixed counter 5 (Atom only) */
/* TOPDOWN_RETIRING.ALL: fixed counter 6 (Atom only) */

static inline bool use_fixed_pseudo_encoding(u64 code)
{
	return !(code & 0xff);
}

/*
 * We model BTS tracing as another fixed-mode PMC.
 *
 * We choose the value 47 for the fixed index of BTS, since lower
 * values are used by actual fixed events and higher values are used
 * to indicate other overflow conditions in the PERF_GLOBAL_STATUS msr.
 */
#define INTEL_PMC_IDX_FIXED_BTS			(INTEL_PMC_IDX_FIXED + 15)

/*
 * The PERF_METRICS MSR is modeled as several magic fixed-mode PMCs, one for
 * each TopDown metric event.
 *
 * Internally the TopDown metric events are mapped to the FxCtr 3 (SLOTS).
 */
#define INTEL_PMC_IDX_METRIC_BASE		(INTEL_PMC_IDX_FIXED + 16)
#define INTEL_PMC_IDX_TD_RETIRING		(INTEL_PMC_IDX_METRIC_BASE + 0)
#define INTEL_PMC_IDX_TD_BAD_SPEC		(INTEL_PMC_IDX_METRIC_BASE + 1)
#define INTEL_PMC_IDX_TD_FE_BOUND		(INTEL_PMC_IDX_METRIC_BASE + 2)
#define INTEL_PMC_IDX_TD_BE_BOUND		(INTEL_PMC_IDX_METRIC_BASE + 3)
#define INTEL_PMC_IDX_TD_HEAVY_OPS		(INTEL_PMC_IDX_METRIC_BASE + 4)
#define INTEL_PMC_IDX_TD_BR_MISPREDICT		(INTEL_PMC_IDX_METRIC_BASE + 5)
#define INTEL_PMC_IDX_TD_FETCH_LAT		(INTEL_PMC_IDX_METRIC_BASE + 6)
#define INTEL_PMC_IDX_TD_MEM_BOUND		(INTEL_PMC_IDX_METRIC_BASE + 7)
#define INTEL_PMC_IDX_METRIC_END		INTEL_PMC_IDX_TD_MEM_BOUND
#define INTEL_PMC_MSK_TOPDOWN			((0xffull << INTEL_PMC_IDX_METRIC_BASE) | \
						INTEL_PMC_MSK_FIXED_SLOTS)

/*
 * There is no event-code assigned to the TopDown events.
 *
 * For the slots event, use the pseudo code of the fixed counter 3.
 *
 * For the metric events, the pseudo event-code is 0x00.
 * The pseudo umask-code starts from the middle of the pseudo event
 * space, 0x80.
 */
#define INTEL_TD_SLOTS				0x0400	/* TOPDOWN.SLOTS */
/* Level 1 metrics */
#define INTEL_TD_METRIC_RETIRING		0x8000	/* Retiring metric */
#define INTEL_TD_METRIC_BAD_SPEC		0x8100	/* Bad speculation metric */
#define INTEL_TD_METRIC_FE_BOUND		0x8200	/* FE bound metric */
#define INTEL_TD_METRIC_BE_BOUND		0x8300	/* BE bound metric */
/* Level 2 metrics */
#define INTEL_TD_METRIC_HEAVY_OPS		0x8400  /* Heavy Operations metric */
#define INTEL_TD_METRIC_BR_MISPREDICT		0x8500  /* Branch Mispredict metric */
#define INTEL_TD_METRIC_FETCH_LAT		0x8600  /* Fetch Latency metric */
#define INTEL_TD_METRIC_MEM_BOUND		0x8700  /* Memory bound metric */

#define INTEL_TD_METRIC_MAX			INTEL_TD_METRIC_MEM_BOUND
#define INTEL_TD_METRIC_NUM			8

#define INTEL_TD_CFG_METRIC_CLEAR_BIT		0
#define INTEL_TD_CFG_METRIC_CLEAR		BIT_ULL(INTEL_TD_CFG_METRIC_CLEAR_BIT)

static inline bool is_metric_idx(int idx)
{
	return (unsigned)(idx - INTEL_PMC_IDX_METRIC_BASE) < INTEL_TD_METRIC_NUM;
}

static inline bool is_topdown_idx(int idx)
{
	return is_metric_idx(idx) || idx == INTEL_PMC_IDX_FIXED_SLOTS;
}

#define INTEL_PMC_OTHER_TOPDOWN_BITS(bit)	\
			(~(0x1ull << bit) & INTEL_PMC_MSK_TOPDOWN)

#define GLOBAL_STATUS_COND_CHG			BIT_ULL(63)
#define GLOBAL_STATUS_BUFFER_OVF_BIT		62
#define GLOBAL_STATUS_BUFFER_OVF		BIT_ULL(GLOBAL_STATUS_BUFFER_OVF_BIT)
#define GLOBAL_STATUS_UNC_OVF			BIT_ULL(61)
#define GLOBAL_STATUS_ASIF			BIT_ULL(60)
#define GLOBAL_STATUS_COUNTERS_FROZEN		BIT_ULL(59)
#define GLOBAL_STATUS_LBRS_FROZEN_BIT		58
#define GLOBAL_STATUS_LBRS_FROZEN		BIT_ULL(GLOBAL_STATUS_LBRS_FROZEN_BIT)
#define GLOBAL_STATUS_TRACE_TOPAPMI_BIT		55
#define GLOBAL_STATUS_TRACE_TOPAPMI		BIT_ULL(GLOBAL_STATUS_TRACE_TOPAPMI_BIT)
#define GLOBAL_STATUS_PERF_METRICS_OVF_BIT	48

#define GLOBAL_CTRL_EN_PERF_METRICS		48
/*
 * We model guest LBR event tracing as another fixed-mode PMC like BTS.
 *
 * We choose bit 58 because it's used to indicate LBR stack frozen state
 * for architectural perfmon v4, also we unconditionally mask that bit in
 * the handle_pmi_common(), so it'll never be set in the overflow handling.
 *
 * With this fake counter assigned, the guest LBR event user (such as KVM),
 * can program the LBR registers on its own, and we don't actually do anything
 * with then in the host context.
 */
#define INTEL_PMC_IDX_FIXED_VLBR	(GLOBAL_STATUS_LBRS_FROZEN_BIT)

/*
 * Pseudo-encoding the guest LBR event as event=0x00,umask=0x1b,
 * since it would claim bit 58 which is effectively Fixed26.
 */
#define INTEL_FIXED_VLBR_EVENT	0x1b00

/*
 * Adaptive PEBS v4
 */

struct pebs_basic {
	u64 format_group:32,
	    retire_latency:16,
	    format_size:16;
	u64 ip;
	u64 applicable_counters;
	u64 tsc;
};

struct pebs_meminfo {
	u64 address;
	u64 aux;
	union {
		/* pre Alder Lake */
		u64 mem_latency;
		/* Alder Lake and later */
		struct {
			u64 instr_latency:16;
			u64 pad2:16;
			u64 cache_latency:16;
			u64 pad3:16;
		};
	};
	u64 tsx_tuning;
};

struct pebs_gprs {
	u64 flags, ip, ax, cx, dx, bx, sp, bp, si, di;
	u64 r8, r9, r10, r11, r12, r13, r14, r15;
};

struct pebs_xmm {
	u64 xmm[16*2];	/* two entries for each register */
};

/*
 * AMD Extended Performance Monitoring and Debug cpuid feature detection
 */
#define EXT_PERFMON_DEBUG_FEATURES		0x80000022

/*
 * IBS cpuid feature detection
 */

#define IBS_CPUID_FEATURES		0x8000001b

/*
 * Same bit mask as for IBS cpuid feature flags (Fn8000_001B_EAX), but
 * bit 0 is used to indicate the existence of IBS.
 */
#define IBS_CAPS_AVAIL			(1U<<0)
#define IBS_CAPS_FETCHSAM		(1U<<1)
#define IBS_CAPS_OPSAM			(1U<<2)
#define IBS_CAPS_RDWROPCNT		(1U<<3)
#define IBS_CAPS_OPCNT			(1U<<4)
#define IBS_CAPS_BRNTRGT		(1U<<5)
#define IBS_CAPS_OPCNTEXT		(1U<<6)
#define IBS_CAPS_RIPINVALIDCHK		(1U<<7)
#define IBS_CAPS_OPBRNFUSE		(1U<<8)
#define IBS_CAPS_FETCHCTLEXTD		(1U<<9)
#define IBS_CAPS_OPDATA4		(1U<<10)
#define IBS_CAPS_ZEN4			(1U<<11)

#define IBS_CAPS_DEFAULT		(IBS_CAPS_AVAIL		\
					 | IBS_CAPS_FETCHSAM	\
					 | IBS_CAPS_OPSAM)

/*
 * IBS APIC setup
 */
#define IBSCTL				0x1cc
#define IBSCTL_LVT_OFFSET_VALID		(1ULL<<8)
#define IBSCTL_LVT_OFFSET_MASK		0x0F

/* IBS fetch bits/masks */
#define IBS_FETCH_L3MISSONLY	(1ULL<<59)
#define IBS_FETCH_RAND_EN	(1ULL<<57)
#define IBS_FETCH_VAL		(1ULL<<49)
#define IBS_FETCH_ENABLE	(1ULL<<48)
#define IBS_FETCH_CNT		0xFFFF0000ULL
#define IBS_FETCH_MAX_CNT	0x0000FFFFULL

/*
 * IBS op bits/masks
 * The lower 7 bits of the current count are random bits
 * preloaded by hardware and ignored in software
 */
#define IBS_OP_CUR_CNT		(0xFFF80ULL<<32)
#define IBS_OP_CUR_CNT_RAND	(0x0007FULL<<32)
#define IBS_OP_CUR_CNT_EXT_MASK	(0x7FULL<<52)
#define IBS_OP_CNT_CTL		(1ULL<<19)
#define IBS_OP_VAL		(1ULL<<18)
#define IBS_OP_ENABLE		(1ULL<<17)
#define IBS_OP_L3MISSONLY	(1ULL<<16)
#define IBS_OP_MAX_CNT		0x0000FFFFULL
#define IBS_OP_MAX_CNT_EXT	0x007FFFFFULL	/* not a register bit mask */
#define IBS_OP_MAX_CNT_EXT_MASK	(0x7FULL<<20)	/* separate upper 7 bits */
#define IBS_RIP_INVALID		(1ULL<<38)

#ifdef CONFIG_X86_LOCAL_APIC
extern u32 get_ibs_caps(void);
extern int forward_event_to_ibs(struct perf_event *event);
#else
static inline u32 get_ibs_caps(void) { return 0; }
static inline int forward_event_to_ibs(struct perf_event *event) { return -ENOENT; }
#endif

#ifdef CONFIG_PERF_EVENTS
extern void perf_events_lapic_init(void);

/*
 * Abuse bits {3,5} of the cpu eflags register. These flags are otherwise
 * unused and ABI specified to be 0, so nobody should care what we do with
 * them.
 *
 * EXACT - the IP points to the exact instruction that triggered the
 *         event (HW bugs exempt).
 * VM    - original X86_VM_MASK; see set_linear_ip().
 */
#define PERF_EFLAGS_EXACT	(1UL << 3)
#define PERF_EFLAGS_VM		(1UL << 5)

struct pt_regs;
struct x86_perf_regs {
	struct pt_regs	regs;
	u64		*xmm_regs;
};

extern unsigned long perf_arch_instruction_pointer(struct pt_regs *regs);
extern unsigned long perf_arch_misc_flags(struct pt_regs *regs);
extern unsigned long perf_arch_guest_misc_flags(struct pt_regs *regs);
#define perf_arch_misc_flags(regs)	perf_arch_misc_flags(regs)
#define perf_arch_guest_misc_flags(regs)	perf_arch_guest_misc_flags(regs)

#include <asm/stacktrace.h>

/*
 * We abuse bit 3 from flags to pass exact information, see
 * perf_arch_misc_flags() and the comment with PERF_EFLAGS_EXACT.
 */
#define perf_arch_fetch_caller_regs(regs, __ip)		{	\
	(regs)->ip = (__ip);					\
	(regs)->sp = (unsigned long)__builtin_frame_address(0);	\
	(regs)->cs = __KERNEL_CS;				\
	regs->flags = 0;					\
}

struct perf_guest_switch_msr {
	unsigned msr;
	u64 host, guest;
};

struct x86_pmu_lbr {
	unsigned int	nr;
	unsigned int	from;
	unsigned int	to;
	unsigned int	info;
	bool		has_callstack;
};

extern void perf_get_x86_pmu_capability(struct x86_pmu_capability *cap);
extern u64 perf_get_hw_event_config(int hw_event);
extern void perf_check_microcode(void);
extern void perf_clear_dirty_counters(void);
extern int x86_perf_rdpmc_index(struct perf_event *event);
#else
static inline void perf_get_x86_pmu_capability(struct x86_pmu_capability *cap)
{
	memset(cap, 0, sizeof(*cap));
}

static inline u64 perf_get_hw_event_config(int hw_event)
{
	return 0;
}

static inline void perf_events_lapic_init(void)	{ }
static inline void perf_check_microcode(void) { }
#endif

#if defined(CONFIG_PERF_EVENTS) && defined(CONFIG_CPU_SUP_INTEL)
extern struct perf_guest_switch_msr *perf_guest_get_msrs(int *nr, void *data);
extern void x86_perf_get_lbr(struct x86_pmu_lbr *lbr);
#else
struct perf_guest_switch_msr *perf_guest_get_msrs(int *nr, void *data);
static inline void x86_perf_get_lbr(struct x86_pmu_lbr *lbr)
{
	memset(lbr, 0, sizeof(*lbr));
}
#endif

#ifdef CONFIG_CPU_SUP_INTEL
 extern void intel_pt_handle_vmx(int on);
#else
static inline void intel_pt_handle_vmx(int on)
{

}
#endif

#if defined(CONFIG_PERF_EVENTS) && defined(CONFIG_CPU_SUP_AMD)
 extern void amd_pmu_enable_virt(void);
 extern void amd_pmu_disable_virt(void);

#if defined(CONFIG_PERF_EVENTS_AMD_BRS)

#define PERF_NEEDS_LOPWR_CB 1

/*
 * architectural low power callback impacts
 * drivers/acpi/processor_idle.c
 * drivers/acpi/acpi_pad.c
 */
extern void perf_amd_brs_lopwr_cb(bool lopwr_in);

DECLARE_STATIC_CALL(perf_lopwr_cb, perf_amd_brs_lopwr_cb);

static __always_inline void perf_lopwr_cb(bool lopwr_in)
{
	static_call_mod(perf_lopwr_cb)(lopwr_in);
}

#endif /* PERF_NEEDS_LOPWR_CB */

#else
 static inline void amd_pmu_enable_virt(void) { }
 static inline void amd_pmu_disable_virt(void) { }
#endif

#define arch_perf_out_copy_user copy_from_user_nmi

#endif /* _ASM_X86_PERF_EVENT_H */

Filemanager

Name Type Size Permission Actions
e820 Folder 0755
fpu Folder 0755
numachip Folder 0755
shared Folder 0755
trace Folder 0755
uv Folder 0755
vdso Folder 0755
xen Folder 0755
GEN-for-each-reg.h File 345 B 0644
Kbuild File 348 B 0644
acenv.h File 1.42 KB 0644
acpi.h File 6.16 KB 0644
acrn.h File 2.12 KB 0644
agp.h File 835 B 0644
alternative.h File 12.87 KB 0644
amd-ibs.h File 4.9 KB 0644
amd_hsmp.h File 364 B 0644
amd_nb.h File 1.59 KB 0644
amd_node.h File 1.41 KB 0644
apic.h File 14.79 KB 0644
apicdef.h File 5.52 KB 0644
apm.h File 1.73 KB 0644
arch_hweight.h File 1.06 KB 0644
archrandom.h File 1.46 KB 0644
asm-offsets.h File 35 B 0644
asm-prototypes.h File 587 B 0644
asm.h File 6.11 KB 0644
atomic.h File 4.36 KB 0644
atomic64_32.h File 7.81 KB 0644
atomic64_64.h File 4.26 KB 0644
audit.h File 351 B 0644
barrier.h File 2.37 KB 0644
bios_ebda.h File 914 B 0644
bitops.h File 11.06 KB 0644
boot.h File 2.46 KB 0644
bootparam_utils.h File 2.84 KB 0644
bug.h File 2.67 KB 0644
bugs.h File 344 B 0644
cache.h File 622 B 0644
cacheflush.h File 329 B 0644
cacheinfo.h File 485 B 0644
ce4100.h File 121 B 0644
cfi.h File 2.78 KB 0644
checksum.h File 323 B 0644
checksum_32.h File 4.57 KB 0644
checksum_64.h File 5.02 KB 0644
clocksource.h File 480 B 0644
cmdline.h File 375 B 0644
cmpxchg.h File 7.29 KB 0644
cmpxchg_32.h File 4.02 KB 0644
cmpxchg_64.h File 2.5 KB 0644
coco.h File 703 B 0644
compat.h File 2.35 KB 0644
cpu.h File 2.15 KB 0644
cpu_device_id.h File 9.02 KB 0644
cpu_entry_area.h File 4.1 KB 0644
cpufeature.h File 7.75 KB 0644
cpufeatures.h File 38.88 KB 0644
cpuid.h File 4.55 KB 0644
cpuidle_haltpoll.h File 189 B 0644
cpumask.h File 905 B 0644
crash.h File 300 B 0644
crash_reserve.h File 1.28 KB 0644
current.h File 1.18 KB 0644
debugreg.h File 4.41 KB 0644
delay.h File 275 B 0644
desc.h File 11.23 KB 0644
desc_defs.h File 4.84 KB 0644
device.h File 176 B 0644
disabled-features.h File 4.19 KB 0644
div64.h File 2.4 KB 0644
dma-mapping.h File 237 B 0644
dma.h File 9.47 KB 0644
dmi.h File 556 B 0644
doublefault.h File 351 B 0644
dwarf2.h File 1.29 KB 0644
edac.h File 474 B 0644
efi.h File 13.49 KB 0644
elf.h File 11.92 KB 0644
elfcore-compat.h File 890 B 0644
emergency-restart.h File 202 B 0644
emulate_prefix.h File 484 B 0644
enclu.h File 181 B 0644
entry-common.h File 3.3 KB 0644
espfix.h File 426 B 0644
exec.h File 37 B 0644
extable.h File 1.82 KB 0644
extable_fixup_types.h File 2.34 KB 0644
fixmap.h File 5.95 KB 0644
floppy.h File 6.7 KB 0644
fpu.h File 221 B 0644
frame.h File 2.5 KB 0644
fred.h File 3.18 KB 0644
fsgsbase.h File 2.02 KB 0644
ftrace.h File 4.87 KB 0644
futex.h File 2.65 KB 0644
gart.h File 2.62 KB 0644
genapic.h File 22 B 0644
geode.h File 693 B 0644
gsseg.h File 1.35 KB 0644
hardirq.h File 2.52 KB 0644
highmem.h File 2.44 KB 0644
hpet.h File 2.89 KB 0644
hugetlb.h File 243 B 0644
hw_breakpoint.h File 2.04 KB 0644
hw_irq.h File 2.99 KB 0644
hyperv_timer.h File 177 B 0644
hypervisor.h File 2.3 KB 0644
i8259.h File 2.01 KB 0644
ia32.h File 1.74 KB 0644
ibt.h File 2.52 KB 0644
idtentry.h File 24.48 KB 0644
imr.h File 1.64 KB 0644
inat.h File 6.36 KB 0644
inat_types.h File 341 B 0644
init.h File 842 B 0644
insn-eval.h File 1.67 KB 0644
insn.h File 8.38 KB 0644
inst.h File 2.02 KB 0644
intel-family.h File 6.64 KB 0644
intel-mid.h File 624 B 0644
intel_ds.h File 947 B 0644
intel_pt.h File 1.25 KB 0644
intel_punit_ipc.h File 4.38 KB 0644
intel_telemetry.h File 3.66 KB 0644
invpcid.h File 1.45 KB 0644
io.h File 11.78 KB 0644
io_apic.h File 5.06 KB 0644
io_bitmap.h File 1.34 KB 0644
iomap.h File 536 B 0644
iommu.h File 965 B 0644
iosf_mbi.h File 7.21 KB 0644
irq.h File 1.22 KB 0644
irq_remapping.h File 1.98 KB 0644
irq_stack.h File 7.49 KB 0644
irq_vectors.h File 4.11 KB 0644
irq_work.h File 358 B 0644
irqdomain.h File 1.79 KB 0644
irqflags.h File 3.11 KB 0644
ist.h File 294 B 0644
jailhouse_para.h File 449 B 0644
jump_label.h File 1.47 KB 0644
kasan.h File 1.26 KB 0644
kaslr.h File 398 B 0644
kbdleds.h File 454 B 0644
kdebug.h File 1.06 KB 0644
kexec-bzimage64.h File 195 B 0644
kexec.h File 7.01 KB 0644
kfence.h File 1.59 KB 0644
kgdb.h File 2.09 KB 0644
kmsan.h File 2.75 KB 0644
kprobes.h File 3.21 KB 0644
kvm-x86-ops.h File 4.7 KB 0644
kvm-x86-pmu-ops.h File 782 B 0644
kvm_host.h File 73.84 KB 0644
kvm_page_track.h File 1.94 KB 0644
kvm_para.h File 4.13 KB 0644
kvm_types.h File 178 B 0644
kvm_vcpu_regs.h File 606 B 0644
kvmclock.h File 477 B 0644
linkage.h File 4.03 KB 0644
local.h File 4.18 KB 0644
mach_timer.h File 1.55 KB 0644
mach_traps.h File 1013 B 0644
math_emu.h File 395 B 0644
mc146818rtc.h File 2.77 KB 0644
mce.h File 13.51 KB 0644
mem_encrypt.h File 3.43 KB 0644
memtype.h File 853 B 0644
microcode.h File 2.17 KB 0644
misc.h File 143 B 0644
mman.h File 412 B 0644
mmconfig.h File 374 B 0644
mmu.h File 2.05 KB 0644
mmu_context.h File 7.01 KB 0644
module.h File 437 B 0644
mpspec.h File 1.86 KB 0644
mpspec_def.h File 4.16 KB 0644
mshyperv.h File 10.18 KB 0644
msi.h File 1.73 KB 0644
msr-index.h File 47.14 KB 0644
msr-trace.h File 1.35 KB 0644
msr.h File 11.44 KB 0644
mtrr.h File 5.47 KB 0644
mwait.h File 4.88 KB 0644
nmi.h File 1.34 KB 0644
nops.h File 2.24 KB 0644
nospec-branch.h File 17.28 KB 0644
numa.h File 1.73 KB 0644
numa_32.h File 256 B 0644
olpc.h File 2.33 KB 0644
olpc_ofw.h File 1.1 KB 0644
orc_header.h File 483 B 0644
orc_lookup.h File 1.04 KB 0644
orc_types.h File 2.13 KB 0644
page.h File 2.44 KB 0644
page_32.h File 680 B 0644
page_32_types.h File 2.34 KB 0644
page_64.h File 2.88 KB 0644
page_64_types.h File 3.07 KB 0644
page_types.h File 1.99 KB 0644
paravirt.h File 17.87 KB 0644
paravirt_api_clock.h File 26 B 0644
paravirt_types.h File 17.32 KB 0644
parport.h File 314 B 0644
pc-conf-reg.h File 723 B 0644
pci-direct.h File 850 B 0644
pci-functions.h File 654 B 0644
pci.h File 2.87 KB 0644
pci_x86.h File 6.7 KB 0644
percpu.h File 23.33 KB 0644
perf_event.h File 19.81 KB 0644
perf_event_p4.h File 26.12 KB 0644
pgalloc.h File 4.88 KB 0644
pgtable-2level.h File 3.29 KB 0644
pgtable-2level_types.h File 945 B 0644
pgtable-3level.h File 6.47 KB 0644
pgtable-3level_types.h File 1.1 KB 0644
pgtable-invert.h File 1.07 KB 0644
pgtable.h File 43.44 KB 0644
pgtable_32.h File 2.12 KB 0644
pgtable_32_areas.h File 1.55 KB 0644
pgtable_32_types.h File 634 B 0644
pgtable_64.h File 7.69 KB 0644
pgtable_64_types.h File 6.33 KB 0644
pgtable_areas.h File 623 B 0644
pgtable_types.h File 18.02 KB 0644
pkeys.h File 3.13 KB 0644
pkru.h File 1.31 KB 0644
platform_sst_audio.h File 3.03 KB 0644
pm-trace.h File 611 B 0644
posix_types.h File 144 B 0644
posted_intr.h File 2.89 KB 0644
preempt.h File 4.14 KB 0644
probe_roms.h File 273 B 0644
processor-cyrix.h File 383 B 0644
processor-flags.h File 1.79 KB 0644
processor.h File 19.7 KB 0644
prom.h File 845 B 0644
proto.h File 1.12 KB 0644
pti.h File 385 B 0644
ptrace.h File 11.96 KB 0644
purgatory.h File 237 B 0644
pvclock-abi.h File 1.5 KB 0644
pvclock.h File 2.74 KB 0644
qrwlock.h File 199 B 0644
qspinlock.h File 3.06 KB 0644
qspinlock_paravirt.h File 2.08 KB 0644
realmode.h File 2.11 KB 0644
reboot.h File 1.38 KB 0644
reboot_fixups.h File 183 B 0644
required-features.h File 2.68 KB 0644
resctrl.h File 5.03 KB 0644
rmwcc.h File 1.81 KB 0644
runtime-const.h File 1.67 KB 0644
seccomp.h File 1.18 KB 0644
sections.h File 490 B 0644
segment.h File 9.92 KB 0644
serial.h File 1.11 KB 0644
set_memory.h File 3.96 KB 0644
setup.h File 3.72 KB 0644
setup_arch.h File 77 B 0644
setup_data.h File 565 B 0644
sev-common.h File 7.69 KB 0644
sev.h File 15.12 KB 0644
sgx.h File 12.85 KB 0644
shmparam.h File 193 B 0644
shstk.h File 1.45 KB 0644
sigcontext.h File 261 B 0644
sigframe.h File 2.09 KB 0644
sighandling.h File 1.72 KB 0644
signal.h File 2.27 KB 0644
simd.h File 287 B 0644
smap.h File 1.44 KB 0644
smp.h File 4.63 KB 0644
softirq_stack.h File 216 B 0644
sparsemem.h File 830 B 0644
spec-ctrl.h File 3.02 KB 0644
special_insns.h File 7.22 KB 0644
spinlock.h File 1.19 KB 0644
spinlock_types.h File 253 B 0644
sta2x11.h File 352 B 0644
stackprotector.h File 2.65 KB 0644
stacktrace.h File 2.78 KB 0644
static_call.h File 2.99 KB 0644
string.h File 129 B 0644
string_32.h File 5.36 KB 0644
string_64.h File 2.5 KB 0644
suspend.h File 496 B 0644
suspend_32.h File 876 B 0644
suspend_64.h File 1.79 KB 0644
svm.h File 16.87 KB 0644
switch_to.h File 2.4 KB 0644
sync_bitops.h File 3.26 KB 0644
sync_core.h File 3.24 KB 0644
syscall.h File 3.49 KB 0644
syscall_wrapper.h File 9.02 KB 0644
syscalls.h File 374 B 0644
tdx.h File 3.42 KB 0644
text-patching.h File 5.55 KB 0644
thermal.h File 428 B 0644
thread_info.h File 8.17 KB 0644
time.h File 355 B 0644
timer.h File 989 B 0644
timex.h File 546 B 0644
tlb.h File 659 B 0644
tlbbatch.h File 332 B 0644
tlbflush.h File 11.69 KB 0644
topology.h File 8.74 KB 0644
trace_clock.h File 406 B 0644
trap_pf.h File 881 B 0644
trapnr.h File 1.7 KB 0644
traps.h File 1.52 KB 0644
tsc.h File 1.71 KB 0644
uaccess.h File 20.11 KB 0644
uaccess_32.h File 1.13 KB 0644
uaccess_64.h File 5.36 KB 0644
umip.h File 317 B 0644
unaccepted_memory.h File 742 B 0644
unistd.h File 1.59 KB 0644
unwind.h File 3.89 KB 0644
unwind_hints.h File 2.03 KB 0644
uprobes.h File 1017 B 0644
user.h File 2.2 KB 0644
user32.h File 2.11 KB 0644
user_32.h File 4.78 KB 0644
user_64.h File 5.07 KB 0644
vdso.h File 1.36 KB 0644
vermagic.h File 1.95 KB 0644
vga.h File 740 B 0644
vgtod.h File 422 B 0644
video.h File 497 B 0644
vm86.h File 2.15 KB 0644
vmalloc.h File 560 B 0644
vmware.h File 9.36 KB 0644
vmx.h File 27.23 KB 0644
vmxfeatures.h File 6.43 KB 0644
vsyscall.h File 988 B 0644
word-at-a-time.h File 1.98 KB 0644
x86_init.h File 11.89 KB 0644
xor.h File 10.39 KB 0644
xor_32.h File 14.54 KB 0644
xor_64.h File 716 B 0644
xor_avx.h File 4.53 KB 0644
Filemanager