]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Track vex r2894 (representation changes to arm64 FPSR)
authorJulian Seward <jseward@acm.org>
Sat, 28 Jun 2014 22:12:34 +0000 (22:12 +0000)
committerJulian Seward <jseward@acm.org>
Sat, 28 Jun 2014 22:12:34 +0000 (22:12 +0000)
git-svn-id: svn://svn.valgrind.org/valgrind/trunk@14120

coregrind/m_gdbserver/valgrind-low-arm64.c
memcheck/mc_machine.c

index 853078d10252334cb0e80dadcb140ac34cd2a2e7..1b5a539777e315110f87d85614e0e4b46bf7dbd3 100644 (file)
@@ -217,7 +217,22 @@ void transfer_register (ThreadId tid, int abs_regno, void * buf,
    case 63: VG_(transfer) (&arm->guest_Q29, buf, dir, size, mod); break;
    case 64: VG_(transfer) (&arm->guest_Q30, buf, dir, size, mod); break;
    case 65: VG_(transfer) (&arm->guest_Q31, buf, dir, size, mod); break;
-   case 66: VG_(transfer) (&arm->guest_FPSR, buf, dir, size, mod); break;
+   case 66: {
+      /* The ARM64 FPSR representation is not the same as the
+          architecturally defined representation.  Hence use conversion
+          functions to convert to/from it. */
+      if (dir == valgrind_to_gdbserver) {
+         ULong fpsr = LibVEX_GuestARM64_get_fpsr(arm);
+         // XXX FIXME what if size != 8 ?  Does this still work?
+         VG_(transfer) (&fpsr, buf, dir, size, mod);
+      } else {
+         // XXX FIXME what if size != 8 ?  Does this still work?
+         ULong fpsr = 0;
+         VG_(transfer) (&fpsr, buf, dir, size, mod);
+         LibVEX_GuestARM64_set_fpsr(arm, fpsr);
+      }
+      break;
+   }
    case 67: VG_(transfer) (&arm->guest_FPCR, buf, dir, size, mod); break;
    default: vg_assert(0);
    }
index 94f89833dda771fc797098b96e330a4cf2375fce..70741070d277650bb4c4319eedc49882dd93492d 100644 (file)
@@ -1053,7 +1053,7 @@ static Int get_otrack_shadow_offset_wrk ( Int offset, Int szB )
    if (o >= GOF(Q31)  && o+sz <= GOF(Q31)+SZB(Q31)) return GOF(Q31);
 
    if (o == GOF(FPCR) && sz == 4) return -1; // untracked
-   if (o == GOF(FPSR) && sz == 4) return -1; // untracked
+   if (o == GOF(QCFLAG) && sz == 16) return o;
 
    if (o == GOF(CMSTART) && sz == 8) return -1; // untracked
    if (o == GOF(CMLEN)   && sz == 8) return -1; // untracked