64 lines
2.3 KiB
Diff
64 lines
2.3 KiB
Diff
# HG changeset patch
|
|
# User Keir Fraser <keir.fraser@citrix.com>
|
|
# Date 1221577042 -3600
|
|
# Node ID 9ab9dadf4876fcab63fcc2e3a8ad13e87b1a8293
|
|
# Parent 15efb62ecf09efd07105b10a3b0b84eecfe8ec8f
|
|
x86-64: enforce memory limits imposed by virtual memory layout
|
|
|
|
... which currently means:
|
|
- The 1:1 map cannot deal with more than 1Tb.
|
|
- The m2p table can handle at most 8Tb.
|
|
- The page_info array can cover up to e.g. 1.6Gb (<=3D 64 CPUs) or
|
|
1Tb (193-256 CPUs).
|
|
|
|
Signed-off-by: Jan Beulich <jbeulich@novell.com>
|
|
|
|
Index: xen-3.3.1-testing/xen/arch/x86/e820.c
|
|
===================================================================
|
|
--- xen-3.3.1-testing.orig/xen/arch/x86/e820.c
|
|
+++ xen-3.3.1-testing/xen/arch/x86/e820.c
|
|
@@ -4,6 +4,7 @@
|
|
#include <xen/compat.h>
|
|
#include <xen/dmi.h>
|
|
#include <asm/e820.h>
|
|
+#include <asm/mm.h>
|
|
#include <asm/page.h>
|
|
|
|
/* opt_mem: Limit of physical RAM. Any RAM beyond this point is ignored. */
|
|
@@ -327,7 +328,7 @@ static void __init clip_to_limit(uint64_
|
|
continue;
|
|
if ( warnmsg )
|
|
{
|
|
- snprintf(_warnmsg, sizeof(_warnmsg), warnmsg, (int)(limit>>30));
|
|
+ snprintf(_warnmsg, sizeof(_warnmsg), warnmsg, (long)(limit>>30));
|
|
printk("WARNING: %s\n", _warnmsg);
|
|
}
|
|
printk("Truncating memory map to %lukB\n",
|
|
@@ -366,8 +367,25 @@ static void __init machine_specific_memo
|
|
|
|
#ifdef __i386__
|
|
clip_to_limit((1ULL << 30) * MACHPHYS_MBYTES,
|
|
- "Only the first %u GB of the physical memory map "
|
|
+ "Only the first %lu GB of the physical memory map "
|
|
"can be accessed by Xen in 32-bit mode.");
|
|
+#else
|
|
+ {
|
|
+ unsigned long limit, mpt_limit, pft_limit;
|
|
+
|
|
+ limit = DIRECTMAP_VIRT_END - DIRECTMAP_VIRT_START;
|
|
+ mpt_limit = ((RDWR_MPT_VIRT_END - RDWR_MPT_VIRT_START)
|
|
+ / sizeof(unsigned long)) << PAGE_SHIFT;
|
|
+ pft_limit = ((FRAMETABLE_VIRT_END - FRAMETABLE_VIRT_START)
|
|
+ / sizeof(struct page_info)) << PAGE_SHIFT;
|
|
+ if ( limit > mpt_limit )
|
|
+ limit = mpt_limit;
|
|
+ if ( limit > pft_limit )
|
|
+ limit = pft_limit;
|
|
+ clip_to_limit(limit,
|
|
+ "Only the first %lu GB of the physical "
|
|
+ "memory map can be accessed by Xen.");
|
|
+ }
|
|
#endif
|
|
|
|
reserve_dmi_region();
|