summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHans Rosenfeld <hans.rosenfeld@nexenta.com>2013-06-19 13:34:25 -0400
committerDan McDonald <danmcd@nexenta.com>2013-06-19 13:59:03 -0400
commit850ad55a82ec00d2ba0cb55e5c30e49baafd4b2d (patch)
tree30236f37ee7d167cea5b0da04a24d0328f77cd40
parent57c8f7a2c8d574d26d069069ece6f024828ee647 (diff)
downloadillumos-joyent-850ad55a82ec00d2ba0cb55e5c30e49baafd4b2d.tar.gz
3832 AMD E721 workaround panics on KVM
Reviewed by: Marcel Telka <marcel@telka.sk> Reviewed by: Robert Mustacchi <rm@joyent.com> Approved by: Dan McDonald <danmcd@nexenta.com>
-rw-r--r--usr/src/uts/i86pc/os/mp_startup.c10
1 files changed, 9 insertions, 1 deletions
diff --git a/usr/src/uts/i86pc/os/mp_startup.c b/usr/src/uts/i86pc/os/mp_startup.c
index f4289939fe..c6e8e4b229 100644
--- a/usr/src/uts/i86pc/os/mp_startup.c
+++ b/usr/src/uts/i86pc/os/mp_startup.c
@@ -28,6 +28,7 @@
*/
/*
* Copyright (c) 2012, Joyent, Inc. All rights reserved.
+ * Copyright 2013 Nexenta Systems, Inc. All rights reserved.
*/
#include <sys/types.h>
@@ -77,6 +78,7 @@
#include <sys/hypervisor.h>
#endif
#include <sys/cpu_module.h>
+#include <sys/ontrap.h>
struct cpu cpus[1]; /* CPU data */
struct cpu *cpu[NCPU] = {&cpus[0]}; /* pointers to all CPUs */
@@ -1186,7 +1188,13 @@ workaround_errata(struct cpu *cpu)
if (cpuid_opteron_erratum(cpu, 721) > 0) {
#if defined(OPTERON_ERRATUM_721)
- wrmsr(MSR_AMD_DE_CFG, rdmsr(MSR_AMD_DE_CFG) | AMD_DE_CFG_E721);
+ on_trap_data_t otd;
+
+ if (!on_trap(&otd, OT_DATA_ACCESS))
+ wrmsr(MSR_AMD_DE_CFG,
+ rdmsr(MSR_AMD_DE_CFG) | AMD_DE_CFG_E721);
+ no_trap();
+
opteron_erratum_721++;
#else
workaround_warning(cpu, 721);