diff mbox series

target/arm: Add MO_128 entry to pred_esz_masks[]

Message ID 20220718100144.3248052-1-peter.maydell@linaro.org
State Superseded
Headers show
Series target/arm: Add MO_128 entry to pred_esz_masks[] | expand

Commit Message

Peter Maydell July 18, 2022, 10:01 a.m. UTC
In commit 7390e0e9ab8475, we added support for SME loads and stores.
Unlike SVE loads and stores, these include handling of 128-bit
elements.  The SME load/store functions call down into the existing
sve_cont_ldst_elements() function, which uses the element size MO_*
value as an index into the pred_esz_masks[] array.  Because this code
path now has to handle MO_128, we need to add an extra element to the
array.

This bug was spotted by Coverity because it meant we were reading off
the end of the array.

Resolves: Coverity CID 1490539, 1490541, 1490543, 1490544, 1490545,
 1490546, 1490548, 1490549, 1490550, 1490551, 1490555, 1490557,
 1490558, 1490560, 1490561, 1490563
Fixes: 7390e0e9ab8475 ("target/arm: Implement SME LD1, ST1")
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
---
 target/arm/cpu.h           | 2 +-
 target/arm/translate-sve.c | 5 +++--
 2 files changed, 4 insertions(+), 3 deletions(-)

Comments

Richard Henderson July 23, 2022, 9:04 p.m. UTC | #1
On 7/18/22 15:31, Peter Maydell wrote:
> In commit 7390e0e9ab8475, we added support for SME loads and stores.
> Unlike SVE loads and stores, these include handling of 128-bit
> elements.  The SME load/store functions call down into the existing
> sve_cont_ldst_elements() function, which uses the element size MO_*
> value as an index into the pred_esz_masks[] array.  Because this code
> path now has to handle MO_128, we need to add an extra element to the
> array.
> 
> This bug was spotted by Coverity because it meant we were reading off
> the end of the array.
> 
> Resolves: Coverity CID 1490539, 1490541, 1490543, 1490544, 1490545,
>   1490546, 1490548, 1490549, 1490550, 1490551, 1490555, 1490557,
>   1490558, 1490560, 1490561, 1490563
> Fixes: 7390e0e9ab8475 ("target/arm: Implement SME LD1, ST1")
> Signed-off-by: Peter Maydell<peter.maydell@linaro.org>
> ---
>   target/arm/cpu.h           | 2 +-
>   target/arm/translate-sve.c | 5 +++--
>   2 files changed, 4 insertions(+), 3 deletions(-)

Reviewed-by: Richard Henderson <richard.henderson@linaro.org>

r~
diff mbox series

Patch

diff --git a/target/arm/cpu.h b/target/arm/cpu.h
index 1e36a839ee4..3123488014d 100644
--- a/target/arm/cpu.h
+++ b/target/arm/cpu.h
@@ -3374,7 +3374,7 @@  static inline uint64_t *aa64_vfp_qreg(CPUARMState *env, unsigned regno)
 }
 
 /* Shared between translate-sve.c and sve_helper.c.  */
-extern const uint64_t pred_esz_masks[4];
+extern const uint64_t pred_esz_masks[5];
 
 /* Helper for the macros below, validating the argument type. */
 static inline MemTxAttrs *typecheck_memtxattrs(MemTxAttrs *x)
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
index 41f8b12259e..621a2abb22f 100644
--- a/target/arm/translate-sve.c
+++ b/target/arm/translate-sve.c
@@ -529,9 +529,10 @@  static void do_predtest(DisasContext *s, int dofs, int gofs, int words)
 }
 
 /* For each element size, the bits within a predicate word that are active.  */
-const uint64_t pred_esz_masks[4] = {
+const uint64_t pred_esz_masks[5] = {
     0xffffffffffffffffull, 0x5555555555555555ull,
-    0x1111111111111111ull, 0x0101010101010101ull
+    0x1111111111111111ull, 0x0101010101010101ull,
+    0x0001000100010001ull,
 };
 
 static bool trans_INVALID(DisasContext *s, arg_INVALID *a)