69 lines · c
1// SPDX-License-Identifier: GPL-2.0-only2 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