-From 77b1ab1732feb5e3dcbaf31d2f7547c5229f5f3a Mon Sep 17 00:00:00 2001
+From joerg.roedel@amd.com Mon Oct 12 12:11:35 2009
From: Joerg Roedel <joerg.roedel@amd.com>
-Date: Wed, 16 Sep 2009 15:24:17 +0200
+Date: Mon, 12 Oct 2009 11:41:51 +0200
Subject: KVM: SVM: Fix tsc offset adjustment when running nested
+To: Stefan Lippers-Hollmann <s.L-H@gmx.de>
+Cc: stable@kernel.org, gregkh@suse.de, linux-kernel@vger.kernel.org, mtosatti@redhat.com
+Message-ID: <20091012094151.GA32228@amd.com>
+Content-Disposition: inline
+
From: Joerg Roedel <joerg.roedel@amd.com>
delta = vcpu->arch.host_tsc - tsc_this;
svm->vmcb->control.tsc_offset += delta;
+ if (is_nested(svm))
-+ svm->nested.hsave->control.tsc_offset += delta;
++ svm->hsave->control.tsc_offset += delta;
vcpu->cpu = cpu;
kvm_migrate_timers(vcpu);
svm->asid_generation = 0;
--- /dev/null
+From joerg.roedel@amd.com Mon Oct 12 12:15:03 2009
+From: Joerg Roedel <joerg.roedel@amd.com>
+Date: Mon, 12 Oct 2009 11:42:44 +0200
+Subject: KVM: SVM: Handle tsc in svm_get_msr/svm_set_msr correctly
+To: Greg KH <greg@kroah.com>
+Cc: Marcelo Tosatti <mtosatti@redhat.com>, stable@kernel.org
+Message-ID: <20091012094244.GB32228@amd.com>
+Content-Disposition: inline
+
+
+From: Joerg Roedel <joerg.roedel@amd.com>
+
+commit 20824f30bb0b8ae0a4099895fd4509f54cf2e1e2 upstream.
+
+When running nested we need to touch the l1 guests
+tsc_offset. Otherwise changes will be lost or a wrong value
+be read.
+
+Signed-off-by: Joerg Roedel <joerg.roedel@amd.com>
+Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ arch/x86/kvm/svm.c | 23 +++++++++++++++++------
+ 1 file changed, 17 insertions(+), 6 deletions(-)
+
+--- a/arch/x86/kvm/svm.c
++++ b/arch/x86/kvm/svm.c
+@@ -1956,10 +1956,14 @@ static int svm_get_msr(struct kvm_vcpu *
+
+ switch (ecx) {
+ case MSR_IA32_TIME_STAMP_COUNTER: {
+- u64 tsc;
++ u64 tsc_offset;
+
+- rdtscll(tsc);
+- *data = svm->vmcb->control.tsc_offset + tsc;
++ if (is_nested(svm))
++ tsc_offset = svm->hsave->control.tsc_offset;
++ else
++ tsc_offset = svm->vmcb->control.tsc_offset;
++
++ *data = tsc_offset + native_read_tsc();
+ break;
+ }
+ case MSR_K6_STAR:
+@@ -2046,10 +2050,17 @@ static int svm_set_msr(struct kvm_vcpu *
+
+ switch (ecx) {
+ case MSR_IA32_TIME_STAMP_COUNTER: {
+- u64 tsc;
++ u64 tsc_offset = data - native_read_tsc();
++ u64 g_tsc_offset = 0;
++
++ if (is_nested(svm)) {
++ g_tsc_offset = svm->vmcb->control.tsc_offset -
++ svm->hsave->control.tsc_offset;
++ svm->hsave->control.tsc_offset = tsc_offset;
++ }
++
++ svm->vmcb->control.tsc_offset = tsc_offset + g_tsc_offset;
+
+- rdtscll(tsc);
+- svm->vmcb->control.tsc_offset = data - tsc;
+ break;
+ }
+ case MSR_K6_STAR:
kvm-vmx-flush-tlb-with-invept-on-cpu-migration.patch
kvm-fix-lapic-timer-period-overflow.patch
kvm-svm-fix-tsc-offset-adjustment-when-running-nested.patch
+kvm-svm-handle-tsc-in-svm_get_msr-svm_set_msr-correctly.patch
net-fix-wrong-sizeof.patch
mm-add_to_swap_cache-must-not-sleep.patch
sis5513-fix-pio-setup-for-atapi-devices.patch