aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKeir Fraser <keir.fraser@citrix.com>2008-08-14 16:26:06 +0100
committerKeir Fraser <keir.fraser@citrix.com>2008-08-14 16:26:06 +0100
commit202b0e0dc09615fc3dcc619a89a3ca3fc2279812 (patch)
tree528741dc647cb19b9377736895d9a3e4debe4fd0
parent006e7188d48680d651cdf27a477b1af3b507de5d (diff)
downloadxen-202b0e0dc09615fc3dcc619a89a3ca3fc2279812.tar.gz
xen-202b0e0dc09615fc3dcc619a89a3ca3fc2279812.tar.bz2
xen-202b0e0dc09615fc3dcc619a89a3ca3fc2279812.zip
x86 shadow: Fix OOS typecounting.
From: Gianluca Guida <gianluca.guida@eu.citrix.com> Signed-off-by: Keir Fraser <keir.fraser@citrix.com>
-rw-r--r--xen/arch/x86/mm/shadow/multi.c15
1 files changed, 7 insertions, 8 deletions
diff --git a/xen/arch/x86/mm/shadow/multi.c b/xen/arch/x86/mm/shadow/multi.c
index 26e2a3cb84..a223dda8c8 100644
--- a/xen/arch/x86/mm/shadow/multi.c
+++ b/xen/arch/x86/mm/shadow/multi.c
@@ -1415,6 +1415,13 @@ static int shadow_set_l1e(struct vcpu *v,
mfn_t new_gmfn = shadow_l1e_get_mfn(new_sl1e);
#endif
ASSERT(sl1e != NULL);
+
+#if SHADOW_OPTIMIZATIONS & SHOPT_OUT_OF_SYNC
+ if ( mfn_valid(new_gmfn) && mfn_oos_may_write(new_gmfn)
+ && ((shadow_l1e_get_flags(new_sl1e) & (_PAGE_RW|_PAGE_PRESENT))
+ == (_PAGE_RW|_PAGE_PRESENT)) )
+ oos_fixup_add(v, new_gmfn, sl1mfn, pgentry_ptr_to_slot(sl1e));
+#endif
old_sl1e = *sl1e;
@@ -1434,14 +1441,6 @@ static int shadow_set_l1e(struct vcpu *v,
else
{
shadow_vram_get_l1e(new_sl1e, sl1e, sl1mfn, d);
-#if SHADOW_OPTIMIZATIONS & SHOPT_OUT_OF_SYNC
- if ( mfn_valid(new_gmfn) && mfn_oos_may_write(new_gmfn)
- && (shadow_l1e_get_flags(new_sl1e) & _PAGE_RW) )
- {
- oos_fixup_add(v, new_gmfn, sl1mfn, pgentry_ptr_to_slot(sl1e));
- }
-#endif
-
}
}
}