mirror of
https://github.com/Zenithsiz/ftmemsim-valgrind.git
synced 2026-02-03 18:13:01 +00:00
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:
parent
b558bd5888
commit
19bc251432
@ -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:
|
||||
|
||||
@ -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 )
|
||||
|
||||
@ -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. */
|
||||
|
||||
@ -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!
|
||||
//----------------------------------------------------------------------
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user