[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-unstable] [POWERPC][XEN] Simplify Dom0 Loading.
# HG changeset patch # User Jimi Xenidis <jimix@xxxxxxxxxxxxxx> # Date 1180880150 14400 # Node ID cb40299a0733d9bd26250c5aa785393a7848882a # Parent dca7528ef9f16c331854d0b2c4fedb6dd8976b67 [POWERPC][XEN] Simplify Dom0 Loading. - Load the kernel image before all other images, this allows for debugging image location to be way easier. - Simplify libelf usage Signed-off-by: Jimi Xenidis <jimix@xxxxxxxxxxxxxx> --- xen/arch/powerpc/domain_build.c | 136 +++++++++++++++++++++------------------- 1 files changed, 73 insertions(+), 63 deletions(-) diff -r dca7528ef9f1 -r cb40299a0733 xen/arch/powerpc/domain_build.c --- a/xen/arch/powerpc/domain_build.c Sun Jun 03 10:02:25 2007 -0400 +++ b/xen/arch/powerpc/domain_build.c Sun Jun 03 10:15:50 2007 -0400 @@ -68,6 +68,7 @@ int construct_dom0(struct domain *d, struct vcpu *v; ulong dst; u64 *ofh_tree; + ulong firmware_base; uint rma_nrpages = 1 << cpu_default_rma_order_pages(); ulong rma_sz; ulong rma; @@ -78,6 +79,7 @@ int construct_dom0(struct domain *d, ulong mod_len = 0; ulong shared_info_addr; uint extent_size = 1 << cpu_extent_order(); + ulong sz; /* Sanity! */ BUG_ON(d->domain_id != 0); @@ -86,26 +88,6 @@ int construct_dom0(struct domain *d, panic("No Dom0 image supplied\n"); printk("*** LOADING DOMAIN 0 ***\n"); - - rc = elf_init(&elf, (void *)image_start, image_len); - if (rc) - return rc; -#ifdef VERBOSE - elf_set_verbose(&elf); -#endif - elf_parse_binary(&elf); - if (0 != (elf_xen_parse(&elf, &parms))) - return rc; - - printk("Dom0 kernel: %s, paddr 0x%" PRIx64 " -> 0x%" PRIx64 "\n", - elf_64bit(&elf) ? "64-bit" : "32-bit", - elf.pstart, elf.pend); - - /* elf contains virtual addresses that can have the upper bits - * masked while running in real mode, so we do the masking as well - * as well */ - parms.virt_kend = RM_MASK(parms.virt_kend, 42); - parms.virt_entry = RM_MASK(parms.virt_entry, 42); /* default is the max(1/16th of memory, CONFIG_MIN_DOM0_PAGES) */ if (dom0_nrpages == 0) { @@ -196,17 +178,75 @@ int construct_dom0(struct domain *d, v = d->vcpu[0]; cpu_init_vcpu(v); + /* convert xen pointer shared_info into guest physical */ + shared_info_addr = (ulong)d->shared_info - page_to_maddr(d->arch.rma_page); + + /* start loading stuff */ + rc = elf_init(&elf, (void *)image_start, image_len); + if (rc) + return rc; +#ifdef VERBOSE + elf_set_verbose(&elf); +#endif + elf_parse_binary(&elf); + if (0 != (elf_xen_parse(&elf, &parms))) + return rc; + + printk("Dom0 kernel: %s, paddr 0x%" PRIx64 " -> 0x%" PRIx64 "\n", + elf_64bit(&elf) ? "64-bit" : "32-bit", + elf.pstart, elf.pend); + + /* elf contains virtual addresses that can have the upper bits + * masked while running in real mode, so we do the masking as well + * as well */ + parms.virt_kend = RM_MASK(parms.virt_kend, 42); + parms.virt_entry = RM_MASK(parms.virt_entry, 42); + + /* set the MSR bit correctly */ + if (elf_64bit(&elf)) + v->arch.ctxt.msr = MSR_SF; + else + v->arch.ctxt.msr = 0; + + /* Load the dom0 kernel. */ + elf.dest = (void *)(parms.virt_kstart + rma); + + elf_load_binary(&elf); + v->arch.ctxt.pc = parms.virt_entry; + + dst = ALIGN_UP(parms.virt_kend + rma, PAGE_SIZE); + + /* Load the initrd. */ + if (initrd_len > 0) { + ASSERT((dst - rma) + image_len < eomem); + + printk("loading initrd: 0x%lx, 0x%lx\n", dst, initrd_len); + memcpy((void *)dst, (void *)initrd_start, initrd_len); + + mod_start = dst - rma; + mod_len = image_len; + + dst = ALIGN_UP(dst + initrd_len, PAGE_SIZE); + } else { + printk("no initrd\n"); + } + + v->arch.ctxt.gprs[3] = mod_start; + v->arch.ctxt.gprs[4] = mod_len; + /* OF usually sits here: * - Linux needs it to be loaded before the vmlinux or initrd * - AIX demands it to be @ 32M. */ - dst = (32 << 20); - - /* Put stack below everything. */ - v->arch.ctxt.gprs[1] = dst - STACK_FRAME_OVERHEAD; - - /* copy relative to Xen */ - dst += rma; + firmware_base = (32 << 20); + if (dst - rma > firmware_base) + panic("Firmware [0x%lx] will over-write images ending: 0x%lx\n", + firmware_base, dst - rma); + dst = firmware_base + rma; + + /* Put stack below firmware. */ + v->arch.ctxt.gprs[1] = dst - rma - STACK_FRAME_OVERHEAD; + v->arch.ctxt.gprs[2] = 0; ASSERT((dst - rma) + (ulong)firmware_image_size < eomem); printk("loading OFH: 0x%lx, RMA: 0x%lx\n", dst, dst - rma); @@ -218,43 +258,18 @@ int construct_dom0(struct domain *d, /* accomodate for a modest bss section */ dst = ALIGN_UP(dst + (ulong)firmware_image_size + PAGE_SIZE, PAGE_SIZE); + ASSERT((dst - rma) + oftree_len < eomem); *ofh_tree = dst - rma; printk("loading OFD: 0x%lx RMA: 0x%lx, 0x%lx\n", dst, dst - rma, oftree_len); memcpy((void *)dst, (void *)oftree, oftree_len); - dst = ALIGN_UP(dst + oftree_len, PAGE_SIZE); - - /* Load the dom0 kernel. */ - elf.dest = (void *)dst; - elf_load_binary(&elf); - v->arch.ctxt.pc = dst - rma + (parms.virt_entry - parms.virt_kstart); - dst = ALIGN_UP(dst + parms.virt_kend, PAGE_SIZE); - - /* Load the initrd. */ - if (initrd_len > 0) { - ASSERT((dst - rma) + image_len < eomem); - - printk("loading initrd: 0x%lx, 0x%lx\n", dst, initrd_len); - memcpy((void *)dst, (void *)initrd_start, initrd_len); - - mod_start = dst - rma; - mod_len = image_len; - - dst = ALIGN_UP(dst + initrd_len, PAGE_SIZE); - } else { - printk("no initrd\n"); - } - - if (elf_64bit(&elf)) { - v->arch.ctxt.msr = MSR_SF; - } else { - v->arch.ctxt.msr = 0; - } - v->arch.ctxt.gprs[2] = 0; - v->arch.ctxt.gprs[3] = mod_start; - v->arch.ctxt.gprs[4] = mod_len; + + /* fixup and add stuff for dom0 */ + sz = ofd_dom0_fixup(d, *ofh_tree + rma, cmdline, shared_info_addr); + printk("modified OFD size: 0x%lx\n", sz); + dst = ALIGN_UP(dst + sz + PAGE_SIZE, PAGE_SIZE); printk("dom0 initial register state:\n" " pc %016lx msr %016lx\n" @@ -268,11 +283,6 @@ int construct_dom0(struct domain *d, v->arch.ctxt.gprs[4], v->arch.ctxt.gprs[5]); - /* convert xen pointer shared_info into guest physical */ - shared_info_addr = (ulong)d->shared_info - page_to_maddr(d->arch.rma_page); - - ofd_dom0_fixup(d, *ofh_tree + rma, cmdline, shared_info_addr); - v->is_initialised = 1; clear_bit(_VPF_down, &v->pause_flags); _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |