|
|
|
|
|
|
|
|
|
|
xen-changelog
[Xen-changelog] Fix a missed unmap in __entry().
# HG changeset patch
# User kaf24@xxxxxxxxxxxxxxxxxxxx
# Node ID cc9ed0eea55aa7b4a2e014f11d97b2e6cac113eb
# Parent d741fa2723094a51274466e91b71c13291732e94
Fix a missed unmap in __entry().
On x86_32p, after several creation/destroy of VMX domain, xen crashes
because we forget to unmap phys_table.
Signed-off-by: Xin Li <xin.b.li@xxxxxxxxx>
diff -r d741fa272309 -r cc9ed0eea55a xen/include/asm-x86/shadow_64.h
--- a/xen/include/asm-x86/shadow_64.h Mon Feb 27 15:14:11 2006
+++ b/xen/include/asm-x86/shadow_64.h Mon Feb 27 15:20:23 2006
@@ -223,6 +223,7 @@
int i;
pgentry_64_t *le_e;
pgentry_64_t *le_p = NULL;
+ pgentry_64_t *phys_vtable = NULL;
unsigned long mfn;
int index;
u32 level = flag & L_MASK;
@@ -251,25 +252,35 @@
{
root_level = PAE_PAGING_LEVELS;
index = table_offset_64(va, root_level);
- le_e = (pgentry_64_t *)map_domain_page(
+ phys_vtable = (pgentry_64_t *)map_domain_page(
pagetable_get_pfn(v->domain->arch.phys_table));
+ le_e = &phys_vtable[index];
}
/*
* If it's not external mode, then mfn should be machine physical.
*/
- for (i = root_level - level; i > 0; i--) {
- if ( unlikely(!(entry_get_flags(*le_e) & _PAGE_PRESENT)) ) {
+ for ( i = root_level - level; i > 0; i-- )
+ {
+ if ( unlikely(!(entry_get_flags(*le_e) & _PAGE_PRESENT)) )
+ {
if ( le_p )
unmap_domain_page(le_p);
+
+ if ( phys_vtable )
+ unmap_domain_page(phys_vtable);
+
return 0;
}
+
mfn = entry_get_pfn(*le_e);
if ( (flag & GUEST_ENTRY) && shadow_mode_translate(d) )
mfn = get_mfn_from_gpfn(mfn);
+
if ( le_p )
unmap_domain_page(le_p);
le_p = (pgentry_64_t *)map_domain_page(mfn);
+
if ( flag & SHADOW_ENTRY )
index = table_offset_64(va, (level + i - 1));
else
@@ -285,8 +296,10 @@
if ( le_p )
unmap_domain_page(le_p);
+ if ( phys_vtable )
+ unmap_domain_page(phys_vtable);
+
return 1;
-
}
static inline int __rw_entry(
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|
<Prev in Thread] |
Current Thread |
[Next in Thread> |
- [Xen-changelog] Fix a missed unmap in __entry().,
Xen patchbot -unstable <=
|
|
|
|
|