#include <stdbool.h>
#include <kselftest.h>
#include <asm/sigcontext.h>
#include <sys/prctl.h>
unsigned int vls[SVE_VQ_MAX];
unsigned int nvls;
int sve_fill_vls(bool use_sme, int min_vls)
{
int vq, vl;
int pr_set_vl = use_sme ? PR_SME_SET_VL : PR_SVE_SET_VL;
int len_mask = use_sme ? PR_SME_VL_LEN_MASK : PR_SVE_VL_LEN_MASK;
for (vq = SVE_VQ_MAX; vq > 0; --vq) {
vl = prctl(pr_set_vl, vq * 16);
if (vl == -1)
return KSFT_FAIL;
vl &= len_mask;
if (vq < sve_vq_from_vl(vl))
break;
vq = sve_vq_from_vl(vl);
vls[nvls++] = vl;
}
if (nvls < min_vls) {
fprintf(stderr, "Only %d VL supported\n", nvls);
return KSFT_SKIP;
}
return KSFT_PASS;
}