aboutsummaryrefslogtreecommitdiffstats
path: root/xen/include/asm-x86/shadow.h
diff options
context:
space:
mode:
authorkfraser@dhcp93.uk.xensource.com <kfraser@dhcp93.uk.xensource.com>2006-06-01 10:50:33 +0100
committerkfraser@dhcp93.uk.xensource.com <kfraser@dhcp93.uk.xensource.com>2006-06-01 10:50:33 +0100
commit4347b980756342e1f9908fc4ae53d788664cb783 (patch)
treed2861890381193a3c4f304c6beccdcba0be67482 /xen/include/asm-x86/shadow.h
parent6c00bbc075e61a342450a2fd196a504224827af7 (diff)
downloadxen-4347b980756342e1f9908fc4ae53d788664cb783.tar.gz
xen-4347b980756342e1f9908fc4ae53d788664cb783.tar.bz2
xen-4347b980756342e1f9908fc4ae53d788664cb783.zip
[HVM] Fix set_guest_back_ptr to ignore empty PTEs.
Signed-off-by: Keir Fraser <keir@xensource.com>
Diffstat (limited to 'xen/include/asm-x86/shadow.h')
-rw-r--r--xen/include/asm-x86/shadow.h35
1 files changed, 19 insertions, 16 deletions
diff --git a/xen/include/asm-x86/shadow.h b/xen/include/asm-x86/shadow.h
index 3a9e0cdf84..32ac908464 100644
--- a/xen/include/asm-x86/shadow.h
+++ b/xen/include/asm-x86/shadow.h
@@ -756,23 +756,26 @@ shadow_unpin(unsigned long smfn)
* when working on finer-gained locks for shadow.
*/
static inline void set_guest_back_ptr(
- struct domain *d, l1_pgentry_t spte, unsigned long smfn, unsigned int index)
+ struct domain *d, l1_pgentry_t spte,
+ unsigned long smfn, unsigned int index)
{
- if ( shadow_mode_external(d) ) {
- unsigned long gmfn;
-
- ASSERT(shadow_lock_is_acquired(d));
- ASSERT( smfn );
- gmfn = l1e_get_pfn(spte);
- ASSERT( gmfn );
- if ( l1e_get_flags(spte) & _PAGE_RW )
- {
- mfn_to_page(gmfn)->tlbflush_timestamp = smfn;
- mfn_to_page(gmfn)->u.inuse.type_info &= ~PGT_va_mask;
- mfn_to_page(gmfn)->u.inuse.type_info |=
- (unsigned long) index << PGT_va_shift;
- }
- }
+ struct page_info *gpage;
+
+ ASSERT(shadow_lock_is_acquired(d));
+
+ if ( !shadow_mode_external(d) ||
+ ((l1e_get_flags(spte) & (_PAGE_PRESENT|_PAGE_RW)) !=
+ (_PAGE_PRESENT|_PAGE_RW)) )
+ return;
+
+ gpage = l1e_get_page(spte);
+
+ ASSERT(smfn != 0);
+ ASSERT(page_to_mfn(gpage) != 0);
+
+ gpage->tlbflush_timestamp = smfn;
+ gpage->u.inuse.type_info &= ~PGT_va_mask;
+ gpage->u.inuse.type_info |= (unsigned long)index << PGT_va_shift;
}
/************************************************************************/