17c2aad20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
27c2aad20Sopenharmony_ci/*
37c2aad20Sopenharmony_ci * Performance events:
47c2aad20Sopenharmony_ci *
57c2aad20Sopenharmony_ci *    Copyright (C) 2008-2009, Thomas Gleixner <tglx@linutronix.de>
67c2aad20Sopenharmony_ci *    Copyright (C) 2008-2011, Red Hat, Inc., Ingo Molnar
77c2aad20Sopenharmony_ci *    Copyright (C) 2008-2011, Red Hat, Inc., Peter Zijlstra
87c2aad20Sopenharmony_ci *
97c2aad20Sopenharmony_ci * Data type definitions, declarations, prototypes.
107c2aad20Sopenharmony_ci *
117c2aad20Sopenharmony_ci *    Started by: Thomas Gleixner and Ingo Molnar
127c2aad20Sopenharmony_ci *
137c2aad20Sopenharmony_ci * For licencing details see kernel-base/COPYING
147c2aad20Sopenharmony_ci */
157c2aad20Sopenharmony_ci#ifndef _UAPI_LINUX_PERF_EVENT_H
167c2aad20Sopenharmony_ci#define _UAPI_LINUX_PERF_EVENT_H
177c2aad20Sopenharmony_ci
187c2aad20Sopenharmony_ci#include <linux/types.h>
197c2aad20Sopenharmony_ci#include <linux/ioctl.h>
207c2aad20Sopenharmony_ci#include <asm/byteorder.h>
217c2aad20Sopenharmony_ci
227c2aad20Sopenharmony_ci/*
237c2aad20Sopenharmony_ci * User-space ABI bits:
247c2aad20Sopenharmony_ci */
257c2aad20Sopenharmony_ci
267c2aad20Sopenharmony_ci/*
277c2aad20Sopenharmony_ci * attr.type
287c2aad20Sopenharmony_ci */
297c2aad20Sopenharmony_cienum perf_type_id {
307c2aad20Sopenharmony_ci	PERF_TYPE_HARDWARE			= 0,
317c2aad20Sopenharmony_ci	PERF_TYPE_SOFTWARE			= 1,
327c2aad20Sopenharmony_ci	PERF_TYPE_TRACEPOINT			= 2,
337c2aad20Sopenharmony_ci	PERF_TYPE_HW_CACHE			= 3,
347c2aad20Sopenharmony_ci	PERF_TYPE_RAW				= 4,
357c2aad20Sopenharmony_ci	PERF_TYPE_BREAKPOINT			= 5,
367c2aad20Sopenharmony_ci
377c2aad20Sopenharmony_ci	PERF_TYPE_MAX,				/* non-ABI */
387c2aad20Sopenharmony_ci};
397c2aad20Sopenharmony_ci
407c2aad20Sopenharmony_ci/*
417c2aad20Sopenharmony_ci * attr.config layout for type PERF_TYPE_HARDWARE and PERF_TYPE_HW_CACHE
427c2aad20Sopenharmony_ci * PERF_TYPE_HARDWARE:			0xEEEEEEEE000000AA
437c2aad20Sopenharmony_ci *					AA: hardware event ID
447c2aad20Sopenharmony_ci *					EEEEEEEE: PMU type ID
457c2aad20Sopenharmony_ci * PERF_TYPE_HW_CACHE:			0xEEEEEEEE00DDCCBB
467c2aad20Sopenharmony_ci *					BB: hardware cache ID
477c2aad20Sopenharmony_ci *					CC: hardware cache op ID
487c2aad20Sopenharmony_ci *					DD: hardware cache op result ID
497c2aad20Sopenharmony_ci *					EEEEEEEE: PMU type ID
507c2aad20Sopenharmony_ci * If the PMU type ID is 0, the PERF_TYPE_RAW will be applied.
517c2aad20Sopenharmony_ci */
527c2aad20Sopenharmony_ci#define PERF_PMU_TYPE_SHIFT		32
537c2aad20Sopenharmony_ci#define PERF_HW_EVENT_MASK		0xffffffff
547c2aad20Sopenharmony_ci
557c2aad20Sopenharmony_ci/*
567c2aad20Sopenharmony_ci * Generalized performance event event_id types, used by the
577c2aad20Sopenharmony_ci * attr.event_id parameter of the sys_perf_event_open()
587c2aad20Sopenharmony_ci * syscall:
597c2aad20Sopenharmony_ci */
607c2aad20Sopenharmony_cienum perf_hw_id {
617c2aad20Sopenharmony_ci	/*
627c2aad20Sopenharmony_ci	 * Common hardware events, generalized by the kernel:
637c2aad20Sopenharmony_ci	 */
647c2aad20Sopenharmony_ci	PERF_COUNT_HW_CPU_CYCLES		= 0,
657c2aad20Sopenharmony_ci	PERF_COUNT_HW_INSTRUCTIONS		= 1,
667c2aad20Sopenharmony_ci	PERF_COUNT_HW_CACHE_REFERENCES		= 2,
677c2aad20Sopenharmony_ci	PERF_COUNT_HW_CACHE_MISSES		= 3,
687c2aad20Sopenharmony_ci	PERF_COUNT_HW_BRANCH_INSTRUCTIONS	= 4,
697c2aad20Sopenharmony_ci	PERF_COUNT_HW_BRANCH_MISSES		= 5,
707c2aad20Sopenharmony_ci	PERF_COUNT_HW_BUS_CYCLES		= 6,
717c2aad20Sopenharmony_ci	PERF_COUNT_HW_STALLED_CYCLES_FRONTEND	= 7,
727c2aad20Sopenharmony_ci	PERF_COUNT_HW_STALLED_CYCLES_BACKEND	= 8,
737c2aad20Sopenharmony_ci	PERF_COUNT_HW_REF_CPU_CYCLES		= 9,
747c2aad20Sopenharmony_ci
757c2aad20Sopenharmony_ci	PERF_COUNT_HW_MAX,			/* non-ABI */
767c2aad20Sopenharmony_ci};
777c2aad20Sopenharmony_ci
787c2aad20Sopenharmony_ci/*
797c2aad20Sopenharmony_ci * Generalized hardware cache events:
807c2aad20Sopenharmony_ci *
817c2aad20Sopenharmony_ci *       { L1-D, L1-I, LLC, ITLB, DTLB, BPU, NODE } x
827c2aad20Sopenharmony_ci *       { read, write, prefetch } x
837c2aad20Sopenharmony_ci *       { accesses, misses }
847c2aad20Sopenharmony_ci */
857c2aad20Sopenharmony_cienum perf_hw_cache_id {
867c2aad20Sopenharmony_ci	PERF_COUNT_HW_CACHE_L1D			= 0,
877c2aad20Sopenharmony_ci	PERF_COUNT_HW_CACHE_L1I			= 1,
887c2aad20Sopenharmony_ci	PERF_COUNT_HW_CACHE_LL			= 2,
897c2aad20Sopenharmony_ci	PERF_COUNT_HW_CACHE_DTLB		= 3,
907c2aad20Sopenharmony_ci	PERF_COUNT_HW_CACHE_ITLB		= 4,
917c2aad20Sopenharmony_ci	PERF_COUNT_HW_CACHE_BPU			= 5,
927c2aad20Sopenharmony_ci	PERF_COUNT_HW_CACHE_NODE		= 6,
937c2aad20Sopenharmony_ci
947c2aad20Sopenharmony_ci	PERF_COUNT_HW_CACHE_MAX,		/* non-ABI */
957c2aad20Sopenharmony_ci};
967c2aad20Sopenharmony_ci
977c2aad20Sopenharmony_cienum perf_hw_cache_op_id {
987c2aad20Sopenharmony_ci	PERF_COUNT_HW_CACHE_OP_READ		= 0,
997c2aad20Sopenharmony_ci	PERF_COUNT_HW_CACHE_OP_WRITE		= 1,
1007c2aad20Sopenharmony_ci	PERF_COUNT_HW_CACHE_OP_PREFETCH		= 2,
1017c2aad20Sopenharmony_ci
1027c2aad20Sopenharmony_ci	PERF_COUNT_HW_CACHE_OP_MAX,		/* non-ABI */
1037c2aad20Sopenharmony_ci};
1047c2aad20Sopenharmony_ci
1057c2aad20Sopenharmony_cienum perf_hw_cache_op_result_id {
1067c2aad20Sopenharmony_ci	PERF_COUNT_HW_CACHE_RESULT_ACCESS	= 0,
1077c2aad20Sopenharmony_ci	PERF_COUNT_HW_CACHE_RESULT_MISS		= 1,
1087c2aad20Sopenharmony_ci
1097c2aad20Sopenharmony_ci	PERF_COUNT_HW_CACHE_RESULT_MAX,		/* non-ABI */
1107c2aad20Sopenharmony_ci};
1117c2aad20Sopenharmony_ci
1127c2aad20Sopenharmony_ci/*
1137c2aad20Sopenharmony_ci * Special "software" events provided by the kernel, even if the hardware
1147c2aad20Sopenharmony_ci * does not support performance events. These events measure various
1157c2aad20Sopenharmony_ci * physical and sw events of the kernel (and allow the profiling of them as
1167c2aad20Sopenharmony_ci * well):
1177c2aad20Sopenharmony_ci */
1187c2aad20Sopenharmony_cienum perf_sw_ids {
1197c2aad20Sopenharmony_ci	PERF_COUNT_SW_CPU_CLOCK			= 0,
1207c2aad20Sopenharmony_ci	PERF_COUNT_SW_TASK_CLOCK		= 1,
1217c2aad20Sopenharmony_ci	PERF_COUNT_SW_PAGE_FAULTS		= 2,
1227c2aad20Sopenharmony_ci	PERF_COUNT_SW_CONTEXT_SWITCHES		= 3,
1237c2aad20Sopenharmony_ci	PERF_COUNT_SW_CPU_MIGRATIONS		= 4,
1247c2aad20Sopenharmony_ci	PERF_COUNT_SW_PAGE_FAULTS_MIN		= 5,
1257c2aad20Sopenharmony_ci	PERF_COUNT_SW_PAGE_FAULTS_MAJ		= 6,
1267c2aad20Sopenharmony_ci	PERF_COUNT_SW_ALIGNMENT_FAULTS		= 7,
1277c2aad20Sopenharmony_ci	PERF_COUNT_SW_EMULATION_FAULTS		= 8,
1287c2aad20Sopenharmony_ci	PERF_COUNT_SW_DUMMY			= 9,
1297c2aad20Sopenharmony_ci	PERF_COUNT_SW_BPF_OUTPUT		= 10,
1307c2aad20Sopenharmony_ci	PERF_COUNT_SW_CGROUP_SWITCHES		= 11,
1317c2aad20Sopenharmony_ci
1327c2aad20Sopenharmony_ci	PERF_COUNT_SW_MAX,			/* non-ABI */
1337c2aad20Sopenharmony_ci};
1347c2aad20Sopenharmony_ci
1357c2aad20Sopenharmony_ci/*
1367c2aad20Sopenharmony_ci * Bits that can be set in attr.sample_type to request information
1377c2aad20Sopenharmony_ci * in the overflow packets.
1387c2aad20Sopenharmony_ci */
1397c2aad20Sopenharmony_cienum perf_event_sample_format {
1407c2aad20Sopenharmony_ci	PERF_SAMPLE_IP				= 1U << 0,
1417c2aad20Sopenharmony_ci	PERF_SAMPLE_TID				= 1U << 1,
1427c2aad20Sopenharmony_ci	PERF_SAMPLE_TIME			= 1U << 2,
1437c2aad20Sopenharmony_ci	PERF_SAMPLE_ADDR			= 1U << 3,
1447c2aad20Sopenharmony_ci	PERF_SAMPLE_READ			= 1U << 4,
1457c2aad20Sopenharmony_ci	PERF_SAMPLE_CALLCHAIN			= 1U << 5,
1467c2aad20Sopenharmony_ci	PERF_SAMPLE_ID				= 1U << 6,
1477c2aad20Sopenharmony_ci	PERF_SAMPLE_CPU				= 1U << 7,
1487c2aad20Sopenharmony_ci	PERF_SAMPLE_PERIOD			= 1U << 8,
1497c2aad20Sopenharmony_ci	PERF_SAMPLE_STREAM_ID			= 1U << 9,
1507c2aad20Sopenharmony_ci	PERF_SAMPLE_RAW				= 1U << 10,
1517c2aad20Sopenharmony_ci	PERF_SAMPLE_BRANCH_STACK		= 1U << 11,
1527c2aad20Sopenharmony_ci	PERF_SAMPLE_REGS_USER			= 1U << 12,
1537c2aad20Sopenharmony_ci	PERF_SAMPLE_STACK_USER			= 1U << 13,
1547c2aad20Sopenharmony_ci	PERF_SAMPLE_WEIGHT			= 1U << 14,
1557c2aad20Sopenharmony_ci	PERF_SAMPLE_DATA_SRC			= 1U << 15,
1567c2aad20Sopenharmony_ci	PERF_SAMPLE_IDENTIFIER			= 1U << 16,
1577c2aad20Sopenharmony_ci	PERF_SAMPLE_TRANSACTION			= 1U << 17,
1587c2aad20Sopenharmony_ci	PERF_SAMPLE_REGS_INTR			= 1U << 18,
1597c2aad20Sopenharmony_ci	PERF_SAMPLE_PHYS_ADDR			= 1U << 19,
1607c2aad20Sopenharmony_ci	PERF_SAMPLE_AUX				= 1U << 20,
1617c2aad20Sopenharmony_ci	PERF_SAMPLE_CGROUP			= 1U << 21,
1627c2aad20Sopenharmony_ci	PERF_SAMPLE_DATA_PAGE_SIZE		= 1U << 22,
1637c2aad20Sopenharmony_ci	PERF_SAMPLE_CODE_PAGE_SIZE		= 1U << 23,
1647c2aad20Sopenharmony_ci	PERF_SAMPLE_WEIGHT_STRUCT		= 1U << 24,
1657c2aad20Sopenharmony_ci
1667c2aad20Sopenharmony_ci	PERF_SAMPLE_MAX = 1U << 25,		/* non-ABI */
1677c2aad20Sopenharmony_ci};
1687c2aad20Sopenharmony_ci
1697c2aad20Sopenharmony_ci#define PERF_SAMPLE_WEIGHT_TYPE	(PERF_SAMPLE_WEIGHT | PERF_SAMPLE_WEIGHT_STRUCT)
1707c2aad20Sopenharmony_ci/*
1717c2aad20Sopenharmony_ci * values to program into branch_sample_type when PERF_SAMPLE_BRANCH is set
1727c2aad20Sopenharmony_ci *
1737c2aad20Sopenharmony_ci * If the user does not pass priv level information via branch_sample_type,
1747c2aad20Sopenharmony_ci * the kernel uses the event's priv level. Branch and event priv levels do
1757c2aad20Sopenharmony_ci * not have to match. Branch priv level is checked for permissions.
1767c2aad20Sopenharmony_ci *
1777c2aad20Sopenharmony_ci * The branch types can be combined, however BRANCH_ANY covers all types
1787c2aad20Sopenharmony_ci * of branches and therefore it supersedes all the other types.
1797c2aad20Sopenharmony_ci */
1807c2aad20Sopenharmony_cienum perf_branch_sample_type_shift {
1817c2aad20Sopenharmony_ci	PERF_SAMPLE_BRANCH_USER_SHIFT		= 0, /* user branches */
1827c2aad20Sopenharmony_ci	PERF_SAMPLE_BRANCH_KERNEL_SHIFT		= 1, /* kernel branches */
1837c2aad20Sopenharmony_ci	PERF_SAMPLE_BRANCH_HV_SHIFT		= 2, /* hypervisor branches */
1847c2aad20Sopenharmony_ci
1857c2aad20Sopenharmony_ci	PERF_SAMPLE_BRANCH_ANY_SHIFT		= 3, /* any branch types */
1867c2aad20Sopenharmony_ci	PERF_SAMPLE_BRANCH_ANY_CALL_SHIFT	= 4, /* any call branch */
1877c2aad20Sopenharmony_ci	PERF_SAMPLE_BRANCH_ANY_RETURN_SHIFT	= 5, /* any return branch */
1887c2aad20Sopenharmony_ci	PERF_SAMPLE_BRANCH_IND_CALL_SHIFT	= 6, /* indirect calls */
1897c2aad20Sopenharmony_ci	PERF_SAMPLE_BRANCH_ABORT_TX_SHIFT	= 7, /* transaction aborts */
1907c2aad20Sopenharmony_ci	PERF_SAMPLE_BRANCH_IN_TX_SHIFT		= 8, /* in transaction */
1917c2aad20Sopenharmony_ci	PERF_SAMPLE_BRANCH_NO_TX_SHIFT		= 9, /* not in transaction */
1927c2aad20Sopenharmony_ci	PERF_SAMPLE_BRANCH_COND_SHIFT		= 10, /* conditional branches */
1937c2aad20Sopenharmony_ci
1947c2aad20Sopenharmony_ci	PERF_SAMPLE_BRANCH_CALL_STACK_SHIFT	= 11, /* call/ret stack */
1957c2aad20Sopenharmony_ci	PERF_SAMPLE_BRANCH_IND_JUMP_SHIFT	= 12, /* indirect jumps */
1967c2aad20Sopenharmony_ci	PERF_SAMPLE_BRANCH_CALL_SHIFT		= 13, /* direct call */
1977c2aad20Sopenharmony_ci
1987c2aad20Sopenharmony_ci	PERF_SAMPLE_BRANCH_NO_FLAGS_SHIFT	= 14, /* no flags */
1997c2aad20Sopenharmony_ci	PERF_SAMPLE_BRANCH_NO_CYCLES_SHIFT	= 15, /* no cycles */
2007c2aad20Sopenharmony_ci
2017c2aad20Sopenharmony_ci	PERF_SAMPLE_BRANCH_TYPE_SAVE_SHIFT	= 16, /* save branch type */
2027c2aad20Sopenharmony_ci
2037c2aad20Sopenharmony_ci	PERF_SAMPLE_BRANCH_HW_INDEX_SHIFT	= 17, /* save low level index of raw branch records */
2047c2aad20Sopenharmony_ci
2057c2aad20Sopenharmony_ci	PERF_SAMPLE_BRANCH_PRIV_SAVE_SHIFT	= 18, /* save privilege mode */
2067c2aad20Sopenharmony_ci
2077c2aad20Sopenharmony_ci	PERF_SAMPLE_BRANCH_MAX_SHIFT		/* non-ABI */
2087c2aad20Sopenharmony_ci};
2097c2aad20Sopenharmony_ci
2107c2aad20Sopenharmony_cienum perf_branch_sample_type {
2117c2aad20Sopenharmony_ci	PERF_SAMPLE_BRANCH_USER		= 1U << PERF_SAMPLE_BRANCH_USER_SHIFT,
2127c2aad20Sopenharmony_ci	PERF_SAMPLE_BRANCH_KERNEL	= 1U << PERF_SAMPLE_BRANCH_KERNEL_SHIFT,
2137c2aad20Sopenharmony_ci	PERF_SAMPLE_BRANCH_HV		= 1U << PERF_SAMPLE_BRANCH_HV_SHIFT,
2147c2aad20Sopenharmony_ci
2157c2aad20Sopenharmony_ci	PERF_SAMPLE_BRANCH_ANY		= 1U << PERF_SAMPLE_BRANCH_ANY_SHIFT,
2167c2aad20Sopenharmony_ci	PERF_SAMPLE_BRANCH_ANY_CALL	= 1U << PERF_SAMPLE_BRANCH_ANY_CALL_SHIFT,
2177c2aad20Sopenharmony_ci	PERF_SAMPLE_BRANCH_ANY_RETURN	= 1U << PERF_SAMPLE_BRANCH_ANY_RETURN_SHIFT,
2187c2aad20Sopenharmony_ci	PERF_SAMPLE_BRANCH_IND_CALL	= 1U << PERF_SAMPLE_BRANCH_IND_CALL_SHIFT,
2197c2aad20Sopenharmony_ci	PERF_SAMPLE_BRANCH_ABORT_TX	= 1U << PERF_SAMPLE_BRANCH_ABORT_TX_SHIFT,
2207c2aad20Sopenharmony_ci	PERF_SAMPLE_BRANCH_IN_TX	= 1U << PERF_SAMPLE_BRANCH_IN_TX_SHIFT,
2217c2aad20Sopenharmony_ci	PERF_SAMPLE_BRANCH_NO_TX	= 1U << PERF_SAMPLE_BRANCH_NO_TX_SHIFT,
2227c2aad20Sopenharmony_ci	PERF_SAMPLE_BRANCH_COND		= 1U << PERF_SAMPLE_BRANCH_COND_SHIFT,
2237c2aad20Sopenharmony_ci
2247c2aad20Sopenharmony_ci	PERF_SAMPLE_BRANCH_CALL_STACK	= 1U << PERF_SAMPLE_BRANCH_CALL_STACK_SHIFT,
2257c2aad20Sopenharmony_ci	PERF_SAMPLE_BRANCH_IND_JUMP	= 1U << PERF_SAMPLE_BRANCH_IND_JUMP_SHIFT,
2267c2aad20Sopenharmony_ci	PERF_SAMPLE_BRANCH_CALL		= 1U << PERF_SAMPLE_BRANCH_CALL_SHIFT,
2277c2aad20Sopenharmony_ci
2287c2aad20Sopenharmony_ci	PERF_SAMPLE_BRANCH_NO_FLAGS	= 1U << PERF_SAMPLE_BRANCH_NO_FLAGS_SHIFT,
2297c2aad20Sopenharmony_ci	PERF_SAMPLE_BRANCH_NO_CYCLES	= 1U << PERF_SAMPLE_BRANCH_NO_CYCLES_SHIFT,
2307c2aad20Sopenharmony_ci
2317c2aad20Sopenharmony_ci	PERF_SAMPLE_BRANCH_TYPE_SAVE	=
2327c2aad20Sopenharmony_ci		1U << PERF_SAMPLE_BRANCH_TYPE_SAVE_SHIFT,
2337c2aad20Sopenharmony_ci
2347c2aad20Sopenharmony_ci	PERF_SAMPLE_BRANCH_HW_INDEX	= 1U << PERF_SAMPLE_BRANCH_HW_INDEX_SHIFT,
2357c2aad20Sopenharmony_ci
2367c2aad20Sopenharmony_ci	PERF_SAMPLE_BRANCH_PRIV_SAVE	= 1U << PERF_SAMPLE_BRANCH_PRIV_SAVE_SHIFT,
2377c2aad20Sopenharmony_ci
2387c2aad20Sopenharmony_ci	PERF_SAMPLE_BRANCH_MAX		= 1U << PERF_SAMPLE_BRANCH_MAX_SHIFT,
2397c2aad20Sopenharmony_ci};
2407c2aad20Sopenharmony_ci
2417c2aad20Sopenharmony_ci/*
2427c2aad20Sopenharmony_ci * Common flow change classification
2437c2aad20Sopenharmony_ci */
2447c2aad20Sopenharmony_cienum {
2457c2aad20Sopenharmony_ci	PERF_BR_UNKNOWN		= 0,	/* unknown */
2467c2aad20Sopenharmony_ci	PERF_BR_COND		= 1,	/* conditional */
2477c2aad20Sopenharmony_ci	PERF_BR_UNCOND		= 2,	/* unconditional  */
2487c2aad20Sopenharmony_ci	PERF_BR_IND		= 3,	/* indirect */
2497c2aad20Sopenharmony_ci	PERF_BR_CALL		= 4,	/* function call */
2507c2aad20Sopenharmony_ci	PERF_BR_IND_CALL	= 5,	/* indirect function call */
2517c2aad20Sopenharmony_ci	PERF_BR_RET		= 6,	/* function return */
2527c2aad20Sopenharmony_ci	PERF_BR_SYSCALL		= 7,	/* syscall */
2537c2aad20Sopenharmony_ci	PERF_BR_SYSRET		= 8,	/* syscall return */
2547c2aad20Sopenharmony_ci	PERF_BR_COND_CALL	= 9,	/* conditional function call */
2557c2aad20Sopenharmony_ci	PERF_BR_COND_RET	= 10,	/* conditional function return */
2567c2aad20Sopenharmony_ci	PERF_BR_ERET		= 11,	/* exception return */
2577c2aad20Sopenharmony_ci	PERF_BR_IRQ		= 12,	/* irq */
2587c2aad20Sopenharmony_ci	PERF_BR_SERROR		= 13,	/* system error */
2597c2aad20Sopenharmony_ci	PERF_BR_NO_TX		= 14,	/* not in transaction */
2607c2aad20Sopenharmony_ci	PERF_BR_EXTEND_ABI	= 15,	/* extend ABI */
2617c2aad20Sopenharmony_ci	PERF_BR_MAX,
2627c2aad20Sopenharmony_ci};
2637c2aad20Sopenharmony_ci
2647c2aad20Sopenharmony_ci/*
2657c2aad20Sopenharmony_ci * Common branch speculation outcome classification
2667c2aad20Sopenharmony_ci */
2677c2aad20Sopenharmony_cienum {
2687c2aad20Sopenharmony_ci	PERF_BR_SPEC_NA			= 0,	/* Not available */
2697c2aad20Sopenharmony_ci	PERF_BR_SPEC_WRONG_PATH		= 1,	/* Speculative but on wrong path */
2707c2aad20Sopenharmony_ci	PERF_BR_NON_SPEC_CORRECT_PATH	= 2,	/* Non-speculative but on correct path */
2717c2aad20Sopenharmony_ci	PERF_BR_SPEC_CORRECT_PATH	= 3,	/* Speculative and on correct path */
2727c2aad20Sopenharmony_ci	PERF_BR_SPEC_MAX,
2737c2aad20Sopenharmony_ci};
2747c2aad20Sopenharmony_ci
2757c2aad20Sopenharmony_cienum {
2767c2aad20Sopenharmony_ci	PERF_BR_NEW_FAULT_ALGN		= 0,    /* Alignment fault */
2777c2aad20Sopenharmony_ci	PERF_BR_NEW_FAULT_DATA		= 1,    /* Data fault */
2787c2aad20Sopenharmony_ci	PERF_BR_NEW_FAULT_INST		= 2,    /* Inst fault */
2797c2aad20Sopenharmony_ci	PERF_BR_NEW_ARCH_1		= 3,    /* Architecture specific */
2807c2aad20Sopenharmony_ci	PERF_BR_NEW_ARCH_2		= 4,    /* Architecture specific */
2817c2aad20Sopenharmony_ci	PERF_BR_NEW_ARCH_3		= 5,    /* Architecture specific */
2827c2aad20Sopenharmony_ci	PERF_BR_NEW_ARCH_4		= 6,    /* Architecture specific */
2837c2aad20Sopenharmony_ci	PERF_BR_NEW_ARCH_5		= 7,    /* Architecture specific */
2847c2aad20Sopenharmony_ci	PERF_BR_NEW_MAX,
2857c2aad20Sopenharmony_ci};
2867c2aad20Sopenharmony_ci
2877c2aad20Sopenharmony_cienum {
2887c2aad20Sopenharmony_ci	PERF_BR_PRIV_UNKNOWN	= 0,
2897c2aad20Sopenharmony_ci	PERF_BR_PRIV_USER	= 1,
2907c2aad20Sopenharmony_ci	PERF_BR_PRIV_KERNEL	= 2,
2917c2aad20Sopenharmony_ci	PERF_BR_PRIV_HV		= 3,
2927c2aad20Sopenharmony_ci};
2937c2aad20Sopenharmony_ci
2947c2aad20Sopenharmony_ci#define PERF_BR_ARM64_FIQ		PERF_BR_NEW_ARCH_1
2957c2aad20Sopenharmony_ci#define PERF_BR_ARM64_DEBUG_HALT	PERF_BR_NEW_ARCH_2
2967c2aad20Sopenharmony_ci#define PERF_BR_ARM64_DEBUG_EXIT	PERF_BR_NEW_ARCH_3
2977c2aad20Sopenharmony_ci#define PERF_BR_ARM64_DEBUG_INST	PERF_BR_NEW_ARCH_4
2987c2aad20Sopenharmony_ci#define PERF_BR_ARM64_DEBUG_DATA	PERF_BR_NEW_ARCH_5
2997c2aad20Sopenharmony_ci
3007c2aad20Sopenharmony_ci#define PERF_SAMPLE_BRANCH_PLM_ALL \
3017c2aad20Sopenharmony_ci	(PERF_SAMPLE_BRANCH_USER|\
3027c2aad20Sopenharmony_ci	 PERF_SAMPLE_BRANCH_KERNEL|\
3037c2aad20Sopenharmony_ci	 PERF_SAMPLE_BRANCH_HV)
3047c2aad20Sopenharmony_ci
3057c2aad20Sopenharmony_ci/*
3067c2aad20Sopenharmony_ci * Values to determine ABI of the registers dump.
3077c2aad20Sopenharmony_ci */
3087c2aad20Sopenharmony_cienum perf_sample_regs_abi {
3097c2aad20Sopenharmony_ci	PERF_SAMPLE_REGS_ABI_NONE	= 0,
3107c2aad20Sopenharmony_ci	PERF_SAMPLE_REGS_ABI_32		= 1,
3117c2aad20Sopenharmony_ci	PERF_SAMPLE_REGS_ABI_64		= 2,
3127c2aad20Sopenharmony_ci};
3137c2aad20Sopenharmony_ci
3147c2aad20Sopenharmony_ci/*
3157c2aad20Sopenharmony_ci * Values for the memory transaction event qualifier, mostly for
3167c2aad20Sopenharmony_ci * abort events. Multiple bits can be set.
3177c2aad20Sopenharmony_ci */
3187c2aad20Sopenharmony_cienum {
3197c2aad20Sopenharmony_ci	PERF_TXN_ELISION        = (1 << 0), /* From elision */
3207c2aad20Sopenharmony_ci	PERF_TXN_TRANSACTION    = (1 << 1), /* From transaction */
3217c2aad20Sopenharmony_ci	PERF_TXN_SYNC           = (1 << 2), /* Instruction is related */
3227c2aad20Sopenharmony_ci	PERF_TXN_ASYNC          = (1 << 3), /* Instruction not related */
3237c2aad20Sopenharmony_ci	PERF_TXN_RETRY          = (1 << 4), /* Retry possible */
3247c2aad20Sopenharmony_ci	PERF_TXN_CONFLICT       = (1 << 5), /* Conflict abort */
3257c2aad20Sopenharmony_ci	PERF_TXN_CAPACITY_WRITE = (1 << 6), /* Capacity write abort */
3267c2aad20Sopenharmony_ci	PERF_TXN_CAPACITY_READ  = (1 << 7), /* Capacity read abort */
3277c2aad20Sopenharmony_ci
3287c2aad20Sopenharmony_ci	PERF_TXN_MAX	        = (1 << 8), /* non-ABI */
3297c2aad20Sopenharmony_ci
3307c2aad20Sopenharmony_ci	/* bits 32..63 are reserved for the abort code */
3317c2aad20Sopenharmony_ci
3327c2aad20Sopenharmony_ci	PERF_TXN_ABORT_MASK  = (0xffffffffULL << 32),
3337c2aad20Sopenharmony_ci	PERF_TXN_ABORT_SHIFT = 32,
3347c2aad20Sopenharmony_ci};
3357c2aad20Sopenharmony_ci
3367c2aad20Sopenharmony_ci/*
3377c2aad20Sopenharmony_ci * The format of the data returned by read() on a perf event fd,
3387c2aad20Sopenharmony_ci * as specified by attr.read_format:
3397c2aad20Sopenharmony_ci *
3407c2aad20Sopenharmony_ci * struct read_format {
3417c2aad20Sopenharmony_ci *	{ u64		value;
3427c2aad20Sopenharmony_ci *	  { u64		time_enabled; } && PERF_FORMAT_TOTAL_TIME_ENABLED
3437c2aad20Sopenharmony_ci *	  { u64		time_running; } && PERF_FORMAT_TOTAL_TIME_RUNNING
3447c2aad20Sopenharmony_ci *	  { u64		id;           } && PERF_FORMAT_ID
3457c2aad20Sopenharmony_ci *	  { u64		lost;         } && PERF_FORMAT_LOST
3467c2aad20Sopenharmony_ci *	} && !PERF_FORMAT_GROUP
3477c2aad20Sopenharmony_ci *
3487c2aad20Sopenharmony_ci *	{ u64		nr;
3497c2aad20Sopenharmony_ci *	  { u64		time_enabled; } && PERF_FORMAT_TOTAL_TIME_ENABLED
3507c2aad20Sopenharmony_ci *	  { u64		time_running; } && PERF_FORMAT_TOTAL_TIME_RUNNING
3517c2aad20Sopenharmony_ci *	  { u64		value;
3527c2aad20Sopenharmony_ci *	    { u64	id;           } && PERF_FORMAT_ID
3537c2aad20Sopenharmony_ci *	    { u64	lost;         } && PERF_FORMAT_LOST
3547c2aad20Sopenharmony_ci *	  }		cntr[nr];
3557c2aad20Sopenharmony_ci *	} && PERF_FORMAT_GROUP
3567c2aad20Sopenharmony_ci * };
3577c2aad20Sopenharmony_ci */
3587c2aad20Sopenharmony_cienum perf_event_read_format {
3597c2aad20Sopenharmony_ci	PERF_FORMAT_TOTAL_TIME_ENABLED		= 1U << 0,
3607c2aad20Sopenharmony_ci	PERF_FORMAT_TOTAL_TIME_RUNNING		= 1U << 1,
3617c2aad20Sopenharmony_ci	PERF_FORMAT_ID				= 1U << 2,
3627c2aad20Sopenharmony_ci	PERF_FORMAT_GROUP			= 1U << 3,
3637c2aad20Sopenharmony_ci	PERF_FORMAT_LOST			= 1U << 4,
3647c2aad20Sopenharmony_ci
3657c2aad20Sopenharmony_ci	PERF_FORMAT_MAX = 1U << 5,		/* non-ABI */
3667c2aad20Sopenharmony_ci};
3677c2aad20Sopenharmony_ci
3687c2aad20Sopenharmony_ci#define PERF_ATTR_SIZE_VER0	64	/* sizeof first published struct */
3697c2aad20Sopenharmony_ci#define PERF_ATTR_SIZE_VER1	72	/* add: config2 */
3707c2aad20Sopenharmony_ci#define PERF_ATTR_SIZE_VER2	80	/* add: branch_sample_type */
3717c2aad20Sopenharmony_ci#define PERF_ATTR_SIZE_VER3	96	/* add: sample_regs_user */
3727c2aad20Sopenharmony_ci					/* add: sample_stack_user */
3737c2aad20Sopenharmony_ci#define PERF_ATTR_SIZE_VER4	104	/* add: sample_regs_intr */
3747c2aad20Sopenharmony_ci#define PERF_ATTR_SIZE_VER5	112	/* add: aux_watermark */
3757c2aad20Sopenharmony_ci#define PERF_ATTR_SIZE_VER6	120	/* add: aux_sample_size */
3767c2aad20Sopenharmony_ci#define PERF_ATTR_SIZE_VER7	128	/* add: sig_data */
3777c2aad20Sopenharmony_ci#define PERF_ATTR_SIZE_VER8	136	/* add: config3 */
3787c2aad20Sopenharmony_ci
3797c2aad20Sopenharmony_ci/*
3807c2aad20Sopenharmony_ci * Hardware event_id to monitor via a performance monitoring event:
3817c2aad20Sopenharmony_ci *
3827c2aad20Sopenharmony_ci * @sample_max_stack: Max number of frame pointers in a callchain,
3837c2aad20Sopenharmony_ci *		      should be < /proc/sys/kernel/perf_event_max_stack
3847c2aad20Sopenharmony_ci */
3857c2aad20Sopenharmony_cistruct perf_event_attr {
3867c2aad20Sopenharmony_ci
3877c2aad20Sopenharmony_ci	/*
3887c2aad20Sopenharmony_ci	 * Major type: hardware/software/tracepoint/etc.
3897c2aad20Sopenharmony_ci	 */
3907c2aad20Sopenharmony_ci	__u32			type;
3917c2aad20Sopenharmony_ci
3927c2aad20Sopenharmony_ci	/*
3937c2aad20Sopenharmony_ci	 * Size of the attr structure, for fwd/bwd compat.
3947c2aad20Sopenharmony_ci	 */
3957c2aad20Sopenharmony_ci	__u32			size;
3967c2aad20Sopenharmony_ci
3977c2aad20Sopenharmony_ci	/*
3987c2aad20Sopenharmony_ci	 * Type specific configuration information.
3997c2aad20Sopenharmony_ci	 */
4007c2aad20Sopenharmony_ci	__u64			config;
4017c2aad20Sopenharmony_ci
4027c2aad20Sopenharmony_ci	union {
4037c2aad20Sopenharmony_ci		__u64		sample_period;
4047c2aad20Sopenharmony_ci		__u64		sample_freq;
4057c2aad20Sopenharmony_ci	};
4067c2aad20Sopenharmony_ci
4077c2aad20Sopenharmony_ci	__u64			sample_type;
4087c2aad20Sopenharmony_ci	__u64			read_format;
4097c2aad20Sopenharmony_ci
4107c2aad20Sopenharmony_ci	__u64			disabled       :  1, /* off by default        */
4117c2aad20Sopenharmony_ci				inherit	       :  1, /* children inherit it   */
4127c2aad20Sopenharmony_ci				pinned	       :  1, /* must always be on PMU */
4137c2aad20Sopenharmony_ci				exclusive      :  1, /* only group on PMU     */
4147c2aad20Sopenharmony_ci				exclude_user   :  1, /* don't count user      */
4157c2aad20Sopenharmony_ci				exclude_kernel :  1, /* ditto kernel          */
4167c2aad20Sopenharmony_ci				exclude_hv     :  1, /* ditto hypervisor      */
4177c2aad20Sopenharmony_ci				exclude_idle   :  1, /* don't count when idle */
4187c2aad20Sopenharmony_ci				mmap           :  1, /* include mmap data     */
4197c2aad20Sopenharmony_ci				comm	       :  1, /* include comm data     */
4207c2aad20Sopenharmony_ci				freq           :  1, /* use freq, not period  */
4217c2aad20Sopenharmony_ci				inherit_stat   :  1, /* per task counts       */
4227c2aad20Sopenharmony_ci				enable_on_exec :  1, /* next exec enables     */
4237c2aad20Sopenharmony_ci				task           :  1, /* trace fork/exit       */
4247c2aad20Sopenharmony_ci				watermark      :  1, /* wakeup_watermark      */
4257c2aad20Sopenharmony_ci				/*
4267c2aad20Sopenharmony_ci				 * precise_ip:
4277c2aad20Sopenharmony_ci				 *
4287c2aad20Sopenharmony_ci				 *  0 - SAMPLE_IP can have arbitrary skid
4297c2aad20Sopenharmony_ci				 *  1 - SAMPLE_IP must have constant skid
4307c2aad20Sopenharmony_ci				 *  2 - SAMPLE_IP requested to have 0 skid
4317c2aad20Sopenharmony_ci				 *  3 - SAMPLE_IP must have 0 skid
4327c2aad20Sopenharmony_ci				 *
4337c2aad20Sopenharmony_ci				 *  See also PERF_RECORD_MISC_EXACT_IP
4347c2aad20Sopenharmony_ci				 */
4357c2aad20Sopenharmony_ci				precise_ip     :  2, /* skid constraint       */
4367c2aad20Sopenharmony_ci				mmap_data      :  1, /* non-exec mmap data    */
4377c2aad20Sopenharmony_ci				sample_id_all  :  1, /* sample_type all events */
4387c2aad20Sopenharmony_ci
4397c2aad20Sopenharmony_ci				exclude_host   :  1, /* don't count in host   */
4407c2aad20Sopenharmony_ci				exclude_guest  :  1, /* don't count in guest  */
4417c2aad20Sopenharmony_ci
4427c2aad20Sopenharmony_ci				exclude_callchain_kernel : 1, /* exclude kernel callchains */
4437c2aad20Sopenharmony_ci				exclude_callchain_user   : 1, /* exclude user callchains */
4447c2aad20Sopenharmony_ci				mmap2          :  1, /* include mmap with inode data     */
4457c2aad20Sopenharmony_ci				comm_exec      :  1, /* flag comm events that are due to an exec */
4467c2aad20Sopenharmony_ci				use_clockid    :  1, /* use @clockid for time fields */
4477c2aad20Sopenharmony_ci				context_switch :  1, /* context switch data */
4487c2aad20Sopenharmony_ci				write_backward :  1, /* Write ring buffer from end to beginning */
4497c2aad20Sopenharmony_ci				namespaces     :  1, /* include namespaces data */
4507c2aad20Sopenharmony_ci				ksymbol        :  1, /* include ksymbol events */
4517c2aad20Sopenharmony_ci				bpf_event      :  1, /* include bpf events */
4527c2aad20Sopenharmony_ci				aux_output     :  1, /* generate AUX records instead of events */
4537c2aad20Sopenharmony_ci				cgroup         :  1, /* include cgroup events */
4547c2aad20Sopenharmony_ci				text_poke      :  1, /* include text poke events */
4557c2aad20Sopenharmony_ci				build_id       :  1, /* use build id in mmap2 events */
4567c2aad20Sopenharmony_ci				inherit_thread :  1, /* children only inherit if cloned with CLONE_THREAD */
4577c2aad20Sopenharmony_ci				remove_on_exec :  1, /* event is removed from task on exec */
4587c2aad20Sopenharmony_ci				sigtrap        :  1, /* send synchronous SIGTRAP on event */
4597c2aad20Sopenharmony_ci				__reserved_1   : 26;
4607c2aad20Sopenharmony_ci
4617c2aad20Sopenharmony_ci	union {
4627c2aad20Sopenharmony_ci		__u32		wakeup_events;	  /* wakeup every n events */
4637c2aad20Sopenharmony_ci		__u32		wakeup_watermark; /* bytes before wakeup   */
4647c2aad20Sopenharmony_ci	};
4657c2aad20Sopenharmony_ci
4667c2aad20Sopenharmony_ci	__u32			bp_type;
4677c2aad20Sopenharmony_ci	union {
4687c2aad20Sopenharmony_ci		__u64		bp_addr;
4697c2aad20Sopenharmony_ci		__u64		kprobe_func; /* for perf_kprobe */
4707c2aad20Sopenharmony_ci		__u64		uprobe_path; /* for perf_uprobe */
4717c2aad20Sopenharmony_ci		__u64		config1; /* extension of config */
4727c2aad20Sopenharmony_ci	};
4737c2aad20Sopenharmony_ci	union {
4747c2aad20Sopenharmony_ci		__u64		bp_len;
4757c2aad20Sopenharmony_ci		__u64		kprobe_addr; /* when kprobe_func == NULL */
4767c2aad20Sopenharmony_ci		__u64		probe_offset; /* for perf_[k,u]probe */
4777c2aad20Sopenharmony_ci		__u64		config2; /* extension of config1 */
4787c2aad20Sopenharmony_ci	};
4797c2aad20Sopenharmony_ci	__u64	branch_sample_type; /* enum perf_branch_sample_type */
4807c2aad20Sopenharmony_ci
4817c2aad20Sopenharmony_ci	/*
4827c2aad20Sopenharmony_ci	 * Defines set of user regs to dump on samples.
4837c2aad20Sopenharmony_ci	 * See asm/perf_regs.h for details.
4847c2aad20Sopenharmony_ci	 */
4857c2aad20Sopenharmony_ci	__u64	sample_regs_user;
4867c2aad20Sopenharmony_ci
4877c2aad20Sopenharmony_ci	/*
4887c2aad20Sopenharmony_ci	 * Defines size of the user stack to dump on samples.
4897c2aad20Sopenharmony_ci	 */
4907c2aad20Sopenharmony_ci	__u32	sample_stack_user;
4917c2aad20Sopenharmony_ci
4927c2aad20Sopenharmony_ci	__s32	clockid;
4937c2aad20Sopenharmony_ci	/*
4947c2aad20Sopenharmony_ci	 * Defines set of regs to dump for each sample
4957c2aad20Sopenharmony_ci	 * state captured on:
4967c2aad20Sopenharmony_ci	 *  - precise = 0: PMU interrupt
4977c2aad20Sopenharmony_ci	 *  - precise > 0: sampled instruction
4987c2aad20Sopenharmony_ci	 *
4997c2aad20Sopenharmony_ci	 * See asm/perf_regs.h for details.
5007c2aad20Sopenharmony_ci	 */
5017c2aad20Sopenharmony_ci	__u64	sample_regs_intr;
5027c2aad20Sopenharmony_ci
5037c2aad20Sopenharmony_ci	/*
5047c2aad20Sopenharmony_ci	 * Wakeup watermark for AUX area
5057c2aad20Sopenharmony_ci	 */
5067c2aad20Sopenharmony_ci	__u32	aux_watermark;
5077c2aad20Sopenharmony_ci	__u16	sample_max_stack;
5087c2aad20Sopenharmony_ci	__u16	__reserved_2;
5097c2aad20Sopenharmony_ci	__u32	aux_sample_size;
5107c2aad20Sopenharmony_ci	__u32	__reserved_3;
5117c2aad20Sopenharmony_ci
5127c2aad20Sopenharmony_ci	/*
5137c2aad20Sopenharmony_ci	 * User provided data if sigtrap=1, passed back to user via
5147c2aad20Sopenharmony_ci	 * siginfo_t::si_perf_data, e.g. to permit user to identify the event.
5157c2aad20Sopenharmony_ci	 * Note, siginfo_t::si_perf_data is long-sized, and sig_data will be
5167c2aad20Sopenharmony_ci	 * truncated accordingly on 32 bit architectures.
5177c2aad20Sopenharmony_ci	 */
5187c2aad20Sopenharmony_ci	__u64	sig_data;
5197c2aad20Sopenharmony_ci
5207c2aad20Sopenharmony_ci	__u64	config3; /* extension of config2 */
5217c2aad20Sopenharmony_ci};
5227c2aad20Sopenharmony_ci
5237c2aad20Sopenharmony_ci/*
5247c2aad20Sopenharmony_ci * Structure used by below PERF_EVENT_IOC_QUERY_BPF command
5257c2aad20Sopenharmony_ci * to query bpf programs attached to the same perf tracepoint
5267c2aad20Sopenharmony_ci * as the given perf event.
5277c2aad20Sopenharmony_ci */
5287c2aad20Sopenharmony_cistruct perf_event_query_bpf {
5297c2aad20Sopenharmony_ci	/*
5307c2aad20Sopenharmony_ci	 * The below ids array length
5317c2aad20Sopenharmony_ci	 */
5327c2aad20Sopenharmony_ci	__u32	ids_len;
5337c2aad20Sopenharmony_ci	/*
5347c2aad20Sopenharmony_ci	 * Set by the kernel to indicate the number of
5357c2aad20Sopenharmony_ci	 * available programs
5367c2aad20Sopenharmony_ci	 */
5377c2aad20Sopenharmony_ci	__u32	prog_cnt;
5387c2aad20Sopenharmony_ci	/*
5397c2aad20Sopenharmony_ci	 * User provided buffer to store program ids
5407c2aad20Sopenharmony_ci	 */
5417c2aad20Sopenharmony_ci	__u32	ids[];
5427c2aad20Sopenharmony_ci};
5437c2aad20Sopenharmony_ci
5447c2aad20Sopenharmony_ci/*
5457c2aad20Sopenharmony_ci * Ioctls that can be done on a perf event fd:
5467c2aad20Sopenharmony_ci */
5477c2aad20Sopenharmony_ci#define PERF_EVENT_IOC_ENABLE			_IO ('$', 0)
5487c2aad20Sopenharmony_ci#define PERF_EVENT_IOC_DISABLE			_IO ('$', 1)
5497c2aad20Sopenharmony_ci#define PERF_EVENT_IOC_REFRESH			_IO ('$', 2)
5507c2aad20Sopenharmony_ci#define PERF_EVENT_IOC_RESET			_IO ('$', 3)
5517c2aad20Sopenharmony_ci#define PERF_EVENT_IOC_PERIOD			_IOW('$', 4, __u64)
5527c2aad20Sopenharmony_ci#define PERF_EVENT_IOC_SET_OUTPUT		_IO ('$', 5)
5537c2aad20Sopenharmony_ci#define PERF_EVENT_IOC_SET_FILTER		_IOW('$', 6, char *)
5547c2aad20Sopenharmony_ci#define PERF_EVENT_IOC_ID			_IOR('$', 7, __u64 *)
5557c2aad20Sopenharmony_ci#define PERF_EVENT_IOC_SET_BPF			_IOW('$', 8, __u32)
5567c2aad20Sopenharmony_ci#define PERF_EVENT_IOC_PAUSE_OUTPUT		_IOW('$', 9, __u32)
5577c2aad20Sopenharmony_ci#define PERF_EVENT_IOC_QUERY_BPF		_IOWR('$', 10, struct perf_event_query_bpf *)
5587c2aad20Sopenharmony_ci#define PERF_EVENT_IOC_MODIFY_ATTRIBUTES	_IOW('$', 11, struct perf_event_attr *)
5597c2aad20Sopenharmony_ci
5607c2aad20Sopenharmony_cienum perf_event_ioc_flags {
5617c2aad20Sopenharmony_ci	PERF_IOC_FLAG_GROUP		= 1U << 0,
5627c2aad20Sopenharmony_ci};
5637c2aad20Sopenharmony_ci
5647c2aad20Sopenharmony_ci/*
5657c2aad20Sopenharmony_ci * Structure of the page that can be mapped via mmap
5667c2aad20Sopenharmony_ci */
5677c2aad20Sopenharmony_cistruct perf_event_mmap_page {
5687c2aad20Sopenharmony_ci	__u32	version;		/* version number of this structure */
5697c2aad20Sopenharmony_ci	__u32	compat_version;		/* lowest version this is compat with */
5707c2aad20Sopenharmony_ci
5717c2aad20Sopenharmony_ci	/*
5727c2aad20Sopenharmony_ci	 * Bits needed to read the hw events in user-space.
5737c2aad20Sopenharmony_ci	 *
5747c2aad20Sopenharmony_ci	 *   u32 seq, time_mult, time_shift, index, width;
5757c2aad20Sopenharmony_ci	 *   u64 count, enabled, running;
5767c2aad20Sopenharmony_ci	 *   u64 cyc, time_offset;
5777c2aad20Sopenharmony_ci	 *   s64 pmc = 0;
5787c2aad20Sopenharmony_ci	 *
5797c2aad20Sopenharmony_ci	 *   do {
5807c2aad20Sopenharmony_ci	 *     seq = pc->lock;
5817c2aad20Sopenharmony_ci	 *     barrier()
5827c2aad20Sopenharmony_ci	 *
5837c2aad20Sopenharmony_ci	 *     enabled = pc->time_enabled;
5847c2aad20Sopenharmony_ci	 *     running = pc->time_running;
5857c2aad20Sopenharmony_ci	 *
5867c2aad20Sopenharmony_ci	 *     if (pc->cap_usr_time && enabled != running) {
5877c2aad20Sopenharmony_ci	 *       cyc = rdtsc();
5887c2aad20Sopenharmony_ci	 *       time_offset = pc->time_offset;
5897c2aad20Sopenharmony_ci	 *       time_mult   = pc->time_mult;
5907c2aad20Sopenharmony_ci	 *       time_shift  = pc->time_shift;
5917c2aad20Sopenharmony_ci	 *     }
5927c2aad20Sopenharmony_ci	 *
5937c2aad20Sopenharmony_ci	 *     index = pc->index;
5947c2aad20Sopenharmony_ci	 *     count = pc->offset;
5957c2aad20Sopenharmony_ci	 *     if (pc->cap_user_rdpmc && index) {
5967c2aad20Sopenharmony_ci	 *       width = pc->pmc_width;
5977c2aad20Sopenharmony_ci	 *       pmc = rdpmc(index - 1);
5987c2aad20Sopenharmony_ci	 *     }
5997c2aad20Sopenharmony_ci	 *
6007c2aad20Sopenharmony_ci	 *     barrier();
6017c2aad20Sopenharmony_ci	 *   } while (pc->lock != seq);
6027c2aad20Sopenharmony_ci	 *
6037c2aad20Sopenharmony_ci	 * NOTE: for obvious reason this only works on self-monitoring
6047c2aad20Sopenharmony_ci	 *       processes.
6057c2aad20Sopenharmony_ci	 */
6067c2aad20Sopenharmony_ci	__u32	lock;			/* seqlock for synchronization */
6077c2aad20Sopenharmony_ci	__u32	index;			/* hardware event identifier */
6087c2aad20Sopenharmony_ci	__s64	offset;			/* add to hardware event value */
6097c2aad20Sopenharmony_ci	__u64	time_enabled;		/* time event active */
6107c2aad20Sopenharmony_ci	__u64	time_running;		/* time event on cpu */
6117c2aad20Sopenharmony_ci	union {
6127c2aad20Sopenharmony_ci		__u64	capabilities;
6137c2aad20Sopenharmony_ci		struct {
6147c2aad20Sopenharmony_ci			__u64	cap_bit0		: 1, /* Always 0, deprecated, see commit 860f085b74e9 */
6157c2aad20Sopenharmony_ci				cap_bit0_is_deprecated	: 1, /* Always 1, signals that bit 0 is zero */
6167c2aad20Sopenharmony_ci
6177c2aad20Sopenharmony_ci				cap_user_rdpmc		: 1, /* The RDPMC instruction can be used to read counts */
6187c2aad20Sopenharmony_ci				cap_user_time		: 1, /* The time_{shift,mult,offset} fields are used */
6197c2aad20Sopenharmony_ci				cap_user_time_zero	: 1, /* The time_zero field is used */
6207c2aad20Sopenharmony_ci				cap_user_time_short	: 1, /* the time_{cycle,mask} fields are used */
6217c2aad20Sopenharmony_ci				cap_____res		: 58;
6227c2aad20Sopenharmony_ci		};
6237c2aad20Sopenharmony_ci	};
6247c2aad20Sopenharmony_ci
6257c2aad20Sopenharmony_ci	/*
6267c2aad20Sopenharmony_ci	 * If cap_user_rdpmc this field provides the bit-width of the value
6277c2aad20Sopenharmony_ci	 * read using the rdpmc() or equivalent instruction. This can be used
6287c2aad20Sopenharmony_ci	 * to sign extend the result like:
6297c2aad20Sopenharmony_ci	 *
6307c2aad20Sopenharmony_ci	 *   pmc <<= 64 - width;
6317c2aad20Sopenharmony_ci	 *   pmc >>= 64 - width; // signed shift right
6327c2aad20Sopenharmony_ci	 *   count += pmc;
6337c2aad20Sopenharmony_ci	 */
6347c2aad20Sopenharmony_ci	__u16	pmc_width;
6357c2aad20Sopenharmony_ci
6367c2aad20Sopenharmony_ci	/*
6377c2aad20Sopenharmony_ci	 * If cap_usr_time the below fields can be used to compute the time
6387c2aad20Sopenharmony_ci	 * delta since time_enabled (in ns) using rdtsc or similar.
6397c2aad20Sopenharmony_ci	 *
6407c2aad20Sopenharmony_ci	 *   u64 quot, rem;
6417c2aad20Sopenharmony_ci	 *   u64 delta;
6427c2aad20Sopenharmony_ci	 *
6437c2aad20Sopenharmony_ci	 *   quot = (cyc >> time_shift);
6447c2aad20Sopenharmony_ci	 *   rem = cyc & (((u64)1 << time_shift) - 1);
6457c2aad20Sopenharmony_ci	 *   delta = time_offset + quot * time_mult +
6467c2aad20Sopenharmony_ci	 *              ((rem * time_mult) >> time_shift);
6477c2aad20Sopenharmony_ci	 *
6487c2aad20Sopenharmony_ci	 * Where time_offset,time_mult,time_shift and cyc are read in the
6497c2aad20Sopenharmony_ci	 * seqcount loop described above. This delta can then be added to
6507c2aad20Sopenharmony_ci	 * enabled and possible running (if index), improving the scaling:
6517c2aad20Sopenharmony_ci	 *
6527c2aad20Sopenharmony_ci	 *   enabled += delta;
6537c2aad20Sopenharmony_ci	 *   if (index)
6547c2aad20Sopenharmony_ci	 *     running += delta;
6557c2aad20Sopenharmony_ci	 *
6567c2aad20Sopenharmony_ci	 *   quot = count / running;
6577c2aad20Sopenharmony_ci	 *   rem  = count % running;
6587c2aad20Sopenharmony_ci	 *   count = quot * enabled + (rem * enabled) / running;
6597c2aad20Sopenharmony_ci	 */
6607c2aad20Sopenharmony_ci	__u16	time_shift;
6617c2aad20Sopenharmony_ci	__u32	time_mult;
6627c2aad20Sopenharmony_ci	__u64	time_offset;
6637c2aad20Sopenharmony_ci	/*
6647c2aad20Sopenharmony_ci	 * If cap_usr_time_zero, the hardware clock (e.g. TSC) can be calculated
6657c2aad20Sopenharmony_ci	 * from sample timestamps.
6667c2aad20Sopenharmony_ci	 *
6677c2aad20Sopenharmony_ci	 *   time = timestamp - time_zero;
6687c2aad20Sopenharmony_ci	 *   quot = time / time_mult;
6697c2aad20Sopenharmony_ci	 *   rem  = time % time_mult;
6707c2aad20Sopenharmony_ci	 *   cyc = (quot << time_shift) + (rem << time_shift) / time_mult;
6717c2aad20Sopenharmony_ci	 *
6727c2aad20Sopenharmony_ci	 * And vice versa:
6737c2aad20Sopenharmony_ci	 *
6747c2aad20Sopenharmony_ci	 *   quot = cyc >> time_shift;
6757c2aad20Sopenharmony_ci	 *   rem  = cyc & (((u64)1 << time_shift) - 1);
6767c2aad20Sopenharmony_ci	 *   timestamp = time_zero + quot * time_mult +
6777c2aad20Sopenharmony_ci	 *               ((rem * time_mult) >> time_shift);
6787c2aad20Sopenharmony_ci	 */
6797c2aad20Sopenharmony_ci	__u64	time_zero;
6807c2aad20Sopenharmony_ci
6817c2aad20Sopenharmony_ci	__u32	size;			/* Header size up to __reserved[] fields. */
6827c2aad20Sopenharmony_ci	__u32	__reserved_1;
6837c2aad20Sopenharmony_ci
6847c2aad20Sopenharmony_ci	/*
6857c2aad20Sopenharmony_ci	 * If cap_usr_time_short, the hardware clock is less than 64bit wide
6867c2aad20Sopenharmony_ci	 * and we must compute the 'cyc' value, as used by cap_usr_time, as:
6877c2aad20Sopenharmony_ci	 *
6887c2aad20Sopenharmony_ci	 *   cyc = time_cycles + ((cyc - time_cycles) & time_mask)
6897c2aad20Sopenharmony_ci	 *
6907c2aad20Sopenharmony_ci	 * NOTE: this form is explicitly chosen such that cap_usr_time_short
6917c2aad20Sopenharmony_ci	 *       is a correction on top of cap_usr_time, and code that doesn't
6927c2aad20Sopenharmony_ci	 *       know about cap_usr_time_short still works under the assumption
6937c2aad20Sopenharmony_ci	 *       the counter doesn't wrap.
6947c2aad20Sopenharmony_ci	 */
6957c2aad20Sopenharmony_ci	__u64	time_cycles;
6967c2aad20Sopenharmony_ci	__u64	time_mask;
6977c2aad20Sopenharmony_ci
6987c2aad20Sopenharmony_ci		/*
6997c2aad20Sopenharmony_ci		 * Hole for extension of the self monitor capabilities
7007c2aad20Sopenharmony_ci		 */
7017c2aad20Sopenharmony_ci
7027c2aad20Sopenharmony_ci	__u8	__reserved[116*8];	/* align to 1k. */
7037c2aad20Sopenharmony_ci
7047c2aad20Sopenharmony_ci	/*
7057c2aad20Sopenharmony_ci	 * Control data for the mmap() data buffer.
7067c2aad20Sopenharmony_ci	 *
7077c2aad20Sopenharmony_ci	 * User-space reading the @data_head value should issue an smp_rmb(),
7087c2aad20Sopenharmony_ci	 * after reading this value.
7097c2aad20Sopenharmony_ci	 *
7107c2aad20Sopenharmony_ci	 * When the mapping is PROT_WRITE the @data_tail value should be
7117c2aad20Sopenharmony_ci	 * written by userspace to reflect the last read data, after issueing
7127c2aad20Sopenharmony_ci	 * an smp_mb() to separate the data read from the ->data_tail store.
7137c2aad20Sopenharmony_ci	 * In this case the kernel will not over-write unread data.
7147c2aad20Sopenharmony_ci	 *
7157c2aad20Sopenharmony_ci	 * See perf_output_put_handle() for the data ordering.
7167c2aad20Sopenharmony_ci	 *
7177c2aad20Sopenharmony_ci	 * data_{offset,size} indicate the location and size of the perf record
7187c2aad20Sopenharmony_ci	 * buffer within the mmapped area.
7197c2aad20Sopenharmony_ci	 */
7207c2aad20Sopenharmony_ci	__u64   data_head;		/* head in the data section */
7217c2aad20Sopenharmony_ci	__u64	data_tail;		/* user-space written tail */
7227c2aad20Sopenharmony_ci	__u64	data_offset;		/* where the buffer starts */
7237c2aad20Sopenharmony_ci	__u64	data_size;		/* data buffer size */
7247c2aad20Sopenharmony_ci
7257c2aad20Sopenharmony_ci	/*
7267c2aad20Sopenharmony_ci	 * AUX area is defined by aux_{offset,size} fields that should be set
7277c2aad20Sopenharmony_ci	 * by the userspace, so that
7287c2aad20Sopenharmony_ci	 *
7297c2aad20Sopenharmony_ci	 *   aux_offset >= data_offset + data_size
7307c2aad20Sopenharmony_ci	 *
7317c2aad20Sopenharmony_ci	 * prior to mmap()ing it. Size of the mmap()ed area should be aux_size.
7327c2aad20Sopenharmony_ci	 *
7337c2aad20Sopenharmony_ci	 * Ring buffer pointers aux_{head,tail} have the same semantics as
7347c2aad20Sopenharmony_ci	 * data_{head,tail} and same ordering rules apply.
7357c2aad20Sopenharmony_ci	 */
7367c2aad20Sopenharmony_ci	__u64	aux_head;
7377c2aad20Sopenharmony_ci	__u64	aux_tail;
7387c2aad20Sopenharmony_ci	__u64	aux_offset;
7397c2aad20Sopenharmony_ci	__u64	aux_size;
7407c2aad20Sopenharmony_ci};
7417c2aad20Sopenharmony_ci
7427c2aad20Sopenharmony_ci/*
7437c2aad20Sopenharmony_ci * The current state of perf_event_header::misc bits usage:
7447c2aad20Sopenharmony_ci * ('|' used bit, '-' unused bit)
7457c2aad20Sopenharmony_ci *
7467c2aad20Sopenharmony_ci *  012         CDEF
7477c2aad20Sopenharmony_ci *  |||---------||||
7487c2aad20Sopenharmony_ci *
7497c2aad20Sopenharmony_ci *  Where:
7507c2aad20Sopenharmony_ci *    0-2     CPUMODE_MASK
7517c2aad20Sopenharmony_ci *
7527c2aad20Sopenharmony_ci *    C       PROC_MAP_PARSE_TIMEOUT
7537c2aad20Sopenharmony_ci *    D       MMAP_DATA / COMM_EXEC / FORK_EXEC / SWITCH_OUT
7547c2aad20Sopenharmony_ci *    E       MMAP_BUILD_ID / EXACT_IP / SCHED_OUT_PREEMPT
7557c2aad20Sopenharmony_ci *    F       (reserved)
7567c2aad20Sopenharmony_ci */
7577c2aad20Sopenharmony_ci
7587c2aad20Sopenharmony_ci#define PERF_RECORD_MISC_CPUMODE_MASK		(7 << 0)
7597c2aad20Sopenharmony_ci#define PERF_RECORD_MISC_CPUMODE_UNKNOWN	(0 << 0)
7607c2aad20Sopenharmony_ci#define PERF_RECORD_MISC_KERNEL			(1 << 0)
7617c2aad20Sopenharmony_ci#define PERF_RECORD_MISC_USER			(2 << 0)
7627c2aad20Sopenharmony_ci#define PERF_RECORD_MISC_HYPERVISOR		(3 << 0)
7637c2aad20Sopenharmony_ci#define PERF_RECORD_MISC_GUEST_KERNEL		(4 << 0)
7647c2aad20Sopenharmony_ci#define PERF_RECORD_MISC_GUEST_USER		(5 << 0)
7657c2aad20Sopenharmony_ci
7667c2aad20Sopenharmony_ci/*
7677c2aad20Sopenharmony_ci * Indicates that /proc/PID/maps parsing are truncated by time out.
7687c2aad20Sopenharmony_ci */
7697c2aad20Sopenharmony_ci#define PERF_RECORD_MISC_PROC_MAP_PARSE_TIMEOUT	(1 << 12)
7707c2aad20Sopenharmony_ci/*
7717c2aad20Sopenharmony_ci * Following PERF_RECORD_MISC_* are used on different
7727c2aad20Sopenharmony_ci * events, so can reuse the same bit position:
7737c2aad20Sopenharmony_ci *
7747c2aad20Sopenharmony_ci *   PERF_RECORD_MISC_MMAP_DATA  - PERF_RECORD_MMAP* events
7757c2aad20Sopenharmony_ci *   PERF_RECORD_MISC_COMM_EXEC  - PERF_RECORD_COMM event
7767c2aad20Sopenharmony_ci *   PERF_RECORD_MISC_FORK_EXEC  - PERF_RECORD_FORK event (perf internal)
7777c2aad20Sopenharmony_ci *   PERF_RECORD_MISC_SWITCH_OUT - PERF_RECORD_SWITCH* events
7787c2aad20Sopenharmony_ci */
7797c2aad20Sopenharmony_ci#define PERF_RECORD_MISC_MMAP_DATA		(1 << 13)
7807c2aad20Sopenharmony_ci#define PERF_RECORD_MISC_COMM_EXEC		(1 << 13)
7817c2aad20Sopenharmony_ci#define PERF_RECORD_MISC_FORK_EXEC		(1 << 13)
7827c2aad20Sopenharmony_ci#define PERF_RECORD_MISC_SWITCH_OUT		(1 << 13)
7837c2aad20Sopenharmony_ci/*
7847c2aad20Sopenharmony_ci * These PERF_RECORD_MISC_* flags below are safely reused
7857c2aad20Sopenharmony_ci * for the following events:
7867c2aad20Sopenharmony_ci *
7877c2aad20Sopenharmony_ci *   PERF_RECORD_MISC_EXACT_IP           - PERF_RECORD_SAMPLE of precise events
7887c2aad20Sopenharmony_ci *   PERF_RECORD_MISC_SWITCH_OUT_PREEMPT - PERF_RECORD_SWITCH* events
7897c2aad20Sopenharmony_ci *   PERF_RECORD_MISC_MMAP_BUILD_ID      - PERF_RECORD_MMAP2 event
7907c2aad20Sopenharmony_ci *
7917c2aad20Sopenharmony_ci *
7927c2aad20Sopenharmony_ci * PERF_RECORD_MISC_EXACT_IP:
7937c2aad20Sopenharmony_ci *   Indicates that the content of PERF_SAMPLE_IP points to
7947c2aad20Sopenharmony_ci *   the actual instruction that triggered the event. See also
7957c2aad20Sopenharmony_ci *   perf_event_attr::precise_ip.
7967c2aad20Sopenharmony_ci *
7977c2aad20Sopenharmony_ci * PERF_RECORD_MISC_SWITCH_OUT_PREEMPT:
7987c2aad20Sopenharmony_ci *   Indicates that thread was preempted in TASK_RUNNING state.
7997c2aad20Sopenharmony_ci *
8007c2aad20Sopenharmony_ci * PERF_RECORD_MISC_MMAP_BUILD_ID:
8017c2aad20Sopenharmony_ci *   Indicates that mmap2 event carries build id data.
8027c2aad20Sopenharmony_ci */
8037c2aad20Sopenharmony_ci#define PERF_RECORD_MISC_EXACT_IP		(1 << 14)
8047c2aad20Sopenharmony_ci#define PERF_RECORD_MISC_SWITCH_OUT_PREEMPT	(1 << 14)
8057c2aad20Sopenharmony_ci#define PERF_RECORD_MISC_MMAP_BUILD_ID		(1 << 14)
8067c2aad20Sopenharmony_ci/*
8077c2aad20Sopenharmony_ci * Reserve the last bit to indicate some extended misc field
8087c2aad20Sopenharmony_ci */
8097c2aad20Sopenharmony_ci#define PERF_RECORD_MISC_EXT_RESERVED		(1 << 15)
8107c2aad20Sopenharmony_ci
8117c2aad20Sopenharmony_cistruct perf_event_header {
8127c2aad20Sopenharmony_ci	__u32	type;
8137c2aad20Sopenharmony_ci	__u16	misc;
8147c2aad20Sopenharmony_ci	__u16	size;
8157c2aad20Sopenharmony_ci};
8167c2aad20Sopenharmony_ci
8177c2aad20Sopenharmony_cistruct perf_ns_link_info {
8187c2aad20Sopenharmony_ci	__u64	dev;
8197c2aad20Sopenharmony_ci	__u64	ino;
8207c2aad20Sopenharmony_ci};
8217c2aad20Sopenharmony_ci
8227c2aad20Sopenharmony_cienum {
8237c2aad20Sopenharmony_ci	NET_NS_INDEX		= 0,
8247c2aad20Sopenharmony_ci	UTS_NS_INDEX		= 1,
8257c2aad20Sopenharmony_ci	IPC_NS_INDEX		= 2,
8267c2aad20Sopenharmony_ci	PID_NS_INDEX		= 3,
8277c2aad20Sopenharmony_ci	USER_NS_INDEX		= 4,
8287c2aad20Sopenharmony_ci	MNT_NS_INDEX		= 5,
8297c2aad20Sopenharmony_ci	CGROUP_NS_INDEX		= 6,
8307c2aad20Sopenharmony_ci
8317c2aad20Sopenharmony_ci	NR_NAMESPACES,		/* number of available namespaces */
8327c2aad20Sopenharmony_ci};
8337c2aad20Sopenharmony_ci
8347c2aad20Sopenharmony_cienum perf_event_type {
8357c2aad20Sopenharmony_ci
8367c2aad20Sopenharmony_ci	/*
8377c2aad20Sopenharmony_ci	 * If perf_event_attr.sample_id_all is set then all event types will
8387c2aad20Sopenharmony_ci	 * have the sample_type selected fields related to where/when
8397c2aad20Sopenharmony_ci	 * (identity) an event took place (TID, TIME, ID, STREAM_ID, CPU,
8407c2aad20Sopenharmony_ci	 * IDENTIFIER) described in PERF_RECORD_SAMPLE below, it will be stashed
8417c2aad20Sopenharmony_ci	 * just after the perf_event_header and the fields already present for
8427c2aad20Sopenharmony_ci	 * the existing fields, i.e. at the end of the payload. That way a newer
8437c2aad20Sopenharmony_ci	 * perf.data file will be supported by older perf tools, with these new
8447c2aad20Sopenharmony_ci	 * optional fields being ignored.
8457c2aad20Sopenharmony_ci	 *
8467c2aad20Sopenharmony_ci	 * struct sample_id {
8477c2aad20Sopenharmony_ci	 * 	{ u32			pid, tid; } && PERF_SAMPLE_TID
8487c2aad20Sopenharmony_ci	 * 	{ u64			time;     } && PERF_SAMPLE_TIME
8497c2aad20Sopenharmony_ci	 * 	{ u64			id;       } && PERF_SAMPLE_ID
8507c2aad20Sopenharmony_ci	 * 	{ u64			stream_id;} && PERF_SAMPLE_STREAM_ID
8517c2aad20Sopenharmony_ci	 * 	{ u32			cpu, res; } && PERF_SAMPLE_CPU
8527c2aad20Sopenharmony_ci	 *	{ u64			id;	  } && PERF_SAMPLE_IDENTIFIER
8537c2aad20Sopenharmony_ci	 * } && perf_event_attr::sample_id_all
8547c2aad20Sopenharmony_ci	 *
8557c2aad20Sopenharmony_ci	 * Note that PERF_SAMPLE_IDENTIFIER duplicates PERF_SAMPLE_ID.  The
8567c2aad20Sopenharmony_ci	 * advantage of PERF_SAMPLE_IDENTIFIER is that its position is fixed
8577c2aad20Sopenharmony_ci	 * relative to header.size.
8587c2aad20Sopenharmony_ci	 */
8597c2aad20Sopenharmony_ci
8607c2aad20Sopenharmony_ci	/*
8617c2aad20Sopenharmony_ci	 * The MMAP events record the PROT_EXEC mappings so that we can
8627c2aad20Sopenharmony_ci	 * correlate userspace IPs to code. They have the following structure:
8637c2aad20Sopenharmony_ci	 *
8647c2aad20Sopenharmony_ci	 * struct {
8657c2aad20Sopenharmony_ci	 *	struct perf_event_header	header;
8667c2aad20Sopenharmony_ci	 *
8677c2aad20Sopenharmony_ci	 *	u32				pid, tid;
8687c2aad20Sopenharmony_ci	 *	u64				addr;
8697c2aad20Sopenharmony_ci	 *	u64				len;
8707c2aad20Sopenharmony_ci	 *	u64				pgoff;
8717c2aad20Sopenharmony_ci	 *	char				filename[];
8727c2aad20Sopenharmony_ci	 * 	struct sample_id		sample_id;
8737c2aad20Sopenharmony_ci	 * };
8747c2aad20Sopenharmony_ci	 */
8757c2aad20Sopenharmony_ci	PERF_RECORD_MMAP			= 1,
8767c2aad20Sopenharmony_ci
8777c2aad20Sopenharmony_ci	/*
8787c2aad20Sopenharmony_ci	 * struct {
8797c2aad20Sopenharmony_ci	 *	struct perf_event_header	header;
8807c2aad20Sopenharmony_ci	 *	u64				id;
8817c2aad20Sopenharmony_ci	 *	u64				lost;
8827c2aad20Sopenharmony_ci	 * 	struct sample_id		sample_id;
8837c2aad20Sopenharmony_ci	 * };
8847c2aad20Sopenharmony_ci	 */
8857c2aad20Sopenharmony_ci	PERF_RECORD_LOST			= 2,
8867c2aad20Sopenharmony_ci
8877c2aad20Sopenharmony_ci	/*
8887c2aad20Sopenharmony_ci	 * struct {
8897c2aad20Sopenharmony_ci	 *	struct perf_event_header	header;
8907c2aad20Sopenharmony_ci	 *
8917c2aad20Sopenharmony_ci	 *	u32				pid, tid;
8927c2aad20Sopenharmony_ci	 *	char				comm[];
8937c2aad20Sopenharmony_ci	 * 	struct sample_id		sample_id;
8947c2aad20Sopenharmony_ci	 * };
8957c2aad20Sopenharmony_ci	 */
8967c2aad20Sopenharmony_ci	PERF_RECORD_COMM			= 3,
8977c2aad20Sopenharmony_ci
8987c2aad20Sopenharmony_ci	/*
8997c2aad20Sopenharmony_ci	 * struct {
9007c2aad20Sopenharmony_ci	 *	struct perf_event_header	header;
9017c2aad20Sopenharmony_ci	 *	u32				pid, ppid;
9027c2aad20Sopenharmony_ci	 *	u32				tid, ptid;
9037c2aad20Sopenharmony_ci	 *	u64				time;
9047c2aad20Sopenharmony_ci	 * 	struct sample_id		sample_id;
9057c2aad20Sopenharmony_ci	 * };
9067c2aad20Sopenharmony_ci	 */
9077c2aad20Sopenharmony_ci	PERF_RECORD_EXIT			= 4,
9087c2aad20Sopenharmony_ci
9097c2aad20Sopenharmony_ci	/*
9107c2aad20Sopenharmony_ci	 * struct {
9117c2aad20Sopenharmony_ci	 *	struct perf_event_header	header;
9127c2aad20Sopenharmony_ci	 *	u64				time;
9137c2aad20Sopenharmony_ci	 *	u64				id;
9147c2aad20Sopenharmony_ci	 *	u64				stream_id;
9157c2aad20Sopenharmony_ci	 * 	struct sample_id		sample_id;
9167c2aad20Sopenharmony_ci	 * };
9177c2aad20Sopenharmony_ci	 */
9187c2aad20Sopenharmony_ci	PERF_RECORD_THROTTLE			= 5,
9197c2aad20Sopenharmony_ci	PERF_RECORD_UNTHROTTLE			= 6,
9207c2aad20Sopenharmony_ci
9217c2aad20Sopenharmony_ci	/*
9227c2aad20Sopenharmony_ci	 * struct {
9237c2aad20Sopenharmony_ci	 *	struct perf_event_header	header;
9247c2aad20Sopenharmony_ci	 *	u32				pid, ppid;
9257c2aad20Sopenharmony_ci	 *	u32				tid, ptid;
9267c2aad20Sopenharmony_ci	 *	u64				time;
9277c2aad20Sopenharmony_ci	 * 	struct sample_id		sample_id;
9287c2aad20Sopenharmony_ci	 * };
9297c2aad20Sopenharmony_ci	 */
9307c2aad20Sopenharmony_ci	PERF_RECORD_FORK			= 7,
9317c2aad20Sopenharmony_ci
9327c2aad20Sopenharmony_ci	/*
9337c2aad20Sopenharmony_ci	 * struct {
9347c2aad20Sopenharmony_ci	 *	struct perf_event_header	header;
9357c2aad20Sopenharmony_ci	 *	u32				pid, tid;
9367c2aad20Sopenharmony_ci	 *
9377c2aad20Sopenharmony_ci	 *	struct read_format		values;
9387c2aad20Sopenharmony_ci	 * 	struct sample_id		sample_id;
9397c2aad20Sopenharmony_ci	 * };
9407c2aad20Sopenharmony_ci	 */
9417c2aad20Sopenharmony_ci	PERF_RECORD_READ			= 8,
9427c2aad20Sopenharmony_ci
9437c2aad20Sopenharmony_ci	/*
9447c2aad20Sopenharmony_ci	 * struct {
9457c2aad20Sopenharmony_ci	 *	struct perf_event_header	header;
9467c2aad20Sopenharmony_ci	 *
9477c2aad20Sopenharmony_ci	 *	#
9487c2aad20Sopenharmony_ci	 *	# Note that PERF_SAMPLE_IDENTIFIER duplicates PERF_SAMPLE_ID.
9497c2aad20Sopenharmony_ci	 *	# The advantage of PERF_SAMPLE_IDENTIFIER is that its position
9507c2aad20Sopenharmony_ci	 *	# is fixed relative to header.
9517c2aad20Sopenharmony_ci	 *	#
9527c2aad20Sopenharmony_ci	 *
9537c2aad20Sopenharmony_ci	 *	{ u64			id;	  } && PERF_SAMPLE_IDENTIFIER
9547c2aad20Sopenharmony_ci	 *	{ u64			ip;	  } && PERF_SAMPLE_IP
9557c2aad20Sopenharmony_ci	 *	{ u32			pid, tid; } && PERF_SAMPLE_TID
9567c2aad20Sopenharmony_ci	 *	{ u64			time;     } && PERF_SAMPLE_TIME
9577c2aad20Sopenharmony_ci	 *	{ u64			addr;     } && PERF_SAMPLE_ADDR
9587c2aad20Sopenharmony_ci	 *	{ u64			id;	  } && PERF_SAMPLE_ID
9597c2aad20Sopenharmony_ci	 *	{ u64			stream_id;} && PERF_SAMPLE_STREAM_ID
9607c2aad20Sopenharmony_ci	 *	{ u32			cpu, res; } && PERF_SAMPLE_CPU
9617c2aad20Sopenharmony_ci	 *	{ u64			period;   } && PERF_SAMPLE_PERIOD
9627c2aad20Sopenharmony_ci	 *
9637c2aad20Sopenharmony_ci	 *	{ struct read_format	values;	  } && PERF_SAMPLE_READ
9647c2aad20Sopenharmony_ci	 *
9657c2aad20Sopenharmony_ci	 *	{ u64			nr,
9667c2aad20Sopenharmony_ci	 *	  u64			ips[nr];  } && PERF_SAMPLE_CALLCHAIN
9677c2aad20Sopenharmony_ci	 *
9687c2aad20Sopenharmony_ci	 *	#
9697c2aad20Sopenharmony_ci	 *	# The RAW record below is opaque data wrt the ABI
9707c2aad20Sopenharmony_ci	 *	#
9717c2aad20Sopenharmony_ci	 *	# That is, the ABI doesn't make any promises wrt to
9727c2aad20Sopenharmony_ci	 *	# the stability of its content, it may vary depending
9737c2aad20Sopenharmony_ci	 *	# on event, hardware, kernel version and phase of
9747c2aad20Sopenharmony_ci	 *	# the moon.
9757c2aad20Sopenharmony_ci	 *	#
9767c2aad20Sopenharmony_ci	 *	# In other words, PERF_SAMPLE_RAW contents are not an ABI.
9777c2aad20Sopenharmony_ci	 *	#
9787c2aad20Sopenharmony_ci	 *
9797c2aad20Sopenharmony_ci	 *	{ u32			size;
9807c2aad20Sopenharmony_ci	 *	  char                  data[size];}&& PERF_SAMPLE_RAW
9817c2aad20Sopenharmony_ci	 *
9827c2aad20Sopenharmony_ci	 *	{ u64                   nr;
9837c2aad20Sopenharmony_ci	 *	  { u64	hw_idx; } && PERF_SAMPLE_BRANCH_HW_INDEX
9847c2aad20Sopenharmony_ci	 *        { u64 from, to, flags } lbr[nr];
9857c2aad20Sopenharmony_ci	 *      } && PERF_SAMPLE_BRANCH_STACK
9867c2aad20Sopenharmony_ci	 *
9877c2aad20Sopenharmony_ci	 * 	{ u64			abi; # enum perf_sample_regs_abi
9887c2aad20Sopenharmony_ci	 * 	  u64			regs[weight(mask)]; } && PERF_SAMPLE_REGS_USER
9897c2aad20Sopenharmony_ci	 *
9907c2aad20Sopenharmony_ci	 * 	{ u64			size;
9917c2aad20Sopenharmony_ci	 * 	  char			data[size];
9927c2aad20Sopenharmony_ci	 * 	  u64			dyn_size; } && PERF_SAMPLE_STACK_USER
9937c2aad20Sopenharmony_ci	 *
9947c2aad20Sopenharmony_ci	 *	{ union perf_sample_weight
9957c2aad20Sopenharmony_ci	 *	 {
9967c2aad20Sopenharmony_ci	 *		u64		full; && PERF_SAMPLE_WEIGHT
9977c2aad20Sopenharmony_ci	 *	#if defined(__LITTLE_ENDIAN_BITFIELD)
9987c2aad20Sopenharmony_ci	 *		struct {
9997c2aad20Sopenharmony_ci	 *			u32	var1_dw;
10007c2aad20Sopenharmony_ci	 *			u16	var2_w;
10017c2aad20Sopenharmony_ci	 *			u16	var3_w;
10027c2aad20Sopenharmony_ci	 *		} && PERF_SAMPLE_WEIGHT_STRUCT
10037c2aad20Sopenharmony_ci	 *	#elif defined(__BIG_ENDIAN_BITFIELD)
10047c2aad20Sopenharmony_ci	 *		struct {
10057c2aad20Sopenharmony_ci	 *			u16	var3_w;
10067c2aad20Sopenharmony_ci	 *			u16	var2_w;
10077c2aad20Sopenharmony_ci	 *			u32	var1_dw;
10087c2aad20Sopenharmony_ci	 *		} && PERF_SAMPLE_WEIGHT_STRUCT
10097c2aad20Sopenharmony_ci	 *	#endif
10107c2aad20Sopenharmony_ci	 *	 }
10117c2aad20Sopenharmony_ci	 *	}
10127c2aad20Sopenharmony_ci	 *	{ u64			data_src; } && PERF_SAMPLE_DATA_SRC
10137c2aad20Sopenharmony_ci	 *	{ u64			transaction; } && PERF_SAMPLE_TRANSACTION
10147c2aad20Sopenharmony_ci	 *	{ u64			abi; # enum perf_sample_regs_abi
10157c2aad20Sopenharmony_ci	 *	  u64			regs[weight(mask)]; } && PERF_SAMPLE_REGS_INTR
10167c2aad20Sopenharmony_ci	 *	{ u64			phys_addr;} && PERF_SAMPLE_PHYS_ADDR
10177c2aad20Sopenharmony_ci	 *	{ u64			size;
10187c2aad20Sopenharmony_ci	 *	  char			data[size]; } && PERF_SAMPLE_AUX
10197c2aad20Sopenharmony_ci	 *	{ u64			data_page_size;} && PERF_SAMPLE_DATA_PAGE_SIZE
10207c2aad20Sopenharmony_ci	 *	{ u64			code_page_size;} && PERF_SAMPLE_CODE_PAGE_SIZE
10217c2aad20Sopenharmony_ci	 * };
10227c2aad20Sopenharmony_ci	 */
10237c2aad20Sopenharmony_ci	PERF_RECORD_SAMPLE			= 9,
10247c2aad20Sopenharmony_ci
10257c2aad20Sopenharmony_ci	/*
10267c2aad20Sopenharmony_ci	 * The MMAP2 records are an augmented version of MMAP, they add
10277c2aad20Sopenharmony_ci	 * maj, min, ino numbers to be used to uniquely identify each mapping
10287c2aad20Sopenharmony_ci	 *
10297c2aad20Sopenharmony_ci	 * struct {
10307c2aad20Sopenharmony_ci	 *	struct perf_event_header	header;
10317c2aad20Sopenharmony_ci	 *
10327c2aad20Sopenharmony_ci	 *	u32				pid, tid;
10337c2aad20Sopenharmony_ci	 *	u64				addr;
10347c2aad20Sopenharmony_ci	 *	u64				len;
10357c2aad20Sopenharmony_ci	 *	u64				pgoff;
10367c2aad20Sopenharmony_ci	 *	union {
10377c2aad20Sopenharmony_ci	 *		struct {
10387c2aad20Sopenharmony_ci	 *			u32		maj;
10397c2aad20Sopenharmony_ci	 *			u32		min;
10407c2aad20Sopenharmony_ci	 *			u64		ino;
10417c2aad20Sopenharmony_ci	 *			u64		ino_generation;
10427c2aad20Sopenharmony_ci	 *		};
10437c2aad20Sopenharmony_ci	 *		struct {
10447c2aad20Sopenharmony_ci	 *			u8		build_id_size;
10457c2aad20Sopenharmony_ci	 *			u8		__reserved_1;
10467c2aad20Sopenharmony_ci	 *			u16		__reserved_2;
10477c2aad20Sopenharmony_ci	 *			u8		build_id[20];
10487c2aad20Sopenharmony_ci	 *		};
10497c2aad20Sopenharmony_ci	 *	};
10507c2aad20Sopenharmony_ci	 *	u32				prot, flags;
10517c2aad20Sopenharmony_ci	 *	char				filename[];
10527c2aad20Sopenharmony_ci	 * 	struct sample_id		sample_id;
10537c2aad20Sopenharmony_ci	 * };
10547c2aad20Sopenharmony_ci	 */
10557c2aad20Sopenharmony_ci	PERF_RECORD_MMAP2			= 10,
10567c2aad20Sopenharmony_ci
10577c2aad20Sopenharmony_ci	/*
10587c2aad20Sopenharmony_ci	 * Records that new data landed in the AUX buffer part.
10597c2aad20Sopenharmony_ci	 *
10607c2aad20Sopenharmony_ci	 * struct {
10617c2aad20Sopenharmony_ci	 * 	struct perf_event_header	header;
10627c2aad20Sopenharmony_ci	 *
10637c2aad20Sopenharmony_ci	 * 	u64				aux_offset;
10647c2aad20Sopenharmony_ci	 * 	u64				aux_size;
10657c2aad20Sopenharmony_ci	 *	u64				flags;
10667c2aad20Sopenharmony_ci	 * 	struct sample_id		sample_id;
10677c2aad20Sopenharmony_ci	 * };
10687c2aad20Sopenharmony_ci	 */
10697c2aad20Sopenharmony_ci	PERF_RECORD_AUX				= 11,
10707c2aad20Sopenharmony_ci
10717c2aad20Sopenharmony_ci	/*
10727c2aad20Sopenharmony_ci	 * Indicates that instruction trace has started
10737c2aad20Sopenharmony_ci	 *
10747c2aad20Sopenharmony_ci	 * struct {
10757c2aad20Sopenharmony_ci	 *	struct perf_event_header	header;
10767c2aad20Sopenharmony_ci	 *	u32				pid;
10777c2aad20Sopenharmony_ci	 *	u32				tid;
10787c2aad20Sopenharmony_ci	 *	struct sample_id		sample_id;
10797c2aad20Sopenharmony_ci	 * };
10807c2aad20Sopenharmony_ci	 */
10817c2aad20Sopenharmony_ci	PERF_RECORD_ITRACE_START		= 12,
10827c2aad20Sopenharmony_ci
10837c2aad20Sopenharmony_ci	/*
10847c2aad20Sopenharmony_ci	 * Records the dropped/lost sample number.
10857c2aad20Sopenharmony_ci	 *
10867c2aad20Sopenharmony_ci	 * struct {
10877c2aad20Sopenharmony_ci	 *	struct perf_event_header	header;
10887c2aad20Sopenharmony_ci	 *
10897c2aad20Sopenharmony_ci	 *	u64				lost;
10907c2aad20Sopenharmony_ci	 *	struct sample_id		sample_id;
10917c2aad20Sopenharmony_ci	 * };
10927c2aad20Sopenharmony_ci	 */
10937c2aad20Sopenharmony_ci	PERF_RECORD_LOST_SAMPLES		= 13,
10947c2aad20Sopenharmony_ci
10957c2aad20Sopenharmony_ci	/*
10967c2aad20Sopenharmony_ci	 * Records a context switch in or out (flagged by
10977c2aad20Sopenharmony_ci	 * PERF_RECORD_MISC_SWITCH_OUT). See also
10987c2aad20Sopenharmony_ci	 * PERF_RECORD_SWITCH_CPU_WIDE.
10997c2aad20Sopenharmony_ci	 *
11007c2aad20Sopenharmony_ci	 * struct {
11017c2aad20Sopenharmony_ci	 *	struct perf_event_header	header;
11027c2aad20Sopenharmony_ci	 *	struct sample_id		sample_id;
11037c2aad20Sopenharmony_ci	 * };
11047c2aad20Sopenharmony_ci	 */
11057c2aad20Sopenharmony_ci	PERF_RECORD_SWITCH			= 14,
11067c2aad20Sopenharmony_ci
11077c2aad20Sopenharmony_ci	/*
11087c2aad20Sopenharmony_ci	 * CPU-wide version of PERF_RECORD_SWITCH with next_prev_pid and
11097c2aad20Sopenharmony_ci	 * next_prev_tid that are the next (switching out) or previous
11107c2aad20Sopenharmony_ci	 * (switching in) pid/tid.
11117c2aad20Sopenharmony_ci	 *
11127c2aad20Sopenharmony_ci	 * struct {
11137c2aad20Sopenharmony_ci	 *	struct perf_event_header	header;
11147c2aad20Sopenharmony_ci	 *	u32				next_prev_pid;
11157c2aad20Sopenharmony_ci	 *	u32				next_prev_tid;
11167c2aad20Sopenharmony_ci	 *	struct sample_id		sample_id;
11177c2aad20Sopenharmony_ci	 * };
11187c2aad20Sopenharmony_ci	 */
11197c2aad20Sopenharmony_ci	PERF_RECORD_SWITCH_CPU_WIDE		= 15,
11207c2aad20Sopenharmony_ci
11217c2aad20Sopenharmony_ci	/*
11227c2aad20Sopenharmony_ci	 * struct {
11237c2aad20Sopenharmony_ci	 *	struct perf_event_header	header;
11247c2aad20Sopenharmony_ci	 *	u32				pid;
11257c2aad20Sopenharmony_ci	 *	u32				tid;
11267c2aad20Sopenharmony_ci	 *	u64				nr_namespaces;
11277c2aad20Sopenharmony_ci	 *	{ u64				dev, inode; } [nr_namespaces];
11287c2aad20Sopenharmony_ci	 *	struct sample_id		sample_id;
11297c2aad20Sopenharmony_ci	 * };
11307c2aad20Sopenharmony_ci	 */
11317c2aad20Sopenharmony_ci	PERF_RECORD_NAMESPACES			= 16,
11327c2aad20Sopenharmony_ci
11337c2aad20Sopenharmony_ci	/*
11347c2aad20Sopenharmony_ci	 * Record ksymbol register/unregister events:
11357c2aad20Sopenharmony_ci	 *
11367c2aad20Sopenharmony_ci	 * struct {
11377c2aad20Sopenharmony_ci	 *	struct perf_event_header	header;
11387c2aad20Sopenharmony_ci	 *	u64				addr;
11397c2aad20Sopenharmony_ci	 *	u32				len;
11407c2aad20Sopenharmony_ci	 *	u16				ksym_type;
11417c2aad20Sopenharmony_ci	 *	u16				flags;
11427c2aad20Sopenharmony_ci	 *	char				name[];
11437c2aad20Sopenharmony_ci	 *	struct sample_id		sample_id;
11447c2aad20Sopenharmony_ci	 * };
11457c2aad20Sopenharmony_ci	 */
11467c2aad20Sopenharmony_ci	PERF_RECORD_KSYMBOL			= 17,
11477c2aad20Sopenharmony_ci
11487c2aad20Sopenharmony_ci	/*
11497c2aad20Sopenharmony_ci	 * Record bpf events:
11507c2aad20Sopenharmony_ci	 *  enum perf_bpf_event_type {
11517c2aad20Sopenharmony_ci	 *	PERF_BPF_EVENT_UNKNOWN		= 0,
11527c2aad20Sopenharmony_ci	 *	PERF_BPF_EVENT_PROG_LOAD	= 1,
11537c2aad20Sopenharmony_ci	 *	PERF_BPF_EVENT_PROG_UNLOAD	= 2,
11547c2aad20Sopenharmony_ci	 *  };
11557c2aad20Sopenharmony_ci	 *
11567c2aad20Sopenharmony_ci	 * struct {
11577c2aad20Sopenharmony_ci	 *	struct perf_event_header	header;
11587c2aad20Sopenharmony_ci	 *	u16				type;
11597c2aad20Sopenharmony_ci	 *	u16				flags;
11607c2aad20Sopenharmony_ci	 *	u32				id;
11617c2aad20Sopenharmony_ci	 *	u8				tag[BPF_TAG_SIZE];
11627c2aad20Sopenharmony_ci	 *	struct sample_id		sample_id;
11637c2aad20Sopenharmony_ci	 * };
11647c2aad20Sopenharmony_ci	 */
11657c2aad20Sopenharmony_ci	PERF_RECORD_BPF_EVENT			= 18,
11667c2aad20Sopenharmony_ci
11677c2aad20Sopenharmony_ci	/*
11687c2aad20Sopenharmony_ci	 * struct {
11697c2aad20Sopenharmony_ci	 *	struct perf_event_header	header;
11707c2aad20Sopenharmony_ci	 *	u64				id;
11717c2aad20Sopenharmony_ci	 *	char				path[];
11727c2aad20Sopenharmony_ci	 *	struct sample_id		sample_id;
11737c2aad20Sopenharmony_ci	 * };
11747c2aad20Sopenharmony_ci	 */
11757c2aad20Sopenharmony_ci	PERF_RECORD_CGROUP			= 19,
11767c2aad20Sopenharmony_ci
11777c2aad20Sopenharmony_ci	/*
11787c2aad20Sopenharmony_ci	 * Records changes to kernel text i.e. self-modified code. 'old_len' is
11797c2aad20Sopenharmony_ci	 * the number of old bytes, 'new_len' is the number of new bytes. Either
11807c2aad20Sopenharmony_ci	 * 'old_len' or 'new_len' may be zero to indicate, for example, the
11817c2aad20Sopenharmony_ci	 * addition or removal of a trampoline. 'bytes' contains the old bytes
11827c2aad20Sopenharmony_ci	 * followed immediately by the new bytes.
11837c2aad20Sopenharmony_ci	 *
11847c2aad20Sopenharmony_ci	 * struct {
11857c2aad20Sopenharmony_ci	 *	struct perf_event_header	header;
11867c2aad20Sopenharmony_ci	 *	u64				addr;
11877c2aad20Sopenharmony_ci	 *	u16				old_len;
11887c2aad20Sopenharmony_ci	 *	u16				new_len;
11897c2aad20Sopenharmony_ci	 *	u8				bytes[];
11907c2aad20Sopenharmony_ci	 *	struct sample_id		sample_id;
11917c2aad20Sopenharmony_ci	 * };
11927c2aad20Sopenharmony_ci	 */
11937c2aad20Sopenharmony_ci	PERF_RECORD_TEXT_POKE			= 20,
11947c2aad20Sopenharmony_ci
11957c2aad20Sopenharmony_ci	/*
11967c2aad20Sopenharmony_ci	 * Data written to the AUX area by hardware due to aux_output, may need
11977c2aad20Sopenharmony_ci	 * to be matched to the event by an architecture-specific hardware ID.
11987c2aad20Sopenharmony_ci	 * This records the hardware ID, but requires sample_id to provide the
11997c2aad20Sopenharmony_ci	 * event ID. e.g. Intel PT uses this record to disambiguate PEBS-via-PT
12007c2aad20Sopenharmony_ci	 * records from multiple events.
12017c2aad20Sopenharmony_ci	 *
12027c2aad20Sopenharmony_ci	 * struct {
12037c2aad20Sopenharmony_ci	 *	struct perf_event_header	header;
12047c2aad20Sopenharmony_ci	 *	u64				hw_id;
12057c2aad20Sopenharmony_ci	 *	struct sample_id		sample_id;
12067c2aad20Sopenharmony_ci	 * };
12077c2aad20Sopenharmony_ci	 */
12087c2aad20Sopenharmony_ci	PERF_RECORD_AUX_OUTPUT_HW_ID		= 21,
12097c2aad20Sopenharmony_ci
12107c2aad20Sopenharmony_ci	PERF_RECORD_MAX,			/* non-ABI */
12117c2aad20Sopenharmony_ci};
12127c2aad20Sopenharmony_ci
12137c2aad20Sopenharmony_cienum perf_record_ksymbol_type {
12147c2aad20Sopenharmony_ci	PERF_RECORD_KSYMBOL_TYPE_UNKNOWN	= 0,
12157c2aad20Sopenharmony_ci	PERF_RECORD_KSYMBOL_TYPE_BPF		= 1,
12167c2aad20Sopenharmony_ci	/*
12177c2aad20Sopenharmony_ci	 * Out of line code such as kprobe-replaced instructions or optimized
12187c2aad20Sopenharmony_ci	 * kprobes or ftrace trampolines.
12197c2aad20Sopenharmony_ci	 */
12207c2aad20Sopenharmony_ci	PERF_RECORD_KSYMBOL_TYPE_OOL		= 2,
12217c2aad20Sopenharmony_ci	PERF_RECORD_KSYMBOL_TYPE_MAX		/* non-ABI */
12227c2aad20Sopenharmony_ci};
12237c2aad20Sopenharmony_ci
12247c2aad20Sopenharmony_ci#define PERF_RECORD_KSYMBOL_FLAGS_UNREGISTER	(1 << 0)
12257c2aad20Sopenharmony_ci
12267c2aad20Sopenharmony_cienum perf_bpf_event_type {
12277c2aad20Sopenharmony_ci	PERF_BPF_EVENT_UNKNOWN		= 0,
12287c2aad20Sopenharmony_ci	PERF_BPF_EVENT_PROG_LOAD	= 1,
12297c2aad20Sopenharmony_ci	PERF_BPF_EVENT_PROG_UNLOAD	= 2,
12307c2aad20Sopenharmony_ci	PERF_BPF_EVENT_MAX,		/* non-ABI */
12317c2aad20Sopenharmony_ci};
12327c2aad20Sopenharmony_ci
12337c2aad20Sopenharmony_ci#define PERF_MAX_STACK_DEPTH		127
12347c2aad20Sopenharmony_ci#define PERF_MAX_CONTEXTS_PER_STACK	  8
12357c2aad20Sopenharmony_ci
12367c2aad20Sopenharmony_cienum perf_callchain_context {
12377c2aad20Sopenharmony_ci	PERF_CONTEXT_HV			= (__u64)-32,
12387c2aad20Sopenharmony_ci	PERF_CONTEXT_KERNEL		= (__u64)-128,
12397c2aad20Sopenharmony_ci	PERF_CONTEXT_USER		= (__u64)-512,
12407c2aad20Sopenharmony_ci
12417c2aad20Sopenharmony_ci	PERF_CONTEXT_GUEST		= (__u64)-2048,
12427c2aad20Sopenharmony_ci	PERF_CONTEXT_GUEST_KERNEL	= (__u64)-2176,
12437c2aad20Sopenharmony_ci	PERF_CONTEXT_GUEST_USER		= (__u64)-2560,
12447c2aad20Sopenharmony_ci
12457c2aad20Sopenharmony_ci	PERF_CONTEXT_MAX		= (__u64)-4095,
12467c2aad20Sopenharmony_ci};
12477c2aad20Sopenharmony_ci
12487c2aad20Sopenharmony_ci/**
12497c2aad20Sopenharmony_ci * PERF_RECORD_AUX::flags bits
12507c2aad20Sopenharmony_ci */
12517c2aad20Sopenharmony_ci#define PERF_AUX_FLAG_TRUNCATED			0x01	/* record was truncated to fit */
12527c2aad20Sopenharmony_ci#define PERF_AUX_FLAG_OVERWRITE			0x02	/* snapshot from overwrite mode */
12537c2aad20Sopenharmony_ci#define PERF_AUX_FLAG_PARTIAL			0x04	/* record contains gaps */
12547c2aad20Sopenharmony_ci#define PERF_AUX_FLAG_COLLISION			0x08	/* sample collided with another */
12557c2aad20Sopenharmony_ci#define PERF_AUX_FLAG_PMU_FORMAT_TYPE_MASK	0xff00	/* PMU specific trace format type */
12567c2aad20Sopenharmony_ci
12577c2aad20Sopenharmony_ci/* CoreSight PMU AUX buffer formats */
12587c2aad20Sopenharmony_ci#define PERF_AUX_FLAG_CORESIGHT_FORMAT_CORESIGHT	0x0000 /* Default for backward compatibility */
12597c2aad20Sopenharmony_ci#define PERF_AUX_FLAG_CORESIGHT_FORMAT_RAW		0x0100 /* Raw format of the source */
12607c2aad20Sopenharmony_ci
12617c2aad20Sopenharmony_ci#define PERF_FLAG_FD_NO_GROUP		(1UL << 0)
12627c2aad20Sopenharmony_ci#define PERF_FLAG_FD_OUTPUT		(1UL << 1)
12637c2aad20Sopenharmony_ci#define PERF_FLAG_PID_CGROUP		(1UL << 2) /* pid=cgroup id, per-cpu mode only */
12647c2aad20Sopenharmony_ci#define PERF_FLAG_FD_CLOEXEC		(1UL << 3) /* O_CLOEXEC */
12657c2aad20Sopenharmony_ci
12667c2aad20Sopenharmony_ci#if defined(__LITTLE_ENDIAN_BITFIELD)
12677c2aad20Sopenharmony_ciunion perf_mem_data_src {
12687c2aad20Sopenharmony_ci	__u64 val;
12697c2aad20Sopenharmony_ci	struct {
12707c2aad20Sopenharmony_ci		__u64   mem_op:5,	/* type of opcode */
12717c2aad20Sopenharmony_ci			mem_lvl:14,	/* memory hierarchy level */
12727c2aad20Sopenharmony_ci			mem_snoop:5,	/* snoop mode */
12737c2aad20Sopenharmony_ci			mem_lock:2,	/* lock instr */
12747c2aad20Sopenharmony_ci			mem_dtlb:7,	/* tlb access */
12757c2aad20Sopenharmony_ci			mem_lvl_num:4,	/* memory hierarchy level number */
12767c2aad20Sopenharmony_ci			mem_remote:1,   /* remote */
12777c2aad20Sopenharmony_ci			mem_snoopx:2,	/* snoop mode, ext */
12787c2aad20Sopenharmony_ci			mem_blk:3,	/* access blocked */
12797c2aad20Sopenharmony_ci			mem_hops:3,	/* hop level */
12807c2aad20Sopenharmony_ci			mem_rsvd:18;
12817c2aad20Sopenharmony_ci	};
12827c2aad20Sopenharmony_ci};
12837c2aad20Sopenharmony_ci#elif defined(__BIG_ENDIAN_BITFIELD)
12847c2aad20Sopenharmony_ciunion perf_mem_data_src {
12857c2aad20Sopenharmony_ci	__u64 val;
12867c2aad20Sopenharmony_ci	struct {
12877c2aad20Sopenharmony_ci		__u64	mem_rsvd:18,
12887c2aad20Sopenharmony_ci			mem_hops:3,	/* hop level */
12897c2aad20Sopenharmony_ci			mem_blk:3,	/* access blocked */
12907c2aad20Sopenharmony_ci			mem_snoopx:2,	/* snoop mode, ext */
12917c2aad20Sopenharmony_ci			mem_remote:1,   /* remote */
12927c2aad20Sopenharmony_ci			mem_lvl_num:4,	/* memory hierarchy level number */
12937c2aad20Sopenharmony_ci			mem_dtlb:7,	/* tlb access */
12947c2aad20Sopenharmony_ci			mem_lock:2,	/* lock instr */
12957c2aad20Sopenharmony_ci			mem_snoop:5,	/* snoop mode */
12967c2aad20Sopenharmony_ci			mem_lvl:14,	/* memory hierarchy level */
12977c2aad20Sopenharmony_ci			mem_op:5;	/* type of opcode */
12987c2aad20Sopenharmony_ci	};
12997c2aad20Sopenharmony_ci};
13007c2aad20Sopenharmony_ci#else
13017c2aad20Sopenharmony_ci#error "Unknown endianness"
13027c2aad20Sopenharmony_ci#endif
13037c2aad20Sopenharmony_ci
13047c2aad20Sopenharmony_ci/* type of opcode (load/store/prefetch,code) */
13057c2aad20Sopenharmony_ci#define PERF_MEM_OP_NA		0x01 /* not available */
13067c2aad20Sopenharmony_ci#define PERF_MEM_OP_LOAD	0x02 /* load instruction */
13077c2aad20Sopenharmony_ci#define PERF_MEM_OP_STORE	0x04 /* store instruction */
13087c2aad20Sopenharmony_ci#define PERF_MEM_OP_PFETCH	0x08 /* prefetch */
13097c2aad20Sopenharmony_ci#define PERF_MEM_OP_EXEC	0x10 /* code (execution) */
13107c2aad20Sopenharmony_ci#define PERF_MEM_OP_SHIFT	0
13117c2aad20Sopenharmony_ci
13127c2aad20Sopenharmony_ci/*
13137c2aad20Sopenharmony_ci * PERF_MEM_LVL_* namespace being depricated to some extent in the
13147c2aad20Sopenharmony_ci * favour of newer composite PERF_MEM_{LVLNUM_,REMOTE_,SNOOPX_} fields.
13157c2aad20Sopenharmony_ci * Supporting this namespace inorder to not break defined ABIs.
13167c2aad20Sopenharmony_ci *
13177c2aad20Sopenharmony_ci * memory hierarchy (memory level, hit or miss)
13187c2aad20Sopenharmony_ci */
13197c2aad20Sopenharmony_ci#define PERF_MEM_LVL_NA		0x01  /* not available */
13207c2aad20Sopenharmony_ci#define PERF_MEM_LVL_HIT	0x02  /* hit level */
13217c2aad20Sopenharmony_ci#define PERF_MEM_LVL_MISS	0x04  /* miss level  */
13227c2aad20Sopenharmony_ci#define PERF_MEM_LVL_L1		0x08  /* L1 */
13237c2aad20Sopenharmony_ci#define PERF_MEM_LVL_LFB	0x10  /* Line Fill Buffer */
13247c2aad20Sopenharmony_ci#define PERF_MEM_LVL_L2		0x20  /* L2 */
13257c2aad20Sopenharmony_ci#define PERF_MEM_LVL_L3		0x40  /* L3 */
13267c2aad20Sopenharmony_ci#define PERF_MEM_LVL_LOC_RAM	0x80  /* Local DRAM */
13277c2aad20Sopenharmony_ci#define PERF_MEM_LVL_REM_RAM1	0x100 /* Remote DRAM (1 hop) */
13287c2aad20Sopenharmony_ci#define PERF_MEM_LVL_REM_RAM2	0x200 /* Remote DRAM (2 hops) */
13297c2aad20Sopenharmony_ci#define PERF_MEM_LVL_REM_CCE1	0x400 /* Remote Cache (1 hop) */
13307c2aad20Sopenharmony_ci#define PERF_MEM_LVL_REM_CCE2	0x800 /* Remote Cache (2 hops) */
13317c2aad20Sopenharmony_ci#define PERF_MEM_LVL_IO		0x1000 /* I/O memory */
13327c2aad20Sopenharmony_ci#define PERF_MEM_LVL_UNC	0x2000 /* Uncached memory */
13337c2aad20Sopenharmony_ci#define PERF_MEM_LVL_SHIFT	5
13347c2aad20Sopenharmony_ci
13357c2aad20Sopenharmony_ci#define PERF_MEM_REMOTE_REMOTE	0x01  /* Remote */
13367c2aad20Sopenharmony_ci#define PERF_MEM_REMOTE_SHIFT	37
13377c2aad20Sopenharmony_ci
13387c2aad20Sopenharmony_ci#define PERF_MEM_LVLNUM_L1	0x01 /* L1 */
13397c2aad20Sopenharmony_ci#define PERF_MEM_LVLNUM_L2	0x02 /* L2 */
13407c2aad20Sopenharmony_ci#define PERF_MEM_LVLNUM_L3	0x03 /* L3 */
13417c2aad20Sopenharmony_ci#define PERF_MEM_LVLNUM_L4	0x04 /* L4 */
13427c2aad20Sopenharmony_ci/* 5-0x7 available */
13437c2aad20Sopenharmony_ci#define PERF_MEM_LVLNUM_UNC	0x08 /* Uncached */
13447c2aad20Sopenharmony_ci#define PERF_MEM_LVLNUM_CXL	0x09 /* CXL */
13457c2aad20Sopenharmony_ci#define PERF_MEM_LVLNUM_IO	0x0a /* I/O */
13467c2aad20Sopenharmony_ci#define PERF_MEM_LVLNUM_ANY_CACHE 0x0b /* Any cache */
13477c2aad20Sopenharmony_ci#define PERF_MEM_LVLNUM_LFB	0x0c /* LFB */
13487c2aad20Sopenharmony_ci#define PERF_MEM_LVLNUM_RAM	0x0d /* RAM */
13497c2aad20Sopenharmony_ci#define PERF_MEM_LVLNUM_PMEM	0x0e /* PMEM */
13507c2aad20Sopenharmony_ci#define PERF_MEM_LVLNUM_NA	0x0f /* N/A */
13517c2aad20Sopenharmony_ci
13527c2aad20Sopenharmony_ci#define PERF_MEM_LVLNUM_SHIFT	33
13537c2aad20Sopenharmony_ci
13547c2aad20Sopenharmony_ci/* snoop mode */
13557c2aad20Sopenharmony_ci#define PERF_MEM_SNOOP_NA	0x01 /* not available */
13567c2aad20Sopenharmony_ci#define PERF_MEM_SNOOP_NONE	0x02 /* no snoop */
13577c2aad20Sopenharmony_ci#define PERF_MEM_SNOOP_HIT	0x04 /* snoop hit */
13587c2aad20Sopenharmony_ci#define PERF_MEM_SNOOP_MISS	0x08 /* snoop miss */
13597c2aad20Sopenharmony_ci#define PERF_MEM_SNOOP_HITM	0x10 /* snoop hit modified */
13607c2aad20Sopenharmony_ci#define PERF_MEM_SNOOP_SHIFT	19
13617c2aad20Sopenharmony_ci
13627c2aad20Sopenharmony_ci#define PERF_MEM_SNOOPX_FWD	0x01 /* forward */
13637c2aad20Sopenharmony_ci#define PERF_MEM_SNOOPX_PEER	0x02 /* xfer from peer */
13647c2aad20Sopenharmony_ci#define PERF_MEM_SNOOPX_SHIFT  38
13657c2aad20Sopenharmony_ci
13667c2aad20Sopenharmony_ci/* locked instruction */
13677c2aad20Sopenharmony_ci#define PERF_MEM_LOCK_NA	0x01 /* not available */
13687c2aad20Sopenharmony_ci#define PERF_MEM_LOCK_LOCKED	0x02 /* locked transaction */
13697c2aad20Sopenharmony_ci#define PERF_MEM_LOCK_SHIFT	24
13707c2aad20Sopenharmony_ci
13717c2aad20Sopenharmony_ci/* TLB access */
13727c2aad20Sopenharmony_ci#define PERF_MEM_TLB_NA		0x01 /* not available */
13737c2aad20Sopenharmony_ci#define PERF_MEM_TLB_HIT	0x02 /* hit level */
13747c2aad20Sopenharmony_ci#define PERF_MEM_TLB_MISS	0x04 /* miss level */
13757c2aad20Sopenharmony_ci#define PERF_MEM_TLB_L1		0x08 /* L1 */
13767c2aad20Sopenharmony_ci#define PERF_MEM_TLB_L2		0x10 /* L2 */
13777c2aad20Sopenharmony_ci#define PERF_MEM_TLB_WK		0x20 /* Hardware Walker*/
13787c2aad20Sopenharmony_ci#define PERF_MEM_TLB_OS		0x40 /* OS fault handler */
13797c2aad20Sopenharmony_ci#define PERF_MEM_TLB_SHIFT	26
13807c2aad20Sopenharmony_ci
13817c2aad20Sopenharmony_ci/* Access blocked */
13827c2aad20Sopenharmony_ci#define PERF_MEM_BLK_NA		0x01 /* not available */
13837c2aad20Sopenharmony_ci#define PERF_MEM_BLK_DATA	0x02 /* data could not be forwarded */
13847c2aad20Sopenharmony_ci#define PERF_MEM_BLK_ADDR	0x04 /* address conflict */
13857c2aad20Sopenharmony_ci#define PERF_MEM_BLK_SHIFT	40
13867c2aad20Sopenharmony_ci
13877c2aad20Sopenharmony_ci/* hop level */
13887c2aad20Sopenharmony_ci#define PERF_MEM_HOPS_0		0x01 /* remote core, same node */
13897c2aad20Sopenharmony_ci#define PERF_MEM_HOPS_1		0x02 /* remote node, same socket */
13907c2aad20Sopenharmony_ci#define PERF_MEM_HOPS_2		0x03 /* remote socket, same board */
13917c2aad20Sopenharmony_ci#define PERF_MEM_HOPS_3		0x04 /* remote board */
13927c2aad20Sopenharmony_ci/* 5-7 available */
13937c2aad20Sopenharmony_ci#define PERF_MEM_HOPS_SHIFT	43
13947c2aad20Sopenharmony_ci
13957c2aad20Sopenharmony_ci#define PERF_MEM_S(a, s) \
13967c2aad20Sopenharmony_ci	(((__u64)PERF_MEM_##a##_##s) << PERF_MEM_##a##_SHIFT)
13977c2aad20Sopenharmony_ci
13987c2aad20Sopenharmony_ci/*
13997c2aad20Sopenharmony_ci * single taken branch record layout:
14007c2aad20Sopenharmony_ci *
14017c2aad20Sopenharmony_ci *      from: source instruction (may not always be a branch insn)
14027c2aad20Sopenharmony_ci *        to: branch target
14037c2aad20Sopenharmony_ci *   mispred: branch target was mispredicted
14047c2aad20Sopenharmony_ci * predicted: branch target was predicted
14057c2aad20Sopenharmony_ci *
14067c2aad20Sopenharmony_ci * support for mispred, predicted is optional. In case it
14077c2aad20Sopenharmony_ci * is not supported mispred = predicted = 0.
14087c2aad20Sopenharmony_ci *
14097c2aad20Sopenharmony_ci *     in_tx: running in a hardware transaction
14107c2aad20Sopenharmony_ci *     abort: aborting a hardware transaction
14117c2aad20Sopenharmony_ci *    cycles: cycles from last branch (or 0 if not supported)
14127c2aad20Sopenharmony_ci *      type: branch type
14137c2aad20Sopenharmony_ci *      spec: branch speculation info (or 0 if not supported)
14147c2aad20Sopenharmony_ci */
14157c2aad20Sopenharmony_cistruct perf_branch_entry {
14167c2aad20Sopenharmony_ci	__u64	from;
14177c2aad20Sopenharmony_ci	__u64	to;
14187c2aad20Sopenharmony_ci	__u64	mispred:1,  /* target mispredicted */
14197c2aad20Sopenharmony_ci		predicted:1,/* target predicted */
14207c2aad20Sopenharmony_ci		in_tx:1,    /* in transaction */
14217c2aad20Sopenharmony_ci		abort:1,    /* transaction abort */
14227c2aad20Sopenharmony_ci		cycles:16,  /* cycle count to last branch */
14237c2aad20Sopenharmony_ci		type:4,     /* branch type */
14247c2aad20Sopenharmony_ci		spec:2,     /* branch speculation info */
14257c2aad20Sopenharmony_ci		new_type:4, /* additional branch type */
14267c2aad20Sopenharmony_ci		priv:3,     /* privilege level */
14277c2aad20Sopenharmony_ci		reserved:31;
14287c2aad20Sopenharmony_ci};
14297c2aad20Sopenharmony_ci
14307c2aad20Sopenharmony_ciunion perf_sample_weight {
14317c2aad20Sopenharmony_ci	__u64		full;
14327c2aad20Sopenharmony_ci#if defined(__LITTLE_ENDIAN_BITFIELD)
14337c2aad20Sopenharmony_ci	struct {
14347c2aad20Sopenharmony_ci		__u32	var1_dw;
14357c2aad20Sopenharmony_ci		__u16	var2_w;
14367c2aad20Sopenharmony_ci		__u16	var3_w;
14377c2aad20Sopenharmony_ci	};
14387c2aad20Sopenharmony_ci#elif defined(__BIG_ENDIAN_BITFIELD)
14397c2aad20Sopenharmony_ci	struct {
14407c2aad20Sopenharmony_ci		__u16	var3_w;
14417c2aad20Sopenharmony_ci		__u16	var2_w;
14427c2aad20Sopenharmony_ci		__u32	var1_dw;
14437c2aad20Sopenharmony_ci	};
14447c2aad20Sopenharmony_ci#else
14457c2aad20Sopenharmony_ci#error "Unknown endianness"
14467c2aad20Sopenharmony_ci#endif
14477c2aad20Sopenharmony_ci};
14487c2aad20Sopenharmony_ci
14497c2aad20Sopenharmony_ci#endif /* _UAPI_LINUX_PERF_EVENT_H */
1450