> > 3) Useful when PPC must do page copies in place of 'page flipping'.
> 
> So you're saying we should worry about it later?


For the future, copy_page using dcbz:

diff -r 7669fca80bfc xen/arch/powerpc/mm.c
--- a/xen/arch/powerpc/mm.c     Mon Dec 04 11:46:53 2006 -0500
+++ b/xen/arch/powerpc/mm.c     Fri Dec 15 17:52:58 2006 -0500
@@ -280,7 +280,8 @@ extern void copy_page(void *dp, void *sp
     if (on_systemsim()) {
         systemsim_memcpy(dp, sp, PAGE_SIZE);
     } else {
-        memcpy(dp, sp, PAGE_SIZE);
+       clear_page(dp);
+       __copy_page(dp, sp);
     }
 }
 
diff -r 7669fca80bfc xen/include/asm-powerpc/page.h
--- a/xen/include/asm-powerpc/page.h    Mon Dec 04 11:46:53 2006 -0500
+++ b/xen/include/asm-powerpc/page.h    Fri Dec 15 17:52:58 2006 -0500
@@ -90,6 +90,25 @@ 1:  dcbz    0,%0\n\
 
 extern void copy_page(void *dp, void *sp);
 
+static __inline__ void __copy_page(void *dp, void *sp)
+{
+       ulong dwords, dword_size;
+
+       dword_size = 8;
+       dwords = (PAGE_SIZE / dword_size) - 1;
+
+       __asm__ __volatile__(
+       "mtctr  %2      # copy_page\n\
+       ld      %2,0(%1)\n\
+       std     %2,0(%0)\n\
+1:     ldu     %2,8(%1)\n\
+       stdu    %2,8(%0)\n\
+       bdnz    1b"
+       : /* no result */
+       : "r" (dp), "r" (sp), "r" (dwords)
+       : "%ctr", "memory");
+}
+
 #define linear_pg_table linear_l1_table
 
 static inline int get_order(unsigned long size)


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

Reply via email to