1// SPDX-License-Identifier: GPL-2.0-only
2
3#include "../../kselftest.h"
4#define MAX_VSIZE	(8192 * 32)
5
6void dump(char *ptr, int size)
7{
8	int i = 0;
9
10	for (i = 0; i < size; i++) {
11		if (i != 0) {
12			if (i % 16 == 0)
13				printf("\n");
14			else if (i % 8 == 0)
15				printf("  ");
16		}
17		printf("%02x ", ptr[i]);
18	}
19	printf("\n");
20}
21
22int main(void)
23{
24	int i;
25	unsigned long vl;
26	char *datap, *tmp;
27
28	datap = malloc(MAX_VSIZE);
29	if (!datap) {
30		ksft_test_result_fail("fail to allocate memory for size = %d\n", MAX_VSIZE);
31		exit(-1);
32	}
33
34	tmp = datap;
35	asm volatile (
36		".option push\n\t"
37		".option arch, +v\n\t"
38		"vsetvli	%0, x0, e8, m8, ta, ma\n\t"
39		"vse8.v		v0, (%2)\n\t"
40		"add		%1, %2, %0\n\t"
41		"vse8.v		v8, (%1)\n\t"
42		"add		%1, %1, %0\n\t"
43		"vse8.v		v16, (%1)\n\t"
44		"add		%1, %1, %0\n\t"
45		"vse8.v		v24, (%1)\n\t"
46		".option pop\n\t"
47		: "=&r" (vl), "=r" (tmp) : "r" (datap) : "memory");
48
49	ksft_print_msg("vl = %lu\n", vl);
50
51	if (datap[0] != 0x00 && datap[0] != 0xff) {
52		ksft_test_result_fail("v-regesters are not properly initialized\n");
53		dump(datap, vl * 4);
54		exit(-1);
55	}
56
57	for (i = 1; i < vl * 4; i++) {
58		if (datap[i] != datap[0]) {
59			ksft_test_result_fail("detect stale values on v-regesters\n");
60			dump(datap, vl * 4);
61			exit(-2);
62		}
63	}
64
65	free(datap);
66	ksft_exit_pass();
67	return 0;
68}
69