diff options
Diffstat (limited to 'tools/include')
| -rw-r--r-- | tools/include/asm-generic/unaligned.h | 23 | ||||
| -rw-r--r-- | tools/include/linux/objtool.h | 12 | ||||
| -rw-r--r-- | tools/include/uapi/linux/bpf.h | 76 | ||||
| -rw-r--r-- | tools/include/uapi/linux/btf.h | 55 | ||||
| -rw-r--r-- | tools/include/uapi/linux/perf_event.h | 19 | 
5 files changed, 159 insertions, 26 deletions
| diff --git a/tools/include/asm-generic/unaligned.h b/tools/include/asm-generic/unaligned.h new file mode 100644 index 000000000000..47387c607035 --- /dev/null +++ b/tools/include/asm-generic/unaligned.h @@ -0,0 +1,23 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * Copied from the kernel sources to tools/perf/: + */ + +#ifndef __TOOLS_LINUX_ASM_GENERIC_UNALIGNED_H +#define __TOOLS_LINUX_ASM_GENERIC_UNALIGNED_H + +#define __get_unaligned_t(type, ptr) ({						\ +	const struct { type x; } __packed *__pptr = (typeof(__pptr))(ptr);	\ +	__pptr->x;								\ +}) + +#define __put_unaligned_t(type, val, ptr) do {					\ +	struct { type x; } __packed *__pptr = (typeof(__pptr))(ptr);		\ +	__pptr->x = (val);							\ +} while (0) + +#define get_unaligned(ptr)	__get_unaligned_t(typeof(*(ptr)), (ptr)) +#define put_unaligned(val, ptr) __put_unaligned_t(typeof(*(ptr)), (val), (ptr)) + +#endif /* __TOOLS_LINUX_ASM_GENERIC_UNALIGNED_H */ + diff --git a/tools/include/linux/objtool.h b/tools/include/linux/objtool.h index 7e72d975cb76..aca52db2f3f3 100644 --- a/tools/include/linux/objtool.h +++ b/tools/include/linux/objtool.h @@ -66,6 +66,17 @@ struct unwind_hint {  	static void __used __section(".discard.func_stack_frame_non_standard") \  		*__func_stack_frame_non_standard_##func = func +/* + * STACK_FRAME_NON_STANDARD_FP() is a frame-pointer-specific function ignore + * for the case where a function is intentionally missing frame pointer setup, + * but otherwise needs objtool/ORC coverage when frame pointers are disabled. + */ +#ifdef CONFIG_FRAME_POINTER +#define STACK_FRAME_NON_STANDARD_FP(func) STACK_FRAME_NON_STANDARD(func) +#else +#define STACK_FRAME_NON_STANDARD_FP(func) +#endif +  #else /* __ASSEMBLY__ */  /* @@ -127,6 +138,7 @@ struct unwind_hint {  #define UNWIND_HINT(sp_reg, sp_offset, type, end)	\  	"\n\t"  #define STACK_FRAME_NON_STANDARD(func) +#define STACK_FRAME_NON_STANDARD_FP(func)  #else  #define ANNOTATE_INTRA_FUNCTION_CALL  .macro UNWIND_HINT sp_reg:req sp_offset=0 type:req end=0 diff --git a/tools/include/uapi/linux/bpf.h b/tools/include/uapi/linux/bpf.h index 791f31dd0abe..ba5af15e25f5 100644 --- a/tools/include/uapi/linux/bpf.h +++ b/tools/include/uapi/linux/bpf.h @@ -906,6 +906,7 @@ enum bpf_map_type {  	BPF_MAP_TYPE_RINGBUF,  	BPF_MAP_TYPE_INODE_STORAGE,  	BPF_MAP_TYPE_TASK_STORAGE, +	BPF_MAP_TYPE_BLOOM_FILTER,  };  /* Note that tracing related programs such as @@ -1274,6 +1275,13 @@ union bpf_attr {  						   * struct stored as the  						   * map value  						   */ +		/* Any per-map-type extra fields +		 * +		 * BPF_MAP_TYPE_BLOOM_FILTER - the lowest 4 bits indicate the +		 * number of hash functions (if 0, the bloom filter will default +		 * to using 5 hash functions). +		 */ +		__u64	map_extra;  	};  	struct { /* anonymous struct used by BPF_MAP_*_ELEM commands */ @@ -1629,7 +1637,7 @@ union bpf_attr {   * u32 bpf_get_smp_processor_id(void)   * 	Description   * 		Get the SMP (symmetric multiprocessing) processor id. Note that - * 		all programs run with preemption disabled, which means that the + * 		all programs run with migration disabled, which means that the   * 		SMP processor id is stable during all the execution of the   * 		program.   * 	Return @@ -4046,7 +4054,7 @@ union bpf_attr {   * 		arguments. The *data* are a **u64** array and corresponding format string   * 		values are stored in the array. For strings and pointers where pointees   * 		are accessed, only the pointer values are stored in the *data* array. - * 		The *data_len* is the size of *data* in bytes. + * 		The *data_len* is the size of *data* in bytes - must be a multiple of 8.   *   *		Formats **%s**, **%p{i,I}{4,6}** requires to read kernel memory.   *		Reading kernel memory may fail due to either invalid address or @@ -4751,7 +4759,8 @@ union bpf_attr {   *		Each format specifier in **fmt** corresponds to one u64 element   *		in the **data** array. For strings and pointers where pointees   *		are accessed, only the pointer values are stored in the *data* - *		array. The *data_len* is the size of *data* in bytes. + *		array. The *data_len* is the size of *data* in bytes - must be + *		a multiple of 8.   *   *		Formats **%s** and **%p{i,I}{4,6}** require to read kernel   *		memory. Reading kernel memory may fail due to either invalid @@ -4877,6 +4886,58 @@ union bpf_attr {   *		Get the struct pt_regs associated with **task**.   *	Return   *		A pointer to struct pt_regs. + * + * long bpf_get_branch_snapshot(void *entries, u32 size, u64 flags) + *	Description + *		Get branch trace from hardware engines like Intel LBR. The + *		hardware engine is stopped shortly after the helper is + *		called. Therefore, the user need to filter branch entries + *		based on the actual use case. To capture branch trace + *		before the trigger point of the BPF program, the helper + *		should be called at the beginning of the BPF program. + * + *		The data is stored as struct perf_branch_entry into output + *		buffer *entries*. *size* is the size of *entries* in bytes. + *		*flags* is reserved for now and must be zero. + * + *	Return + *		On success, number of bytes written to *buf*. On error, a + *		negative value. + * + *		**-EINVAL** if *flags* is not zero. + * + *		**-ENOENT** if architecture does not support branch records. + * + * long bpf_trace_vprintk(const char *fmt, u32 fmt_size, const void *data, u32 data_len) + *	Description + *		Behaves like **bpf_trace_printk**\ () helper, but takes an array of u64 + *		to format and can handle more format args as a result. + * + *		Arguments are to be used as in **bpf_seq_printf**\ () helper. + *	Return + *		The number of bytes written to the buffer, or a negative error + *		in case of failure. + * + * struct unix_sock *bpf_skc_to_unix_sock(void *sk) + * 	Description + *		Dynamically cast a *sk* pointer to a *unix_sock* pointer. + *	Return + *		*sk* if casting is valid, or **NULL** otherwise. + * + * long bpf_kallsyms_lookup_name(const char *name, int name_sz, int flags, u64 *res) + *	Description + *		Get the address of a kernel symbol, returned in *res*. *res* is + *		set to 0 if the symbol is not found. + *	Return + *		On success, zero. On error, a negative value. + * + *		**-EINVAL** if *flags* is not zero. + * + *		**-EINVAL** if string *name* is not the same size as *name_sz*. + * + *		**-ENOENT** if symbol is not found. + * + *		**-EPERM** if caller does not have permission to obtain kernel address.   */  #define __BPF_FUNC_MAPPER(FN)		\  	FN(unspec),			\ @@ -5055,6 +5116,10 @@ union bpf_attr {  	FN(get_func_ip),		\  	FN(get_attach_cookie),		\  	FN(task_pt_regs),		\ +	FN(get_branch_snapshot),	\ +	FN(trace_vprintk),		\ +	FN(skc_to_unix_sock),		\ +	FN(kallsyms_lookup_name),	\  	/* */  /* integer value in 'imm' field of BPF_CALL instruction selects which helper @@ -5284,6 +5349,8 @@ struct __sk_buff {  	__u32 gso_segs;  	__bpf_md_ptr(struct bpf_sock *, sk);  	__u32 gso_size; +	__u32 :32;		/* Padding, future use. */ +	__u64 hwtstamp;  };  struct bpf_tunnel_key { @@ -5577,6 +5644,7 @@ struct bpf_prog_info {  	__u64 run_time_ns;  	__u64 run_cnt;  	__u64 recursion_misses; +	__u32 verified_insns;  } __attribute__((aligned(8)));  struct bpf_map_info { @@ -5594,6 +5662,8 @@ struct bpf_map_info {  	__u32 btf_id;  	__u32 btf_key_type_id;  	__u32 btf_value_type_id; +	__u32 :32;	/* alignment pad */ +	__u64 map_extra;  } __attribute__((aligned(8)));  struct bpf_btf_info { diff --git a/tools/include/uapi/linux/btf.h b/tools/include/uapi/linux/btf.h index d27b1708efe9..deb12f755f0f 100644 --- a/tools/include/uapi/linux/btf.h +++ b/tools/include/uapi/linux/btf.h @@ -43,7 +43,7 @@ struct btf_type {  	 * "size" tells the size of the type it is describing.  	 *  	 * "type" is used by PTR, TYPEDEF, VOLATILE, CONST, RESTRICT, -	 * FUNC, FUNC_PROTO and VAR. +	 * FUNC, FUNC_PROTO, VAR and DECL_TAG.  	 * "type" is a type_id referring to another type.  	 */  	union { @@ -56,25 +56,29 @@ struct btf_type {  #define BTF_INFO_VLEN(info)	((info) & 0xffff)  #define BTF_INFO_KFLAG(info)	((info) >> 31) -#define BTF_KIND_UNKN		0	/* Unknown	*/ -#define BTF_KIND_INT		1	/* Integer	*/ -#define BTF_KIND_PTR		2	/* Pointer	*/ -#define BTF_KIND_ARRAY		3	/* Array	*/ -#define BTF_KIND_STRUCT		4	/* Struct	*/ -#define BTF_KIND_UNION		5	/* Union	*/ -#define BTF_KIND_ENUM		6	/* Enumeration	*/ -#define BTF_KIND_FWD		7	/* Forward	*/ -#define BTF_KIND_TYPEDEF	8	/* Typedef	*/ -#define BTF_KIND_VOLATILE	9	/* Volatile	*/ -#define BTF_KIND_CONST		10	/* Const	*/ -#define BTF_KIND_RESTRICT	11	/* Restrict	*/ -#define BTF_KIND_FUNC		12	/* Function	*/ -#define BTF_KIND_FUNC_PROTO	13	/* Function Proto	*/ -#define BTF_KIND_VAR		14	/* Variable	*/ -#define BTF_KIND_DATASEC	15	/* Section	*/ -#define BTF_KIND_FLOAT		16	/* Floating point	*/ -#define BTF_KIND_MAX		BTF_KIND_FLOAT -#define NR_BTF_KINDS		(BTF_KIND_MAX + 1) +enum { +	BTF_KIND_UNKN		= 0,	/* Unknown	*/ +	BTF_KIND_INT		= 1,	/* Integer	*/ +	BTF_KIND_PTR		= 2,	/* Pointer	*/ +	BTF_KIND_ARRAY		= 3,	/* Array	*/ +	BTF_KIND_STRUCT		= 4,	/* Struct	*/ +	BTF_KIND_UNION		= 5,	/* Union	*/ +	BTF_KIND_ENUM		= 6,	/* Enumeration	*/ +	BTF_KIND_FWD		= 7,	/* Forward	*/ +	BTF_KIND_TYPEDEF	= 8,	/* Typedef	*/ +	BTF_KIND_VOLATILE	= 9,	/* Volatile	*/ +	BTF_KIND_CONST		= 10,	/* Const	*/ +	BTF_KIND_RESTRICT	= 11,	/* Restrict	*/ +	BTF_KIND_FUNC		= 12,	/* Function	*/ +	BTF_KIND_FUNC_PROTO	= 13,	/* Function Proto	*/ +	BTF_KIND_VAR		= 14,	/* Variable	*/ +	BTF_KIND_DATASEC	= 15,	/* Section	*/ +	BTF_KIND_FLOAT		= 16,	/* Floating point	*/ +	BTF_KIND_DECL_TAG	= 17,	/* Decl Tag */ + +	NR_BTF_KINDS, +	BTF_KIND_MAX		= NR_BTF_KINDS - 1, +};  /* For some specific BTF_KIND, "struct btf_type" is immediately   * followed by extra data. @@ -170,4 +174,15 @@ struct btf_var_secinfo {  	__u32	size;  }; +/* BTF_KIND_DECL_TAG is followed by a single "struct btf_decl_tag" to describe + * additional information related to the tag applied location. + * If component_idx == -1, the tag is applied to a struct, union, + * variable or function. Otherwise, it is applied to a struct/union + * member or a func argument, and component_idx indicates which member + * or argument (0 ... vlen-1). + */ +struct btf_decl_tag { +       __s32   component_idx; +}; +  #endif /* _UAPI__LINUX_BTF_H__ */ diff --git a/tools/include/uapi/linux/perf_event.h b/tools/include/uapi/linux/perf_event.h index f92880a15645..2fc09579e24a 100644 --- a/tools/include/uapi/linux/perf_event.h +++ b/tools/include/uapi/linux/perf_event.h @@ -1210,14 +1210,16 @@ union perf_mem_data_src {  			mem_remote:1,   /* remote */  			mem_snoopx:2,	/* snoop mode, ext */  			mem_blk:3,	/* access blocked */ -			mem_rsvd:21; +			mem_hops:3,	/* hop level */ +			mem_rsvd:18;  	};  };  #elif defined(__BIG_ENDIAN_BITFIELD)  union perf_mem_data_src {  	__u64 val;  	struct { -		__u64	mem_rsvd:21, +		__u64	mem_rsvd:18, +			mem_hops:3,	/* hop level */  			mem_blk:3,	/* access blocked */  			mem_snoopx:2,	/* snoop mode, ext */  			mem_remote:1,   /* remote */ @@ -1241,7 +1243,13 @@ union perf_mem_data_src {  #define PERF_MEM_OP_EXEC	0x10 /* code (execution) */  #define PERF_MEM_OP_SHIFT	0 -/* memory hierarchy (memory level, hit or miss) */ +/* + * PERF_MEM_LVL_* namespace being depricated to some extent in the + * favour of newer composite PERF_MEM_{LVLNUM_,REMOTE_,SNOOPX_} fields. + * Supporting this namespace inorder to not break defined ABIs. + * + * memory hierarchy (memory level, hit or miss) + */  #define PERF_MEM_LVL_NA		0x01  /* not available */  #define PERF_MEM_LVL_HIT	0x02  /* hit level */  #define PERF_MEM_LVL_MISS	0x04  /* miss level  */ @@ -1307,6 +1315,11 @@ union perf_mem_data_src {  #define PERF_MEM_BLK_ADDR	0x04 /* address conflict */  #define PERF_MEM_BLK_SHIFT	40 +/* hop level */ +#define PERF_MEM_HOPS_0		0x01 /* remote core, same node */ +/* 2-7 available */ +#define PERF_MEM_HOPS_SHIFT	43 +  #define PERF_MEM_S(a, s) \  	(((__u64)PERF_MEM_##a##_##s) << PERF_MEM_##a##_SHIFT) |