WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-ppc-devel

[XenPPC] [xenppc-unstable] [POWERPC] correctly allocate domain memory

To: xen-ppc-devel@xxxxxxxxxxxxxxxxxxx
Subject: [XenPPC] [xenppc-unstable] [POWERPC] correctly allocate domain memory
From: Xen patchbot-xenppc-unstable <patchbot-xenppc-unstable@xxxxxxxxxxxxxxxxxxx>
Date: Wed, 02 Aug 2006 19:00:49 +0000
Delivery-date: Wed, 02 Aug 2006 12:09:09 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-ppc-devel-request@lists.xensource.com?subject=help>
List-id: Xen PPC development <xen-ppc-devel.lists.xensource.com>
List-post: <mailto:xen-ppc-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-ppc-devel>, <mailto:xen-ppc-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-ppc-devel>, <mailto:xen-ppc-devel-request@lists.xensource.com?subject=unsubscribe>
Reply-to: xen-ppc-devel@xxxxxxxxxxxxxxxxxxx
Sender: xen-ppc-devel-bounces@xxxxxxxxxxxxxxxxxxx
# HG changeset patch
# User Hollis Blanchard <hollisb@xxxxxxxxxx>
# Node ID 85a5d108cbf79055c96e021b8bd41b5d613913c2
# Parent  7f21d87ec95d093d58bbc05c0b38292202ffe079
[POWERPC] correctly allocate domain memory
- allocate domain RMA in arch_domain_create()
- allocate domain RMA with alloc_domheap_pages()
- replace DOM0_GETMEMLIST hack
Signed-off-by: Hollis Blanchard <hollisb@xxxxxxxxxx>
---
 xen/arch/powerpc/dom0_ops.c         |   43 +++++++++++++++++++++++++-----------
 xen/arch/powerpc/domain.c           |   29 ++++++++++++++++++------
 xen/arch/powerpc/powerpc64/ppc970.c |    7 +++++
 xen/include/asm-powerpc/processor.h |    1 
 4 files changed, 59 insertions(+), 21 deletions(-)

diff -r 7f21d87ec95d -r 85a5d108cbf7 xen/arch/powerpc/dom0_ops.c
--- a/xen/arch/powerpc/dom0_ops.c       Mon Jul 31 12:08:13 2006 -0500
+++ b/xen/arch/powerpc/dom0_ops.c       Wed Aug 02 13:49:50 2006 -0500
@@ -40,23 +40,40 @@ long arch_do_dom0_op(struct dom0_op *op,
     long ret = 0;
 
     switch (op->cmd) {
-    case DOM0_GETMEMLIST: {
-        /* XXX 64M hackage */
-        const int memsize = (64UL<<20);
-        int domain_pfns = memsize>>12;
-        int max_pfns = op->u.getmemlist.max_pfns;
-        int domid = op->u.getmemlist.domain;
+    case DOM0_GETMEMLIST:
+    {
         int i;
+        struct domain *d = find_domain_by_id(op->u.getmemlist.domain);
+        unsigned long max_pfns = op->u.getmemlist.max_pfns;
+        xen_pfn_t mfn;
+        struct list_head *list_ent;
 
-        for (i = 0; (i < max_pfns) && (i < domain_pfns); i++) {
-            xen_pfn_t mfn = (((domid + 1) * memsize) >> 12) + i;
-            if (copy_to_guest_offset(op->u.getmemlist.buffer, i, &mfn, 1)) {
-                ret = -EFAULT;
-                break;
+        ret = -EINVAL;
+        if ( d != NULL )
+        {
+            ret = 0;
+
+            spin_lock(&d->page_alloc_lock);
+            list_ent = d->page_list.next;
+            for ( i = 0; (i < max_pfns) && (list_ent != &d->page_list); i++ )
+            {
+                mfn = page_to_mfn(list_entry(
+                    list_ent, struct page_info, list));
+                if ( copy_to_guest_offset(op->u.getmemlist.buffer,
+                                          i, &mfn, 1) )
+                {
+                    ret = -EFAULT;
+                    break;
+                }
+                list_ent = mfn_to_page(mfn)->list.next;
             }
+            spin_unlock(&d->page_alloc_lock);
+
+            op->u.getmemlist.num_pfns = i;
+            copy_to_guest(u_dom0_op, op, 1);
+            
+            put_domain(d);
         }
-        op->u.getmemlist.num_pfns = i;
-        copy_to_guest(u_dom0_op, op, 1);
     }
     break;
 
diff -r 7f21d87ec95d -r 85a5d108cbf7 xen/arch/powerpc/domain.c
--- a/xen/arch/powerpc/domain.c Mon Jul 31 12:08:13 2006 -0500
+++ b/xen/arch/powerpc/domain.c Wed Aug 02 13:49:50 2006 -0500
@@ -73,6 +73,10 @@ unsigned long hypercall_create_continuat
 
 int arch_domain_create(struct domain *d)
 {
+    struct page_info *rma;
+    unsigned long rma_base;
+    unsigned long rma_size;
+    unsigned int rma_order;
 
     if (d->domain_id == IDLE_DOMAIN_ID) {
         d->shared_info = (void *)alloc_xenheap_page();
@@ -81,17 +85,28 @@ int arch_domain_create(struct domain *d)
         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);
+    rma_order = cpu_rma_order();
+    rma_size = 1UL << rma_order << PAGE_SHIFT;
+
+    /* allocate the real mode area */
+    d->max_pages = 1UL << rma_order;
+    rma = alloc_domheap_pages(d, rma_order, 0);
+    if (NULL == rma)
+        return 1;
+    rma_base = page_to_maddr(rma);
+
+    BUG_ON(rma_base & (rma_size-1)); /* check alignment */
+
+    d->arch.rma_base = rma_base;
+    d->arch.rma_size = rma_size;
+
+    printk("clearing RMO: 0x%lx[0x%lx]\n", rma_base, rma_size);
+    memset((void *)rma_base, 0, rma_size);
 
     htab_alloc(d, LOG_DEFAULT_HTAB_BYTES);
 
     d->shared_info = (shared_info_t *)
-        (rma_addr(&d->arch, RMA_SHARED_INFO) + d->arch.rma_base);
+        (rma_addr(&d->arch, RMA_SHARED_INFO) + rma_base);
 
     d->arch.large_page_sizes = 1;
     d->arch.large_page_shift[0] = 24; /* 16 M for 970s */
diff -r 7f21d87ec95d -r 85a5d108cbf7 xen/arch/powerpc/powerpc64/ppc970.c
--- a/xen/arch/powerpc/powerpc64/ppc970.c       Mon Jul 31 12:08:13 2006 -0500
+++ b/xen/arch/powerpc/powerpc64/ppc970.c       Wed Aug 02 13:49:50 2006 -0500
@@ -30,6 +30,12 @@
 #include <asm/powerpc64/ppc970-hid.h>
 
 #undef SERIALIZE
+
+unsigned int cpu_rma_order(void)
+{
+    /* XXX what about non-HV mode? */
+    return 14; /* 1<<14<<PAGE_SIZE = 64M */
+}
 
 void cpu_initialize(void)
 {
@@ -102,7 +108,6 @@ void cpu_initialize(void)
     mthid5(hid5.word);
 
     __asm__ __volatile__("isync; slbia; isync" : : : "memory");
-    
 }
 
 void cpu_init_vcpu(struct vcpu *v)
diff -r 7f21d87ec95d -r 85a5d108cbf7 xen/include/asm-powerpc/processor.h
--- a/xen/include/asm-powerpc/processor.h       Mon Jul 31 12:08:13 2006 -0500
+++ b/xen/include/asm-powerpc/processor.h       Wed Aug 02 13:49:50 2006 -0500
@@ -39,6 +39,7 @@ struct cpu_user_regs;
 struct cpu_user_regs;
 extern void show_registers(struct cpu_user_regs *);
 extern void show_execution_state(struct cpu_user_regs *);
+extern unsigned int cpu_rma_order(void);
 extern void cpu_initialize(void);
 extern void cpu_init_vcpu(struct vcpu *);
 extern void save_cpu_sprs(struct vcpu *);

_______________________________________________
Xen-ppc-devel mailing list
Xen-ppc-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-ppc-devel

<Prev in Thread] Current Thread [Next in Thread>
  • [XenPPC] [xenppc-unstable] [POWERPC] correctly allocate domain memory, Xen patchbot-xenppc-unstable <=