This patch creates a new node, /xen/start_info_t in the flat devtree.
It adds a property for each field of the start_info_t structure that
xc_linux_build used to fill-out. I've also removed the helper functions
which created/filled-out the start_info_t structure.
This patch depends on Patch2 which modifies linux:xen_init_early().
--
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 | 36 +++++++++++++++++++++-----
mk_flatdevtree.h | 6 ++--
xc_linux_build.c | 76 +++++++++++++++++++++++--------------------------------
3 files changed, 67 insertions(+), 51 deletions(-)
Signed-off-by: Ryan Harper <ryanh@xxxxxxxxxx>
---
diff -r ed5ee9dde0bd tools/libxc/powerpc64/mk_flatdevtree.c
--- a/tools/libxc/powerpc64/mk_flatdevtree.c Sun Jan 21 08:17:46 2007 -0500
+++ b/tools/libxc/powerpc64/mk_flatdevtree.c Tue Jan 23 09:50:43 2007 -0600
@@ -316,7 +316,10 @@ 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,
+ unsigned long console_evtchn,
+ unsigned long store_evtchn,
+ unsigned long nr_pages)
{
struct boot_param_header *bph = NULL;
uint64_t val[2];
@@ -419,11 +422,6 @@ 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");
@@ -448,6 +446,32 @@ int make_devtree(struct ft_cxt *root,
ft_prop(root, "interrupts", val32, sizeof(val32));
/* end of console */
+ ft_end_node(root);
+
+ /* mark up start_info fields here */
+ ft_begin_node(root, "start_info_t");
+
+ ft_prop_str(root, "magic", "xen-3.0-powerpc64HV");
+
+ val[0] = cpu_to_be64((u64) nr_pages);
+ ft_prop(root, "nr_pages", &(val[0]), sizeof(val[0]));
+
+ val[0] = cpu_to_be64((u64) (rma_bytes - PAGE_SIZE));
+ ft_prop(root, "shared_info", &(val[0]), sizeof(val[0]));
+
+ val[0] = cpu_to_be64((u64) ((rma_bytes >> PAGE_SHIFT) - 2));
+ ft_prop(root, "store_mfn", &(val[0]), sizeof(val[0]));
+
+ ft_prop_int(root, "store_evtchn", store_evtchn);
+
+ /* start_info->console.domU.mfn */
+ val[0] = cpu_to_be64((u64) ((rma_bytes >> PAGE_SHIFT) - 3));
+ ft_prop(root, "console_domU_mfn", &(val[0]), sizeof(val[0]));
+
+ /* start_info->console.domU.evtchn */
+ ft_prop_int(root, "console_domU_evtchn", console_evtchn);
+
+ /* end of start_info_t */
ft_end_node(root);
/* end of xen node */
diff -r ed5ee9dde0bd tools/libxc/powerpc64/mk_flatdevtree.h
--- a/tools/libxc/powerpc64/mk_flatdevtree.h Sun Jan 21 08:17:46 2007 -0500
+++ b/tools/libxc/powerpc64/mk_flatdevtree.h Mon Jan 22 15:38:46 2007 -0600
@@ -32,8 +32,10 @@ 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,
+ unsigned long console_evtchn,
+ unsigned long store_evtchn,
+ unsigned long nr_pages);
#define MAX_PATH 200
#define BUFSIZE 1024
#define BPH_SIZE 16*1024
diff -r ed5ee9dde0bd tools/libxc/powerpc64/xc_linux_build.c
--- a/tools/libxc/powerpc64/xc_linux_build.c Sun Jan 21 08:17:46 2007 -0500
+++ b/tools/libxc/powerpc64/xc_linux_build.c Tue Jan 23 10:14:55 2007 -0600
@@ -109,34 +109,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 +163,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,7 +170,6 @@ 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;
u32 remaining_kb;
@@ -208,7 +178,9 @@ int xc_linux_build(int xc_handle,
int rma_log = 26; /* 64MB RMA */
int rc = 0;
int op;
+ void *si;
struct ft_cxt devtree;
+ u64 val;
DPRINTF("%s\n", __func__);
@@ -283,23 +255,41 @@ int xc_linux_build(int xc_handle,
/* 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 << 12), shadow_mb,
+ initrd_base, initrd_len, cmdline, console_evtchn,
+ store_evtchn, nr_pages) < 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;
- }
+
+ /* fetch console_mfn and store_mfn values from devtree */
+ si = ft_find_node((void *)devtree.bph, "/xen/start_info_t");
+ if (si == NULL) {
+ DPRINTF("failed to find /xen/start_info_t in devtree\n");
+ rc = -1;
+ goto out;
+ }
+
+ /* mfn properties are stored as u64s */
+ if (ft_get_prop((void *)devtree.bph, si, "console_domU_mfn",
+ &val, sizeof(val)) < 0) {
+ DPRINTF("failed to get 'console_domU_mfn' property\n");
+ rc = -1;
+ goto out;
+ }
+ *console_mfn = page_array[(xen_pfn_t)val];
+
+ if (ft_get_prop((void *)devtree.bph, si, "store_mfn",
+ &val, sizeof(val)) < 0) {
+ DPRINTF("failed to get 'store_mfn' property\n");
+ rc = -1;
+ goto out;
+ }
+ *store_mfn = page_array[(xen_pfn_t)val];
+
+ DPRINTF("console_mfn->%08lx store_mfn->%08lx\n", *console_mfn,
+ *store_mfn);
devtree_addr = DEVTREE_ADDR;
DPRINTF("loading flattened device tree to 0x%lx[0x%x]\n",
_______________________________________________
Xen-ppc-devel mailing list
Xen-ppc-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-ppc-devel
|