diff options
author | kfraser@dhcp93.uk.xensource.com <kfraser@dhcp93.uk.xensource.com> | 2006-06-01 10:50:33 +0100 |
---|---|---|
committer | kfraser@dhcp93.uk.xensource.com <kfraser@dhcp93.uk.xensource.com> | 2006-06-01 10:50:33 +0100 |
commit | 4347b980756342e1f9908fc4ae53d788664cb783 (patch) | |
tree | d2861890381193a3c4f304c6beccdcba0be67482 /xen/include/asm-x86/shadow.h | |
parent | 6c00bbc075e61a342450a2fd196a504224827af7 (diff) | |
download | xen-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.h | 35 |
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; } /************************************************************************/ |