xref: /openbmc/linux/tools/testing/selftests/powerpc/alignment/alignment_handler.c (revision 8be98d2f2a0a262f8bf8a0bc1fdf522b3c7aab17)
12874c5fdSThomas Gleixner // SPDX-License-Identifier: GPL-2.0-or-later
28d191587SAndrew Donnellan /*
38d191587SAndrew Donnellan  * Test the powerpc alignment handler on POWER8/POWER9
48d191587SAndrew Donnellan  *
58d191587SAndrew Donnellan  * Copyright (C) 2017 IBM Corporation (Michael Neuling, Andrew Donnellan)
68d191587SAndrew Donnellan  */
78d191587SAndrew Donnellan 
88d191587SAndrew Donnellan /*
98d191587SAndrew Donnellan  * This selftest exercises the powerpc alignment fault handler.
108d191587SAndrew Donnellan  *
118d191587SAndrew Donnellan  * We create two sets of source and destination buffers, one in regular memory,
1201bd2946SJordan Niethe  * the other cache-inhibited (by default we use /dev/fb0 for this, but an
13*812aa68eSJordan Niethe  * alterative path for cache-inhibited memory may be provided, e.g. memtrace).
148d191587SAndrew Donnellan  *
158d191587SAndrew Donnellan  * We initialise the source buffers, then use whichever set of load/store
168d191587SAndrew Donnellan  * instructions is under test to copy bytes from the source buffers to the
178d191587SAndrew Donnellan  * destination buffers. For the regular buffers, these instructions will
188d191587SAndrew Donnellan  * execute normally. For the cache-inhibited buffers, these instructions
198d191587SAndrew Donnellan  * will trap and cause an alignment fault, and the alignment fault handler
208d191587SAndrew Donnellan  * will emulate the particular instruction under test. We then compare the
218d191587SAndrew Donnellan  * destination buffers to ensure that the native and emulated cases give the
228d191587SAndrew Donnellan  * same result.
238d191587SAndrew Donnellan  *
248d191587SAndrew Donnellan  * TODO:
258d191587SAndrew Donnellan  *   - Any FIXMEs below
268d191587SAndrew Donnellan  *   - Test VSX regs < 32 and > 32
278d191587SAndrew Donnellan  *   - Test all loads and stores
288d191587SAndrew Donnellan  *   - Check update forms do update register
298d191587SAndrew Donnellan  *   - Test alignment faults over page boundary
308d191587SAndrew Donnellan  *
318d191587SAndrew Donnellan  * Some old binutils may not support all the instructions.
328d191587SAndrew Donnellan  */
338d191587SAndrew Donnellan 
348d191587SAndrew Donnellan 
358d191587SAndrew Donnellan #include <sys/mman.h>
368d191587SAndrew Donnellan #include <sys/types.h>
378d191587SAndrew Donnellan #include <sys/stat.h>
388d191587SAndrew Donnellan #include <fcntl.h>
398d191587SAndrew Donnellan #include <unistd.h>
40edba42cdSMichael Ellerman #include <stdbool.h>
418d191587SAndrew Donnellan #include <stdio.h>
428d191587SAndrew Donnellan #include <stdlib.h>
438d191587SAndrew Donnellan #include <string.h>
448d191587SAndrew Donnellan #include <assert.h>
458d191587SAndrew Donnellan #include <getopt.h>
468d191587SAndrew Donnellan #include <setjmp.h>
478d191587SAndrew Donnellan #include <signal.h>
488d191587SAndrew Donnellan 
498d191587SAndrew Donnellan #include "utils.h"
50620a6473SJordan Niethe #include "instructions.h"
518d191587SAndrew Donnellan 
528d191587SAndrew Donnellan int bufsize;
538d191587SAndrew Donnellan int debug;
548d191587SAndrew Donnellan int testing;
558d191587SAndrew Donnellan volatile int gotsig;
56db96221aSJordan Niethe bool prefixes_enabled;
5701bd2946SJordan Niethe char *cipath = "/dev/fb0";
5801bd2946SJordan Niethe long cioffset;
598d191587SAndrew Donnellan 
sighandler(int sig,siginfo_t * info,void * ctx)608d191587SAndrew Donnellan void sighandler(int sig, siginfo_t *info, void *ctx)
618d191587SAndrew Donnellan {
62ecdf06e1SHarish 	ucontext_t *ucp = ctx;
638d191587SAndrew Donnellan 
648d191587SAndrew Donnellan 	if (!testing) {
658d191587SAndrew Donnellan 		signal(sig, SIG_DFL);
668d191587SAndrew Donnellan 		kill(0, sig);
678d191587SAndrew Donnellan 	}
688d191587SAndrew Donnellan 	gotsig = sig;
698d191587SAndrew Donnellan #ifdef __powerpc64__
70db96221aSJordan Niethe 	if (prefixes_enabled) {
71db96221aSJordan Niethe 		u32 inst = *(u32 *)ucp->uc_mcontext.gp_regs[PT_NIP];
72db96221aSJordan Niethe 		ucp->uc_mcontext.gp_regs[PT_NIP] += ((inst >> 26 == 1) ? 8 : 4);
73db96221aSJordan Niethe 	} else {
748d191587SAndrew Donnellan 		ucp->uc_mcontext.gp_regs[PT_NIP] += 4;
75db96221aSJordan Niethe 	}
768d191587SAndrew Donnellan #else
778d191587SAndrew Donnellan 	ucp->uc_mcontext.uc_regs->gregs[PT_NIP] += 4;
788d191587SAndrew Donnellan #endif
798d191587SAndrew Donnellan }
808d191587SAndrew Donnellan 
818d191587SAndrew Donnellan #define XFORM(reg, n)  " " #reg " ,%"#n",%2 ;"
828d191587SAndrew Donnellan #define DFORM(reg, n)  " " #reg " ,0(%"#n") ;"
838d191587SAndrew Donnellan 
848d191587SAndrew Donnellan #define TEST(name, ld_op, st_op, form, ld_reg, st_reg)		\
858d191587SAndrew Donnellan 	void test_##name(char *s, char *d)			\
868d191587SAndrew Donnellan 	{							\
878d191587SAndrew Donnellan 		asm volatile(					\
888d191587SAndrew Donnellan 			#ld_op form(ld_reg, 0)			\
898d191587SAndrew Donnellan 			#st_op form(st_reg, 1)			\
908d191587SAndrew Donnellan 			:: "r"(s), "r"(d), "r"(0)		\
918d191587SAndrew Donnellan 			: "memory", "vs0", "vs32", "r31");	\
928d191587SAndrew Donnellan 	}							\
938d191587SAndrew Donnellan 	rc |= do_test(#name, test_##name)
948d191587SAndrew Donnellan 
95620a6473SJordan Niethe #define TESTP(name, ld_op, st_op, ld_reg, st_reg)		\
96620a6473SJordan Niethe 	void test_##name(char *s, char *d)			\
97620a6473SJordan Niethe 	{							\
98620a6473SJordan Niethe 		asm volatile(					\
99620a6473SJordan Niethe 			ld_op(ld_reg, %0, 0, 0)			\
100620a6473SJordan Niethe 			st_op(st_reg, %1, 0, 0)			\
101620a6473SJordan Niethe 			:: "r"(s), "r"(d), "r"(0)		\
102620a6473SJordan Niethe 			: "memory", "vs0", "vs32", "r31");	\
103620a6473SJordan Niethe 	}							\
104620a6473SJordan Niethe 	rc |= do_test(#name, test_##name)
105620a6473SJordan Niethe 
1068d191587SAndrew Donnellan #define LOAD_VSX_XFORM_TEST(op) TEST(op, op, stxvd2x, XFORM, 32, 32)
1078d191587SAndrew Donnellan #define STORE_VSX_XFORM_TEST(op) TEST(op, lxvd2x, op, XFORM, 32, 32)
1088d191587SAndrew Donnellan #define LOAD_VSX_DFORM_TEST(op) TEST(op, op, stxv, DFORM, 32, 32)
1098d191587SAndrew Donnellan #define STORE_VSX_DFORM_TEST(op) TEST(op, lxv, op, DFORM, 32, 32)
1108d191587SAndrew Donnellan #define LOAD_VMX_XFORM_TEST(op) TEST(op, op, stxvd2x, XFORM, 0, 32)
1118d191587SAndrew Donnellan #define STORE_VMX_XFORM_TEST(op) TEST(op, lxvd2x, op, XFORM, 32, 0)
1128d191587SAndrew Donnellan #define LOAD_VMX_DFORM_TEST(op) TEST(op, op, stxv, DFORM, 0, 32)
1138d191587SAndrew Donnellan #define STORE_VMX_DFORM_TEST(op) TEST(op, lxv, op, DFORM, 32, 0)
1148d191587SAndrew Donnellan 
1158d191587SAndrew Donnellan #define LOAD_XFORM_TEST(op) TEST(op, op, stdx, XFORM, 31, 31)
1168d191587SAndrew Donnellan #define STORE_XFORM_TEST(op) TEST(op, ldx, op, XFORM, 31, 31)
1178d191587SAndrew Donnellan #define LOAD_DFORM_TEST(op) TEST(op, op, std, DFORM, 31, 31)
1188d191587SAndrew Donnellan #define STORE_DFORM_TEST(op) TEST(op, ld, op, DFORM, 31, 31)
1198d191587SAndrew Donnellan 
1208d191587SAndrew Donnellan #define LOAD_FLOAT_DFORM_TEST(op)  TEST(op, op, stfd, DFORM, 0, 0)
1218d191587SAndrew Donnellan #define STORE_FLOAT_DFORM_TEST(op) TEST(op, lfd, op, DFORM, 0, 0)
1228d191587SAndrew Donnellan #define LOAD_FLOAT_XFORM_TEST(op)  TEST(op, op, stfdx, XFORM, 0, 0)
1238d191587SAndrew Donnellan #define STORE_FLOAT_XFORM_TEST(op) TEST(op, lfdx, op, XFORM, 0, 0)
1248d191587SAndrew Donnellan 
125620a6473SJordan Niethe #define LOAD_MLS_PREFIX_TEST(op) TESTP(op, op, PSTD, 31, 31)
126620a6473SJordan Niethe #define STORE_MLS_PREFIX_TEST(op) TESTP(op, PLD, op, 31, 31)
127620a6473SJordan Niethe 
128620a6473SJordan Niethe #define LOAD_8LS_PREFIX_TEST(op) TESTP(op, op, PSTD, 31, 31)
129620a6473SJordan Niethe #define STORE_8LS_PREFIX_TEST(op) TESTP(op, PLD, op, 31, 31)
130620a6473SJordan Niethe 
131620a6473SJordan Niethe #define LOAD_FLOAT_MLS_PREFIX_TEST(op) TESTP(op, op, PSTFD, 0, 0)
132620a6473SJordan Niethe #define STORE_FLOAT_MLS_PREFIX_TEST(op) TESTP(op, PLFD, op, 0, 0)
133620a6473SJordan Niethe 
134620a6473SJordan Niethe #define LOAD_VSX_8LS_PREFIX_TEST(op, tail) TESTP(op, op, PSTXV ## tail, 0, 32)
135620a6473SJordan Niethe #define STORE_VSX_8LS_PREFIX_TEST(op, tail) TESTP(op, PLXV ## tail, op, 32, 0)
1368d191587SAndrew Donnellan 
1378d191587SAndrew Donnellan /* FIXME: Unimplemented tests: */
1388d191587SAndrew Donnellan // STORE_DFORM_TEST(stq)   /* FIXME: need two registers for quad */
1398d191587SAndrew Donnellan // STORE_DFORM_TEST(stswi) /* FIXME: string instruction */
1408d191587SAndrew Donnellan 
1418d191587SAndrew Donnellan // STORE_XFORM_TEST(stwat) /* AMO can't emulate or run on CI */
1428d191587SAndrew Donnellan // STORE_XFORM_TEST(stdat) /* ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ */
1438d191587SAndrew Donnellan 
1448d191587SAndrew Donnellan 
1458d191587SAndrew Donnellan /* preload byte by byte */
preload_data(void * dst,int offset,int width)1468d191587SAndrew Donnellan void preload_data(void *dst, int offset, int width)
1478d191587SAndrew Donnellan {
1488d191587SAndrew Donnellan 	char *c = dst;
1498d191587SAndrew Donnellan 	int i;
1508d191587SAndrew Donnellan 
1518d191587SAndrew Donnellan 	c += offset;
1528d191587SAndrew Donnellan 
1538d191587SAndrew Donnellan 	for (i = 0 ; i < width ; i++)
1548d191587SAndrew Donnellan 		c[i] = i;
1558d191587SAndrew Donnellan }
1568d191587SAndrew Donnellan 
test_memcpy(void * dst,void * src,int size,int offset,void (* test_func)(char *,char *))1578d191587SAndrew Donnellan int test_memcpy(void *dst, void *src, int size, int offset,
1588d191587SAndrew Donnellan 		void (*test_func)(char *, char *))
1598d191587SAndrew Donnellan {
1608d191587SAndrew Donnellan 	char *s, *d;
1618d191587SAndrew Donnellan 
1628d191587SAndrew Donnellan 	s = src;
1638d191587SAndrew Donnellan 	s += offset;
1648d191587SAndrew Donnellan 	d = dst;
1658d191587SAndrew Donnellan 	d += offset;
1668d191587SAndrew Donnellan 
1678d191587SAndrew Donnellan 	assert(size == 16);
1688d191587SAndrew Donnellan 	gotsig = 0;
1698d191587SAndrew Donnellan 	testing = 1;
1708d191587SAndrew Donnellan 
1718d191587SAndrew Donnellan 	test_func(s, d); /* run the actual test */
1728d191587SAndrew Donnellan 
1738d191587SAndrew Donnellan 	testing = 0;
1748d191587SAndrew Donnellan 	if (gotsig) {
1758d191587SAndrew Donnellan 		if (debug)
1768d191587SAndrew Donnellan 			printf("  Got signal %i\n", gotsig);
1778d191587SAndrew Donnellan 		return 1;
1788d191587SAndrew Donnellan 	}
1798d191587SAndrew Donnellan 	return 0;
1808d191587SAndrew Donnellan }
1818d191587SAndrew Donnellan 
dumpdata(char * s1,char * s2,int n,char * test_name)1828d191587SAndrew Donnellan void dumpdata(char *s1, char *s2, int n, char *test_name)
1838d191587SAndrew Donnellan {
1848d191587SAndrew Donnellan 	int i;
1858d191587SAndrew Donnellan 
1868d191587SAndrew Donnellan 	printf("  %s: unexpected result:\n", test_name);
1878d191587SAndrew Donnellan 	printf("    mem:");
1888d191587SAndrew Donnellan 	for (i = 0; i < n; i++)
1898d191587SAndrew Donnellan 		printf(" %02x", s1[i]);
1908d191587SAndrew Donnellan 	printf("\n");
1918d191587SAndrew Donnellan 	printf("    ci: ");
1928d191587SAndrew Donnellan 	for (i = 0; i < n; i++)
1938d191587SAndrew Donnellan 		printf(" %02x", s2[i]);
1948d191587SAndrew Donnellan 	printf("\n");
1958d191587SAndrew Donnellan }
1968d191587SAndrew Donnellan 
test_memcmp(void * s1,void * s2,int n,int offset,char * test_name)1978d191587SAndrew Donnellan int test_memcmp(void *s1, void *s2, int n, int offset, char *test_name)
1988d191587SAndrew Donnellan {
1998d191587SAndrew Donnellan 	char *s1c, *s2c;
2008d191587SAndrew Donnellan 
2018d191587SAndrew Donnellan 	s1c = s1;
2028d191587SAndrew Donnellan 	s1c += offset;
2038d191587SAndrew Donnellan 	s2c = s2;
2048d191587SAndrew Donnellan 	s2c += offset;
2058d191587SAndrew Donnellan 
2068d191587SAndrew Donnellan 	if (memcmp(s1c, s2c, n)) {
2078d191587SAndrew Donnellan 		if (debug) {
2088d191587SAndrew Donnellan 			printf("\n  Compare failed. Offset:%i length:%i\n",
2098d191587SAndrew Donnellan 			       offset, n);
2108d191587SAndrew Donnellan 			dumpdata(s1c, s2c, n, test_name);
2118d191587SAndrew Donnellan 		}
2128d191587SAndrew Donnellan 		return 1;
2138d191587SAndrew Donnellan 	}
2148d191587SAndrew Donnellan 	return 0;
2158d191587SAndrew Donnellan }
2168d191587SAndrew Donnellan 
2178d191587SAndrew Donnellan /*
2188d191587SAndrew Donnellan  * Do two memcpy tests using the same instructions. One cachable
2198d191587SAndrew Donnellan  * memory and the other doesn't.
2208d191587SAndrew Donnellan  */
do_test(char * test_name,void (* test_func)(char *,char *))2218d191587SAndrew Donnellan int do_test(char *test_name, void (*test_func)(char *, char *))
2228d191587SAndrew Donnellan {
223edba42cdSMichael Ellerman 	int offset, width, fd, rc, r;
2248d191587SAndrew Donnellan 	void *mem0, *mem1, *ci0, *ci1;
2258d191587SAndrew Donnellan 
2268d191587SAndrew Donnellan 	printf("\tDoing %s:\t", test_name);
2278d191587SAndrew Donnellan 
22801bd2946SJordan Niethe 	fd = open(cipath, O_RDWR);
2298d191587SAndrew Donnellan 	if (fd < 0) {
2308d191587SAndrew Donnellan 		printf("\n");
23101bd2946SJordan Niethe 		perror("Can't open ci file now?");
232edba42cdSMichael Ellerman 		return 1;
2338d191587SAndrew Donnellan 	}
2348d191587SAndrew Donnellan 
23501bd2946SJordan Niethe 	ci0 = mmap(NULL, bufsize, PROT_WRITE | PROT_READ, MAP_SHARED,
23601bd2946SJordan Niethe 		   fd, cioffset);
23701bd2946SJordan Niethe 	ci1 = mmap(NULL, bufsize, PROT_WRITE | PROT_READ, MAP_SHARED,
23801bd2946SJordan Niethe 		   fd, cioffset + bufsize);
23901bd2946SJordan Niethe 
2408d191587SAndrew Donnellan 	if ((ci0 == MAP_FAILED) || (ci1 == MAP_FAILED)) {
2418d191587SAndrew Donnellan 		printf("\n");
2428d191587SAndrew Donnellan 		perror("mmap failed");
2438d191587SAndrew Donnellan 		SKIP_IF(1);
2448d191587SAndrew Donnellan 	}
2458d191587SAndrew Donnellan 
2468d191587SAndrew Donnellan 	rc = posix_memalign(&mem0, bufsize, bufsize);
2478d191587SAndrew Donnellan 	if (rc) {
2488d191587SAndrew Donnellan 		printf("\n");
2498d191587SAndrew Donnellan 		return rc;
2508d191587SAndrew Donnellan 	}
2518d191587SAndrew Donnellan 
2528d191587SAndrew Donnellan 	rc = posix_memalign(&mem1, bufsize, bufsize);
2538d191587SAndrew Donnellan 	if (rc) {
2548d191587SAndrew Donnellan 		printf("\n");
2558d191587SAndrew Donnellan 		free(mem0);
2568d191587SAndrew Donnellan 		return rc;
2578d191587SAndrew Donnellan 	}
2588d191587SAndrew Donnellan 
259edba42cdSMichael Ellerman 	rc = 0;
260d1781f23SMichael Neuling 	/*
261d1781f23SMichael Neuling 	 * offset = 0 is aligned but tests the workaround for the P9N
262d1781f23SMichael Neuling 	 * DD2.1 vector CI load issue (see 5080332c2c89 "powerpc/64s:
263d1781f23SMichael Neuling 	 * Add workaround for P9 vector CI load issue")
264d1781f23SMichael Neuling 	 */
265d1781f23SMichael Neuling 	for (offset = 0; offset < 16; offset++) {
2668d191587SAndrew Donnellan 		width = 16; /* vsx == 16 bytes */
2678d191587SAndrew Donnellan 		r = 0;
2688d191587SAndrew Donnellan 
2698d191587SAndrew Donnellan 		/* load pattern into memory byte by byte */
2708d191587SAndrew Donnellan 		preload_data(ci0, offset, width);
2718d191587SAndrew Donnellan 		preload_data(mem0, offset, width); // FIXME: remove??
2728d191587SAndrew Donnellan 		memcpy(ci0, mem0, bufsize);
2738d191587SAndrew Donnellan 		memcpy(ci1, mem1, bufsize); /* initialise output to the same */
2748d191587SAndrew Donnellan 
2758d191587SAndrew Donnellan 		/* sanity check */
2768d191587SAndrew Donnellan 		test_memcmp(mem0, ci0, width, offset, test_name);
2778d191587SAndrew Donnellan 
2788d191587SAndrew Donnellan 		r |= test_memcpy(ci1,  ci0,  width, offset, test_func);
2798d191587SAndrew Donnellan 		r |= test_memcpy(mem1, mem0, width, offset, test_func);
2808d191587SAndrew Donnellan 		if (r && !debug) {
2818d191587SAndrew Donnellan 			printf("FAILED: Got signal");
282edba42cdSMichael Ellerman 			rc = 1;
2838d191587SAndrew Donnellan 			break;
2848d191587SAndrew Donnellan 		}
2858d191587SAndrew Donnellan 
2868d191587SAndrew Donnellan 		r |= test_memcmp(mem1, ci1, width, offset, test_name);
2878d191587SAndrew Donnellan 		if (r && !debug) {
2888d191587SAndrew Donnellan 			printf("FAILED: Wrong Data");
289edba42cdSMichael Ellerman 			rc = 1;
2908d191587SAndrew Donnellan 			break;
2918d191587SAndrew Donnellan 		}
2928d191587SAndrew Donnellan 	}
293edba42cdSMichael Ellerman 
294edba42cdSMichael Ellerman 	if (rc == 0)
2958d191587SAndrew Donnellan 		printf("PASSED");
296edba42cdSMichael Ellerman 
2978d191587SAndrew Donnellan 	printf("\n");
2988d191587SAndrew Donnellan 
2998d191587SAndrew Donnellan 	munmap(ci0, bufsize);
3008d191587SAndrew Donnellan 	munmap(ci1, bufsize);
3018d191587SAndrew Donnellan 	free(mem0);
3028d191587SAndrew Donnellan 	free(mem1);
303edba42cdSMichael Ellerman 	close(fd);
3048d191587SAndrew Donnellan 
3058d191587SAndrew Donnellan 	return rc;
3068d191587SAndrew Donnellan }
3078d191587SAndrew Donnellan 
can_open_cifile(void)30801bd2946SJordan Niethe static bool can_open_cifile(void)
309edba42cdSMichael Ellerman {
310edba42cdSMichael Ellerman 	int fd;
311edba42cdSMichael Ellerman 
31201bd2946SJordan Niethe 	fd = open(cipath, O_RDWR);
313edba42cdSMichael Ellerman 	if (fd < 0)
314edba42cdSMichael Ellerman 		return false;
315edba42cdSMichael Ellerman 
316edba42cdSMichael Ellerman 	close(fd);
317edba42cdSMichael Ellerman 	return true;
318edba42cdSMichael Ellerman }
319edba42cdSMichael Ellerman 
test_alignment_handler_vsx_206(void)3208d191587SAndrew Donnellan int test_alignment_handler_vsx_206(void)
3218d191587SAndrew Donnellan {
3228d191587SAndrew Donnellan 	int rc = 0;
3238d191587SAndrew Donnellan 
32401bd2946SJordan Niethe 	SKIP_IF(!can_open_cifile());
3258e4bdc69SMichael Ellerman 	SKIP_IF(!have_hwcap(PPC_FEATURE_ARCH_2_06));
326edba42cdSMichael Ellerman 
3278d191587SAndrew Donnellan 	printf("VSX: 2.06B\n");
3288d191587SAndrew Donnellan 	LOAD_VSX_XFORM_TEST(lxvd2x);
3298d191587SAndrew Donnellan 	LOAD_VSX_XFORM_TEST(lxvw4x);
3308d191587SAndrew Donnellan 	LOAD_VSX_XFORM_TEST(lxsdx);
3318d191587SAndrew Donnellan 	LOAD_VSX_XFORM_TEST(lxvdsx);
3328d191587SAndrew Donnellan 	STORE_VSX_XFORM_TEST(stxvd2x);
3338d191587SAndrew Donnellan 	STORE_VSX_XFORM_TEST(stxvw4x);
3348d191587SAndrew Donnellan 	STORE_VSX_XFORM_TEST(stxsdx);
3358d191587SAndrew Donnellan 	return rc;
3368d191587SAndrew Donnellan }
3378d191587SAndrew Donnellan 
test_alignment_handler_vsx_207(void)3388d191587SAndrew Donnellan int test_alignment_handler_vsx_207(void)
3398d191587SAndrew Donnellan {
3408d191587SAndrew Donnellan 	int rc = 0;
3418d191587SAndrew Donnellan 
34201bd2946SJordan Niethe 	SKIP_IF(!can_open_cifile());
3438e4bdc69SMichael Ellerman 	SKIP_IF(!have_hwcap2(PPC_FEATURE2_ARCH_2_07));
344edba42cdSMichael Ellerman 
3458d191587SAndrew Donnellan 	printf("VSX: 2.07B\n");
3468d191587SAndrew Donnellan 	LOAD_VSX_XFORM_TEST(lxsspx);
3478d191587SAndrew Donnellan 	LOAD_VSX_XFORM_TEST(lxsiwax);
3488d191587SAndrew Donnellan 	LOAD_VSX_XFORM_TEST(lxsiwzx);
3498d191587SAndrew Donnellan 	STORE_VSX_XFORM_TEST(stxsspx);
3508d191587SAndrew Donnellan 	STORE_VSX_XFORM_TEST(stxsiwx);
3518d191587SAndrew Donnellan 	return rc;
3528d191587SAndrew Donnellan }
3538d191587SAndrew Donnellan 
test_alignment_handler_vsx_300(void)3548d191587SAndrew Donnellan int test_alignment_handler_vsx_300(void)
3558d191587SAndrew Donnellan {
3568d191587SAndrew Donnellan 	int rc = 0;
3578d191587SAndrew Donnellan 
35801bd2946SJordan Niethe 	SKIP_IF(!can_open_cifile());
359edba42cdSMichael Ellerman 
3608d191587SAndrew Donnellan 	SKIP_IF(!have_hwcap2(PPC_FEATURE2_ARCH_3_00));
3618d191587SAndrew Donnellan 	printf("VSX: 3.00B\n");
3628d191587SAndrew Donnellan 	LOAD_VMX_DFORM_TEST(lxsd);
3638d191587SAndrew Donnellan 	LOAD_VSX_XFORM_TEST(lxsibzx);
3648d191587SAndrew Donnellan 	LOAD_VSX_XFORM_TEST(lxsihzx);
3658d191587SAndrew Donnellan 	LOAD_VMX_DFORM_TEST(lxssp);
3668d191587SAndrew Donnellan 	LOAD_VSX_DFORM_TEST(lxv);
3678d191587SAndrew Donnellan 	LOAD_VSX_XFORM_TEST(lxvb16x);
3688d191587SAndrew Donnellan 	LOAD_VSX_XFORM_TEST(lxvh8x);
3698d191587SAndrew Donnellan 	LOAD_VSX_XFORM_TEST(lxvx);
3708d191587SAndrew Donnellan 	LOAD_VSX_XFORM_TEST(lxvwsx);
3718d191587SAndrew Donnellan 	LOAD_VSX_XFORM_TEST(lxvl);
3728d191587SAndrew Donnellan 	LOAD_VSX_XFORM_TEST(lxvll);
3738d191587SAndrew Donnellan 	STORE_VMX_DFORM_TEST(stxsd);
3748d191587SAndrew Donnellan 	STORE_VSX_XFORM_TEST(stxsibx);
3758d191587SAndrew Donnellan 	STORE_VSX_XFORM_TEST(stxsihx);
3768d191587SAndrew Donnellan 	STORE_VMX_DFORM_TEST(stxssp);
3778d191587SAndrew Donnellan 	STORE_VSX_DFORM_TEST(stxv);
3788d191587SAndrew Donnellan 	STORE_VSX_XFORM_TEST(stxvb16x);
3798d191587SAndrew Donnellan 	STORE_VSX_XFORM_TEST(stxvh8x);
3808d191587SAndrew Donnellan 	STORE_VSX_XFORM_TEST(stxvx);
3818d191587SAndrew Donnellan 	STORE_VSX_XFORM_TEST(stxvl);
3828d191587SAndrew Donnellan 	STORE_VSX_XFORM_TEST(stxvll);
3838d191587SAndrew Donnellan 	return rc;
3848d191587SAndrew Donnellan }
3858d191587SAndrew Donnellan 
test_alignment_handler_vsx_prefix(void)386620a6473SJordan Niethe int test_alignment_handler_vsx_prefix(void)
387620a6473SJordan Niethe {
388620a6473SJordan Niethe 	int rc = 0;
389620a6473SJordan Niethe 
390620a6473SJordan Niethe 	SKIP_IF(!can_open_cifile());
391620a6473SJordan Niethe 	SKIP_IF(!have_hwcap2(PPC_FEATURE2_ARCH_3_1));
392620a6473SJordan Niethe 
393620a6473SJordan Niethe 	printf("VSX: PREFIX\n");
394620a6473SJordan Niethe 	LOAD_VSX_8LS_PREFIX_TEST(PLXSD, 0);
395620a6473SJordan Niethe 	LOAD_VSX_8LS_PREFIX_TEST(PLXSSP, 0);
396620a6473SJordan Niethe 	LOAD_VSX_8LS_PREFIX_TEST(PLXV0, 0);
397620a6473SJordan Niethe 	LOAD_VSX_8LS_PREFIX_TEST(PLXV1, 1);
398620a6473SJordan Niethe 	STORE_VSX_8LS_PREFIX_TEST(PSTXSD, 0);
399620a6473SJordan Niethe 	STORE_VSX_8LS_PREFIX_TEST(PSTXSSP, 0);
400620a6473SJordan Niethe 	STORE_VSX_8LS_PREFIX_TEST(PSTXV0, 0);
401620a6473SJordan Niethe 	STORE_VSX_8LS_PREFIX_TEST(PSTXV1, 1);
402620a6473SJordan Niethe 	return rc;
403620a6473SJordan Niethe }
404620a6473SJordan Niethe 
test_alignment_handler_integer(void)4058d191587SAndrew Donnellan int test_alignment_handler_integer(void)
4068d191587SAndrew Donnellan {
4078d191587SAndrew Donnellan 	int rc = 0;
4088d191587SAndrew Donnellan 
40901bd2946SJordan Niethe 	SKIP_IF(!can_open_cifile());
410edba42cdSMichael Ellerman 
4118d191587SAndrew Donnellan 	printf("Integer\n");
4128d191587SAndrew Donnellan 	LOAD_DFORM_TEST(lbz);
4138d191587SAndrew Donnellan 	LOAD_DFORM_TEST(lbzu);
4148d191587SAndrew Donnellan 	LOAD_XFORM_TEST(lbzx);
4158d191587SAndrew Donnellan 	LOAD_XFORM_TEST(lbzux);
4168d191587SAndrew Donnellan 	LOAD_DFORM_TEST(lhz);
4178d191587SAndrew Donnellan 	LOAD_DFORM_TEST(lhzu);
4188d191587SAndrew Donnellan 	LOAD_XFORM_TEST(lhzx);
4198d191587SAndrew Donnellan 	LOAD_XFORM_TEST(lhzux);
4208d191587SAndrew Donnellan 	LOAD_DFORM_TEST(lha);
4218d191587SAndrew Donnellan 	LOAD_DFORM_TEST(lhau);
4228d191587SAndrew Donnellan 	LOAD_XFORM_TEST(lhax);
4238d191587SAndrew Donnellan 	LOAD_XFORM_TEST(lhaux);
4248d191587SAndrew Donnellan 	LOAD_XFORM_TEST(lhbrx);
4258d191587SAndrew Donnellan 	LOAD_DFORM_TEST(lwz);
4268d191587SAndrew Donnellan 	LOAD_DFORM_TEST(lwzu);
4278d191587SAndrew Donnellan 	LOAD_XFORM_TEST(lwzx);
4288d191587SAndrew Donnellan 	LOAD_XFORM_TEST(lwzux);
4298d191587SAndrew Donnellan 	LOAD_DFORM_TEST(lwa);
4308d191587SAndrew Donnellan 	LOAD_XFORM_TEST(lwax);
4318d191587SAndrew Donnellan 	LOAD_XFORM_TEST(lwaux);
4328d191587SAndrew Donnellan 	LOAD_XFORM_TEST(lwbrx);
4338d191587SAndrew Donnellan 	LOAD_DFORM_TEST(ld);
4348d191587SAndrew Donnellan 	LOAD_DFORM_TEST(ldu);
4358d191587SAndrew Donnellan 	LOAD_XFORM_TEST(ldx);
4368d191587SAndrew Donnellan 	LOAD_XFORM_TEST(ldux);
4378d191587SAndrew Donnellan 	STORE_DFORM_TEST(stb);
4388d191587SAndrew Donnellan 	STORE_XFORM_TEST(stbx);
4398d191587SAndrew Donnellan 	STORE_DFORM_TEST(stbu);
4408d191587SAndrew Donnellan 	STORE_XFORM_TEST(stbux);
4418d191587SAndrew Donnellan 	STORE_DFORM_TEST(sth);
4428d191587SAndrew Donnellan 	STORE_XFORM_TEST(sthx);
4438d191587SAndrew Donnellan 	STORE_DFORM_TEST(sthu);
4448d191587SAndrew Donnellan 	STORE_XFORM_TEST(sthux);
4458d191587SAndrew Donnellan 	STORE_XFORM_TEST(sthbrx);
4468d191587SAndrew Donnellan 	STORE_DFORM_TEST(stw);
4478d191587SAndrew Donnellan 	STORE_XFORM_TEST(stwx);
4488d191587SAndrew Donnellan 	STORE_DFORM_TEST(stwu);
4498d191587SAndrew Donnellan 	STORE_XFORM_TEST(stwux);
4508d191587SAndrew Donnellan 	STORE_XFORM_TEST(stwbrx);
4518d191587SAndrew Donnellan 	STORE_DFORM_TEST(std);
4528d191587SAndrew Donnellan 	STORE_XFORM_TEST(stdx);
4538d191587SAndrew Donnellan 	STORE_DFORM_TEST(stdu);
4548d191587SAndrew Donnellan 	STORE_XFORM_TEST(stdux);
455dd3a44c0SMichael Ellerman 
456dd3a44c0SMichael Ellerman #ifdef __BIG_ENDIAN__
457dd3a44c0SMichael Ellerman 	LOAD_DFORM_TEST(lmw);
4588d191587SAndrew Donnellan 	STORE_DFORM_TEST(stmw);
459dd3a44c0SMichael Ellerman #endif
4608e4bdc69SMichael Ellerman 
4618e4bdc69SMichael Ellerman 	return rc;
4628e4bdc69SMichael Ellerman }
4638e4bdc69SMichael Ellerman 
test_alignment_handler_integer_206(void)4648e4bdc69SMichael Ellerman int test_alignment_handler_integer_206(void)
4658e4bdc69SMichael Ellerman {
4668e4bdc69SMichael Ellerman 	int rc = 0;
4678e4bdc69SMichael Ellerman 
46801bd2946SJordan Niethe 	SKIP_IF(!can_open_cifile());
4698e4bdc69SMichael Ellerman 	SKIP_IF(!have_hwcap(PPC_FEATURE_ARCH_2_06));
4708e4bdc69SMichael Ellerman 
4718e4bdc69SMichael Ellerman 	printf("Integer: 2.06\n");
4728e4bdc69SMichael Ellerman 
4738e4bdc69SMichael Ellerman 	LOAD_XFORM_TEST(ldbrx);
4748e4bdc69SMichael Ellerman 	STORE_XFORM_TEST(stdbrx);
4758e4bdc69SMichael Ellerman 
4768d191587SAndrew Donnellan 	return rc;
4778d191587SAndrew Donnellan }
4788d191587SAndrew Donnellan 
test_alignment_handler_integer_prefix(void)479620a6473SJordan Niethe int test_alignment_handler_integer_prefix(void)
480620a6473SJordan Niethe {
481620a6473SJordan Niethe 	int rc = 0;
482620a6473SJordan Niethe 
483620a6473SJordan Niethe 	SKIP_IF(!can_open_cifile());
484620a6473SJordan Niethe 	SKIP_IF(!have_hwcap2(PPC_FEATURE2_ARCH_3_1));
485620a6473SJordan Niethe 
486620a6473SJordan Niethe 	printf("Integer: PREFIX\n");
487620a6473SJordan Niethe 	LOAD_MLS_PREFIX_TEST(PLBZ);
488620a6473SJordan Niethe 	LOAD_MLS_PREFIX_TEST(PLHZ);
489620a6473SJordan Niethe 	LOAD_MLS_PREFIX_TEST(PLHA);
490620a6473SJordan Niethe 	LOAD_MLS_PREFIX_TEST(PLWZ);
491620a6473SJordan Niethe 	LOAD_8LS_PREFIX_TEST(PLWA);
492620a6473SJordan Niethe 	LOAD_8LS_PREFIX_TEST(PLD);
493620a6473SJordan Niethe 	STORE_MLS_PREFIX_TEST(PSTB);
494620a6473SJordan Niethe 	STORE_MLS_PREFIX_TEST(PSTH);
495620a6473SJordan Niethe 	STORE_MLS_PREFIX_TEST(PSTW);
496620a6473SJordan Niethe 	STORE_8LS_PREFIX_TEST(PSTD);
497620a6473SJordan Niethe 	return rc;
498620a6473SJordan Niethe }
499620a6473SJordan Niethe 
test_alignment_handler_vmx(void)5008d191587SAndrew Donnellan int test_alignment_handler_vmx(void)
5018d191587SAndrew Donnellan {
5028d191587SAndrew Donnellan 	int rc = 0;
5038d191587SAndrew Donnellan 
50401bd2946SJordan Niethe 	SKIP_IF(!can_open_cifile());
5058e4bdc69SMichael Ellerman 	SKIP_IF(!have_hwcap(PPC_FEATURE_HAS_ALTIVEC));
506edba42cdSMichael Ellerman 
5078d191587SAndrew Donnellan 	printf("VMX\n");
5088d191587SAndrew Donnellan 	LOAD_VMX_XFORM_TEST(lvx);
5098d191587SAndrew Donnellan 
5108d191587SAndrew Donnellan 	/*
5118d191587SAndrew Donnellan 	 * FIXME: These loads only load part of the register, so our
5128d191587SAndrew Donnellan 	 * testing method doesn't work. Also they don't take alignment
5138d191587SAndrew Donnellan 	 * faults, so it's kinda pointless anyway
5148d191587SAndrew Donnellan 	 *
5158d191587SAndrew Donnellan 	 LOAD_VMX_XFORM_TEST(lvebx)
5168d191587SAndrew Donnellan 	 LOAD_VMX_XFORM_TEST(lvehx)
5178d191587SAndrew Donnellan 	 LOAD_VMX_XFORM_TEST(lvewx)
5188d191587SAndrew Donnellan 	 LOAD_VMX_XFORM_TEST(lvxl)
5198d191587SAndrew Donnellan 	*/
5208d191587SAndrew Donnellan 	STORE_VMX_XFORM_TEST(stvx);
5218d191587SAndrew Donnellan 	STORE_VMX_XFORM_TEST(stvebx);
5228d191587SAndrew Donnellan 	STORE_VMX_XFORM_TEST(stvehx);
5238d191587SAndrew Donnellan 	STORE_VMX_XFORM_TEST(stvewx);
5248d191587SAndrew Donnellan 	STORE_VMX_XFORM_TEST(stvxl);
5258d191587SAndrew Donnellan 	return rc;
5268d191587SAndrew Donnellan }
5278d191587SAndrew Donnellan 
test_alignment_handler_fp(void)5288d191587SAndrew Donnellan int test_alignment_handler_fp(void)
5298d191587SAndrew Donnellan {
5308d191587SAndrew Donnellan 	int rc = 0;
5318d191587SAndrew Donnellan 
53201bd2946SJordan Niethe 	SKIP_IF(!can_open_cifile());
533edba42cdSMichael Ellerman 
5348d191587SAndrew Donnellan 	printf("Floating point\n");
5358d191587SAndrew Donnellan 	LOAD_FLOAT_DFORM_TEST(lfd);
5368d191587SAndrew Donnellan 	LOAD_FLOAT_XFORM_TEST(lfdx);
5378d191587SAndrew Donnellan 	LOAD_FLOAT_DFORM_TEST(lfdu);
5388d191587SAndrew Donnellan 	LOAD_FLOAT_XFORM_TEST(lfdux);
5398d191587SAndrew Donnellan 	LOAD_FLOAT_DFORM_TEST(lfs);
5408d191587SAndrew Donnellan 	LOAD_FLOAT_XFORM_TEST(lfsx);
5418d191587SAndrew Donnellan 	LOAD_FLOAT_DFORM_TEST(lfsu);
5428d191587SAndrew Donnellan 	LOAD_FLOAT_XFORM_TEST(lfsux);
5438d191587SAndrew Donnellan 	STORE_FLOAT_DFORM_TEST(stfd);
5448d191587SAndrew Donnellan 	STORE_FLOAT_XFORM_TEST(stfdx);
5458d191587SAndrew Donnellan 	STORE_FLOAT_DFORM_TEST(stfdu);
5468d191587SAndrew Donnellan 	STORE_FLOAT_XFORM_TEST(stfdux);
5478d191587SAndrew Donnellan 	STORE_FLOAT_DFORM_TEST(stfs);
5488d191587SAndrew Donnellan 	STORE_FLOAT_XFORM_TEST(stfsx);
5498d191587SAndrew Donnellan 	STORE_FLOAT_DFORM_TEST(stfsu);
5508d191587SAndrew Donnellan 	STORE_FLOAT_XFORM_TEST(stfsux);
5518d191587SAndrew Donnellan 	STORE_FLOAT_XFORM_TEST(stfiwx);
5528d191587SAndrew Donnellan 
5538d191587SAndrew Donnellan 	return rc;
5548d191587SAndrew Donnellan }
5558d191587SAndrew Donnellan 
test_alignment_handler_fp_205(void)5568e4bdc69SMichael Ellerman int test_alignment_handler_fp_205(void)
5578e4bdc69SMichael Ellerman {
5588e4bdc69SMichael Ellerman 	int rc = 0;
5598e4bdc69SMichael Ellerman 
56001bd2946SJordan Niethe 	SKIP_IF(!can_open_cifile());
5618e4bdc69SMichael Ellerman 	SKIP_IF(!have_hwcap(PPC_FEATURE_ARCH_2_05));
5628e4bdc69SMichael Ellerman 
5638e4bdc69SMichael Ellerman 	printf("Floating point: 2.05\n");
5648e4bdc69SMichael Ellerman 
5658e4bdc69SMichael Ellerman 	LOAD_FLOAT_DFORM_TEST(lfdp);
5668e4bdc69SMichael Ellerman 	LOAD_FLOAT_XFORM_TEST(lfdpx);
5678e4bdc69SMichael Ellerman 	LOAD_FLOAT_XFORM_TEST(lfiwax);
5688e4bdc69SMichael Ellerman 	STORE_FLOAT_DFORM_TEST(stfdp);
5698e4bdc69SMichael Ellerman 	STORE_FLOAT_XFORM_TEST(stfdpx);
5708e4bdc69SMichael Ellerman 
5718e4bdc69SMichael Ellerman 	return rc;
5728e4bdc69SMichael Ellerman }
5738e4bdc69SMichael Ellerman 
test_alignment_handler_fp_206(void)5748e4bdc69SMichael Ellerman int test_alignment_handler_fp_206(void)
5758e4bdc69SMichael Ellerman {
5768e4bdc69SMichael Ellerman 	int rc = 0;
5778e4bdc69SMichael Ellerman 
57801bd2946SJordan Niethe 	SKIP_IF(!can_open_cifile());
5798e4bdc69SMichael Ellerman 	SKIP_IF(!have_hwcap(PPC_FEATURE_ARCH_2_06));
5808e4bdc69SMichael Ellerman 
5818e4bdc69SMichael Ellerman 	printf("Floating point: 2.06\n");
5828e4bdc69SMichael Ellerman 
5838e4bdc69SMichael Ellerman 	LOAD_FLOAT_XFORM_TEST(lfiwzx);
5848e4bdc69SMichael Ellerman 
5858e4bdc69SMichael Ellerman 	return rc;
5868e4bdc69SMichael Ellerman }
5878e4bdc69SMichael Ellerman 
588620a6473SJordan Niethe 
test_alignment_handler_fp_prefix(void)589620a6473SJordan Niethe int test_alignment_handler_fp_prefix(void)
590620a6473SJordan Niethe {
591620a6473SJordan Niethe 	int rc = 0;
592620a6473SJordan Niethe 
593620a6473SJordan Niethe 	SKIP_IF(!can_open_cifile());
594620a6473SJordan Niethe 	SKIP_IF(!have_hwcap2(PPC_FEATURE2_ARCH_3_1));
595620a6473SJordan Niethe 
596620a6473SJordan Niethe 	printf("Floating point: PREFIX\n");
597620a6473SJordan Niethe 	LOAD_FLOAT_DFORM_TEST(lfs);
598620a6473SJordan Niethe 	LOAD_FLOAT_MLS_PREFIX_TEST(PLFS);
599620a6473SJordan Niethe 	LOAD_FLOAT_MLS_PREFIX_TEST(PLFD);
600620a6473SJordan Niethe 	STORE_FLOAT_MLS_PREFIX_TEST(PSTFS);
601620a6473SJordan Niethe 	STORE_FLOAT_MLS_PREFIX_TEST(PSTFD);
602620a6473SJordan Niethe 	return rc;
603620a6473SJordan Niethe }
604620a6473SJordan Niethe 
usage(char * prog)6058d191587SAndrew Donnellan void usage(char *prog)
6068d191587SAndrew Donnellan {
60701bd2946SJordan Niethe 	printf("Usage: %s [options] [path [offset]]\n", prog);
6088d191587SAndrew Donnellan 	printf("  -d	Enable debug error output\n");
6098d191587SAndrew Donnellan 	printf("\n");
610620a6473SJordan Niethe 	printf("This test requires a POWER8, POWER9 or POWER10 CPU ");
611620a6473SJordan Niethe 	printf("and either a usable framebuffer at /dev/fb0 or ");
612620a6473SJordan Niethe 	printf("the path to usable cache inhibited memory and optional ");
613620a6473SJordan Niethe 	printf("offset to be provided\n");
6148d191587SAndrew Donnellan }
6158d191587SAndrew Donnellan 
main(int argc,char * argv[])6168d191587SAndrew Donnellan int main(int argc, char *argv[])
6178d191587SAndrew Donnellan {
6188d191587SAndrew Donnellan 
6198d191587SAndrew Donnellan 	struct sigaction sa;
6208d191587SAndrew Donnellan 	int rc = 0;
6218d191587SAndrew Donnellan 	int option = 0;
6228d191587SAndrew Donnellan 
6238d191587SAndrew Donnellan 	while ((option = getopt(argc, argv, "d")) != -1) {
6248d191587SAndrew Donnellan 		switch (option) {
6258d191587SAndrew Donnellan 		case 'd':
6268d191587SAndrew Donnellan 			debug++;
6278d191587SAndrew Donnellan 			break;
6288d191587SAndrew Donnellan 		default:
6298d191587SAndrew Donnellan 			usage(argv[0]);
6308d191587SAndrew Donnellan 			exit(1);
6318d191587SAndrew Donnellan 		}
6328d191587SAndrew Donnellan 	}
63301bd2946SJordan Niethe 	argc -= optind;
63401bd2946SJordan Niethe 	argv += optind;
63501bd2946SJordan Niethe 
63601bd2946SJordan Niethe 	if (argc > 0)
63701bd2946SJordan Niethe 		cipath = argv[0];
63801bd2946SJordan Niethe 	if (argc > 1)
63901bd2946SJordan Niethe 		cioffset = strtol(argv[1], 0, 0x10);
6408d191587SAndrew Donnellan 
6418d191587SAndrew Donnellan 	bufsize = getpagesize();
6428d191587SAndrew Donnellan 
6438d191587SAndrew Donnellan 	sa.sa_sigaction = sighandler;
6448d191587SAndrew Donnellan 	sigemptyset(&sa.sa_mask);
6458d191587SAndrew Donnellan 	sa.sa_flags = SA_SIGINFO;
6468d191587SAndrew Donnellan 	if (sigaction(SIGSEGV, &sa, NULL) == -1
6478d191587SAndrew Donnellan 	    || sigaction(SIGBUS, &sa, NULL) == -1
6488d191587SAndrew Donnellan 	    || sigaction(SIGILL, &sa, NULL) == -1) {
6498d191587SAndrew Donnellan 		perror("sigaction");
6508d191587SAndrew Donnellan 		exit(1);
6518d191587SAndrew Donnellan 	}
6528d191587SAndrew Donnellan 
653db96221aSJordan Niethe 	prefixes_enabled = have_hwcap2(PPC_FEATURE2_ARCH_3_1);
654db96221aSJordan Niethe 
6558d191587SAndrew Donnellan 	rc |= test_harness(test_alignment_handler_vsx_206,
6568d191587SAndrew Donnellan 			   "test_alignment_handler_vsx_206");
6578d191587SAndrew Donnellan 	rc |= test_harness(test_alignment_handler_vsx_207,
6588d191587SAndrew Donnellan 			   "test_alignment_handler_vsx_207");
6598d191587SAndrew Donnellan 	rc |= test_harness(test_alignment_handler_vsx_300,
6608d191587SAndrew Donnellan 			   "test_alignment_handler_vsx_300");
661620a6473SJordan Niethe 	rc |= test_harness(test_alignment_handler_vsx_prefix,
662620a6473SJordan Niethe 			   "test_alignment_handler_vsx_prefix");
6638d191587SAndrew Donnellan 	rc |= test_harness(test_alignment_handler_integer,
6648d191587SAndrew Donnellan 			   "test_alignment_handler_integer");
6658e4bdc69SMichael Ellerman 	rc |= test_harness(test_alignment_handler_integer_206,
6668e4bdc69SMichael Ellerman 			   "test_alignment_handler_integer_206");
667620a6473SJordan Niethe 	rc |= test_harness(test_alignment_handler_integer_prefix,
668620a6473SJordan Niethe 			   "test_alignment_handler_integer_prefix");
6698d191587SAndrew Donnellan 	rc |= test_harness(test_alignment_handler_vmx,
6708d191587SAndrew Donnellan 			   "test_alignment_handler_vmx");
6718d191587SAndrew Donnellan 	rc |= test_harness(test_alignment_handler_fp,
6728d191587SAndrew Donnellan 			   "test_alignment_handler_fp");
6738e4bdc69SMichael Ellerman 	rc |= test_harness(test_alignment_handler_fp_205,
6748e4bdc69SMichael Ellerman 			   "test_alignment_handler_fp_205");
6758e4bdc69SMichael Ellerman 	rc |= test_harness(test_alignment_handler_fp_206,
6768e4bdc69SMichael Ellerman 			   "test_alignment_handler_fp_206");
677620a6473SJordan Niethe 	rc |= test_harness(test_alignment_handler_fp_prefix,
678620a6473SJordan Niethe 			   "test_alignment_handler_fp_prefix");
6798d191587SAndrew Donnellan 	return rc;
6808d191587SAndrew Donnellan }
681