amd64/186061: FreeBSD 10 crashes as KVM guest on GNU/Linux on AMD family 10h CPUs

Simon Matter simon.matter at invoca.ch
Thu Feb 6 11:00:02 UTC 2014


The following reply was made to PR amd64/186061; it has been noted by GNATS.

From: "Simon Matter" <simon.matter at invoca.ch>
To: bug-followup at FreeBSD.org
Cc: simon.matter at invoca.ch
Subject: Re: amd64/186061: FreeBSD 10 crashes as KVM guest on GNU/Linux on
 AMD family 10h CPUs
Date: Thu, 6 Feb 2014 11:46:41 +0100

 ------=_20140206114641_95473
 Content-Type: text/plain; charset="iso-8859-1"
 Content-Transfer-Encoding: 8bit
 
 Hi,
 
 After thinking about it again it seems the proposed solution may not be
 enough. At least KVM allows to migrate guests from an Intel to an AMD
 processor. That means in case of running as a vm guest, it's required to
 always enable "AMD Erratum 383" workaround. Otherwise, after migration to
 an affected AMD Family 10h processor, the guest could triggered AMD
 Erratum 383.
 
 I've tried to implement this and attached patch fixes the problem for me.
 Would me nice if someone with more experience than me could have a look at
 it.
 
 Thanks,
 Simon
 ------=_20140206114641_95473
 Content-Type: text/x-diff; name="vm-erratum383.patch"
 Content-Transfer-Encoding: 8bit
 Content-Disposition: attachment; filename="vm-erratum383.patch"
 
 --- /usr/src/sys/x86/x86/mca.c.orig	2014-01-16 21:35:03.000000000 +0100
 +++ /usr/src/sys/x86/x86/mca.c	2014-02-05 22:15:53.109619475 +0100
 @@ -720,8 +720,8 @@
  	 * parity (L1TP) errors is disabled, enable the recommended workaround
  	 * for Erratum 383.
  	 */
 -	if (cpu_vendor_id == CPU_VENDOR_AMD &&
 -	    CPUID_TO_FAMILY(cpu_id) == 0x10 && amd10h_L1TP)
 +	if (vm_guest != VM_GUEST_NO || (cpu_vendor_id == CPU_VENDOR_AMD &&
 +	    CPUID_TO_FAMILY(cpu_id) == 0x10 && amd10h_L1TP))
  		workaround_erratum383 = 1;
  
  	mca_banks = mcg_cap & MCG_CAP_COUNT;
 --- /usr/src/sys/i386/i386/pmap.c.orig	2014-01-16 21:33:36.000000000 +0100
 +++ /usr/src/sys/i386/i386/pmap.c	2014-02-05 22:25:28.395821316 +0100
 @@ -752,12 +752,12 @@
  	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 the kernel is running in a virtual machine on any processor
 +	 * family, then it must assume that MCA is enabled by the virtual
 +	 * machine monitor and the vm may migrate to an AMD Family 10h
 +	 * processor.
  	 */
 -	if (vm_guest == VM_GUEST_VM && cpu_vendor_id == CPU_VENDOR_AMD &&
 -	    CPUID_TO_FAMILY(cpu_id) == 0x10)
 +	if (vm_guest != VM_GUEST_NO)
  		workaround_erratum383 = 1;
  
  	/*
 --- /usr/src/sys/amd64/amd64/pmap.c.orig	2014-01-16 21:33:04.000000000 +0100
 +++ /usr/src/sys/amd64/amd64/pmap.c	2014-02-05 22:28:25.814349113 +0100
 @@ -1005,12 +1005,12 @@
  	}
  
  	/*
 -	 * 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 the kernel is running in a virtual machine on any processor
 +	 * family, then it must assume that MCA is enabled by the virtual
 +	 * machine monitor and the vm may migrate to an AMD Family 10h
 +	 * processor.
  	 */
 -	if (vm_guest == VM_GUEST_VM && cpu_vendor_id == CPU_VENDOR_AMD &&
 -	    CPUID_TO_FAMILY(cpu_id) == 0x10)
 +	if (vm_guest != VM_GUEST_NO)
  		workaround_erratum383 = 1;
  
  	/*
 ------=_20140206114641_95473--
 
 


More information about the freebsd-amd64 mailing list