1 // SPDX-License-Identifier: GPL-2.0-only 2 3 #include "../../kselftest.h" 4 #define MAX_VSIZE (8192 * 32) 5 6 void 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 22 int 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 = %lu\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