WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-ppc-devel

[XenPPC] [PATCH 2/4] create start_info_t in linux

To: xen-ppc-devel@xxxxxxxxxxxxxxxxxxx
Subject: [XenPPC] [PATCH 2/4] create start_info_t in linux
From: Ryan Harper <ryanh@xxxxxxxxxx>
Date: Tue, 30 Jan 2007 13:08:05 -0600
Delivery-date: Tue, 30 Jan 2007 11:07:25 -0800
Envelope-to: www-data@xxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-ppc-devel-request@lists.xensource.com?subject=help>
List-id: Xen PPC development <xen-ppc-devel.lists.xensource.com>
List-post: <mailto:xen-ppc-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-ppc-devel>, <mailto:xen-ppc-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-ppc-devel>, <mailto:xen-ppc-devel-request@lists.xensource.com?subject=unsubscribe>
Sender: xen-ppc-devel-bounces@xxxxxxxxxxxxxxxxxxx
User-agent: Mutt/1.5.6+20040907i
Add information into flat devtree needed to create a start_info_t
structure in linux.

-- 
Ryan Harper
Software Engineer; Linux Technology Center
IBM Corp., Austin, Tx
(512) 838-9253   T/L: 678-9253
ryanh@xxxxxxxxxx


diffstat output:
 mk_flatdevtree.c |   89 +++++++++++++++++++++++++++++++++++++++++--------------
 mk_flatdevtree.h |    7 +++-
 xc_linux_build.c |   63 ++++++++++++--------------------------
 3 files changed, 93 insertions(+), 66 deletions(-)

Signed-off-by: Ryan Harper <ryanh@xxxxxxxxxx>
---
diff -r 220e131bde0d tools/libxc/powerpc64/mk_flatdevtree.c
--- a/tools/libxc/powerpc64/mk_flatdevtree.c    Mon Jan 29 20:49:18 2007 -0600
+++ b/tools/libxc/powerpc64/mk_flatdevtree.c    Mon Jan 29 20:54:54 2007 -0600
@@ -316,13 +316,17 @@ int make_devtree(struct ft_cxt *root,
                  unsigned long shadow_mb,
                  unsigned long initrd_base,
                  unsigned long initrd_len,
-                 const char *bootargs)
+                 const char *bootargs,
+                 uint64_t shared_info_maddr,
+                 unsigned long console_evtchn,
+                 uint64_t console_maddr,
+                 unsigned long store_evtchn,
+                 uint64_t store_maddr)
 {
     struct boot_param_header *bph = NULL;
     uint64_t val[2];
     uint32_t val32[2];
     unsigned long remaining;
-    unsigned long rma_reserve = 4 * PAGE_SIZE;
     unsigned long initrd_end = initrd_base + initrd_len;
     int64_t shadow_mb_log;
     uint64_t pft_size;
@@ -351,10 +355,26 @@ int make_devtree(struct ft_cxt *root,
 
     /* you MUST set reservations BEFORE _starting_the_tree_ */
 
-    /* reserve some pages at the end of RMA */
-    val[0] = cpu_to_be64((u64) (rma_bytes - rma_reserve));
-    val[1] = cpu_to_be64((u64) rma_reserve);
-    ft_add_rsvmap(root, val[0], val[1]);
+    /* reserve shared_info_t page */
+    if (shared_info_maddr) {
+        val[0] = cpu_to_be64((u64) shared_info_maddr);
+        val[1] = cpu_to_be64((u64) PAGE_SIZE);
+        ft_add_rsvmap(root, val[0], val[1]);
+    }
+
+    /* reserve console page for domU */
+    if (console_maddr) {
+        val[0] = cpu_to_be64((u64) console_maddr);
+        val[1] = cpu_to_be64((u64) PAGE_SIZE);
+        ft_add_rsvmap(root, val[0], val[1]);
+    }
+
+    /* reserve xen store page for domU */
+    if (store_maddr) {
+        val[0] = cpu_to_be64((u64) store_maddr);
+        val[1] = cpu_to_be64((u64) PAGE_SIZE);
+        ft_add_rsvmap(root, val[0], val[1]);
+    }
 
     /* reserve space for initrd if needed */
     if ( initrd_len > 0 )  {
@@ -419,19 +439,19 @@ int make_devtree(struct ft_cxt *root,
     /* xen = root.addnode('xen') */
     ft_begin_node(root, "xen");
 
-    /* start-info is the first page in the RMA reserved area */
-    val[0] = cpu_to_be64((u64) (rma_bytes - rma_reserve));
-    val[1] = cpu_to_be64((u64) PAGE_SIZE);
-    ft_prop(root, "start-info", val, sizeof(val));
-
     /*  xen.addprop('version', 'Xen-3.0-unstable\0') */
-    ft_prop_str(root, "version", "Xen-3.0-unstable");
+    ft_prop_str(root, "compatible", "Xen-3.0-unstable");
 
     /* xen.addprop('reg', long(imghandler.vm.domid), long(0)) */
     val[0] = cpu_to_be64((u64) domid);
     val[1] = cpu_to_be64((u64) 0);
     ft_prop(root, "reg", val, sizeof(val));
 
+    /* point to shared_info_t page base addr */
+    val[0] = cpu_to_be64((u64) shared_info_maddr);
+    val[1] = cpu_to_be64((u64) PAGE_SIZE);
+    ft_prop(root, "shared-info", val, sizeof(val));
+
     /* xen.addprop('domain-name', imghandler.vm.getName() + '\0') */
     /* libxc doesn't know the domain name, that is purely a xend thing */
     /* ft_prop_str(root, "domain-name", domain_name); */
@@ -439,16 +459,41 @@ int make_devtree(struct ft_cxt *root,
     /* add xen/linux,phandle for chosen/interrupt-controller */
     ft_prop_int(root, "linux,phandle", xen_phandle);
 
-    /* xencons = xen.addnode('console') */
-    ft_begin_node(root, "console");
-
-    /* xencons.addprop('interrupts', 1, 0) */
-    val32[0] = cpu_to_be32((u32) 1);
-    val32[1] = cpu_to_be32((u32) 0);
-    ft_prop(root, "interrupts", val32, sizeof(val32));
-
-    /* end of console */
-    ft_end_node(root);
+    if (console_maddr != 0) {
+        /* xencons = xen.addnode('console') */
+        ft_begin_node(root, "console");
+
+        /* console_maddr */
+        val[0] = cpu_to_be64((u64) console_maddr);
+        val[1] = cpu_to_be64((u64) PAGE_SIZE);
+        ft_prop(root, "reg", val, sizeof(val));
+
+        /* xencons.addprop('interrupts', console_evtchn, 0) */
+        val32[0] = cpu_to_be32((u32) console_evtchn);
+        val32[1] = cpu_to_be32((u32) 0);
+        ft_prop(root, "interrupts", val32, sizeof(val32));
+
+        /* end of console */
+        ft_end_node(root);
+    }
+
+    if (store_maddr != 0) {
+        /* start store node */
+        ft_begin_node(root, "store");
+
+        /* store maddr */
+        val[0] = cpu_to_be64((u64) store_maddr);
+        val[1] = cpu_to_be64((u64) PAGE_SIZE);
+        ft_prop(root, "reg", val, sizeof(val));
+
+        /* store event channel */
+        val32[0] = cpu_to_be32((u32) store_evtchn);
+        val32[1] = cpu_to_be32((u32) 0);
+        ft_prop(root, "interrupts", val32, sizeof(val32));
+
+        /* end of store */
+        ft_end_node(root);
+    }
 
     /* end of xen node */
     ft_end_node(root);
diff -r 220e131bde0d tools/libxc/powerpc64/mk_flatdevtree.h
--- a/tools/libxc/powerpc64/mk_flatdevtree.h    Mon Jan 29 20:49:18 2007 -0600
+++ b/tools/libxc/powerpc64/mk_flatdevtree.h    Mon Jan 29 20:54:54 2007 -0600
@@ -32,7 +32,12 @@ extern int make_devtree(struct ft_cxt *r
                         unsigned long shadow_mb,
                         unsigned long initrd_base,
                         unsigned long initrd_len,
-                        const char *bootargs);
+                        const char *bootargs,
+                        uint64_t shared_info_maddr,
+                        unsigned long console_evtchn,
+                        uint64_t console_maddr,
+                        unsigned long store_evtchn,
+                        uint64_t store_maddr);
 
 #define MAX_PATH 200
 #define BUFSIZE 1024
diff -r 220e131bde0d tools/libxc/powerpc64/xc_linux_build.c
--- a/tools/libxc/powerpc64/xc_linux_build.c    Mon Jan 29 20:49:18 2007 -0600
+++ b/tools/libxc/powerpc64/xc_linux_build.c    Tue Jan 30 11:57:11 2007 -0600
@@ -33,6 +33,7 @@
 #include <xc_private.h>
 #include <xg_private.h>
 #include <xenctrl.h>
+#include <xen/arch-powerpc.h>
 
 #include "flatdevtree_env.h"
 #include "flatdevtree.h"
@@ -109,34 +110,6 @@ out:
     return rc;
 }
 
-static unsigned long create_start_info(
-        start_info_t *start_info,
-        unsigned int console_evtchn,
-        unsigned int store_evtchn,
-        unsigned long nr_pages,
-        unsigned long rma_pages)
-{
-    unsigned long start_info_addr;
-    uint64_t rma_top;
-
-    memset(start_info, 0, sizeof(*start_info));
-    snprintf(start_info->magic, sizeof(start_info->magic),
-             "xen-%d.%d-powerpc64HV", 3, 0);
-
-    rma_top = rma_pages << PAGE_SHIFT;
-    DPRINTF("RMA top = 0x%"PRIX64"\n", rma_top);
-
-    start_info->nr_pages = nr_pages;
-    start_info->shared_info = rma_top - PAGE_SIZE;
-    start_info->store_mfn = (rma_top >> PAGE_SHIFT) - 2;
-    start_info->store_evtchn = store_evtchn;
-    start_info->console.domU.mfn = (rma_top >> PAGE_SHIFT) - 3;
-    start_info->console.domU.evtchn = console_evtchn;
-    start_info_addr = rma_top - 4*PAGE_SIZE;
-
-    return start_info_addr;
-}
-
 static void free_page_array(xen_pfn_t *page_array)
 {
     free(page_array);
@@ -191,7 +164,6 @@ int xc_linux_build(int xc_handle,
                    unsigned int console_evtchn,
                    unsigned long *console_mfn)
 {
-    start_info_t start_info;
     struct domain_setup_info dsi;
     xen_pfn_t *page_array = NULL;
     unsigned long nr_pages;
@@ -199,9 +171,11 @@ int xc_linux_build(int xc_handle,
     unsigned long kern_addr;
     unsigned long initrd_base = 0;
     unsigned long initrd_len = 0;
-    unsigned long start_info_addr;
     unsigned long rma_pages;
     unsigned long shadow_mb;
+    u64 shared_info_maddr;
+    u64 store_maddr;
+    u64 console_maddr;
     u32 remaining_kb;
     u32 extent_order;
     u64 nr_extents;
@@ -281,22 +255,25 @@ int xc_linux_build(int xc_handle,
         goto out;
     }
 
+    /* determine shared_info, console, and store maddr */
+    shared_info_maddr = (rma_pages << PAGE_SHIFT) -
+                        (RMA_SHARED_INFO * PAGE_SIZE);
+    console_maddr = (rma_pages << PAGE_SHIFT) - (RMA_CONSOLE * PAGE_SIZE);
+    store_maddr = (rma_pages << PAGE_SHIFT) - (RMA_STORE * PAGE_SIZE);
+
+    /* map maddr to "mfns" */
+    *store_mfn = page_array[(xen_pfn_t)(store_maddr >> PAGE_SHIFT)];
+    *console_mfn = page_array[(xen_pfn_t)(console_maddr >> PAGE_SHIFT)];
+    DPRINTF("console_mfn->%08lx store_mfn->%08lx\n", *console_mfn,
+            *store_mfn);
+
     /* build the devtree here */
     DPRINTF("constructing devtree\n");
-    if (make_devtree(&devtree, domid, mem_mb, (rma_pages*PAGE_SIZE), shadow_mb,
-                     initrd_base, initrd_len, cmdline) < 0) {
+    if (make_devtree(&devtree, domid, mem_mb, (rma_pages << PAGE_SHIFT),
+                     shadow_mb, initrd_base, initrd_len, cmdline, 
+                     shared_info_maddr, console_evtchn, console_maddr,
+                     store_evtchn, store_maddr) < 0) {
         DPRINTF("failed to create flattened device tree\n");
-        rc = -1;
-        goto out;
-    }
-    
-    /* start_info stuff: about to be removed  */
-    start_info_addr = create_start_info(&start_info, console_evtchn,
-                                        store_evtchn, nr_pages, rma_pages);
-    *console_mfn = page_array[start_info.console.domU.mfn];
-    *store_mfn = page_array[start_info.store_mfn];
-    if (install_image(xc_handle, domid, page_array, &start_info,
-                      start_info_addr, sizeof(start_info_t))) {
         rc = -1;
         goto out;
     }

_______________________________________________
Xen-ppc-devel mailing list
Xen-ppc-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-ppc-devel

<Prev in Thread] Current Thread [Next in Thread>
  • [XenPPC] [PATCH 2/4] create start_info_t in linux, Ryan Harper <=