[PARISC] Add parisc implementation of flush_kernel_dcache_page()
[linux-2.6.git] / arch / parisc / kernel / pacache.S
index 71ade44..7a4f07e 100644 (file)
@@ -26,7 +26,7 @@
  *       can be used.
  */
 
-#ifdef __LP64__
+#ifdef CONFIG_64BIT
 #define ADDIB  addib,*
 #define CMPB   cmpb,*
 #define ANDCM  andcm,*
@@ -40,6 +40,8 @@
        .level  2.0
 #endif
 
+#include <linux/config.h>
+
 #include <asm/psw.h>
 #include <asm/assembly.h>
 #include <asm/pgtable.h>
@@ -225,7 +227,7 @@ flush_instruction_cache_local:
 
 fimanyloop:                                    /* Loop if LOOP >= 2 */
        ADDIB>          -1, %r31, fimanyloop    /* Adjusted inner loop decr */
-       fice            0(%sr1, %arg0)
+       fice            %r0(%sr1, %arg0)
        fice,m          %arg1(%sr1, %arg0)      /* Last fice and addr adjust */
        movb,tr         %arg3, %r31, fimanyloop /* Re-init inner loop count */
        ADDIB<=,n       -1, %arg2, fisync       /* Outer loop decr */
@@ -267,7 +269,7 @@ flush_data_cache_local:
 
 fdmanyloop:                                    /* Loop if LOOP >= 2 */
        ADDIB>          -1, %r31, fdmanyloop    /* Adjusted inner loop decr */
-       fdce            0(%sr1, %arg0)
+       fdce            %r0(%sr1, %arg0)
        fdce,m          %arg1(%sr1, %arg0)      /* Last fdce and addr adjust */
        movb,tr         %arg3, %r31, fdmanyloop /* Re-init inner loop count */
        ADDIB<=,n       -1, %arg2, fdsync       /* Outer loop decr */
@@ -294,7 +296,7 @@ copy_user_page_asm:
        .callinfo NO_CALLS
        .entry
 
-#ifdef __LP64__
+#ifdef CONFIG_64BIT
        /* PA8x00 CPUs can consume 2 loads or 1 store per cycle.
         * Unroll the loop by hand and arrange insn appropriately.
         * GCC probably can do this just as well.
@@ -349,7 +351,11 @@ copy_user_page_asm:
        std             %r22, 120(%r26)
        ldo             128(%r26), %r26
 
-       ADDIB>          -1, %r1, 1b             /* bundle 10 */
+       /* conditional branches nullify on forward taken branch, and on
+        * non-taken backward branch. Note that .+4 is a backwards branch.
+        * The ldd should only get executed if the branch is taken.
+        */
+       ADDIB>,n        -1, %r1, 1b             /* bundle 10 */
        ldd             0(%r25), %r19           /* start next loads */
 
 #else
@@ -361,10 +367,10 @@ copy_user_page_asm:
         * the full 64 bit register values on interrupt, we can't
         * use ldd/std on a 32 bit kernel.
         */
+       ldw             0(%r25), %r19
        ldi             64, %r1         /* PAGE_SIZE/64 == 64 */
 
 1:
-       ldw             0(%r25), %r19
        ldw             4(%r25), %r20
        ldw             8(%r25), %r21
        ldw             12(%r25), %r22
@@ -394,11 +400,12 @@ copy_user_page_asm:
        ldw             60(%r25), %r22
        stw             %r19, 48(%r26)
        stw             %r20, 52(%r26)
+       ldo             64(%r25), %r25
        stw             %r21, 56(%r26)
        stw             %r22, 60(%r26)
        ldo             64(%r26), %r26
-       ADDIB>          -1, %r1, 1b
-       ldo             64(%r25), %r25
+       ADDIB>,n        -1, %r1, 1b
+       ldw             0(%r25), %r19
 #endif
        bv              %r0(%r2)
        nop
@@ -454,7 +461,7 @@ copy_user_page_asm:
        sub             %r25, %r1, %r23         /* move physical addr into non shadowed reg */
 
        ldil            L%(TMPALIAS_MAP_START), %r28
-#ifdef __LP64__
+#ifdef CONFIG_64BIT
        extrd,u         %r26,56,32, %r26                /* convert phys addr to tlb insert format */
        extrd,u         %r23,56,32, %r23                /* convert phys addr to tlb insert format */
        depd            %r24,63,22, %r28                /* Form aliased virtual address 'to' */
@@ -541,7 +548,7 @@ __clear_user_page_asm:
        tophys_r1       %r26
 
        ldil            L%(TMPALIAS_MAP_START), %r28
-#ifdef __LP64__
+#ifdef CONFIG_64BIT
 #if (TMPALIAS_MAP_START >= 0x80000000)
        depdi           0, 31,32, %r28          /* clear any sign extension */
 #endif
@@ -558,7 +565,7 @@ __clear_user_page_asm:
 
        pdtlb           0(%r28)
 
-#ifdef __LP64__
+#ifdef CONFIG_64BIT
        ldi             32, %r1                 /* PAGE_SIZE/128 == 32 */
 
        /* PREFETCH (Write) has not (yet) been proven to help here */
@@ -583,7 +590,7 @@ __clear_user_page_asm:
        ADDIB>          -1, %r1, 1b
        ldo             128(%r28), %r28
 
-#else  /* ! __LP64 */
+#else  /* ! CONFIG_64BIT */
 
        ldi             64, %r1                 /* PAGE_SIZE/64 == 64 */
 
@@ -606,7 +613,7 @@ __clear_user_page_asm:
        stw             %r0, 60(%r28)
        ADDIB>          -1, %r1, 1b
        ldo             64(%r28), %r28
-#endif /* __LP64 */
+#endif /* CONFIG_64BIT */
 
        bv              %r0(%r2)
        nop
@@ -614,9 +621,9 @@ __clear_user_page_asm:
 
        .procend
 
-       .export flush_kernel_dcache_page
+       .export flush_kernel_dcache_page_asm
 
-flush_kernel_dcache_page:
+flush_kernel_dcache_page_asm:
        .proc
        .callinfo NO_CALLS
        .entry
@@ -624,7 +631,7 @@ flush_kernel_dcache_page:
        ldil            L%dcache_stride, %r1
        ldw             R%dcache_stride(%r1), %r23
 
-#ifdef __LP64__
+#ifdef CONFIG_64BIT
        depdi,z         1, 63-PAGE_SHIFT,1, %r25
 #else
        depwi,z         1, 31-PAGE_SHIFT,1, %r25
@@ -668,7 +675,7 @@ flush_user_dcache_page:
        ldil            L%dcache_stride, %r1
        ldw             R%dcache_stride(%r1), %r23
 
-#ifdef __LP64__
+#ifdef CONFIG_64BIT
        depdi,z         1,63-PAGE_SHIFT,1, %r25
 #else
        depwi,z         1,31-PAGE_SHIFT,1, %r25
@@ -712,7 +719,7 @@ flush_user_icache_page:
        ldil            L%dcache_stride, %r1
        ldw             R%dcache_stride(%r1), %r23
 
-#ifdef __LP64__
+#ifdef CONFIG_64BIT
        depdi,z         1, 63-PAGE_SHIFT,1, %r25
 #else
        depwi,z         1, 31-PAGE_SHIFT,1, %r25
@@ -757,7 +764,7 @@ purge_kernel_dcache_page:
        ldil            L%dcache_stride, %r1
        ldw             R%dcache_stride(%r1), %r23
 
-#ifdef __LP64__
+#ifdef CONFIG_64BIT
        depdi,z         1, 63-PAGE_SHIFT,1, %r25
 #else
        depwi,z         1, 31-PAGE_SHIFT,1, %r25
@@ -805,7 +812,7 @@ flush_alias_page:
        tophys_r1               %r26
 
        ldil            L%(TMPALIAS_MAP_START), %r28
-#ifdef __LP64__
+#ifdef CONFIG_64BIT
        extrd,u         %r26, 56,32, %r26       /* convert phys addr to tlb insert format */
        depd            %r25, 63,22, %r28       /* Form aliased virtual address 'to' */
        depdi           0, 63,12, %r28          /* Clear any offset bits */
@@ -822,7 +829,7 @@ flush_alias_page:
        ldil            L%dcache_stride, %r1
        ldw             R%dcache_stride(%r1), %r23
 
-#ifdef __LP64__
+#ifdef CONFIG_64BIT
        depdi,z         1, 63-PAGE_SHIFT,1, %r29
 #else
        depwi,z         1, 31-PAGE_SHIFT,1, %r29
@@ -933,7 +940,7 @@ flush_kernel_icache_page:
        ldil            L%icache_stride, %r1
        ldw             R%icache_stride(%r1), %r23
 
-#ifdef __LP64__
+#ifdef CONFIG_64BIT
        depdi,z         1, 63-PAGE_SHIFT,1, %r25
 #else
        depwi,z         1, 31-PAGE_SHIFT,1, %r25
@@ -942,23 +949,23 @@ flush_kernel_icache_page:
        sub             %r25, %r23, %r25
 
 
-1:      fic,m          %r23(%r26)
-       fic,m           %r23(%r26)
-       fic,m           %r23(%r26)
-       fic,m           %r23(%r26)
-       fic,m           %r23(%r26)
-       fic,m           %r23(%r26)
-       fic,m           %r23(%r26)
-       fic,m           %r23(%r26)
-       fic,m           %r23(%r26)
-       fic,m           %r23(%r26)
-       fic,m           %r23(%r26)
-       fic,m           %r23(%r26)
-       fic,m           %r23(%r26)
-       fic,m           %r23(%r26)
-       fic,m           %r23(%r26)
+1:      fic,m          %r23(%sr4, %r26)
+       fic,m           %r23(%sr4, %r26)
+       fic,m           %r23(%sr4, %r26)
+       fic,m           %r23(%sr4, %r26)
+       fic,m           %r23(%sr4, %r26)
+       fic,m           %r23(%sr4, %r26)
+       fic,m           %r23(%sr4, %r26)
+       fic,m           %r23(%sr4, %r26)
+       fic,m           %r23(%sr4, %r26)
+       fic,m           %r23(%sr4, %r26)
+       fic,m           %r23(%sr4, %r26)
+       fic,m           %r23(%sr4, %r26)
+       fic,m           %r23(%sr4, %r26)
+       fic,m           %r23(%sr4, %r26)
+       fic,m           %r23(%sr4, %r26)
        CMPB<<          %r26, %r25, 1b
-       fic,m           %r23(%r26)
+       fic,m           %r23(%sr4, %r26)
 
        sync
        bv              %r0(%r2)
@@ -980,7 +987,7 @@ flush_kernel_icache_range_asm:
        ANDCM           %r26, %r21, %r26
 
 1:      CMPB<<,n       %r26, %r25, 1b
-       fic,m           %r23(%r26)
+       fic,m           %r23(%sr4, %r26)
 
        sync
        bv              %r0(%r2)