18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * __clear_user_page, __clear_user, clear_page implementation of SuperH
48c2ecf20Sopenharmony_ci *
58c2ecf20Sopenharmony_ci * Copyright (C) 2001  Kaz Kojima
68c2ecf20Sopenharmony_ci * Copyright (C) 2001, 2002  Niibe Yutaka
78c2ecf20Sopenharmony_ci * Copyright (C) 2006  Paul Mundt
88c2ecf20Sopenharmony_ci */
98c2ecf20Sopenharmony_ci#include <linux/linkage.h>
108c2ecf20Sopenharmony_ci#include <asm/page.h>
118c2ecf20Sopenharmony_ci
128c2ecf20Sopenharmony_ciENTRY(__clear_user)
138c2ecf20Sopenharmony_ci	!
148c2ecf20Sopenharmony_ci	mov	#0, r0
158c2ecf20Sopenharmony_ci	mov	#0xffffffe0, r1
168c2ecf20Sopenharmony_ci	!
178c2ecf20Sopenharmony_ci	! r4..(r4+31)&~32 	   -------- not aligned	[ Area 0 ]
188c2ecf20Sopenharmony_ci	! (r4+31)&~32..(r4+r5)&~32 -------- aligned	[ Area 1 ]
198c2ecf20Sopenharmony_ci	! (r4+r5)&~32..r4+r5       -------- not aligned	[ Area 2 ]
208c2ecf20Sopenharmony_ci	!
218c2ecf20Sopenharmony_ci	! Clear area 0
228c2ecf20Sopenharmony_ci	mov	r4, r2
238c2ecf20Sopenharmony_ci	!
248c2ecf20Sopenharmony_ci	tst	r1, r5		! length < 32
258c2ecf20Sopenharmony_ci	bt	.Larea2		! skip to remainder
268c2ecf20Sopenharmony_ci	!
278c2ecf20Sopenharmony_ci	add	#31, r2
288c2ecf20Sopenharmony_ci	and	r1, r2
298c2ecf20Sopenharmony_ci	cmp/eq	r4, r2
308c2ecf20Sopenharmony_ci	bt	.Larea1
318c2ecf20Sopenharmony_ci	mov	r2, r3
328c2ecf20Sopenharmony_ci	sub	r4, r3
338c2ecf20Sopenharmony_ci	mov	r3, r7
348c2ecf20Sopenharmony_ci	mov	r4, r2
358c2ecf20Sopenharmony_ci	!
368c2ecf20Sopenharmony_ci.L0:	dt	r3
378c2ecf20Sopenharmony_ci0:	mov.b	r0, @r2
388c2ecf20Sopenharmony_ci	bf/s	.L0
398c2ecf20Sopenharmony_ci	 add	#1, r2
408c2ecf20Sopenharmony_ci	!
418c2ecf20Sopenharmony_ci	sub	r7, r5
428c2ecf20Sopenharmony_ci	mov	r2, r4
438c2ecf20Sopenharmony_ci.Larea1:
448c2ecf20Sopenharmony_ci	mov	r4, r3
458c2ecf20Sopenharmony_ci	add	r5, r3
468c2ecf20Sopenharmony_ci	and	r1, r3
478c2ecf20Sopenharmony_ci	cmp/hi	r2, r3
488c2ecf20Sopenharmony_ci	bf	.Larea2
498c2ecf20Sopenharmony_ci	!
508c2ecf20Sopenharmony_ci	! Clear area 1
518c2ecf20Sopenharmony_ci#if defined(CONFIG_CPU_SH4)
528c2ecf20Sopenharmony_ci1:	movca.l	r0, @r2
538c2ecf20Sopenharmony_ci#else
548c2ecf20Sopenharmony_ci1:	mov.l	r0, @r2
558c2ecf20Sopenharmony_ci#endif
568c2ecf20Sopenharmony_ci	add	#4, r2
578c2ecf20Sopenharmony_ci2:	mov.l	r0, @r2
588c2ecf20Sopenharmony_ci	add	#4, r2
598c2ecf20Sopenharmony_ci3:	mov.l	r0, @r2
608c2ecf20Sopenharmony_ci	add	#4, r2
618c2ecf20Sopenharmony_ci4:	mov.l	r0, @r2
628c2ecf20Sopenharmony_ci	add	#4, r2
638c2ecf20Sopenharmony_ci5:	mov.l	r0, @r2
648c2ecf20Sopenharmony_ci	add	#4, r2
658c2ecf20Sopenharmony_ci6:	mov.l	r0, @r2
668c2ecf20Sopenharmony_ci	add	#4, r2
678c2ecf20Sopenharmony_ci7:	mov.l	r0, @r2
688c2ecf20Sopenharmony_ci	add	#4, r2
698c2ecf20Sopenharmony_ci8:	mov.l	r0, @r2
708c2ecf20Sopenharmony_ci	add	#4, r2
718c2ecf20Sopenharmony_ci	cmp/hi	r2, r3
728c2ecf20Sopenharmony_ci	bt/s	1b
738c2ecf20Sopenharmony_ci	 nop
748c2ecf20Sopenharmony_ci	!
758c2ecf20Sopenharmony_ci	! Clear area 2
768c2ecf20Sopenharmony_ci.Larea2:
778c2ecf20Sopenharmony_ci	mov	r4, r3
788c2ecf20Sopenharmony_ci	add	r5, r3
798c2ecf20Sopenharmony_ci	cmp/hs	r3, r2
808c2ecf20Sopenharmony_ci	bt/s	.Ldone
818c2ecf20Sopenharmony_ci	 sub	r2, r3
828c2ecf20Sopenharmony_ci.L2:	dt	r3
838c2ecf20Sopenharmony_ci9:	mov.b	r0, @r2
848c2ecf20Sopenharmony_ci	bf/s	.L2
858c2ecf20Sopenharmony_ci	 add	#1, r2
868c2ecf20Sopenharmony_ci	!
878c2ecf20Sopenharmony_ci.Ldone:	rts
888c2ecf20Sopenharmony_ci	 mov	#0, r0	! return 0 as normal return
898c2ecf20Sopenharmony_ci
908c2ecf20Sopenharmony_ci	! return the number of bytes remained
918c2ecf20Sopenharmony_ci.Lbad_clear_user:
928c2ecf20Sopenharmony_ci	mov	r4, r0
938c2ecf20Sopenharmony_ci	add	r5, r0
948c2ecf20Sopenharmony_ci	rts
958c2ecf20Sopenharmony_ci	 sub	r2, r0
968c2ecf20Sopenharmony_ci
978c2ecf20Sopenharmony_ci.section __ex_table,"a"
988c2ecf20Sopenharmony_ci	.align 2
998c2ecf20Sopenharmony_ci	.long	0b, .Lbad_clear_user
1008c2ecf20Sopenharmony_ci	.long	1b, .Lbad_clear_user
1018c2ecf20Sopenharmony_ci	.long	2b, .Lbad_clear_user
1028c2ecf20Sopenharmony_ci	.long	3b, .Lbad_clear_user
1038c2ecf20Sopenharmony_ci	.long	4b, .Lbad_clear_user
1048c2ecf20Sopenharmony_ci	.long	5b, .Lbad_clear_user
1058c2ecf20Sopenharmony_ci	.long	6b, .Lbad_clear_user
1068c2ecf20Sopenharmony_ci	.long	7b, .Lbad_clear_user
1078c2ecf20Sopenharmony_ci	.long	8b, .Lbad_clear_user
1088c2ecf20Sopenharmony_ci	.long	9b, .Lbad_clear_user
1098c2ecf20Sopenharmony_ci.previous
110