mirror of git://sourceware.org/git/glibc.git
elf: tst-audit10: split AVX512F code into dedicated functions [BZ #32882]
"Recent" GCC versions (since commit fc62716fe8d1, backported to stable
branches) emit a vzeroupper instruction at the end of functions
containing AVX instructions. This causes the tst-audit10 test to fail
on CPUs lacking AVX instructions, despite the AVX512F check. The crash
occurs in the pltenter function of tst-auditmod10b.c.
Fix that by moving the code guarded by the check_avx512 function into
specific functions using the target ("avx512f") attribute. Note that
since commit 5359c3bc91 ("x86-64: Remove compiler -mavx512f check") it
is safe to assume that the compiler has AVX512F support, thus the
__AVX512F__ checks can be dropped.
Tested on non-AVX, AVX2 and AVX512F machines.
Reviewed-by: Florian Weimer <fweimer@redhat.com>
This commit is contained in:
parent
4e24e4d936
commit
e78caeb4ff
|
|
@ -142,7 +142,6 @@ CFLAGS-tst-avxmod.c += $(AVX-CFLAGS)
|
|||
AVX512-CFLAGS = -mavx512f
|
||||
CFLAGS-tst-audit10-aux.c += $(AVX512-CFLAGS)
|
||||
CFLAGS-tst-auditmod10a.c += $(AVX512-CFLAGS)
|
||||
CFLAGS-tst-auditmod10b.c += $(AVX512-CFLAGS)
|
||||
CFLAGS-tst-avx512-aux.c += $(AVX512-CFLAGS)
|
||||
CFLAGS-tst-avx512mod.c += $(AVX512-CFLAGS)
|
||||
|
||||
|
|
|
|||
|
|
@ -125,7 +125,6 @@ la_symbind64 (Elf64_Sym *sym, unsigned int ndx, uintptr_t *refcook,
|
|||
|
||||
#include <tst-audit.h>
|
||||
|
||||
#ifdef __AVX512F__
|
||||
#include <immintrin.h>
|
||||
#include <cpuid.h>
|
||||
|
||||
|
|
@ -148,9 +147,37 @@ check_avx512 (void)
|
|||
return (eax & 0xe6) == 0xe6;
|
||||
}
|
||||
|
||||
#else
|
||||
#include <emmintrin.h>
|
||||
#endif
|
||||
void
|
||||
__attribute__ ((target ("avx512f")))
|
||||
pltenter_avx512f (La_regs *regs, long int *framesizep)
|
||||
{
|
||||
__m512i zero = _mm512_setzero_si512 ();
|
||||
if (memcmp (®s->lr_vector[0], &zero, sizeof (zero))
|
||||
|| memcmp (®s->lr_vector[1], &zero, sizeof (zero))
|
||||
|| memcmp (®s->lr_vector[2], &zero, sizeof (zero))
|
||||
|| memcmp (®s->lr_vector[3], &zero, sizeof (zero))
|
||||
|| memcmp (®s->lr_vector[4], &zero, sizeof (zero))
|
||||
|| memcmp (®s->lr_vector[5], &zero, sizeof (zero))
|
||||
|| memcmp (®s->lr_vector[6], &zero, sizeof (zero))
|
||||
|| memcmp (®s->lr_vector[7], &zero, sizeof (zero)))
|
||||
abort ();
|
||||
|
||||
for (int i = 0; i < 8; i++)
|
||||
regs->lr_vector[i].zmm[0]
|
||||
= (La_x86_64_zmm) _mm512_set1_epi64 (i + 1);
|
||||
|
||||
__m512i zmm = _mm512_set1_epi64 (-1);
|
||||
asm volatile ("vmovdqa64 %0, %%zmm0" : : "x" (zmm) : "xmm0" );
|
||||
asm volatile ("vmovdqa64 %0, %%zmm1" : : "x" (zmm) : "xmm1" );
|
||||
asm volatile ("vmovdqa64 %0, %%zmm2" : : "x" (zmm) : "xmm2" );
|
||||
asm volatile ("vmovdqa64 %0, %%zmm3" : : "x" (zmm) : "xmm3" );
|
||||
asm volatile ("vmovdqa64 %0, %%zmm4" : : "x" (zmm) : "xmm4" );
|
||||
asm volatile ("vmovdqa64 %0, %%zmm5" : : "x" (zmm) : "xmm5" );
|
||||
asm volatile ("vmovdqa64 %0, %%zmm6" : : "x" (zmm) : "xmm6" );
|
||||
asm volatile ("vmovdqa64 %0, %%zmm7" : : "x" (zmm) : "xmm7" );
|
||||
|
||||
*framesizep = 1024;
|
||||
}
|
||||
|
||||
ElfW(Addr)
|
||||
pltenter (ElfW(Sym) *sym, unsigned int ndx, uintptr_t *refcook,
|
||||
|
|
@ -160,41 +187,35 @@ pltenter (ElfW(Sym) *sym, unsigned int ndx, uintptr_t *refcook,
|
|||
printf ("pltenter: symname=%s, st_value=%#lx, ndx=%u, flags=%u\n",
|
||||
symname, (long int) sym->st_value, ndx, *flags);
|
||||
|
||||
#ifdef __AVX512F__
|
||||
if (check_avx512 () && strcmp (symname, "audit_test") == 0)
|
||||
{
|
||||
__m512i zero = _mm512_setzero_si512 ();
|
||||
if (memcmp (®s->lr_vector[0], &zero, sizeof (zero))
|
||||
|| memcmp (®s->lr_vector[1], &zero, sizeof (zero))
|
||||
|| memcmp (®s->lr_vector[2], &zero, sizeof (zero))
|
||||
|| memcmp (®s->lr_vector[3], &zero, sizeof (zero))
|
||||
|| memcmp (®s->lr_vector[4], &zero, sizeof (zero))
|
||||
|| memcmp (®s->lr_vector[5], &zero, sizeof (zero))
|
||||
|| memcmp (®s->lr_vector[6], &zero, sizeof (zero))
|
||||
|| memcmp (®s->lr_vector[7], &zero, sizeof (zero)))
|
||||
abort ();
|
||||
|
||||
for (int i = 0; i < 8; i++)
|
||||
regs->lr_vector[i].zmm[0]
|
||||
= (La_x86_64_zmm) _mm512_set1_epi64 (i + 1);
|
||||
|
||||
__m512i zmm = _mm512_set1_epi64 (-1);
|
||||
asm volatile ("vmovdqa64 %0, %%zmm0" : : "x" (zmm) : "xmm0" );
|
||||
asm volatile ("vmovdqa64 %0, %%zmm1" : : "x" (zmm) : "xmm1" );
|
||||
asm volatile ("vmovdqa64 %0, %%zmm2" : : "x" (zmm) : "xmm2" );
|
||||
asm volatile ("vmovdqa64 %0, %%zmm3" : : "x" (zmm) : "xmm3" );
|
||||
asm volatile ("vmovdqa64 %0, %%zmm4" : : "x" (zmm) : "xmm4" );
|
||||
asm volatile ("vmovdqa64 %0, %%zmm5" : : "x" (zmm) : "xmm5" );
|
||||
asm volatile ("vmovdqa64 %0, %%zmm6" : : "x" (zmm) : "xmm6" );
|
||||
asm volatile ("vmovdqa64 %0, %%zmm7" : : "x" (zmm) : "xmm7" );
|
||||
|
||||
*framesizep = 1024;
|
||||
}
|
||||
#endif
|
||||
pltenter_avx512f (regs, framesizep);
|
||||
|
||||
return sym->st_value;
|
||||
}
|
||||
|
||||
void
|
||||
__attribute__ ((target ("avx512f")))
|
||||
pltexit_avx512f (const La_regs *inregs, La_retval *outregs)
|
||||
{
|
||||
__m512i zero = _mm512_setzero_si512 ();
|
||||
if (memcmp (&outregs->lrv_vector0, &zero, sizeof (zero)))
|
||||
abort ();
|
||||
|
||||
for (int i = 0; i < 8; i++)
|
||||
{
|
||||
__m512i zmm = _mm512_set1_epi64 (i + 1);
|
||||
if (memcmp (&inregs->lr_vector[i], &zmm, sizeof (zmm)) != 0)
|
||||
abort ();
|
||||
}
|
||||
|
||||
outregs->lrv_vector0.zmm[0]
|
||||
= (La_x86_64_zmm) _mm512_set1_epi64 (0x12349876);
|
||||
|
||||
__m512i zmm = _mm512_set1_epi64 (-1);
|
||||
asm volatile ("vmovdqa64 %0, %%zmm0" : : "x" (zmm) : "xmm0" );
|
||||
asm volatile ("vmovdqa64 %0, %%zmm1" : : "x" (zmm) : "xmm1" );
|
||||
}
|
||||
|
||||
unsigned int
|
||||
pltexit (ElfW(Sym) *sym, unsigned int ndx, uintptr_t *refcook,
|
||||
uintptr_t *defcook, const La_regs *inregs, La_retval *outregs,
|
||||
|
|
@ -204,28 +225,8 @@ pltexit (ElfW(Sym) *sym, unsigned int ndx, uintptr_t *refcook,
|
|||
symname, (long int) sym->st_value, ndx,
|
||||
(ptrdiff_t) outregs->int_retval);
|
||||
|
||||
#ifdef __AVX512F__
|
||||
if (check_avx512 () && strcmp (symname, "audit_test") == 0)
|
||||
{
|
||||
__m512i zero = _mm512_setzero_si512 ();
|
||||
if (memcmp (&outregs->lrv_vector0, &zero, sizeof (zero)))
|
||||
abort ();
|
||||
|
||||
for (int i = 0; i < 8; i++)
|
||||
{
|
||||
__m512i zmm = _mm512_set1_epi64 (i + 1);
|
||||
if (memcmp (&inregs->lr_vector[i], &zmm, sizeof (zmm)) != 0)
|
||||
abort ();
|
||||
}
|
||||
|
||||
outregs->lrv_vector0.zmm[0]
|
||||
= (La_x86_64_zmm) _mm512_set1_epi64 (0x12349876);
|
||||
|
||||
__m512i zmm = _mm512_set1_epi64 (-1);
|
||||
asm volatile ("vmovdqa64 %0, %%zmm0" : : "x" (zmm) : "xmm0" );
|
||||
asm volatile ("vmovdqa64 %0, %%zmm1" : : "x" (zmm) : "xmm1" );
|
||||
}
|
||||
#endif
|
||||
pltexit_avx512f (inregs, outregs);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue