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