Linux Audio

Check our new training course

Loading...
  1/* SPDX-License-Identifier: GPL-2.0-only */
  2/*
  3 * Copyright 2013, Michael Ellerman, IBM Corp.
  4 */
  5
  6#ifndef _SELFTESTS_POWERPC_UTILS_H
  7#define _SELFTESTS_POWERPC_UTILS_H
  8
  9#define __cacheline_aligned __attribute__((aligned(128)))
 10
 11#include <stdint.h>
 12#include <stdio.h>
 13#include <stdbool.h>
 14#include <sys/signal.h>
 15#include <linux/auxvec.h>
 16#include <linux/perf_event.h>
 17#include <asm/cputable.h>
 18#include "reg.h"
 19#include <unistd.h>
 20
 21#ifndef ARRAY_SIZE
 22# define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
 23#endif
 24
 25/* Avoid headaches with PRI?64 - just use %ll? always */
 26typedef unsigned long long u64;
 27typedef   signed long long s64;
 28
 29/* Just for familiarity */
 30typedef uint32_t u32;
 31typedef uint16_t u16;
 32typedef uint8_t u8;
 33
 34void test_harness_set_timeout(uint64_t time);
 35int test_harness(int (test_function)(void), const char *name);
 36
 37int read_auxv(char *buf, ssize_t buf_size);
 38void *find_auxv_entry(int type, char *auxv);
 39void *get_auxv_entry(int type);
 40
 41#define BIND_CPU_ANY	(-1)
 42
 43int pick_online_cpu(void);
 44int bind_to_cpu(int cpu);
 45
 46int parse_intmax(const char *buffer, size_t count, intmax_t *result, int base);
 47int parse_uintmax(const char *buffer, size_t count, uintmax_t *result, int base);
 48int parse_int(const char *buffer, size_t count, int *result, int base);
 49int parse_uint(const char *buffer, size_t count, unsigned int *result, int base);
 50int parse_long(const char *buffer, size_t count, long *result, int base);
 51int parse_ulong(const char *buffer, size_t count, unsigned long *result, int base);
 52
 53int read_file(const char *path, char *buf, size_t count, size_t *len);
 54int write_file(const char *path, const char *buf, size_t count);
 55int read_file_alloc(const char *path, char **buf, size_t *len);
 56int read_long(const char *path, long *result, int base);
 57int write_long(const char *path, long result, int base);
 58int read_ulong(const char *path, unsigned long *result, int base);
 59int write_ulong(const char *path, unsigned long result, int base);
 60int read_debugfs_file(const char *debugfs_file, char *buf, size_t count);
 61int write_debugfs_file(const char *debugfs_file, const char *buf, size_t count);
 62int read_debugfs_int(const char *debugfs_file, int *result);
 63int write_debugfs_int(const char *debugfs_file, int result);
 64int read_sysfs_file(char *debugfs_file, char *result, size_t result_size);
 65int perf_event_open_counter(unsigned int type,
 66			    unsigned long config, int group_fd);
 67int perf_event_enable(int fd);
 68int perf_event_disable(int fd);
 69int perf_event_reset(int fd);
 70
 71struct perf_event_read {
 72	__u64 nr;
 73	__u64 l1d_misses;
 74};
 75
 76#if !defined(__GLIBC_PREREQ) || !__GLIBC_PREREQ(2, 30)
 77#include <sys/syscall.h>
 78
 79static inline pid_t gettid(void)
 80{
 81	return syscall(SYS_gettid);
 82}
 83#endif
 84
 85static inline bool have_hwcap(unsigned long ftr)
 86{
 87	return ((unsigned long)get_auxv_entry(AT_HWCAP) & ftr) == ftr;
 88}
 89
 90#ifdef AT_HWCAP2
 91static inline bool have_hwcap2(unsigned long ftr2)
 92{
 93	return ((unsigned long)get_auxv_entry(AT_HWCAP2) & ftr2) == ftr2;
 94}
 95#else
 96static inline bool have_hwcap2(unsigned long ftr2)
 97{
 98	return false;
 99}
100#endif
101
102static inline char *auxv_base_platform(void)
103{
104	return ((char *)get_auxv_entry(AT_BASE_PLATFORM));
105}
106
107static inline char *auxv_platform(void)
108{
109	return ((char *)get_auxv_entry(AT_PLATFORM));
110}
111
112bool is_ppc64le(void);
113int using_hash_mmu(bool *using_hash);
114
115struct sigaction push_signal_handler(int sig, void (*fn)(int, siginfo_t *, void *));
116struct sigaction pop_signal_handler(int sig, struct sigaction old_handler);
117
118/* Yes, this is evil */
119#define FAIL_IF(x)						\
120do {								\
121	if ((x)) {						\
122		fprintf(stderr,					\
123		"[FAIL] Test FAILED on line %d\n", __LINE__);	\
124		return 1;					\
125	}							\
126} while (0)
127
128#define FAIL_IF_MSG(x, msg)					\
129do {								\
130	if ((x)) {						\
131		fprintf(stderr,					\
132		"[FAIL] Test FAILED on line %d: %s\n", 		\
133		__LINE__, msg);					\
134		return 1;					\
135	}							\
136} while (0)
137
138#define FAIL_IF_EXIT(x)						\
139do {								\
140	if ((x)) {						\
141		fprintf(stderr,					\
142		"[FAIL] Test FAILED on line %d\n", __LINE__);	\
143		_exit(1);					\
144	}							\
145} while (0)
146
147#define FAIL_IF_EXIT_MSG(x, msg)				\
148do {								\
149	if ((x)) {						\
150		fprintf(stderr,					\
151		"[FAIL] Test FAILED on line %d: %s\n", 		\
152		__LINE__, msg);					\
153		_exit(1);					\
154	}							\
155} while (0)
156
157/* The test harness uses this, yes it's gross */
158#define MAGIC_SKIP_RETURN_VALUE	99
159
160#define SKIP_IF(x)						\
161do {								\
162	if ((x)) {						\
163		fprintf(stderr,					\
164		"[SKIP] Test skipped on line %d\n", __LINE__);	\
165		return MAGIC_SKIP_RETURN_VALUE;			\
166	}							\
167} while (0)
168
169#define SKIP_IF_MSG(x, msg)					\
170do {								\
171	if ((x)) {						\
172		fprintf(stderr,					\
173		"[SKIP] Test skipped on line %d: %s\n",		\
174		 __LINE__, msg);				\
175		return MAGIC_SKIP_RETURN_VALUE;			\
176	}							\
177} while (0)
178
179#define _str(s) #s
180#define str(s) _str(s)
181
182#define sigsafe_err(msg)	({ \
183		ssize_t nbytes __attribute__((unused)); \
184		nbytes = write(STDERR_FILENO, msg, strlen(msg)); })
185
186/* POWER9 feature */
187#ifndef PPC_FEATURE2_ARCH_3_00
188#define PPC_FEATURE2_ARCH_3_00 0x00800000
189#endif
190
191/* POWER10 feature */
192#ifndef PPC_FEATURE2_ARCH_3_1
193#define PPC_FEATURE2_ARCH_3_1 0x00040000
194#endif
195
196/* POWER10 features */
197#ifndef PPC_FEATURE2_MMA
198#define PPC_FEATURE2_MMA 0x00020000
199#endif
200
201#if defined(__powerpc64__)
202#define UCONTEXT_NIA(UC)	(UC)->uc_mcontext.gp_regs[PT_NIP]
203#define UCONTEXT_MSR(UC)	(UC)->uc_mcontext.gp_regs[PT_MSR]
204#elif defined(__powerpc__)
205#define UCONTEXT_NIA(UC)	(UC)->uc_mcontext.uc_regs->gregs[PT_NIP]
206#define UCONTEXT_MSR(UC)	(UC)->uc_mcontext.uc_regs->gregs[PT_MSR]
207#else
208#error implement UCONTEXT_NIA
209#endif
210
211#endif /* _SELFTESTS_POWERPC_UTILS_H */