From: Philippe Waroquiers Date: Sun, 10 Aug 2014 10:42:10 +0000 (+0000) Subject: arm64 Improve fpsr gdbsrv handling. X-Git-Tag: svn/VALGRIND_3_10_0~204 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7200525296932549dc3ebfd7bb0635d35165645d;p=thirdparty%2Fvalgrind.git arm64 Improve fpsr gdbsrv handling. let the compiler handle the ULong to UInt conversion rather than play with addresses. Tested manually GDB+vgdb that reading and setting fpsr works, using code such as (provided by Julian, I cannot write a single line of arm64 asm :) void set_fpsr ( uint32_t val ) { __asm__ __volatile__( "msr fpsr, %0" : : "r"(val) : "cc" ); } uint32_t get_fpsr ( void ) { uint32_t res; __asm__ __volatile__( "mrs %0, fpsr" : "=r"(res) : : "cc" ); return res; } git-svn-id: svn://svn.valgrind.org/valgrind/trunk@14256 --- diff --git a/coregrind/m_gdbserver/valgrind-low-arm64.c b/coregrind/m_gdbserver/valgrind-low-arm64.c index ff65378def..32f19e1746 100644 --- a/coregrind/m_gdbserver/valgrind-low-arm64.c +++ b/coregrind/m_gdbserver/valgrind-low-arm64.c @@ -226,15 +226,19 @@ void transfer_register (ThreadId tid, int abs_regno, void * buf, significant part of the ULong that VEX provides/needs, as GDB expects or gives only 4 bytes. */ if (dir == valgrind_to_gdbserver) { - ULong fpsr = LibVEX_GuestARM64_get_fpsr(arm); - VG_(transfer) ((UInt*)&fpsr, buf, dir, size, mod); + ULong fpsr64 = LibVEX_GuestARM64_get_fpsr(arm); + UInt fpsr = (UInt)fpsr64; + VG_(transfer) (&fpsr, buf, dir, size, mod); } else { - ULong fpsr = 0; + UInt fpsr; + ULong fpsr64; VG_(transfer) ((UInt*)&fpsr, buf, dir, size, mod); - LibVEX_GuestARM64_set_fpsr(arm, fpsr); + fpsr64 = fpsr; + LibVEX_GuestARM64_set_fpsr(arm, fpsr64); /* resync the cache with the part of fpsr that VEX represents. */ - fpsr = LibVEX_GuestARM64_get_fpsr(arm); - VG_(transfer) ((UInt*)&fpsr, buf, valgrind_to_gdbserver, size, mod); + fpsr64 = LibVEX_GuestARM64_get_fpsr(arm); + fpsr = (UInt)fpsr64; + VG_(transfer) (&fpsr, buf, valgrind_to_gdbserver, size, mod); } break; }