Path: blob/master/tools/testing/selftests/arm64/fp/sve-probe-vls.c
26289 views
// SPDX-License-Identifier: GPL-2.0-only1/*2* Copyright (C) 2015-2020 ARM Limited.3* Original author: Dave Martin <[email protected]>4*/5#include <assert.h>6#include <errno.h>7#include <stdio.h>8#include <stdlib.h>9#include <string.h>10#include <sys/auxv.h>11#include <sys/prctl.h>12#include <asm/sigcontext.h>1314#include "../../kselftest.h"15#include "rdvl.h"1617int main(int argc, char **argv)18{19unsigned int vq;20int vl;21static unsigned int vqs[SVE_VQ_MAX];22unsigned int nvqs = 0;2324ksft_print_header();25ksft_set_plan(2);2627if (!(getauxval(AT_HWCAP) & HWCAP_SVE))28ksft_exit_skip("SVE not available\n");2930/*31* Enumerate up to SVE_VQ_MAX vector lengths32*/33for (vq = SVE_VQ_MAX; vq > 0; --vq) {34vl = prctl(PR_SVE_SET_VL, vq * 16);35if (vl == -1)36ksft_exit_fail_msg("PR_SVE_SET_VL failed: %s (%d)\n",37strerror(errno), errno);3839vl &= PR_SVE_VL_LEN_MASK;4041if (rdvl_sve() != vl)42ksft_exit_fail_msg("PR_SVE_SET_VL reports %d, RDVL %d\n",43vl, rdvl_sve());4445if (!sve_vl_valid(vl))46ksft_exit_fail_msg("VL %d invalid\n", vl);47vq = sve_vq_from_vl(vl);4849if (!(nvqs < SVE_VQ_MAX))50ksft_exit_fail_msg("Too many VLs %u >= SVE_VQ_MAX\n",51nvqs);52vqs[nvqs++] = vq;53}54ksft_test_result_pass("Enumerated %d vector lengths\n", nvqs);55ksft_test_result_pass("All vector lengths valid\n");5657/* Print out the vector lengths in ascending order: */58while (nvqs--)59ksft_print_msg("%u\n", 16 * vqs[nvqs]);6061ksft_exit_pass();62}636465