[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [XenPPC] [pushed] [ppc] Move shared pages into RMA
changeset: 9715:1bdd8ec03da55dd5d7a802a147d9e77d06d3a244 tag: tip user: jimix@xxxxxxxxxxxxxxxxxxxxx date: Thu Mar 30 18:40:26 2006 -0500 files: xen/arch/ppc/domain.c xen/arch/ppc/domain_build.c xen/arch/ppc/mm.c xen/arch/ppc/ofd_fixup.c xen/arch/ppc/papr/xlate.c xen/arch/ppc/ppc64/ppc970.c xen/arch/ppc/usercopy.c xen/include/asm-ppc/domain.h xen/include/asm-ppc/mm.h description: [ppc] Move shared pages into RMA - All references to RMO should actually be RMA. - Allocate domain shared_info page from the RMA - Remove all magical PFN hacks for mapping shared pages. diff -r 2389fd7700c5c9d251d0ce8f666d01c48cb13f55 -r 1bdd8ec03da55dd5d7a802a147d9e77d06d3a244 xen/arch/ppc/domain.c --- a/xen/arch/ppc/domain.c Thu Mar 30 18:38:23 2006 -0500 +++ b/xen/arch/ppc/domain.c Thu Mar 30 18:40:26 2006 -0500 @@ -68,28 +68,25 @@ unsigned long hypercall_create_continuat int arch_domain_create(struct domain *d) { - void *dummy; - - /* dummy safety page for mapping pages that are yet to be shared */ - dummy = alloc_xenheap_page(); - clear_page(dummy); - d->arch.shared_dummy_pfn = (ulong)dummy >> PAGE_SHIFT; - - /* Shared area pfn2mfn array, may end up publishing this */ - d->arch.shared_pfn2mfn = (void *)alloc_xenheap_page(); - clear_page(d->arch.shared_pfn2mfn); - d->arch.shared_nr_pfn = PAGE_SHIFT - 3; - - d->shared_info = (void *)alloc_xenheap_page(); - clear_page(d->shared_info); + + if (d->domain_id == IDLE_DOMAIN_ID) { + d->shared_info = (void *)alloc_xenheap_page(); + clear_page(d->shared_info); + + return 0; + } + + /* XXX the hackage... hardcode 64M domains */ + d->arch.rma_base = (64<<20) * (d->domain_id + 1); + d->arch.rma_size = (64<<20); + + printk("clearing RMO: 0x%lx[0x%lx]\n", d->arch.rma_base, d->arch.rma_size); + memset((void*)d->arch.rma_base, 0, d->arch.rma_size); htab_alloc(d, LOG_DEFAULT_HTAB_BYTES); - /* XXX the hackage... hardcode 64M domains */ - d->arch.rmo_base = (64<<20) * (d->domain_id + 1); - d->arch.rmo_len = (64<<20); - - d->arch.shared_base_pfn = (d->arch.rmo_len >> PAGE_SHIFT) - 1; + d->shared_info = (shared_info_t *) + (rma_addr(&d->arch, RMA_SHARED_INFO) + d->arch.rma_base); d->arch.large_page_sizes = 1; d->arch.large_page_shift[0] = 24; /* 16 M for 970s */ diff -r 2389fd7700c5c9d251d0ce8f666d01c48cb13f55 -r 1bdd8ec03da55dd5d7a802a147d9e77d06d3a244 xen/arch/ppc/domain_build.c --- a/xen/arch/ppc/domain_build.c Thu Mar 30 18:38:23 2006 -0500 +++ b/xen/arch/ppc/domain_build.c Thu Mar 30 18:40:26 2006 -0500 @@ -23,6 +23,7 @@ #include <xen/init.h> #include <xen/ctype.h> #include <xen/iocap.h> +#include <xen/compile.h> #include <asm/processor.h> #include <asm/papr.h> @@ -88,7 +89,7 @@ static inline int is_loadable_phdr(Elf_P ((phdr->p_flags & (PF_W|PF_X)) != 0)); } -static int rm_loadelfimage(struct domain_setup_info *dsi, ulong rmo) +static int rm_loadelfimage(struct domain_setup_info *dsi, ulong rma) { char *elfbase = (char *)dsi->image_addr; Elf_Ehdr *ehdr = (Elf_Ehdr *)dsi->image_addr; @@ -101,11 +102,11 @@ static int rm_loadelfimage(struct domain if (!is_loadable_phdr(phdr)) continue; if (phdr->p_filesz != 0) - memcpy((char *)(rmo + RM_MASK(phdr->p_paddr, 42)), + memcpy((char *)(rma + RM_MASK(phdr->p_paddr, 42)), elfbase + phdr->p_offset, phdr->p_filesz); if (phdr->p_memsz > phdr->p_filesz) - memset((char *)(rmo + RM_MASK(phdr->p_paddr, 42) + phdr->p_filesz), + memset((char *)(rma + RM_MASK(phdr->p_paddr, 42) + phdr->p_filesz), 0, phdr->p_memsz - phdr->p_filesz); } @@ -126,11 +127,9 @@ int construct_dom0(struct domain *d, struct domain_setup_info dsi; ulong dst; u64 *ofh_tree; - ulong rmo_sz = d->arch.rmo_len; - ulong rmo = d->arch.rmo_base; + ulong rma_sz = d->arch.rma_size; + ulong rma = d->arch.rma_base; start_info_t *si; - ulong vstartinfo_start; - ulong vstartinfo_end; ulong eomem; /* Sanity! */ @@ -162,37 +161,26 @@ int construct_dom0(struct domain *d, /* By default DOM0 is allocated all available memory. */ d->max_pages = ~0U; - ASSERT( image_len < rmo_sz ); - printk("clearing RMO: 0x%lx[0x%lx]\n", rmo, rmo_sz); - memset((void*)rmo, 0, rmo_sz); - - /* place the start info at the end */ - eomem = rmo_sz; - vstartinfo_end = eomem; - eomem -= PAGE_SIZE; - vstartinfo_start = eomem; - printk("xen_start_info: 0x%lx\n", vstartinfo_start); - si = (start_info_t *)(vstartinfo_start + rmo); - + ASSERT( image_len < rma_sz ); + + si = (start_info_t *)(rma_addr(&d->arch, RMA_START_INFO) + rma); + printk("xen_start_info: %p\n", si); + + sprintf(si->magic, "xen-%i.%i-powerpc%d%s", + XEN_VERSION, XEN_SUBVERSION, BITS_PER_LONG, "HV"); si->flags = SIF_PRIVILEGED | SIF_INITDOMAIN; - /* first page of shared region belongs to the Xen Shared Info page */ - d->arch.shared_pfn2mfn[0] = ((ulong)d->shared_info) >> PAGE_SHIFT; - - /* place the shared area one page below the top of RMO. */ - d->arch.shared_base_pfn = (rmo_sz >> PAGE_SHIFT) - 1; - si->shared_info = d->arch.shared_base_pfn << PAGE_SHIFT; + si->shared_info = ((ulong)d->shared_info) - rma; + printk("shared_info: 0x%lx,%p\n", si->shared_info, d->shared_info); + + eomem = si->shared_info; /* allow dom0 to access all of system RAM */ d->arch.logical_base_pfn = 128 << (20 - PAGE_SHIFT); /* 128 MB */ d->arch.logical_end_pfn = max_page; - /* dom0 is not given a store or console page */ - si->store_mfn = d->arch.shared_base_pfn + 1; - si->console_mfn = d->arch.shared_base_pfn + 2; - /* number of pages accessible */ - si->nr_pages = (rmo_sz >> PAGE_SHIFT) + 3; + si->nr_pages = rma_sz >> PAGE_SHIFT; si->pt_base = 0; si->nr_pt_frames = 0; @@ -208,30 +196,31 @@ int construct_dom0(struct domain *d, v->arch.ctxt.gprs[1] = dst - STACK_FRAME_OVERHEAD; /* copy relative to Xen */ - dst += rmo; + dst += rma; extern int ofh_image_start[0]; extern int ofh_image_size[0]; - ASSERT((dst - rmo) + (ulong)ofh_image_size < eomem); - printk("loading OFH: 0x%lx, 0x%p\n", dst, ofh_image_size); + ASSERT((dst - rma) + (ulong)ofh_image_size < eomem); + printk("loading OFH: 0x%lx, RMA: 0x%lx\n", dst, dst - rma); memcpy((void *)dst, ofh_image_start, (ulong)ofh_image_size); - v->arch.ctxt.gprs[5] = (dst - rmo); + v->arch.ctxt.gprs[5] = (dst - rma); ofh_tree = (u64 *)(dst + 0x10); ASSERT(*ofh_tree == 0xdeadbeef00000000); /* accomodate for a modest bss section */ dst = ALIGN_UP(dst + (ulong)ofh_image_size + PAGE_SIZE, PAGE_SIZE); - ASSERT((dst - rmo) + oftree_len < eomem); - - *ofh_tree = dst - rmo; - printk("loading OFD: 0x%lx, 0x%lx\n", dst, oftree_len); + 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); - printk("loading Dom0: 0x%lx, in RMO:0x%lx\n", dst, dst - rmo); + printk("loading Dom0: 0x%lx, in RMA:0x%lx\n", dst, dst - rma); rm_loadelfimage(&dsi, dst); ulong kbase = dst; @@ -239,12 +228,12 @@ int construct_dom0(struct domain *d, /* move dst to end of bss */ dst = ALIGN_UP(dsi.v_kernend + dst, PAGE_SIZE); if ( initrd_len > 0 ) { - ASSERT( (dst - rmo) + image_len < eomem ); + 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); - si->mod_start = dst - rmo; + si->mod_start = dst - rma; si->mod_len = image_len; dst = ALIGN_UP(dst + initrd_len, PAGE_SIZE); @@ -274,10 +263,10 @@ int construct_dom0(struct domain *d, && ((fdesc[1] >= dsi.v_kernstart) /* toc can be greater than image */ && (fdesc[1] < (dsi.v_kernend + (0x7fff * sizeof (ulong)))))) { /* it is almost certainly a function descriptor */ - pc = RM_MASK(fdesc[0], 42) + kbase - rmo; - r2 = RM_MASK(fdesc[1], 42) + kbase - rmo; + pc = RM_MASK(fdesc[0], 42) + kbase - rma; + r2 = RM_MASK(fdesc[1], 42) + kbase - rma; } else { - pc = ((ulong)fdesc) - rmo; + pc = ((ulong)fdesc) - rma; r2 = 0; } @@ -286,7 +275,7 @@ int construct_dom0(struct domain *d, printk("DOM: pc = 0x%lx, r2 = 0x%lx\n", pc, r2); - ofd_dom0_fixup(d, *ofh_tree + rmo, si, dst); + ofd_dom0_fixup(d, *ofh_tree + rma, si, dst - rma); set_bit(_VCPUF_initialised, &v->vcpu_flags); diff -r 2389fd7700c5c9d251d0ce8f666d01c48cb13f55 -r 1bdd8ec03da55dd5d7a802a147d9e77d06d3a244 xen/arch/ppc/mm.c --- a/xen/arch/ppc/mm.c Thu Mar 30 18:38:23 2006 -0500 +++ b/xen/arch/ppc/mm.c Thu Mar 30 18:40:26 2006 -0500 @@ -100,32 +100,23 @@ extern void copy_page(void *dp, void *sp ulong pfn2mfn(struct domain *d, long pfn, int *type) { - ulong rmo_base_mfn = d->arch.rmo_base >> PAGE_SHIFT; - ulong rmo_len_mfn = d->arch.rmo_len >> PAGE_SHIFT; + ulong rma_base_mfn = d->arch.rma_base >> PAGE_SHIFT; + ulong rma_size_mfn = d->arch.rma_size >> PAGE_SHIFT; ulong mfn; int t; - if (pfn >= d->arch.shared_base_pfn && - pfn < (d->arch.shared_base_pfn + d->arch.shared_nr_pfn)) { - /* shared_info physical mapping (not machine address) is inside RMO, so - * need to test for it first. */ - mfn = d->arch.shared_pfn2mfn[pfn - d->arch.shared_base_pfn]; - if (mfn == 0) { - mfn = d->arch.shared_dummy_pfn; - } - t = PFN_TYPE_SHARED; - } else if (pfn < rmo_len_mfn) { - mfn = pfn + rmo_base_mfn; - t = PFN_TYPE_RMO; + if (pfn < rma_size_mfn) { + mfn = pfn + rma_base_mfn; + t = PFN_TYPE_RMA; } else if (pfn >= d->arch.logical_base_pfn && - pfn < d->arch.logical_end_pfn) { + pfn < d->arch.logical_end_pfn) { if (test_bit(_DOMF_privileged, &d->domain_flags)) { /* This hack allows dom0 to map all memory, necessary to * initialize domU state. */ mfn = pfn; } else { panic("we do not handle the logical area yet\n"); - mfn = 0; + mfn = 0; } t = PFN_TYPE_LOGICAL; diff -r 2389fd7700c5c9d251d0ce8f666d01c48cb13f55 -r 1bdd8ec03da55dd5d7a802a147d9e77d06d3a244 xen/arch/ppc/ofd_fixup.c --- a/xen/arch/ppc/ofd_fixup.c Thu Mar 30 18:38:23 2006 -0500 +++ b/xen/arch/ppc/ofd_fixup.c Thu Mar 30 18:40:26 2006 -0500 @@ -361,8 +361,8 @@ static ofdn_t ofd_memory_props(void *m, ofdn_t n = -1; ulong start = 0; static char name[] = "memory"; - ulong mem_size = d->arch.rmo_len; - ulong chunk_size = d->arch.rmo_len; + ulong mem_size = d->arch.rma_size; + ulong chunk_size = d->arch.rma_size; /* Remove all old memory props */ do { @@ -382,7 +382,7 @@ static ofdn_t ofd_memory_props(void *m, start, size); if (start == 0) { - /* We are processing the first and RMO chunk */ + /* We are processing the first and RMA chunk */ /* free list of physical addresses available after OF and * client program have been accounted for */ @@ -426,7 +426,7 @@ static ofdn_t ofd_xen_props(void *m, str if (n > 0) { char xen[256]; int xl; - u32 val; + u32 val[2]; ofd_prop_add(m, n, "name", &path[1], sizeof (path) - 1); @@ -435,22 +435,13 @@ static ofdn_t ofd_xen_props(void *m, str ASSERT(xl < sizeof (xen)); ofd_prop_add(m, n, "version", xen, xl + 1); - val = (ulong)si - d->arch.rmo_base; - ofd_prop_add(m, n, "start-info", &val, sizeof (val)); - val = PAGE_SIZE; - ofd_prop_add(m, n, "start-info-size", &val, sizeof (val)); - - /* the very last memory chunk is small and contains the PFNs - * that contain Xen uses for communication pages that coincide - * with the start_info page */ - /* its just 3 pages right now: - * 1. the shared page - * 2. the XenStore page - * 3. the console page, tho dom0 does not have one - */ - n = ofd_memory_chunk_create(m, n, "/xen", "shared", "xen-shared", - d->arch.shared_base_pfn << PAGE_SHIFT, - 3 << PAGE_SHIFT); + val[0] = (ulong)si - d->arch.rma_base; + val[1] = PAGE_SIZE; + ofd_prop_add(m, n, "start-info", val, sizeof (val)); + + val[1] = RMA_LAST_DOM0 * PAGE_SIZE; + val[0] = d->arch.rma_size - val[1]; + ofd_prop_add(m, n, "reserved", val, sizeof (val)); } return n; } diff -r 2389fd7700c5c9d251d0ce8f666d01c48cb13f55 -r 1bdd8ec03da55dd5d7a802a147d9e77d06d3a244 xen/arch/ppc/papr/xlate.c --- a/xen/arch/ppc/papr/xlate.c Thu Mar 30 18:38:23 2006 -0500 +++ b/xen/arch/ppc/papr/xlate.c Thu Mar 30 18:40:26 2006 -0500 @@ -191,14 +191,6 @@ static void h_enter(struct cpu_user_regs return; } } - if (mtype == PFN_TYPE_SHARED) { - /* this areas must be mapped with 4k pages */ - if (pte.bits.l) { - printk("%s: Large page in shared region: 0x%lx\n", __func__, lpn); - regs->gprs[3] = H_Parameter; - return; - } - } /* fixup the RPN field of our local PTE copy */ pte.bits.rpn = rpn | lp_bits; diff -r 2389fd7700c5c9d251d0ce8f666d01c48cb13f55 -r 1bdd8ec03da55dd5d7a802a147d9e77d06d3a244 xen/arch/ppc/ppc64/ppc970.c --- a/xen/arch/ppc/ppc64/ppc970.c Thu Mar 30 18:38:23 2006 -0500 +++ b/xen/arch/ppc/ppc64/ppc970.c Thu Mar 30 18:40:26 2006 -0500 @@ -94,20 +94,20 @@ void cpu_init_vcpu(struct vcpu *v) { struct domain *d = v->domain; union hid4 hid4; - ulong rmo_base = d->arch.rmo_base; - ulong rmo_size = d->arch.rmo_len; + ulong rma_base = d->arch.rma_base; + ulong rma_size = d->arch.rma_size; hid4.word = mfhid4(); hid4.bits.lpes0 = 0; /* exceptions go to hypervisor vectors */ - hid4.bits.lpes1 = 1; /* RMO applies */ + hid4.bits.lpes1 = 1; /* RMA applies */ - hid4.bits.rmor = rmo_base >> 26; + hid4.bits.rmor = rma_base >> 26; hid4.bits.lpid01 = d->domain_id & 3; hid4.bits.lpid25 = (d->domain_id >> 2) & 0xf; - switch (rmo_size) { + switch (rma_size) { case 256ULL << 30: /* 256 GB */ hid4.bits.rmlr0 = 0; hid4.bits.rmlr12 = 0; diff -r 2389fd7700c5c9d251d0ce8f666d01c48cb13f55 -r 1bdd8ec03da55dd5d7a802a147d9e77d06d3a244 xen/arch/ppc/usercopy.c --- a/xen/arch/ppc/usercopy.c Thu Mar 30 18:38:23 2006 -0500 +++ b/xen/arch/ppc/usercopy.c Thu Mar 30 18:40:26 2006 -0500 @@ -42,7 +42,7 @@ unsigned long paddr_to_maddr(unsigned lo pa = pfn2mfn(d, pfn, &mtype); switch (mtype) { - case PFN_TYPE_RMO: + case PFN_TYPE_RMA: case PFN_TYPE_LOGICAL: break; default: diff -r 2389fd7700c5c9d251d0ce8f666d01c48cb13f55 -r 1bdd8ec03da55dd5d7a802a147d9e77d06d3a244 xen/include/asm-ppc/domain.h --- a/xen/include/asm-ppc/domain.h Thu Mar 30 18:38:23 2006 -0500 +++ b/xen/include/asm-ppc/domain.h Thu Mar 30 18:40:26 2006 -0500 @@ -32,28 +32,12 @@ struct arch_domain { struct domain_htab htab; /* The RMO area is fixed to the domain and is accessible while the * processor is in real mode */ - ulong rmo_base; - ulong rmo_len; + ulong rma_base; + ulong rma_size; /* This is regular memory, only available thru translataion */ ulong logical_base_pfn; ulong logical_end_pfn; - - /* This is an area dedicated for cross-domain and hypervisor - * shared pages, only 4k PTE are allowed in this region. Since - * the domain is free to use large pages elsewhere is must be in - * its own segment on machines that do not allow mixing of page - * sizes in the segment */ - ulong shared_base_pfn; - ulong shared_nr_pfn; - ulong *shared_pfn2mfn; - - /* since most kernels map all of accessible memory in the kernel's - * address space, pages in the shared region that have no real - * page assigned get mapped to thsi dummy page. We should, every - * once in a while, check and make sure that this page stays clear - * becuase bad thing can happen if the domain actually uses it. */ - ulong shared_dummy_pfn; /* I/O-port access bitmap mask. */ u8 *iobmp_mask; /* Address of IO bitmap mask, or NULL. */ @@ -109,4 +93,16 @@ extern void load_float(struct vcpu *); #define arch_event_deliverable (!!((guest_cpu_user_regs())->msr & MSR_EE)) +#define RMA_SHARED_INFO 1 +#define RMA_START_INFO 2 +#define RMA_LAST_DOM0 2 +/* these are not used for dom0 so they should be last */ +#define RMA_CONSOLE 3 +#define RMA_LAST_DOMU 3 + +static inline ulong rma_addr(struct arch_domain *d, int type) +{ + return d->rma_size - (type * PAGE_SIZE); +} + #endif diff -r 2389fd7700c5c9d251d0ce8f666d01c48cb13f55 -r 1bdd8ec03da55dd5d7a802a147d9e77d06d3a244 xen/include/asm-ppc/mm.h --- a/xen/include/asm-ppc/mm.h Thu Mar 30 18:38:23 2006 -0500 +++ b/xen/include/asm-ppc/mm.h Thu Mar 30 18:40:26 2006 -0500 @@ -195,10 +195,9 @@ extern int update_grant_va_mapping(unsig extern void put_page_type(struct page_info *page); -#define PFN_TYPE_RMO 0 +#define PFN_TYPE_RMA 0 #define PFN_TYPE_LOGICAL 1 -#define PFN_TYPE_SHARED 2 -#define PFN_TYPE_IO 3 +#define PFN_TYPE_IO 2 extern ulong pfn2mfn(struct domain *d, long mfn, int *type); /* Arch-specific portion of memory_op hypercall. */ _______________________________________________ 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 |