diff mbox

[Xen-devel,v4,8/9] tools: arm: support up to (almost) 1TB of guest RAM

Message ID 1399980574-12515-8-git-send-email-ian.campbell@citrix.com
State New
Headers show

Commit Message

Ian Campbell May 13, 2014, 11:29 a.m. UTC
This creates a second bank of RAM starting at 8GB and potentially
extending to the 1TB boundary, which is the limit imposed by our
current use of a 3 level p2m with 2 pages at level 0 (2^40 bits).

I've deliberately left a gap between the two banks just to
exercise those code paths.

The second bank is 1016GB in size which plus the 3GB below 4GB is
1019GB maximum guest RAM. At the point where the fact that this
is slightly less than a full TB starts to become an issue for
people then we can switch to a 4 level p2m, which would be needed
to support guests larger than 1TB anyhow.

Tested on 32-bit with 1, 4 and 6GB guests. Anything more than
~3GB requires an LPAE enabled kernel, or a 64-bit guest.

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
---
v4: Significantly reworked (simplified) due to changes in earlier patches.
    Removed existing Acks.
v3: remove inadvertent whitespace change
---
 tools/libxc/xc_dom_arm.c      |    4 ++--
 tools/libxl/libxl_arm.c       |    4 ++--
 xen/include/public/arch-arm.h |    9 ++++++---
 3 files changed, 10 insertions(+), 7 deletions(-)
diff mbox

Patch

diff --git a/tools/libxc/xc_dom_arm.c b/tools/libxc/xc_dom_arm.c
index c83965d..549caa1 100644
--- a/tools/libxc/xc_dom_arm.c
+++ b/tools/libxc/xc_dom_arm.c
@@ -287,10 +287,10 @@  int arch_setup_meminit(struct xc_dom_image *dom)
     uint64_t ramsize = (uint64_t)dom->total_pages << XC_PAGE_SHIFT;
 
     const uint64_t bankbase[GUEST_RAM_BANKS] = {
-        GUEST_RAM0_BASE
+        GUEST_RAM0_BASE, GUEST_RAM1_BASE
     };
     const uint64_t bankmax[GUEST_RAM_BANKS] = {
-        GUEST_RAM0_SIZE
+        GUEST_RAM0_SIZE, GUEST_RAM1_SIZE
     };
 
     /* Convenient */
diff --git a/tools/libxl/libxl_arm.c b/tools/libxl/libxl_arm.c
index 90fca67..058bed3 100644
--- a/tools/libxl/libxl_arm.c
+++ b/tools/libxl/libxl_arm.c
@@ -261,7 +261,7 @@  static int make_memory_nodes(libxl__gc *gc, void *fdt,
     int res, i;
     const char *name;
     const uint64_t bankbase[GUEST_RAM_BANKS] = {
-        GUEST_RAM0_BASE
+        GUEST_RAM0_BASE, GUEST_RAM1_BASE
     };
 
     for (i = 0; i < GUEST_RAM_BANKS; i++) {
@@ -560,7 +560,7 @@  int libxl__arch_domain_finalise_hw_description(libxl__gc *gc,
     void *fdt = dom->devicetree_blob;
     int i;
     const uint64_t bankbase[GUEST_RAM_BANKS] = {
-        GUEST_RAM0_BASE
+        GUEST_RAM0_BASE, GUEST_RAM1_BASE
     };
 
     const struct xc_dom_seg *ramdisk = dom->ramdisk_blob ?
diff --git a/xen/include/public/arch-arm.h b/xen/include/public/arch-arm.h
index 96c8786..935a1eb 100644
--- a/xen/include/public/arch-arm.h
+++ b/xen/include/public/arch-arm.h
@@ -375,14 +375,17 @@  typedef uint64_t xen_callback_t;
 #define GUEST_MAGIC_BASE  0x39000000ULL
 #define GUEST_MAGIC_SIZE  0x01000000ULL
 
-#define GUEST_RAM_BANKS   1
+#define GUEST_RAM_BANKS   2
 
-#define GUEST_RAM0_BASE   0x40000000ULL /* 3GB of RAM @ 1GB */
+#define GUEST_RAM0_BASE   0x40000000ULL /* 3GB of low RAM @ 1GB */
 #define GUEST_RAM0_SIZE   0xc0000000ULL
 
+#define GUEST_RAM1_BASE   0x0200000000ULL /* 1016GB of RAM @ 8GB */
+#define GUEST_RAM1_SIZE   0xfe00000000ULL
+
 #define GUEST_RAM_BASE    GUEST_RAM0_BASE /* Lowest RAM address */
 /* Largest amount of actual RAM, not including holes */
-#define GUEST_RAM_MAX     (GUEST_RAM0_SIZE)
+#define GUEST_RAM_MAX     (GUEST_RAM0_SIZE + GUEST_RAM1_SIZE)
 
 /* Interrupts */
 #define GUEST_TIMER_VIRT_PPI    27