[ARM] clearpage: provide our own clear_user_highpage()
[safe/jmp/linux-2.6] / arch / arm / mm / copypage-v4wt.c
index 86c2cfd..b8a345d 100644 (file)
@@ -60,29 +60,29 @@ void v4wt_copy_user_highpage(struct page *to, struct page *from,
  *
  * Same story as above.
  */
-void __attribute__((naked))
-v4wt_clear_user_page(void *kaddr, unsigned long vaddr)
+void v4wt_clear_user_highpage(struct page *page, unsigned long vaddr)
 {
+       void *kaddr = kmap_atomic(page, KM_USER0);
        asm("\
-       str     lr, [sp, #-4]!\n\
-       mov     r1, %0                          @ 1\n\
+       mov     r1, %1                          @ 1\n\
        mov     r2, #0                          @ 1\n\
        mov     r3, #0                          @ 1\n\
        mov     ip, #0                          @ 1\n\
        mov     lr, #0                          @ 1\n\
-1:     stmia   r0!, {r2, r3, ip, lr}           @ 4\n\
-       stmia   r0!, {r2, r3, ip, lr}           @ 4\n\
-       stmia   r0!, {r2, r3, ip, lr}           @ 4\n\
-       stmia   r0!, {r2, r3, ip, lr}           @ 4\n\
+1:     stmia   %0!, {r2, r3, ip, lr}           @ 4\n\
+       stmia   %0!, {r2, r3, ip, lr}           @ 4\n\
+       stmia   %0!, {r2, r3, ip, lr}           @ 4\n\
+       stmia   %0!, {r2, r3, ip, lr}           @ 4\n\
        subs    r1, r1, #1                      @ 1\n\
        bne     1b                              @ 1\n\
-       mcr     p15, 0, r2, c7, c7, 0           @ flush ID cache\n\
-       ldr     pc, [sp], #4"
+       mcr     p15, 0, r2, c7, c7, 0           @ flush ID cache"
        :
-       : "I" (PAGE_SIZE / 64));
+       : "r" (kaddr), "I" (PAGE_SIZE / 64)
+       : "r1", "r2", "r3", "ip", "lr");
+       kunmap_atomic(kaddr, KM_USER0);
 }
 
 struct cpu_user_fns v4wt_user_fns __initdata = {
-       .cpu_clear_user_page    = v4wt_clear_user_page,
+       .cpu_clear_user_highpage = v4wt_clear_user_highpage,
        .cpu_copy_user_highpage = v4wt_copy_user_highpage,
 };