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] [PATCH 5 of 6] [PATCH] xen: add machine_to_phys table for ppc

To: xen-ppc-devel@xxxxxxxxxxxxxxxxxxx
Subject: [XenPPC] [PATCH 5 of 6] [PATCH] xen: add machine_to_phys table for ppc
From: Ryan Harper <ryanh@xxxxxxxxxx>
Date: Wed, 21 Feb 2007 18:17:03 -0500
Delivery-date: Wed, 21 Feb 2007 16:16:24 -0800
Envelope-to: www-data@xxxxxxxxxxxxxxxxxx
In-reply-to: <patchbomb.1172103418@xxxxxxxxxxxxxxxxxxxxx>
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>
Sender: xen-ppc-devel-bounces@xxxxxxxxxxxxxxxxxxx
3 files changed, 43 insertions(+), 28 deletions(-)
xen/arch/powerpc/memory.c    |    1 
xen/arch/powerpc/mm.c        |   56 ++++++++++++++++++++++++++----------------
xen/include/asm-powerpc/mm.h |   14 +++++-----


# HG changeset patch
# User Ryan Harper <ryanh@xxxxxxxxxx>
# Date 1172103252 21600
# Node ID 82803360d949f547abfd7601177ecd836e492e36
# Parent  33f05ec503bfabccd119f06b30037b618f8d05b9
[PATCH] xen: add machine_to_phys table for ppc

Signed-off-by: Ryan Harper <ryanh@xxxxxxxxxx>

ediff -r a9398ae1c634 xen/arch/powerpc/memory.c

diff -r 33f05ec503bf -r 82803360d949 xen/arch/powerpc/memory.c
--- a/xen/arch/powerpc/memory.c Wed Feb 21 18:14:12 2007 -0600
+++ b/xen/arch/powerpc/memory.c Wed Feb 21 18:14:12 2007 -0600
@@ -176,6 +176,7 @@ void memory_init(module_t *mod, int mcou
     DBG("total_pages: 0x%016lx\n", total_pages);
 
     init_frametable();
+    init_machine_to_phys_table();
 
     numa_initmem_init(0, max_page);
 
diff -r 33f05ec503bf -r 82803360d949 xen/arch/powerpc/mm.c
--- a/xen/arch/powerpc/mm.c     Wed Feb 21 18:14:12 2007 -0600
+++ b/xen/arch/powerpc/mm.c     Wed Feb 21 18:14:12 2007 -0600
@@ -43,6 +43,9 @@ unsigned long max_page;
 unsigned long max_page;
 unsigned long total_pages;
 
+/* machine to phys mapping to used by all domains */
+unsigned long *machine_phys_mapping;
+
 void __init init_frametable(void)
 {
     unsigned long p;
@@ -58,6 +61,25 @@ void __init init_frametable(void)
     frame_table = (struct page_info *)(p << PAGE_SHIFT);
     for (i = 0; i < nr_pages; i += 1)
         clear_page((void *)((p + i) << PAGE_SHIFT));
+}
+
+/* array of pfns, indexed by mfn */
+void __init init_machine_to_phys_table(void)
+{
+    unsigned long p;
+    unsigned long nr_pages;
+    int i;
+
+    nr_pages = PFN_UP(max_page * sizeof(unsigned long));
+
+    p = alloc_boot_pages(nr_pages, 1);
+    if (p == 0)
+        panic("Not enough memory for machine phys mapping table\n");
+
+    machine_phys_mapping = (unsigned long *)(p << PAGE_SHIFT);
+    for (i = 0; i < nr_pages; i += 1)
+        clear_page((void *)((p + i) << PAGE_SHIFT));
+
 }
 
 void share_xen_page_with_guest(
@@ -489,10 +511,12 @@ ulong pfn2mfn(struct domain *d, ulong pf
 /* mfn_to_pfn */
 unsigned long mfn_to_gmfn(struct domain *d, unsigned long mfn)
 {
-    ulong cur_pfn;
+    struct page_info *pg = mfn_to_page(mfn);
     ulong gnttab_mfn;
-    ulong rma_mfn;
-    uint ext_nrpages = (1 << cpu_extent_order());
+
+    /* is this our mfn? */
+    if ( page_get_owner(pg) != d )
+        return INVALID_M2P_ENTRY;
 
     /* grant? */
     gnttab_mfn = gnttab_shared_mfn(d, d->grant_table, 0);
@@ -503,22 +527,8 @@ unsigned long mfn_to_gmfn(struct domain 
     if (d->is_privileged && cpu_io_mfn(mfn))
         return mfn;
 
-    rma_mfn = page_to_mfn(d->arch.rma_page);
-    if (mfn >= rma_mfn &&
-        mfn < (rma_mfn + (1 << d->arch.rma_order)))
-        return mfn - rma_mfn;
-
-    /* check extents (cpu-defined contiguous chunks after RMA) */
-    cur_pfn = 1UL << d->arch.rma_order; /* start looking after RMA */
-    for ( ; cur_pfn < d->max_pages; cur_pfn += ext_nrpages )
-    {
-        uint b_mfn = d->arch.p2m[cur_pfn];
-        uint e_mfn = b_mfn + ext_nrpages;
-
-        if (mfn >= b_mfn && mfn < e_mfn)
-            return cur_pfn + (mfn - b_mfn);
-    }
-    return INVALID_M2P_ENTRY;
+    /* check m2p table */
+    return get_gpfn_from_mfn(mfn);
 }
 
 void guest_physmap_add_page(
@@ -543,8 +553,10 @@ void guest_physmap_add_page(
         printk("Ack! PFN aliased. pfn%lx, old mfn=%lx, new mfn=%lx\n",
                 gpfn, d->arch.p2m[gpfn], mfn);
 
-    /* pfn and mfn ok, map it */
+    /* pfn and mfn ok, map p2m */
     d->arch.p2m[gpfn] = mfn;
+    /* map m2p */
+    set_gpfn_from_mfn(mfn, gpfn);
 }
 
 void guest_physmap_remove_page(
@@ -562,8 +574,10 @@ void guest_physmap_remove_page(
         return;
     }
 
-    /* pfn and mfn ok, unmap it */
+    /* pfn and mfn ok, unmap p2m */
     d->arch.p2m[gpfn] = INVALID_MFN;
+    /* unmap m2p */
+    set_gpfn_from_mfn(mfn, INVALID_M2P_ENTRY);
 }
 
 void shadow_drop_references(
diff -r 33f05ec503bf -r 82803360d949 xen/include/asm-powerpc/mm.h
--- a/xen/include/asm-powerpc/mm.h      Wed Feb 21 18:14:12 2007 -0600
+++ b/xen/include/asm-powerpc/mm.h      Wed Feb 21 18:14:12 2007 -0600
@@ -145,6 +145,7 @@ extern unsigned long max_page;
 extern unsigned long max_page;
 extern unsigned long total_pages;
 void init_frametable(void);
+void init_machine_to_phys_table(void);
 void free_rma_check(struct page_info *page);
 
 static inline void put_page(struct page_info *page)
@@ -226,14 +227,13 @@ typedef struct {
 } vm_assist_info_t;
 extern vm_assist_info_t vm_assist_info[];
 
-
-/* hope that accesses to this will fail spectacularly */
-#undef machine_to_phys_mapping
+extern unsigned long *machine_phys_mapping;
+#define machine_to_phys_mapping  (machine_phys_mapping)
 #define INVALID_M2P_ENTRY        (~0UL)
-
-/* do nothing, its all calculated */
-#define set_gpfn_from_mfn(mfn, pfn) do { } while (0)
-#define get_gpfn_from_mfn(mfn) (mfn)
+#define VALID_M2P(_e)            (!((_e) & (1UL<<(BITS_PER_LONG-1))))
+
+#define set_gpfn_from_mfn(mfn, pfn) (machine_to_phys_mapping[(mfn)] = (pfn))
+#define get_gpfn_from_mfn(mfn)      (machine_to_phys_mapping[(mfn)])
 
 extern unsigned long mfn_to_gmfn(struct domain *d, unsigned long mfn);
 

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

<Prev in Thread] Current Thread [Next in Thread>