Home | History | Annotate | Download | only in include
      1 /*
      2  * Copyright 2013, Michael Ellerman, IBM Corp.
      3  * Licensed under GPLv2.
      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 <stdbool.h>
     13 #include <linux/auxvec.h>
     14 #include <linux/perf_event.h>
     15 #include "reg.h"
     16 
     17 /* Avoid headaches with PRI?64 - just use %ll? always */
     18 typedef unsigned long long u64;
     19 typedef   signed long long s64;
     20 
     21 /* Just for familiarity */
     22 typedef uint32_t u32;
     23 typedef uint16_t u16;
     24 typedef uint8_t u8;
     25 
     26 void test_harness_set_timeout(uint64_t time);
     27 int test_harness(int (test_function)(void), char *name);
     28 
     29 int read_auxv(char *buf, ssize_t buf_size);
     30 void *find_auxv_entry(int type, char *auxv);
     31 void *get_auxv_entry(int type);
     32 
     33 int pick_online_cpu(void);
     34 
     35 int read_debugfs_file(char *debugfs_file, int *result);
     36 int write_debugfs_file(char *debugfs_file, int result);
     37 void set_dscr(unsigned long val);
     38 int perf_event_open_counter(unsigned int type,
     39 			    unsigned long config, int group_fd);
     40 int perf_event_enable(int fd);
     41 int perf_event_disable(int fd);
     42 int perf_event_reset(int fd);
     43 
     44 static inline bool have_hwcap(unsigned long ftr)
     45 {
     46 	return ((unsigned long)get_auxv_entry(AT_HWCAP) & ftr) == ftr;
     47 }
     48 
     49 #ifdef AT_HWCAP2
     50 static inline bool have_hwcap2(unsigned long ftr2)
     51 {
     52 	return ((unsigned long)get_auxv_entry(AT_HWCAP2) & ftr2) == ftr2;
     53 }
     54 #else
     55 static inline bool have_hwcap2(unsigned long ftr2)
     56 {
     57 	return false;
     58 }
     59 #endif
     60 
     61 bool is_ppc64le(void);
     62 
     63 /* Yes, this is evil */
     64 #define FAIL_IF(x)						\
     65 do {								\
     66 	if ((x)) {						\
     67 		fprintf(stderr,					\
     68 		"[FAIL] Test FAILED on line %d\n", __LINE__);	\
     69 		return 1;					\
     70 	}							\
     71 } while (0)
     72 
     73 /* The test harness uses this, yes it's gross */
     74 #define MAGIC_SKIP_RETURN_VALUE	99
     75 
     76 #define SKIP_IF(x)						\
     77 do {								\
     78 	if ((x)) {						\
     79 		fprintf(stderr,					\
     80 		"[SKIP] Test skipped on line %d\n", __LINE__);	\
     81 		return MAGIC_SKIP_RETURN_VALUE;			\
     82 	}							\
     83 } while (0)
     84 
     85 #define _str(s) #s
     86 #define str(s) _str(s)
     87 
     88 /* POWER9 feature */
     89 #ifndef PPC_FEATURE2_ARCH_3_00
     90 #define PPC_FEATURE2_ARCH_3_00 0x00800000
     91 #endif
     92 
     93 #if defined(__powerpc64__)
     94 #define UCONTEXT_NIA(UC)	(UC)->uc_mcontext.gp_regs[PT_NIP]
     95 #elif defined(__powerpc__)
     96 #define UCONTEXT_NIA(UC)	(UC)->uc_mcontext.uc_regs->gregs[PT_NIP]
     97 #else
     98 #error implement UCONTEXT_NIA
     99 #endif
    100 
    101 #endif /* _SELFTESTS_POWERPC_UTILS_H */
    102