• Home
  • History
  • Annotate
  • Line#
  • Navigate
  • Raw
  • Download
  • only in /asuswrt-rt-n18u-9.0.0.4.380.2695/release/src-rt-6.x.4708/linux/linux-2.6.36/arch/arm/mm/
1/*
2 *  linux/arch/arm/mm/copypage-v3.c
3 *
4 *  Copyright (C) 1995-1999 Russell King
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2 as
8 * published by the Free Software Foundation.
9 */
10#include <linux/init.h>
11#include <linux/highmem.h>
12
13static void __naked
14v3_copy_user_page(void *kto, const void *kfrom)
15{
16	asm("\n\
17	stmfd	sp!, {r4, lr}			@	2\n\
18	mov	r2, %2				@	1\n\
19	ldmia	%0!, {r3, r4, ip, lr}		@	4+1\n\
201:	stmia	%1!, {r3, r4, ip, lr}		@	4\n\
21	ldmia	%0!, {r3, r4, ip, lr}		@	4+1\n\
22	stmia	%1!, {r3, r4, ip, lr}		@	4\n\
23	ldmia	%0!, {r3, r4, ip, lr}		@	4+1\n\
24	stmia	%1!, {r3, r4, ip, lr}		@	4\n\
25	ldmia	%0!, {r3, r4, ip, lr}		@	4\n\
26	subs	r2, r2, #1			@	1\n\
27	stmia	%1!, {r3, r4, ip, lr}		@	4\n\
28	ldmneia	%0!, {r3, r4, ip, lr}		@	4\n\
29	bne	1b				@	1\n\
30	ldmfd	sp!, {r4, pc}			@	3"
31	:
32	: "r" (kfrom), "r" (kto), "I" (PAGE_SIZE / 64));
33}
34
35void v3_copy_user_highpage(struct page *to, struct page *from,
36	unsigned long vaddr, struct vm_area_struct *vma)
37{
38	void *kto, *kfrom;
39
40	kto = kmap_atomic(to, KM_USER0);
41	kfrom = kmap_atomic(from, KM_USER1);
42	v3_copy_user_page(kto, kfrom);
43	kunmap_atomic(kfrom, KM_USER1);
44	kunmap_atomic(kto, KM_USER0);
45}
46
47void v3_clear_user_highpage(struct page *page, unsigned long vaddr)
48{
49	void *ptr, *kaddr = kmap_atomic(page, KM_USER0);
50	asm volatile("\n\
51	mov	r1, %2				@ 1\n\
52	mov	r2, #0				@ 1\n\
53	mov	r3, #0				@ 1\n\
54	mov	ip, #0				@ 1\n\
55	mov	lr, #0				@ 1\n\
561:	stmia	%0!, {r2, r3, ip, lr}		@ 4\n\
57	stmia	%0!, {r2, r3, ip, lr}		@ 4\n\
58	stmia	%0!, {r2, r3, ip, lr}		@ 4\n\
59	stmia	%0!, {r2, r3, ip, lr}		@ 4\n\
60	subs	r1, r1, #1			@ 1\n\
61	bne	1b				@ 1"
62	: "=r" (ptr)
63	: "0" (kaddr), "I" (PAGE_SIZE / 64)
64	: "r1", "r2", "r3", "ip", "lr");
65	kunmap_atomic(kaddr, KM_USER0);
66}
67
68struct cpu_user_fns v3_user_fns __initdata = {
69	.cpu_clear_user_highpage = v3_clear_user_highpage,
70	.cpu_copy_user_highpage	= v3_copy_user_highpage,
71};
72