cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

header.h (4732B)


      1/* SPDX-License-Identifier: GPL-2.0 */
      2#ifndef __PERF_HEADER_H
      3#define __PERF_HEADER_H
      4
      5#include <linux/stddef.h>
      6#include <linux/perf_event.h>
      7#include <sys/types.h>
      8#include <stdio.h> // FILE
      9#include <stdbool.h>
     10#include <linux/bitmap.h>
     11#include <linux/types.h>
     12#include "env.h"
     13#include "pmu.h"
     14
     15enum {
     16	HEADER_RESERVED		= 0,	/* always cleared */
     17	HEADER_FIRST_FEATURE	= 1,
     18	HEADER_TRACING_DATA	= 1,
     19	HEADER_BUILD_ID,
     20
     21	HEADER_HOSTNAME,
     22	HEADER_OSRELEASE,
     23	HEADER_VERSION,
     24	HEADER_ARCH,
     25	HEADER_NRCPUS,
     26	HEADER_CPUDESC,
     27	HEADER_CPUID,
     28	HEADER_TOTAL_MEM,
     29	HEADER_CMDLINE,
     30	HEADER_EVENT_DESC,
     31	HEADER_CPU_TOPOLOGY,
     32	HEADER_NUMA_TOPOLOGY,
     33	HEADER_BRANCH_STACK,
     34	HEADER_PMU_MAPPINGS,
     35	HEADER_GROUP_DESC,
     36	HEADER_AUXTRACE,
     37	HEADER_STAT,
     38	HEADER_CACHE,
     39	HEADER_SAMPLE_TIME,
     40	HEADER_MEM_TOPOLOGY,
     41	HEADER_CLOCKID,
     42	HEADER_DIR_FORMAT,
     43	HEADER_BPF_PROG_INFO,
     44	HEADER_BPF_BTF,
     45	HEADER_COMPRESSED,
     46	HEADER_CPU_PMU_CAPS,
     47	HEADER_CLOCK_DATA,
     48	HEADER_HYBRID_TOPOLOGY,
     49	HEADER_HYBRID_CPU_PMU_CAPS,
     50	HEADER_LAST_FEATURE,
     51	HEADER_FEAT_BITS	= 256,
     52};
     53
     54enum perf_header_version {
     55	PERF_HEADER_VERSION_1,
     56	PERF_HEADER_VERSION_2,
     57};
     58
     59struct perf_file_section {
     60	u64 offset;
     61	u64 size;
     62};
     63
     64struct perf_file_header {
     65	u64				magic;
     66	u64				size;
     67	u64				attr_size;
     68	struct perf_file_section	attrs;
     69	struct perf_file_section	data;
     70	/* event_types is ignored */
     71	struct perf_file_section	event_types;
     72	DECLARE_BITMAP(adds_features, HEADER_FEAT_BITS);
     73};
     74
     75struct perf_pipe_file_header {
     76	u64				magic;
     77	u64				size;
     78};
     79
     80struct perf_header;
     81
     82int perf_file_header__read(struct perf_file_header *header,
     83			   struct perf_header *ph, int fd);
     84
     85struct perf_header {
     86	enum perf_header_version	version;
     87	bool				needs_swap;
     88	u64				data_offset;
     89	u64				data_size;
     90	u64				feat_offset;
     91	DECLARE_BITMAP(adds_features, HEADER_FEAT_BITS);
     92	struct perf_env 	env;
     93};
     94
     95struct feat_fd {
     96	struct perf_header *ph;
     97	int		   fd;
     98	void		   *buf;	/* Either buf != NULL or fd >= 0 */
     99	ssize_t		   offset;
    100	size_t		   size;
    101	struct evsel	   *events;
    102};
    103
    104struct perf_header_feature_ops {
    105	int	   (*write)(struct feat_fd *ff, struct evlist *evlist);
    106	void	   (*print)(struct feat_fd *ff, FILE *fp);
    107	int	   (*process)(struct feat_fd *ff, void *data);
    108	const char *name;
    109	bool	   full_only;
    110	bool	   synthesize;
    111};
    112
    113struct evlist;
    114struct perf_session;
    115struct perf_tool;
    116union perf_event;
    117
    118int perf_session__read_header(struct perf_session *session, int repipe_fd);
    119int perf_session__write_header(struct perf_session *session,
    120			       struct evlist *evlist,
    121			       int fd, bool at_exit);
    122int perf_header__write_pipe(int fd);
    123
    124/* feat_writer writes a feature section to output */
    125struct feat_writer {
    126	int (*write)(struct feat_writer *fw, void *buf, size_t sz);
    127};
    128
    129/* feat_copier copies a feature section using feat_writer to output */
    130struct feat_copier {
    131	int (*copy)(struct feat_copier *fc, int feat, struct feat_writer *fw);
    132};
    133
    134int perf_session__inject_header(struct perf_session *session,
    135				struct evlist *evlist,
    136				int fd,
    137				struct feat_copier *fc);
    138
    139size_t perf_session__data_offset(const struct evlist *evlist);
    140
    141void perf_header__set_feat(struct perf_header *header, int feat);
    142void perf_header__clear_feat(struct perf_header *header, int feat);
    143bool perf_header__has_feat(const struct perf_header *header, int feat);
    144
    145int perf_header__set_cmdline(int argc, const char **argv);
    146
    147int perf_header__process_sections(struct perf_header *header, int fd,
    148				  void *data,
    149				  int (*process)(struct perf_file_section *section,
    150				  struct perf_header *ph,
    151				  int feat, int fd, void *data));
    152
    153int perf_header__fprintf_info(struct perf_session *s, FILE *fp, bool full);
    154
    155int perf_event__process_feature(struct perf_session *session,
    156				union perf_event *event);
    157int perf_event__process_attr(struct perf_tool *tool, union perf_event *event,
    158			     struct evlist **pevlist);
    159int perf_event__process_event_update(struct perf_tool *tool,
    160				     union perf_event *event,
    161				     struct evlist **pevlist);
    162size_t perf_event__fprintf_event_update(union perf_event *event, FILE *fp);
    163int perf_event__process_tracing_data(struct perf_session *session,
    164				     union perf_event *event);
    165int perf_event__process_build_id(struct perf_session *session,
    166				 union perf_event *event);
    167bool is_perf_magic(u64 magic);
    168
    169#define NAME_ALIGN 64
    170
    171struct feat_fd;
    172
    173int do_write(struct feat_fd *fd, const void *buf, size_t size);
    174
    175int write_padded(struct feat_fd *fd, const void *bf,
    176		 size_t count, size_t count_aligned);
    177
    178int is_cpu_online(unsigned int cpu);
    179/*
    180 * arch specific callback
    181 */
    182int get_cpuid(char *buffer, size_t sz);
    183
    184char *get_cpuid_str(struct perf_pmu *pmu __maybe_unused);
    185int strcmp_cpuid_str(const char *s1, const char *s2);
    186#endif /* __PERF_HEADER_H */