arch-arm: correctly set floats from GDB on aarch64
authorCiro Santilli <ciro.santilli@arm.com>
Thu, 15 Nov 2018 00:00:00 +0000 (00:00 +0000)
committerCiro Santilli <ciro.santilli@arm.com>
Mon, 3 Dec 2018 10:43:15 +0000 (10:43 +0000)
aarch64 floating point registers are now stored as vector type, but this
was not updated in the stub.

Change-Id: I4a2bc1cea0eec9beeb5bbd49e2a868b9d5ed0a42
Reviewed-on: https://gem5-review.googlesource.com/c/14498
Reviewed-by: Giacomo Travaglini <giacomo.travaglini@arm.com>
Maintainer: Giacomo Travaglini <giacomo.travaglini@arm.com>

src/arch/arm/remote_gdb.cc
src/arch/arm/remote_gdb.hh

index 38207d4942cbe1abe7bd51ee3d3593b444a648d0..f3ffa8589ca9378dc4d8ac35d4be48a70d5aee67 100644 (file)
@@ -203,11 +203,13 @@ RemoteGDB::AArch64GdbRegCache::getRegs(ThreadContext *context)
     r.pc = context->pcState().pc();
     r.cpsr = context->readMiscRegNoEffect(MISCREG_CPSR);
 
-    for (int i = 0; i < 32*4; i += 4) {
-        r.v[i + 0] = context->readFloatRegBits(i + 2);
-        r.v[i + 1] = context->readFloatRegBits(i + 3);
-        r.v[i + 2] = context->readFloatRegBits(i + 0);
-        r.v[i + 3] = context->readFloatRegBits(i + 1);
+    size_t base = 0;
+    for (int i = 0; i < NumVecV8ArchRegs; i++) {
+        auto v = (context->readVecReg(RegId(VecRegClass, i))).as<VecElem>();
+        for (size_t j = 0; j < NumVecElemPerVecReg; j++) {
+            r.v[base] = v[j];
+            base++;
+        }
     }
 }
 
@@ -227,11 +229,14 @@ RemoteGDB::AArch64GdbRegCache::setRegs(ThreadContext *context) const
     // mapped.
     context->setIntReg(INTREG_SPX, r.spx);
 
-    for (int i = 0; i < 32*4; i += 4) {
-        context->setFloatRegBits(i + 2, r.v[i + 0]);
-        context->setFloatRegBits(i + 3, r.v[i + 1]);
-        context->setFloatRegBits(i + 0, r.v[i + 2]);
-        context->setFloatRegBits(i + 1, r.v[i + 3]);
+    size_t base = 0;
+    for (int i = 0; i < NumVecV8ArchRegs; i++) {
+        auto v = (context->getWritableVecReg(
+                RegId(VecRegClass, i))).as<VecElem>();
+        for (size_t j = 0; j < NumVecElemPerVecReg; j++) {
+            v[j] = r.v[base];
+            base++;
+        }
     }
 }
 
index e59d7b04563c78289397f6b923babb2c6f521ed1..10fcb6d4a7aa0978f0e845a711e585d2f7acbc74 100644 (file)
@@ -96,7 +96,7 @@ class RemoteGDB : public BaseRemoteGDB
           uint64_t spx;
           uint64_t pc;
           uint32_t cpsr;
-          uint32_t v[32*4];
+          VecElem v[NumVecV8ArchRegs * NumVecElemPerVecReg];
         } M5_ATTR_PACKED r;
       public:
         char *data() const { return (char *)&r; }