summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorZhao Jin <cronozhj@gmail.com>2011-09-19 06:19:51 +0200
committerAvi Kivity <avi@redhat.com>2011-09-25 18:13:25 +0200
commit41bc3186b3c92a4ca05e2aa14bb6272fb491e679 (patch)
tree43f66f314c1461710db968e7e820d382d094d453
parentMerge branch 'spi/merge' of git://git.secretlab.ca/git/linux-2.6 (diff)
downloadlinux-41bc3186b3c92a4ca05e2aa14bb6272fb491e679.tar.xz
linux-41bc3186b3c92a4ca05e2aa14bb6272fb491e679.zip
KVM: MMU: fix incorrect return of spte
__update_clear_spte_slow should return original spte while the current code returns low half of original spte combined with high half of new spte. Signed-off-by: Zhao Jin <cronozhj@gmail.com> Reviewed-by: Xiao Guangrong <xiaoguangrong@cn.fujitsu.com> Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
-rw-r--r--arch/x86/kvm/mmu.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c
index 1c5b69373a00..8e8da7960dbe 100644
--- a/arch/x86/kvm/mmu.c
+++ b/arch/x86/kvm/mmu.c
@@ -400,7 +400,8 @@ static u64 __update_clear_spte_slow(u64 *sptep, u64 spte)
/* xchg acts as a barrier before the setting of the high bits */
orig.spte_low = xchg(&ssptep->spte_low, sspte.spte_low);
- orig.spte_high = ssptep->spte_high = sspte.spte_high;
+ orig.spte_high = ssptep->spte_high;
+ ssptep->spte_high = sspte.spte_high;
count_spte_clear(sptep, spte);
return orig.spte;