arch: Fix unserialization of VectorReg value
authorGabor Dozsa <gabor.dozsa@arm.com>
Tue, 7 Nov 2017 14:05:00 +0000 (14:05 +0000)
committerAndreas Sandberg <andreas.sandberg@arm.com>
Tue, 2 Oct 2018 11:51:44 +0000 (11:51 +0000)
Change-Id: Iba01ae60e10703877eae299ba924fa1f04a4a387
Signed-off-by: Giacomo Gabrielli <giacomo.gabrielli@arm.com>
Reviewed-on: https://gem5-review.googlesource.com/13104
Reviewed-by: Andreas Sandberg <andreas.sandberg@arm.com>
Maintainer: Andreas Sandberg <andreas.sandberg@arm.com>

src/arch/generic/vec_reg.hh

index b68a5886da07cad6ef3a437dc6488ef73d0fb00b..7145af4cfbd6b7fc236611d391c8d8daa041b0b8 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015-2016 ARM Limited
+ * Copyright (c) 2015-2016, 2018 ARM Limited
  * All rights reserved
  *
  * The license below extends only to copyright in the software and shall
@@ -635,11 +635,14 @@ template <size_t Sz>
 inline bool
 to_number(const std::string& value, VecRegContainer<Sz>& v)
 {
-    int i = 0;
-    while (i < Sz) {
-        std::string byte = value.substr(i<<1, 2);
-        v.template raw_ptr<uint8_t>()[i] = stoul(byte, 0, 16);
-        i++;
+    fatal_if(value.size() > 2 * VecRegContainer<Sz>::SIZE,
+             "Vector register value overflow at unserialize");
+
+    for (int i = 0; i < VecRegContainer<Sz>::SIZE; i++) {
+        uint8_t b = 0;
+        if (2 * i < value.size())
+            b = stoul(value.substr(i * 2, 2), nullptr, 16);
+        v.template raw_ptr<uint8_t>()[i] = b;
     }
     return true;
 }