kselftest/arm64: Don't probe the current VL for unsupported vector types
authorMark Brown <broonie@kernel.org>
Mon, 18 Dec 2023 23:39:32 +0000 (23:39 +0000)
committerWill Deacon <will@kernel.org>
Tue, 19 Dec 2023 10:03:17 +0000 (10:03 +0000)
The vec-syscfg selftest verifies that setting the VL of the currently
tested vector type does not disrupt the VL of the other vector type. To do
this it records the current vector length for each type but neglects to
guard this with a check for that vector type actually being supported. Add
one, using a helper function which we also update all the other instances
of this pattern.

Signed-off-by: Mark Brown <broonie@kernel.org>
Link: https://lore.kernel.org/r/20231218-kselftest-arm64-vec-syscfg-rdvl-v1-1-0ac22d47e81f@kernel.org
Signed-off-by: Will Deacon <will@kernel.org>
tools/testing/selftests/arm64/fp/vec-syscfg.c

index 5f648b97a06fea4df891e3e998c997b85bbc200a..ea9c7d47790f9daf44c0f49e789e72ee2200e46e 100644 (file)
@@ -66,6 +66,11 @@ static struct vec_data vec_data[] = {
        },
 };
 
+static bool vec_type_supported(struct vec_data *data)
+{
+       return getauxval(data->hwcap_type) & data->hwcap;
+}
+
 static int stdio_read_integer(FILE *f, const char *what, int *val)
 {
        int n = 0;
@@ -564,8 +569,11 @@ static void prctl_set_all_vqs(struct vec_data *data)
                return;
        }
 
-       for (i = 0; i < ARRAY_SIZE(vec_data); i++)
+       for (i = 0; i < ARRAY_SIZE(vec_data); i++) {
+               if (!vec_type_supported(&vec_data[i]))
+                       continue;
                orig_vls[i] = vec_data[i].rdvl();
+       }
 
        for (vq = SVE_VQ_MIN; vq <= SVE_VQ_MAX; vq++) {
                vl = sve_vl_from_vq(vq);
@@ -594,7 +602,7 @@ static void prctl_set_all_vqs(struct vec_data *data)
                        if (&vec_data[i] == data)
                                continue;
 
-                       if (!(getauxval(vec_data[i].hwcap_type) & vec_data[i].hwcap))
+                       if (!vec_type_supported(&vec_data[i]))
                                continue;
 
                        if (vec_data[i].rdvl() != orig_vls[i]) {
@@ -765,7 +773,7 @@ int main(void)
                struct vec_data *data = &vec_data[i];
                unsigned long supported;
 
-               supported = getauxval(data->hwcap_type) & data->hwcap;
+               supported = vec_type_supported(data);
                if (!supported)
                        all_supported = false;