]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
arm-linux: determine whether the host supports Neon by looking at our
authorJulian Seward <jseward@acm.org>
Thu, 9 Sep 2010 07:25:58 +0000 (07:25 +0000)
committerJulian Seward <jseward@acm.org>
Thu, 9 Sep 2010 07:25:58 +0000 (07:25 +0000)
AUXV at startup, rather than by trying to execute a Neon instruction
and seeing whether it SIGILLs.  Apparently the latter is not a
reliable way to ascertain the presence of usable Neon support.  Fixes
#249775.

git-svn-id: svn://svn.valgrind.org/valgrind/trunk@11347

coregrind/m_initimg/initimg-linux.c
coregrind/m_machine.c
coregrind/pub_core_machine.h
include/vki/vki-arm-linux.h

index 19535039d8e8b53859ba68dd22013e23b303d1f8..ad7dedd213ec03fe10b26a9dff1fe624226d5377 100644 (file)
@@ -672,6 +672,14 @@ Addr setup_client_stack( void*  init_sp,
             break;
 
          case AT_HWCAP:
+#           if defined(VGP_arm_linux)
+            { Bool has_neon = (auxv->u.a_val & VKI_HWCAP_NEON) > 0;
+              VG_(debugLog)(2, "initimg",
+                               "ARM has-neon from-auxv: %s\n",
+                               has_neon ? "YES" : "NO");
+              VG_(machine_arm_set_has_NEON)( has_neon );
+            }
+#           endif
             break;
 
          case AT_DCACHEBSIZE:
index fdd2ce8030c44e256810a6ac47ca544eb6299819..5f3bc927b9438050221e66ad1ee8b9772e78b1b9 100644 (file)
@@ -983,6 +983,22 @@ void VG_(machine_ppc64_set_clszB)( Int szB )
 #endif
 
 
+/* Notify host's ability to handle NEON instructions. */
+#if defined(VGA_arm)
+void VG_(machine_arm_set_has_NEON)( Bool has_neon )
+{
+   vg_assert(hwcaps_done);
+   /* There's nothing else we can sanity check. */
+
+   if (has_neon) {
+      vai.hwcaps |= VEX_HWCAPS_ARM_NEON;
+   } else {
+      vai.hwcaps &= ~VEX_HWCAPS_ARM_NEON;
+   }
+}
+#endif
+
+
 /* Fetch host cpu info, once established. */
 void VG_(machine_get_VexArchInfo)( /*OUT*/VexArch* pVa,
                                    /*OUT*/VexArchInfo* pVai )
index 91d048aabbd31404e7226350db86f3df32a1326c..ea32dc83d09862ba97217c5a1efd0e7664b2bf54 100644 (file)
@@ -158,6 +158,11 @@ void VG_(get_UnwindStartRegs) ( /*OUT*/UnwindStartRegs* regs,
 
           then safe to use VG_(machine_get_VexArchInfo) 
                        and VG_(machine_ppc64_has_VMX)
+   -------------
+   arm:   initially:  call VG_(machine_get_hwcaps)
+                      call VG_(machine_arm_set_has_NEON)
+
+          then safe to use VG_(machine_get_VexArchInfo) 
 
    VG_(machine_get_hwcaps) may use signals (although it attempts to
    leave signal state unchanged) and therefore should only be
@@ -182,6 +187,10 @@ extern void VG_(machine_ppc32_set_clszB)( Int );
 extern void VG_(machine_ppc64_set_clszB)( Int );
 #endif
 
+#if defined(VGA_arm)
+extern void VG_(machine_arm_set_has_NEON)( Bool );
+#endif
+
 /* X86: set to 1 if the host is able to do {ld,st}mxcsr (load/store
    the SSE control/status register), else zero.  Is referenced from
    assembly code, so do not change from a 32-bit int. */
index 65da4e037752a7d45e35354160d7472ee4325c94..9e6ff1ea7223a7bdae94eeb16367e36bceffbe59 100644 (file)
@@ -871,6 +871,12 @@ struct vki_vm86plus_struct {
        struct vki_vm86plus_info_struct vm86plus;
 };
 
+//----------------------------------------------------------------------
+// From linux-2.6.35.4/arch/arm/include/asm/hwcap.h
+//----------------------------------------------------------------------
+
+#define VKI_HWCAP_NEON      4096
+
 //----------------------------------------------------------------------
 // And that's it!
 //----------------------------------------------------------------------