aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJan Beulich <jbeulich@suse.com>2013-01-23 14:04:34 +0100
committerJan Beulich <jbeulich@suse.com>2013-01-23 14:04:34 +0100
commita8d2b06db7826063df9d04be9d6f928bf2189bd0 (patch)
tree4c0e6f548c1d54775b69d60e6d9c5f0b550a505e
parenta2fd3bc4d44f1fca34fcfcff843b1eb940dc2c9a (diff)
downloadxen-a8d2b06db7826063df9d04be9d6f928bf2189bd0.tar.gz
xen-a8d2b06db7826063df9d04be9d6f928bf2189bd0.tar.bz2
xen-a8d2b06db7826063df9d04be9d6f928bf2189bd0.zip
x86: extend frame table virtual space
... to allow frames for up to 16Tb. At the same time, add the super page frame table coordinates to the comment describing the address space layout. Signed-off-by: Jan Beulich <jbeulich@suse.com> Acked-by: Keir Fraser <keir@xen.org>
-rw-r--r--xen/arch/x86/mm.c5
-rw-r--r--xen/arch/x86/setup.c4
-rw-r--r--xen/arch/x86/x86_64/mm.c4
-rw-r--r--xen/include/asm-x86/config.h22
4 files changed, 19 insertions, 16 deletions
diff --git a/xen/arch/x86/mm.c b/xen/arch/x86/mm.c
index 9c289e4221..e043ba10b3 100644
--- a/xen/arch/x86/mm.c
+++ b/xen/arch/x86/mm.c
@@ -146,8 +146,7 @@ unsigned long max_page;
unsigned long total_pages;
unsigned long __read_mostly pdx_group_valid[BITS_TO_LONGS(
- (FRAMETABLE_SIZE / sizeof(*frame_table) + PDX_GROUP_COUNT - 1)
- / PDX_GROUP_COUNT)] = { [0] = 1 };
+ (FRAMETABLE_NR + PDX_GROUP_COUNT - 1) / PDX_GROUP_COUNT)] = { [0] = 1 };
bool_t __read_mostly machine_to_phys_mapping_valid = 0;
@@ -218,7 +217,7 @@ static void __init init_spagetable(void)
BUILD_BUG_ON(XEN_VIRT_END > SPAGETABLE_VIRT_START);
init_frametable_chunk(spage_table,
- mem_hotplug ? (void *)SPAGETABLE_VIRT_END
+ mem_hotplug ? spage_table + SPAGETABLE_NR
: pdx_to_spage(max_pdx - 1) + 1);
}
diff --git a/xen/arch/x86/setup.c b/xen/arch/x86/setup.c
index f4d3788e06..f9ed5804b2 100644
--- a/xen/arch/x86/setup.c
+++ b/xen/arch/x86/setup.c
@@ -378,8 +378,8 @@ static void __init setup_max_pdx(void)
if ( max_pdx > (DIRECTMAP_SIZE >> PAGE_SHIFT) )
max_pdx = DIRECTMAP_SIZE >> PAGE_SHIFT;
- if ( max_pdx > FRAMETABLE_SIZE / sizeof(*frame_table) )
- max_pdx = FRAMETABLE_SIZE / sizeof(*frame_table);
+ if ( max_pdx > FRAMETABLE_NR )
+ max_pdx = FRAMETABLE_NR;
max_page = pdx_to_pfn(max_pdx - 1) + 1;
}
diff --git a/xen/arch/x86/x86_64/mm.c b/xen/arch/x86/x86_64/mm.c
index 333f57a556..c6e09a4041 100644
--- a/xen/arch/x86/x86_64/mm.c
+++ b/xen/arch/x86/x86_64/mm.c
@@ -958,7 +958,7 @@ static int extend_frame_table(struct mem_hotadd_info *info)
nidx = cidx = pfn_to_pdx(spfn)/PDX_GROUP_COUNT;
ASSERT( pfn_to_pdx(epfn) <= (DIRECTMAP_SIZE >> PAGE_SHIFT) &&
- (pfn_to_pdx(epfn) <= FRAMETABLE_SIZE / sizeof(struct page_info)) );
+ pfn_to_pdx(epfn) <= FRAMETABLE_NR );
if ( test_bit(cidx, pdx_group_valid) )
cidx = find_next_zero_bit(pdx_group_valid, eidx, cidx);
@@ -1406,7 +1406,7 @@ int mem_hotadd_check(unsigned long spfn, unsigned long epfn)
if ( (spfn >= epfn) )
return 0;
- if (pfn_to_pdx(epfn) > (FRAMETABLE_SIZE / sizeof(*frame_table)))
+ if (pfn_to_pdx(epfn) > FRAMETABLE_NR)
return 0;
if ( (spfn | epfn) & ((1UL << PAGETABLE_ORDER) - 1) )
diff --git a/xen/include/asm-x86/config.h b/xen/include/asm-x86/config.h
index ce3a7c00a2..fad918918c 100644
--- a/xen/include/asm-x86/config.h
+++ b/xen/include/asm-x86/config.h
@@ -152,9 +152,11 @@ extern unsigned char boot_edid_info[128];
* High read-only compatibility machine-to-phys translation table.
* 0xffff82c480000000 - 0xffff82c4bfffffff [1GB, 2^30 bytes, PML4:261]
* Xen text, static data, bss.
- * 0xffff82c4c0000000 - 0xffff82f5ffffffff [197GB, PML4:261]
+ * 0xffff82c4c0000000 - 0xffff82dffbffffff [109GB - 64MB, PML4:261]
* Reserved for future use.
- * 0xffff82f600000000 - 0xffff82ffffffffff [40GB, 2^38 bytes, PML4:261]
+ * 0xffff82dffc000000 - 0xffff82dfffffffff [64MB, 2^26 bytes, PML4:261]
+ * Super-page information array.
+ * 0xffff82e000000000 - 0xffff82ffffffffff [128GB, 2^37 bytes, PML4:261]
* Page-frame information array.
* 0xffff830000000000 - 0xffff87ffffffffff [5TB, 5*2^40 bytes, PML4:262-271]
* 1:1 direct mapping of all physical memory.
@@ -218,15 +220,17 @@ extern unsigned char boot_edid_info[128];
/* Slot 261: xen text, static data and bss (1GB). */
#define XEN_VIRT_START (HIRO_COMPAT_MPT_VIRT_END)
#define XEN_VIRT_END (XEN_VIRT_START + GB(1))
-/* Slot 261: superpage information array (20MB). */
+/* Slot 261: superpage information array (64MB). */
#define SPAGETABLE_VIRT_END FRAMETABLE_VIRT_START
-#define SPAGETABLE_SIZE ((DIRECTMAP_SIZE >> SUPERPAGE_SHIFT) * \
- sizeof(struct spage_info))
-#define SPAGETABLE_VIRT_START (SPAGETABLE_VIRT_END - SPAGETABLE_SIZE)
-/* Slot 261: page-frame information array (40GB). */
+#define SPAGETABLE_NR (((FRAMETABLE_NR - 1) >> (SUPERPAGE_SHIFT - \
+ PAGE_SHIFT)) + 1)
+#define SPAGETABLE_SIZE (SPAGETABLE_NR * sizeof(struct spage_info))
+#define SPAGETABLE_VIRT_START ((SPAGETABLE_VIRT_END - SPAGETABLE_SIZE) & \
+ (-1UL << SUPERPAGE_SHIFT))
+/* Slot 261: page-frame information array (128GB). */
#define FRAMETABLE_VIRT_END DIRECTMAP_VIRT_START
-#define FRAMETABLE_SIZE ((DIRECTMAP_SIZE >> PAGE_SHIFT) * \
- sizeof(struct page_info))
+#define FRAMETABLE_SIZE GB(128)
+#define FRAMETABLE_NR (FRAMETABLE_SIZE / sizeof(*frame_table))
#define FRAMETABLE_VIRT_START (FRAMETABLE_VIRT_END - FRAMETABLE_SIZE)
/* Slot 262-271: A direct 1:1 mapping of all of physical memory. */
#define DIRECTMAP_VIRT_START (PML4_ADDR(262))