• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1/*
2 * __clear_user_page, __clear_user, clear_page implementation of SuperH
3 *
4 * Copyright (C) 2001  Kaz Kojima
5 * Copyright (C) 2001, 2002  Niibe Yutaka
6 * Copyright (C) 2006  Paul Mundt
7 */
8#include <linux/linkage.h>
9#include <asm/page.h>
10
11/*
12 * clear_page
13 * @to: P1 address
14 *
15 * void clear_page(void *to)
16 */
17
18/*
19 * r0 --- scratch
20 * r4 --- to
21 * r5 --- to + PAGE_SIZE
22 */
23ENTRY(clear_page)
24	mov	r4,r5
25	mov.l	.Llimit,r0
26	add	r0,r5
27	mov	#0,r0
28	!
291:
30#if defined(CONFIG_CPU_SH4)
31	movca.l	r0,@r4
32	mov	r4,r1
33#else
34	mov.l	r0,@r4
35#endif
36	add	#32,r4
37	mov.l	r0,@-r4
38	mov.l	r0,@-r4
39	mov.l	r0,@-r4
40	mov.l	r0,@-r4
41	mov.l	r0,@-r4
42	mov.l	r0,@-r4
43	mov.l	r0,@-r4
44#if defined(CONFIG_CPU_SH4)
45	ocbwb	@r1
46#endif
47	cmp/eq	r5,r4
48	bf/s	1b
49	 add	#28,r4
50	!
51	rts
52	 nop
53
54	.balign 4
55.Llimit:	.long	(PAGE_SIZE-28)
56
57ENTRY(__clear_user)
58	!
59	mov	#0, r0
60	mov	#0xe0, r1	! 0xffffffe0
61	!
62	! r4..(r4+31)&~32 	   -------- not aligned	[ Area 0 ]
63	! (r4+31)&~32..(r4+r5)&~32 -------- aligned	[ Area 1 ]
64	! (r4+r5)&~32..r4+r5       -------- not aligned	[ Area 2 ]
65	!
66	! Clear area 0
67	mov	r4, r2
68	!
69	tst	r1, r5		! length < 32
70	bt	.Larea2		! skip to remainder
71	!
72	add	#31, r2
73	and	r1, r2
74	cmp/eq	r4, r2
75	bt	.Larea1
76	mov	r2, r3
77	sub	r4, r3
78	mov	r3, r7
79	mov	r4, r2
80	!
81.L0:	dt	r3
820:	mov.b	r0, @r2
83	bf/s	.L0
84	 add	#1, r2
85	!
86	sub	r7, r5
87	mov	r2, r4
88.Larea1:
89	mov	r4, r3
90	add	r5, r3
91	and	r1, r3
92	cmp/hi	r2, r3
93	bf	.Larea2
94	!
95	! Clear area 1
96#if defined(CONFIG_CPU_SH4)
971:	movca.l	r0, @r2
98#else
991:	mov.l	r0, @r2
100#endif
101	add	#4, r2
1022:	mov.l	r0, @r2
103	add	#4, r2
1043:	mov.l	r0, @r2
105	add	#4, r2
1064:	mov.l	r0, @r2
107	add	#4, r2
1085:	mov.l	r0, @r2
109	add	#4, r2
1106:	mov.l	r0, @r2
111	add	#4, r2
1127:	mov.l	r0, @r2
113	add	#4, r2
1148:	mov.l	r0, @r2
115	add	#4, r2
116	cmp/hi	r2, r3
117	bt/s	1b
118	 nop
119	!
120	! Clear area 2
121.Larea2:
122	mov	r4, r3
123	add	r5, r3
124	cmp/hs	r3, r2
125	bt/s	.Ldone
126	 sub	r2, r3
127.L2:	dt	r3
1289:	mov.b	r0, @r2
129	bf/s	.L2
130	 add	#1, r2
131	!
132.Ldone:	rts
133	 mov	#0, r0	! return 0 as normal return
134
135	! return the number of bytes remained
136.Lbad_clear_user:
137	mov	r4, r0
138	add	r5, r0
139	rts
140	 sub	r2, r0
141
142.section __ex_table,"a"
143	.align 2
144	.long	0b, .Lbad_clear_user
145	.long	1b, .Lbad_clear_user
146	.long	2b, .Lbad_clear_user
147	.long	3b, .Lbad_clear_user
148	.long	4b, .Lbad_clear_user
149	.long	5b, .Lbad_clear_user
150	.long	6b, .Lbad_clear_user
151	.long	7b, .Lbad_clear_user
152	.long	8b, .Lbad_clear_user
153	.long	9b, .Lbad_clear_user
154.previous
155