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