target/arm: Correctly bound length in sve_zcr_get_valid_len
authorRichard Henderson <richard.henderson@linaro.org>
Fri, 23 Jul 2021 20:33:42 +0000 (10:33 -1000)
committerPeter Maydell <peter.maydell@linaro.org>
Tue, 27 Jul 2021 09:57:40 +0000 (10:57 +0100)
Currently, our only caller is sve_zcr_len_for_el, which has
already masked the length extracted from ZCR_ELx, so the
masking done here is a nop.  But we will shortly have uses
from other locations, where the length will be unmasked.

Saturate the length to ARM_MAX_VQ instead of truncating to
the low 4 bits.

Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
Message-id: 20210723203344.968563-2-richard.henderson@linaro.org
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
target/arm/helper.c

index 0c07ca98376c2c3b19c16210c3bf7b52f7ce452c..8c1d8dbce36ec33c423d167d387e05e73850e050 100644 (file)
@@ -6461,7 +6461,9 @@ static uint32_t sve_zcr_get_valid_len(ARMCPU *cpu, uint32_t start_len)
 {
     uint32_t end_len;
 
-    end_len = start_len &= 0xf;
+    start_len = MIN(start_len, ARM_MAX_VQ - 1);
+    end_len = start_len;
+
     if (!test_bit(start_len, cpu->sve_vq_map)) {
         end_len = find_last_bit(cpu->sve_vq_map, start_len);
         assert(end_len < start_len);