diff --git a/xen/arch/x86/cpu/amd.c b/xen/arch/x86/cpu/amd.c index 1e370185cd..6167f92813 100644 --- a/xen/arch/x86/cpu/amd.c +++ b/xen/arch/x86/cpu/amd.c @@ -11,6 +11,7 @@ #include #include /* amd_init_cpu */ #include +#include #include "cpu.h" @@ -659,6 +660,17 @@ static void __devinit init_amd(struct cpuinfo_x86 *c) if (c->x86 > 0x11) set_bit(X86_FEATURE_ARAT, c->x86_capability); + /* + * Prior to Family 0x14, perf counters are not reset during warm reboot. + * We have to reset them manually. + */ + if (nmi_watchdog != NMI_LOCAL_APIC && c->x86 < 0x14) { + wrmsrl(MSR_K7_PERFCTR0, 0); + wrmsrl(MSR_K7_PERFCTR1, 0); + wrmsrl(MSR_K7_PERFCTR2, 0); + wrmsrl(MSR_K7_PERFCTR3, 0); + } + /* Prevent TSC drift in non single-processor, single-core platforms. */ if ((smp_processor_id() == 1) && c1_ramping_may_cause_clock_drift(c)) disable_c1_ramping();