The data that was in start_info_t should be just simple bindings in "/
xen" since they describe xen, there is no need to create a new node.
many of the props are not needed since they are expressed elsewhere
in the devtree or perhaps differently.
more below.
On Jan 24, 2007, at 12:41 PM, Ryan Harper wrote:
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");
No need for magic since we are not trying to verify that the memory
location is good.
If we _do_ need this as some kind of compatibility statement then I'd
say the property name is "compatible"
+
+ val[0] = cpu_to_be64((u64) nr_pages);
+ ft_prop(root, "nr_pages", &(val[0]), sizeof(val[0]));
/memory node has this covered and linux knows about it, AFAICT we
don't need it at all
If we do need it then you'll have to walk the LMB and count the pages
like it is done in:
arch/powerpc/mm/hash_utils_64.c htab_initialize 429 void __init
htab_initialize(void )
+
+ val[0] = cpu_to_be64((u64) (rma_bytes - PAGE_SIZE));
+ ft_prop(root, "shared_info", &(val[0]), sizeof(val[0]));
memory areas generally contain a size so that should be included.
I believe that "_" is reserved for the standard root bindings, use
use "-".
So the name should be "shared-info"
+
+ val[0] = cpu_to_be64((u64) ((rma_bytes >> PAGE_SHIFT) - 2));
+ ft_prop(root, "store_mfn", &(val[0]), sizeof(val[0]));
To there are to items that describe Xen Store, its location and its
interrupt.
I would think the correct binding here is:
/xen/store/reg: <store_mfn << PAGE_SHIFT>
/xen/store/interrupts: <store_evtchn> 0
the latter is 2 ints.
Same goes for console.
+
+ 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
_______________________________________________
Xen-ppc-devel mailing list
Xen-ppc-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-ppc-devel
|