+ cpuid_register_index_ebx * 8 * sizeof (unsigned int)),
x86_cpu_WBNOINVD = x86_cpu_index_80000008_ebx + 9,
+ x86_cpu_AMD_IBPB = x86_cpu_index_80000008_ebx + 12,
+ x86_cpu_AMD_IBRS = x86_cpu_index_80000008_ebx + 14,
+ x86_cpu_AMD_STIBP = x86_cpu_index_80000008_ebx + 15,
+ x86_cpu_AMD_SSBD = x86_cpu_index_80000008_ebx + 24,
x86_cpu_index_7_ecx_1_eax
= (CPUID_INDEX_7_ECX_1 * 8 * 4 * sizeof (unsigned int)
/* EBX. */
#define bit_cpu_WBNOINVD (1u << 9)
+#define bit_cpu_AMD_IBPB (1u << 12)
+#define bit_cpu_AMD_IBRS (1u << 14)
+#define bit_cpu_AMD_STIBP (1u << 15)
+#define bit_cpu_AMD_SSBD (1u << 24)
/* CPUID_INDEX_7_ECX_1. */
/* EBX. */
#define index_cpu_WBNOINVD CPUID_INDEX_80000008
+#define index_cpu_AMD_IBPB CPUID_INDEX_80000008
+#define index_cpu_AMD_IBRS CPUID_INDEX_80000008
+#define index_cpu_AMD_STIBP CPUID_INDEX_80000008
+#define index_cpu_AMD_SSBD CPUID_INDEX_80000008
/* CPUID_INDEX_7_ECX_1. */
/* EBX. */
#define reg_WBNOINVD ebx
+#define reg_AMD_IBPB ebx
+#define reg_AMD_IBRS ebx
+#define reg_AMD_STIBP ebx
+#define reg_AMD_SSBD ebx
/* CPUID_INDEX_7_ECX_1. */
License along with the GNU C Library; if not, see
<https://www.gnu.org/licenses/>. */
-#include <sys/platform/x86.h>
+#include <cpu-features.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <stdbool.h>
static char *cpu_flags;
do_test (int argc, char **argv)
{
int fails = 0;
+ const struct cpu_features *cpu_features = __get_cpu_features ();
get_cpuinfo ();
fails += CHECK_PROC (acpi, ACPI);
fails += CHECK_PROC (hle, HLE);
fails += CHECK_PROC (ht, HTT);
fails += CHECK_PROC (hybrid, HYBRID);
- fails += CHECK_PROC (ibrs, IBRS_IBPB);
+ if (cpu_features->basic.kind == arch_kind_intel)
+ {
+ fails += CHECK_PROC (ibrs, IBRS_IBPB);
+ fails += CHECK_PROC (stibp, STIBP);
+ }
+ else if (cpu_features->basic.kind == arch_kind_amd)
+ {
+ fails += CHECK_PROC (ibpb, AMD_IBPB);
+ fails += CHECK_PROC (ibrs, AMD_IBRS);
+ fails += CHECK_PROC (stibp, AMD_STIBP);
+ }
fails += CHECK_PROC (ibt, IBT);
fails += CHECK_PROC (invariant_tsc, INVARIANT_TSC);
fails += CHECK_PROC (invpcid, INVPCID);
fails += CHECK_PROC (smep, SMEP);
fails += CHECK_PROC (smx, SMX);
fails += CHECK_PROC (ss, SS);
- fails += CHECK_PROC (ssbd, SSBD);
+ if (cpu_features->basic.kind == arch_kind_intel)
+ fails += CHECK_PROC (ssbd, SSBD);
+ else if (cpu_features->basic.kind == arch_kind_amd)
+ fails += CHECK_PROC (ssbd, AMD_SSBD);
fails += CHECK_PROC (sse, SSE);
fails += CHECK_PROC (sse2, SSE2);
fails += CHECK_PROC (pni, SSE3);
fails += CHECK_PROC (sse4_2, SSE4_2);
fails += CHECK_PROC (sse4a, SSE4A);
fails += CHECK_PROC (ssse3, SSSE3);
- fails += CHECK_PROC (stibp, STIBP);
fails += CHECK_PROC (svm, SVM);
#ifdef __x86_64__
/* NB: SYSCALL_SYSRET is 64-bit only. */