blob: 5eb47bc34f55368df2058a5449071a8c78c801c5 [file] [log] [blame]
#ifndef __RAS_H__
#define __RAS_H__
/*
* Put stuff from perf.h here so as not to copy *everything* over
*/
#define _GNU_SOURCE
#include <assert.h>
#include <dirent.h>
#include <errno.h>
#include <fcntl.h>
#include <limits.h>
#include <inttypes.h>
#include <poll.h>
#include <signal.h>
#include <stdbool.h>
#include <stdlib.h>
#include <string.h>
#include <sys/ioctl.h>
#include <sys/mman.h>
#include <sys/resource.h>
#include <sys/stat.h>
#include <sys/syscall.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
#include <linux/bitops.h>
#include <linux/hash.h>
#include <linux/kernel.h>
#include <linux/types.h>
#include <linux/perf_event.h>
#include <asm/bug.h>
#include <asm/posix_types.h>
#include "lib.h"
#include "sane_ctype.h"
#define PERF_ALIGN(x, a) __PERF_ALIGN_MASK(x, (typeof(x))(a)-1)
#define __PERF_ALIGN_MASK(x, mask) (((x)+(mask))&~(mask))
#define BUILD_ID_SIZE 20
#define MAX_NR_CPUS 256
#if defined(__x86_64__)
#define mb() asm volatile("mfence" ::: "memory")
#define wmb() asm volatile("sfence" ::: "memory")
#define rmb() asm volatile("lfence" ::: "memory")
#define cpu_relax() asm volatile("rep; nop" ::: "memory");
#elif defined(__arm__)
/*
* Use the __kuser_memory_barrier helper in the CPU helper page. See
* arch/arm/kernel/entry-armv.S in the kernel source for details.
*/
#define mb() ((void(*)(void))0xffff0fa0)()
#define wmb() ((void(*)(void))0xffff0fa0)()
#define rmb() ((void(*)(void))0xffff0fa0)()
#define cpu_relax() ((void(*)(void))0xffff0fa0)()
#elif defined(__aarch64__)
#define mb() asm volatile("dmb ish" ::: "memory")
#define wmb() asm volatile("dmb ishst" ::: "memory")
#define rmb() asm volatile("dmb ishld" ::: "memory")
#define cpu_relax() asm volatile("yield" ::: "memory")
#endif
#define FD(e, x, y) (*(int *)xyarray__entry(e->fd, x, y))
#define SID(e, x, y) xyarray__entry(e->sample_id, x, y)
static inline int
sys_perf_event_open(struct perf_event_attr *attr,
pid_t pid, int cpu, int group_fd,
unsigned long flags)
{
int fd;
fd = syscall(__NR_perf_event_open, attr, pid, cpu,
group_fd, flags);
#if 0
if (unlikely(test_attr__enabled))
test_attr__open(attr, pid, cpu, fd, group_fd, flags);
#endif
return fd;
}
static inline __attribute__((const))
bool is_power_of_2(unsigned long n)
{
return (n != 0 && ((n & (n - 1)) == 0));
}
static inline void *zalloc(size_t size)
{
return calloc(1, size);
}
#define zfree(ptr) ({ free(*ptr); *ptr = NULL; })
struct branch_flags {
u64 mispred:1;
u64 predicted:1;
u64 in_tx:1;
u64 abort:1;
u64 reserved:60;
};
/*
* rasd specific
*/
struct perf_rasd {
char *sys;
char *name;
};
/* evsel.c */
union u64_swap {
u64 val64;
u32 val32[2];
};
unsigned int page_size;
struct option {
};
/* util.c */
int filename__read_str(const char *filename, char **buf, size_t *sizep);
void event_attr_init(struct perf_event_attr *attr);
#endif /* __RAS_H__ */