From: Julian Seward Date: Sat, 28 Jun 2014 22:12:34 +0000 (+0000) Subject: Track vex r2894 (representation changes to arm64 FPSR) X-Git-Tag: svn/VALGRIND_3_10_0~317 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b67bf56fb6dd9c2c80855bf12c11adab9bcbd333;p=thirdparty%2Fvalgrind.git Track vex r2894 (representation changes to arm64 FPSR) git-svn-id: svn://svn.valgrind.org/valgrind/trunk@14120 --- diff --git a/coregrind/m_gdbserver/valgrind-low-arm64.c b/coregrind/m_gdbserver/valgrind-low-arm64.c index 853078d102..1b5a539777 100644 --- a/coregrind/m_gdbserver/valgrind-low-arm64.c +++ b/coregrind/m_gdbserver/valgrind-low-arm64.c @@ -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); } diff --git a/memcheck/mc_machine.c b/memcheck/mc_machine.c index 94f89833dd..70741070d2 100644 --- a/memcheck/mc_machine.c +++ b/memcheck/mc_machine.c @@ -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