arm-linux: determine whether the host supports Neon by looking at our

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
This commit is contained in:
Julian Seward 2010-09-09 07:25:58 +00:00
parent b558bd5888
commit 19bc251432
4 changed files with 39 additions and 0 deletions

View 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:

View 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 )

View 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. */

View 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!
//----------------------------------------------------------------------