]> xenbits.xensource.com Git - xen.git/commitdiff
x86/AMD: apply erratum 665 workaround
authorEmanuel Czirai <icanrealizeum@gmail.com>
Mon, 26 Sep 2016 15:28:09 +0000 (17:28 +0200)
committerJan Beulich <jbeulich@suse.com>
Mon, 26 Sep 2016 15:28:09 +0000 (17:28 +0200)
AMD F12h machines have an erratum which can cause DIV/IDIV to behave
unpredictably. The workaround is to set MSRC001_1029[31] but sometimes
there is no BIOS update containing that workaround so let's do it
ourselves unconditionally. It is simple enough.

[ Borislav: Wrote commit message. ]

Signed-off-by: Emanuel Czirai <icanrealizeum@gmail.com>
Signed-off-by: Borislav Petkov <bp@suse.de>
[Linux commit: d1992996753132e2dafe955cccb2fb0714d3cfc4]

Make applicable to Xen.

Signed-off-by: Jan Beulich <jbeulich@suse.com>
Reviewed-by: Andrew Cooper <andrew.cooper3@citrix.com>
xen/arch/x86/cpu/amd.c
xen/include/asm-x86/msr-index.h

index 23175469996541992b4d3bb5fc88db568bfed129..4ff0b54629c55f22f73248737a938b3be9e8ac83 100644 (file)
@@ -661,6 +661,18 @@ static void init_amd(struct cpuinfo_x86 *c)
                                       smp_processor_id());
                        wrmsrl(MSR_AMD64_LS_CFG, value | (1 << 15));
                }
+       } else if (c->x86 == 0x12) {
+               rdmsrl(MSR_AMD64_DE_CFG, value);
+               if (!(value & (1U << 31))) {
+                       static bool warned;
+
+                       if (c == &boot_cpu_data || opt_cpu_info ||
+                           !test_and_set_bool(warned))
+                               printk(KERN_WARNING
+                                      "CPU%u: Applying workaround for erratum 665\n",
+                                      smp_processor_id());
+                       wrmsrl(MSR_AMD64_DE_CFG, value | (1U << 31));
+               }
        }
 
        /* AMD CPUs do not support SYSENTER outside of legacy mode. */
index deb82a771c1d9d451d306e3ea71761ceb6ead7e8..98dbff13375c6c740a9bae5c142e7e18ec13c23b 100644 (file)
 
 /* AMD64 MSRs */
 #define MSR_AMD64_NB_CFG               0xc001001f
+#define AMD64_NB_CFG_CF8_EXT_ENABLE_BIT        46
 #define MSR_AMD64_LS_CFG               0xc0011020
 #define MSR_AMD64_IC_CFG               0xc0011021
 #define MSR_AMD64_DC_CFG               0xc0011022
-#define AMD64_NB_CFG_CF8_EXT_ENABLE_BIT        46
+#define MSR_AMD64_DE_CFG               0xc0011029
 
 #define MSR_AMD64_DR0_ADDRESS_MASK     0xc0011027
 #define MSR_AMD64_DR1_ADDRESS_MASK     0xc0011019