1 /* Copyright (C) 2012-2016 Free Software Foundation, Inc.
2 This file is part of the GNU C Library.
4 The GNU C Library is free software; you can redistribute it and/or
5 modify it under the terms of the GNU Lesser General Public
6 License as published by the Free Software Foundation; either
7 version 2.1 of the License, or (at your option) any later version.
9 The GNU C Library is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 Lesser General Public License for more details.
14 You should have received a copy of the GNU Lesser General Public
15 License along with the GNU C Library; if not, see
16 <http://www.gnu.org/licenses/>. */
18 /* Verify that changing AVX512 registers in audit library won't affect
19 function parameter passing/return. */
27 #include <bits/wordsize.h>
28 #include <gnu/lib-names.h>
31 la_version (unsigned int v
)
35 printf ("version: %u\n", v
);
38 sprintf (buf
, "%u", v
);
44 la_activity (uintptr_t *cookie
, unsigned int flag
)
46 if (flag
== LA_ACT_CONSISTENT
)
47 printf ("activity: consistent\n");
48 else if (flag
== LA_ACT_ADD
)
49 printf ("activity: add\n");
50 else if (flag
== LA_ACT_DELETE
)
51 printf ("activity: delete\n");
53 printf ("activity: unknown activity %u\n", flag
);
57 la_objsearch (const char *name
, uintptr_t *cookie
, unsigned int flag
)
61 if (flag
== LA_SER_ORIG
)
62 flagstr
= "LA_SET_ORIG";
63 else if (flag
== LA_SER_LIBPATH
)
64 flagstr
= "LA_SER_LIBPATH";
65 else if (flag
== LA_SER_RUNPATH
)
66 flagstr
= "LA_SER_RUNPATH";
67 else if (flag
== LA_SER_CONFIG
)
68 flagstr
= "LA_SER_CONFIG";
69 else if (flag
== LA_SER_DEFAULT
)
70 flagstr
= "LA_SER_DEFAULT";
71 else if (flag
== LA_SER_SECURE
)
72 flagstr
= "LA_SER_SECURE";
75 sprintf (buf
, "unknown flag %d", flag
);
78 printf ("objsearch: %s, %s\n", name
, flagstr
);
84 la_objopen (struct link_map
*l
, Lmid_t lmid
, uintptr_t *cookie
)
86 printf ("objopen: %ld, %s\n", lmid
, l
->l_name
);
92 la_preinit (uintptr_t *cookie
)
98 la_objclose (uintptr_t *cookie
)
100 printf ("objclose\n");
105 la_symbind32 (Elf32_Sym
*sym
, unsigned int ndx
, uintptr_t *refcook
,
106 uintptr_t *defcook
, unsigned int *flags
, const char *symname
)
108 printf ("symbind32: symname=%s, st_value=%#lx, ndx=%u, flags=%u\n",
109 symname
, (long int) sym
->st_value
, ndx
, *flags
);
111 return sym
->st_value
;
115 la_symbind64 (Elf64_Sym
*sym
, unsigned int ndx
, uintptr_t *refcook
,
116 uintptr_t *defcook
, unsigned int *flags
, const char *symname
)
118 printf ("symbind64: symname=%s, st_value=%#lx, ndx=%u, flags=%u\n",
119 symname
, (long int) sym
->st_value
, ndx
, *flags
);
121 return sym
->st_value
;
124 #include <tst-audit.h>
127 #include <immintrin.h>
133 unsigned int eax
, ebx
, ecx
, edx
;
135 if (__get_cpuid (1, &eax
, &ebx
, &ecx
, &edx
) == 0
136 || (ecx
& (bit_AVX
| bit_OSXSAVE
)) != (bit_AVX
| bit_OSXSAVE
))
139 __cpuid_count (7, 0, eax
, ebx
, ecx
, edx
);
140 if (!(ebx
& bit_AVX512F
))
143 asm ("xgetbv" : "=a" (eax
), "=d" (edx
) : "c" (0));
145 /* Verify that ZMM, YMM and XMM states are enabled. */
146 return (eax
& 0xe6) == 0xe6;
150 #include <emmintrin.h>
154 pltenter (ElfW(Sym
) *sym
, unsigned int ndx
, uintptr_t *refcook
,
155 uintptr_t *defcook
, La_regs
*regs
, unsigned int *flags
,
156 const char *symname
, long int *framesizep
)
158 printf ("pltenter: symname=%s, st_value=%#lx, ndx=%u, flags=%u\n",
159 symname
, (long int) sym
->st_value
, ndx
, *flags
);
162 if (check_avx512 () && strcmp (symname
, "audit_test") == 0)
164 __m512i zero
= _mm512_setzero_si512 ();
165 if (memcmp (®s
->lr_vector
[0], &zero
, sizeof (zero
))
166 || memcmp (®s
->lr_vector
[1], &zero
, sizeof (zero
))
167 || memcmp (®s
->lr_vector
[2], &zero
, sizeof (zero
))
168 || memcmp (®s
->lr_vector
[3], &zero
, sizeof (zero
))
169 || memcmp (®s
->lr_vector
[4], &zero
, sizeof (zero
))
170 || memcmp (®s
->lr_vector
[5], &zero
, sizeof (zero
))
171 || memcmp (®s
->lr_vector
[6], &zero
, sizeof (zero
))
172 || memcmp (®s
->lr_vector
[7], &zero
, sizeof (zero
)))
175 for (int i
= 0; i
< 8; i
++)
176 regs
->lr_vector
[i
].zmm
[0]
177 = (La_x86_64_zmm
) _mm512_set1_epi64 (i
+ 1);
179 __m512i zmm
= _mm512_set1_epi64 (-1);
180 asm volatile ("vmovdqa64 %0, %%zmm0" : : "x" (zmm
) : "xmm0" );
181 asm volatile ("vmovdqa64 %0, %%zmm1" : : "x" (zmm
) : "xmm1" );
182 asm volatile ("vmovdqa64 %0, %%zmm2" : : "x" (zmm
) : "xmm2" );
183 asm volatile ("vmovdqa64 %0, %%zmm3" : : "x" (zmm
) : "xmm3" );
184 asm volatile ("vmovdqa64 %0, %%zmm4" : : "x" (zmm
) : "xmm4" );
185 asm volatile ("vmovdqa64 %0, %%zmm5" : : "x" (zmm
) : "xmm5" );
186 asm volatile ("vmovdqa64 %0, %%zmm6" : : "x" (zmm
) : "xmm6" );
187 asm volatile ("vmovdqa64 %0, %%zmm7" : : "x" (zmm
) : "xmm7" );
193 return sym
->st_value
;
197 pltexit (ElfW(Sym
) *sym
, unsigned int ndx
, uintptr_t *refcook
,
198 uintptr_t *defcook
, const La_regs
*inregs
, La_retval
*outregs
,
201 printf ("pltexit: symname=%s, st_value=%#lx, ndx=%u, retval=%tu\n",
202 symname
, (long int) sym
->st_value
, ndx
,
203 (ptrdiff_t) outregs
->int_retval
);
206 if (check_avx512 () && strcmp (symname
, "audit_test") == 0)
208 __m512i zero
= _mm512_setzero_si512 ();
209 if (memcmp (&outregs
->lrv_vector0
, &zero
, sizeof (zero
)))
212 for (int i
= 0; i
< 8; i
++)
214 __m512i zmm
= _mm512_set1_epi64 (i
+ 1);
215 if (memcmp (&inregs
->lr_vector
[i
], &zmm
, sizeof (zmm
)) != 0)
219 outregs
->lrv_vector0
.zmm
[0]
220 = (La_x86_64_zmm
) _mm512_set1_epi64 (0x12349876);
222 __m512i zmm
= _mm512_set1_epi64 (-1);
223 asm volatile ("vmovdqa64 %0, %%zmm0" : : "x" (zmm
) : "xmm0" );
224 asm volatile ("vmovdqa64 %0, %%zmm1" : : "x" (zmm
) : "xmm1" );