# HG changeset patch
# User Keir Fraser <keir.fraser@xxxxxxxxxx>
# Date 1232024071 0
# Node ID 40d9d9ff435afee74431102e4e1ac6c7542649bd
# Parent d84504432e611beb407ff4de29ab29a59187a3ea
x86 p2m: Apply correct 4GB NPT limit check in two places.
Signed-off-by: Keir Fraser <keir.fraser@xxxxxxxxxx>
---
xen/arch/x86/mm/p2m.c | 61 ++++++++++++++++++++++++--------------------------
1 files changed, 30 insertions(+), 31 deletions(-)
diff -r d84504432e61 -r 40d9d9ff435a xen/arch/x86/mm/p2m.c
--- a/xen/arch/x86/mm/p2m.c Thu Jan 15 12:41:44 2009 +0000
+++ b/xen/arch/x86/mm/p2m.c Thu Jan 15 12:54:31 2009 +0000
@@ -1890,6 +1890,30 @@ guest_physmap_remove_page(struct domain
p2m_unlock(d->arch.p2m);
}
+#if CONFIG_PAGING_LEVELS == 3
+static int gfn_check_limit(
+ struct domain *d, unsigned long gfn, unsigned int order)
+{
+ /*
+ * 32bit AMD nested paging does not support over 4GB guest due to
+ * hardware translation limit. This limitation is checked by comparing
+ * gfn with 0xfffffUL.
+ */
+ if ( !paging_mode_hap(d) || ((gfn + (1ul << order)) <= 0x100000UL) ||
+ (boot_cpu_data.x86_vendor != X86_VENDOR_AMD) )
+ return 0;
+
+ if ( !test_and_set_bool(d->arch.hvm_domain.svm.npt_4gb_warning) )
+ dprintk(XENLOG_WARNING, "Dom%d failed to populate memory beyond"
+ " 4GB: specify 'hap=0' domain config option.\n",
+ d->domain_id);
+
+ return -EINVAL;
+}
+#else
+#define gfn_check_limit(d, g, o) 0
+#endif
+
int
guest_physmap_mark_populate_on_demand(struct domain *d, unsigned long gfn,
unsigned int order)
@@ -1903,21 +1927,9 @@ guest_physmap_mark_populate_on_demand(st
BUG_ON(!paging_mode_translate(d));
-#if CONFIG_PAGING_LEVELS == 3
- /*
- * 32bit PAE nested paging does not support over 4GB guest due to
- * hardware translation limit. This limitation is checked by comparing
- * gfn with 0xfffffUL.
- */
- if ( paging_mode_hap(d) && (gfn > 0xfffffUL) )
- {
- if ( !test_and_set_bool(d->arch.hvm_domain.svm.npt_4gb_warning) )
- dprintk(XENLOG_WARNING, "Dom%d failed to populate memory beyond"
- " 4GB: specify 'hap=0' domain config option.\n",
- d->domain_id);
- return -EINVAL;
- }
-#endif
+ rc = gfn_check_limit(d, gfn, order);
+ if ( rc != 0 )
+ return rc;
p2m_lock(p2md);
audit_p2m(d);
@@ -1987,22 +1999,9 @@ guest_physmap_add_entry(struct domain *d
return 0;
}
-#if CONFIG_PAGING_LEVELS == 3
- /*
- * 32bit AMD nested paging does not support over 4GB guest due to
- * hardware translation limit. This limitation is checked by comparing
- * gfn with 0xfffffUL.
- */
- if ( paging_mode_hap(d) && (gfn > 0xfffffUL) &&
- (boot_cpu_data.x86_vendor == X86_VENDOR_AMD) )
- {
- if ( !test_and_set_bool(d->arch.hvm_domain.svm.npt_4gb_warning) )
- dprintk(XENLOG_WARNING, "Dom%d failed to populate memory beyond"
- " 4GB: specify 'hap=0' domain config option.\n",
- d->domain_id);
- return -EINVAL;
- }
-#endif
+ rc = gfn_check_limit(d, gfn, order);
+ if ( rc != 0 )
+ return rc;
p2m_lock(d->arch.p2m);
audit_p2m(d);
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|