xref: /linux/tools/testing/selftests/riscv/vector/v_helpers.c (revision ba6ec09911b805778a2fed6d626bfe77b011a717)
157d7713aSCharlie Jenkins // SPDX-License-Identifier: GPL-2.0-only
257d7713aSCharlie Jenkins 
357d7713aSCharlie Jenkins #include "../hwprobe/hwprobe.h"
4*c384c5d4SCharlie Jenkins #include <asm/vendor/thead.h>
557d7713aSCharlie Jenkins #include <stdbool.h>
657d7713aSCharlie Jenkins #include <stdlib.h>
757d7713aSCharlie Jenkins #include <stdio.h>
857d7713aSCharlie Jenkins #include <unistd.h>
957d7713aSCharlie Jenkins #include <sys/wait.h>
1057d7713aSCharlie Jenkins 
is_xtheadvector_supported(void)11*c384c5d4SCharlie Jenkins bool is_xtheadvector_supported(void)
12*c384c5d4SCharlie Jenkins {
13*c384c5d4SCharlie Jenkins 	struct riscv_hwprobe pair;
14*c384c5d4SCharlie Jenkins 
15*c384c5d4SCharlie Jenkins 	pair.key = RISCV_HWPROBE_KEY_VENDOR_EXT_THEAD_0;
16*c384c5d4SCharlie Jenkins 	riscv_hwprobe(&pair, 1, 0, NULL, 0);
17*c384c5d4SCharlie Jenkins 	return pair.value & RISCV_HWPROBE_VENDOR_EXT_XTHEADVECTOR;
18*c384c5d4SCharlie Jenkins }
19*c384c5d4SCharlie Jenkins 
is_vector_supported(void)2057d7713aSCharlie Jenkins bool is_vector_supported(void)
2157d7713aSCharlie Jenkins {
2257d7713aSCharlie Jenkins 	struct riscv_hwprobe pair;
2357d7713aSCharlie Jenkins 
2457d7713aSCharlie Jenkins 	pair.key = RISCV_HWPROBE_KEY_IMA_EXT_0;
2557d7713aSCharlie Jenkins 	riscv_hwprobe(&pair, 1, 0, NULL, 0);
2657d7713aSCharlie Jenkins 	return pair.value & RISCV_HWPROBE_EXT_ZVE32X;
2757d7713aSCharlie Jenkins }
2857d7713aSCharlie Jenkins 
launch_test(char * next_program,int test_inherit,int xtheadvector)29*c384c5d4SCharlie Jenkins int launch_test(char *next_program, int test_inherit, int xtheadvector)
3057d7713aSCharlie Jenkins {
31*c384c5d4SCharlie Jenkins 	char *exec_argv[4], *exec_envp[1];
3257d7713aSCharlie Jenkins 	int rc, pid, status;
3357d7713aSCharlie Jenkins 
3457d7713aSCharlie Jenkins 	pid = fork();
3557d7713aSCharlie Jenkins 	if (pid < 0) {
3657d7713aSCharlie Jenkins 		printf("fork failed %d", pid);
3757d7713aSCharlie Jenkins 		return -1;
3857d7713aSCharlie Jenkins 	}
3957d7713aSCharlie Jenkins 
4057d7713aSCharlie Jenkins 	if (!pid) {
4157d7713aSCharlie Jenkins 		exec_argv[0] = next_program;
4257d7713aSCharlie Jenkins 		exec_argv[1] = test_inherit != 0 ? "x" : NULL;
43*c384c5d4SCharlie Jenkins 		exec_argv[2] = xtheadvector != 0 ? "x" : NULL;
44*c384c5d4SCharlie Jenkins 		exec_argv[3] = NULL;
4557d7713aSCharlie Jenkins 		exec_envp[0] = NULL;
4657d7713aSCharlie Jenkins 		/* launch the program again to check inherit */
4757d7713aSCharlie Jenkins 		rc = execve(next_program, exec_argv, exec_envp);
4857d7713aSCharlie Jenkins 		if (rc) {
4957d7713aSCharlie Jenkins 			perror("execve");
5057d7713aSCharlie Jenkins 			printf("child execve failed %d\n", rc);
5157d7713aSCharlie Jenkins 			exit(-1);
5257d7713aSCharlie Jenkins 		}
5357d7713aSCharlie Jenkins 	}
5457d7713aSCharlie Jenkins 
5557d7713aSCharlie Jenkins 	rc = waitpid(-1, &status, 0);
5657d7713aSCharlie Jenkins 	if (rc < 0) {
5757d7713aSCharlie Jenkins 		printf("waitpid failed\n");
5857d7713aSCharlie Jenkins 		return -3;
5957d7713aSCharlie Jenkins 	}
6057d7713aSCharlie Jenkins 
6157d7713aSCharlie Jenkins 	if ((WIFEXITED(status) && WEXITSTATUS(status) == -1) ||
6257d7713aSCharlie Jenkins 	    WIFSIGNALED(status)) {
6357d7713aSCharlie Jenkins 		printf("child exited abnormally\n");
6457d7713aSCharlie Jenkins 		return -4;
6557d7713aSCharlie Jenkins 	}
6657d7713aSCharlie Jenkins 
6757d7713aSCharlie Jenkins 	return WEXITSTATUS(status);
6857d7713aSCharlie Jenkins }
69