Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 7 May 2014 16:28:37 +0000 (UTC)
From:      Alan Cox <alc@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-8@freebsd.org
Subject:   svn commit: r265556 - in stable/8/sys: amd64/amd64 i386/i386
Message-ID:  <201405071628.s47GSbQn061640@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: alc
Date: Wed May  7 16:28:36 2014
New Revision: 265556
URL: http://svnweb.freebsd.org/changeset/base/265556

Log:
  MFC r262338
    When the kernel is running in a virtual machine, it cannot rely upon the
    processor family to determine if the workaround for AMD Family 10h Erratum
    383 should be enabled.  To enable virtual machine migration among a
    heterogeneous collection of physical machines, the hypervisor may have
    been configured to report an older processor family with a reduced feature
    set.  Effectively, the reported processor family and its features are like
    a "least common denominator" for the collection of machines.
  
    Therefore, when the kernel is running in a virtual machine, instead of
    relying upon the processor family, we now test for features that prove
    that the underlying processor is not affected by the erratum.  (The
    features that we test for are unlikely to ever be emulated in software
    on an affected physical processor.)
  
  PR:		186061

Modified:
  stable/8/sys/amd64/amd64/pmap.c
  stable/8/sys/i386/i386/pmap.c
Directory Properties:
  stable/8/sys/   (props changed)
  stable/8/sys/amd64/   (props changed)
  stable/8/sys/i386/   (props changed)

Modified: stable/8/sys/amd64/amd64/pmap.c
==============================================================================
--- stable/8/sys/amd64/amd64/pmap.c	Wed May  7 16:16:49 2014	(r265555)
+++ stable/8/sys/amd64/amd64/pmap.c	Wed May  7 16:28:36 2014	(r265556)
@@ -706,12 +706,18 @@ pmap_init(void)
 	}
 
 	/*
-	 * If the kernel is running in a virtual machine on an AMD Family 10h
-	 * processor, then it must assume that MCA is enabled by the virtual
-	 * machine monitor.
-	 */
-	if (vm_guest == VM_GUEST_VM && cpu_vendor_id == CPU_VENDOR_AMD &&
-	    CPUID_TO_FAMILY(cpu_id) == 0x10)
+	 * If the kernel is running on a virtual machine, then it must assume
+	 * that MCA is enabled by the hypervisor.  Moreover, the kernel must
+	 * be prepared for the hypervisor changing the vendor and family that
+	 * are reported by CPUID.  Consequently, the workaround for AMD Family
+	 * 10h Erratum 383 is enabled if the processor's feature set does not
+	 * include at least one feature that is only supported by older Intel
+	 * or newer AMD processors.
+	 */
+	if (vm_guest == VM_GUEST_VM && (cpu_feature & CPUID_SS) == 0 &&
+	    (cpu_feature2 & (CPUID2_SSSE3 | CPUID2_SSE41 | CPUID2_AESNI |
+	    CPUID2_AVX | CPUID2_XSAVE)) == 0 && (amd_feature2 & (AMDID2_XOP |
+	    AMDID2_FMA4)) == 0)
 		workaround_erratum383 = 1;
 
 	/*

Modified: stable/8/sys/i386/i386/pmap.c
==============================================================================
--- stable/8/sys/i386/i386/pmap.c	Wed May  7 16:16:49 2014	(r265555)
+++ stable/8/sys/i386/i386/pmap.c	Wed May  7 16:28:36 2014	(r265556)
@@ -757,12 +757,18 @@ pmap_init(void)
 	pv_entry_high_water = 9 * (pv_entry_max / 10);
 
 	/*
-	 * If the kernel is running in a virtual machine on an AMD Family 10h
-	 * processor, then it must assume that MCA is enabled by the virtual
-	 * machine monitor.
-	 */
-	if (vm_guest == VM_GUEST_VM && cpu_vendor_id == CPU_VENDOR_AMD &&
-	    CPUID_TO_FAMILY(cpu_id) == 0x10)
+	 * If the kernel is running on a virtual machine, then it must assume
+	 * that MCA is enabled by the hypervisor.  Moreover, the kernel must
+	 * be prepared for the hypervisor changing the vendor and family that
+	 * are reported by CPUID.  Consequently, the workaround for AMD Family
+	 * 10h Erratum 383 is enabled if the processor's feature set does not
+	 * include at least one feature that is only supported by older Intel
+	 * or newer AMD processors.
+	 */
+	if (vm_guest == VM_GUEST_VM && (cpu_feature & CPUID_SS) == 0 &&
+	    (cpu_feature2 & (CPUID2_SSSE3 | CPUID2_SSE41 | CPUID2_AESNI |
+	    CPUID2_AVX | CPUID2_XSAVE)) == 0 && (amd_feature2 & (AMDID2_XOP |
+	    AMDID2_FMA4)) == 0)
 		workaround_erratum383 = 1;
 
 	/*



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201405071628.s47GSbQn061640>