[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [XenPPC] [PATCH 2/4] create start_info_t in linux
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
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |