Fix nptl/tst-setuid3.c
[glibc.git] / sysdeps / x86_64 / tst-auditmod10b.c
blobad6fcafddacb9d4823c0b3c18674ca1cbabd4452
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. */
21 #include <dlfcn.h>
22 #include <stdint.h>
23 #include <stdio.h>
24 #include <stdlib.h>
25 #include <string.h>
26 #include <unistd.h>
27 #include <bits/wordsize.h>
28 #include <gnu/lib-names.h>
30 unsigned int
31 la_version (unsigned int v)
33 setlinebuf (stdout);
35 printf ("version: %u\n", v);
37 char buf[20];
38 sprintf (buf, "%u", v);
40 return v;
43 void
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");
52 else
53 printf ("activity: unknown activity %u\n", flag);
56 char *
57 la_objsearch (const char *name, uintptr_t *cookie, unsigned int flag)
59 char buf[100];
60 const char *flagstr;
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";
73 else
75 sprintf (buf, "unknown flag %d", flag);
76 flagstr = buf;
78 printf ("objsearch: %s, %s\n", name, flagstr);
80 return (char *) name;
83 unsigned int
84 la_objopen (struct link_map *l, Lmid_t lmid, uintptr_t *cookie)
86 printf ("objopen: %ld, %s\n", lmid, l->l_name);
88 return 3;
91 void
92 la_preinit (uintptr_t *cookie)
94 printf ("preinit\n");
97 unsigned int
98 la_objclose (uintptr_t *cookie)
100 printf ("objclose\n");
101 return 0;
104 uintptr_t
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;
114 uintptr_t
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>
126 #ifdef __AVX512F__
127 #include <immintrin.h>
128 #include <cpuid.h>
130 static int
131 check_avx512 (void)
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))
137 return 0;
139 __cpuid_count (7, 0, eax, ebx, ecx, edx);
140 if (!(ebx & bit_AVX512F))
141 return 0;
143 asm ("xgetbv" : "=a" (eax), "=d" (edx) : "c" (0));
145 /* Verify that ZMM, YMM and XMM states are enabled. */
146 return (eax & 0xe6) == 0xe6;
149 #else
150 #include <emmintrin.h>
151 #endif
153 ElfW(Addr)
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);
161 #ifdef __AVX512F__
162 if (check_avx512 () && strcmp (symname, "audit_test") == 0)
164 __m512i zero = _mm512_setzero_si512 ();
165 if (memcmp (&regs->lr_vector[0], &zero, sizeof (zero))
166 || memcmp (&regs->lr_vector[1], &zero, sizeof (zero))
167 || memcmp (&regs->lr_vector[2], &zero, sizeof (zero))
168 || memcmp (&regs->lr_vector[3], &zero, sizeof (zero))
169 || memcmp (&regs->lr_vector[4], &zero, sizeof (zero))
170 || memcmp (&regs->lr_vector[5], &zero, sizeof (zero))
171 || memcmp (&regs->lr_vector[6], &zero, sizeof (zero))
172 || memcmp (&regs->lr_vector[7], &zero, sizeof (zero)))
173 abort ();
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" );
189 *framesizep = 1024;
191 #endif
193 return sym->st_value;
196 unsigned int
197 pltexit (ElfW(Sym) *sym, unsigned int ndx, uintptr_t *refcook,
198 uintptr_t *defcook, const La_regs *inregs, La_retval *outregs,
199 const char *symname)
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);
205 #ifdef __AVX512F__
206 if (check_avx512 () && strcmp (symname, "audit_test") == 0)
208 __m512i zero = _mm512_setzero_si512 ();
209 if (memcmp (&outregs->lrv_vector0, &zero, sizeof (zero)))
210 abort ();
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)
216 abort ();
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" );
226 #endif
228 return 0;