xref: /openbmc/linux/arch/sh/lib/__clear_user.S (revision 498495dba268b20e8eadd7fe93c140c68b6cc9d2)
1*b2441318SGreg Kroah-Hartman/* SPDX-License-Identifier: GPL-2.0 */
2221c007bSPaul Mundt/*
3221c007bSPaul Mundt * __clear_user_page, __clear_user, clear_page implementation of SuperH
4221c007bSPaul Mundt *
5221c007bSPaul Mundt * Copyright (C) 2001  Kaz Kojima
6221c007bSPaul Mundt * Copyright (C) 2001, 2002  Niibe Yutaka
7221c007bSPaul Mundt * Copyright (C) 2006  Paul Mundt
8221c007bSPaul Mundt */
9221c007bSPaul Mundt#include <linux/linkage.h>
10221c007bSPaul Mundt#include <asm/page.h>
11221c007bSPaul Mundt
12221c007bSPaul MundtENTRY(__clear_user)
13221c007bSPaul Mundt	!
14221c007bSPaul Mundt	mov	#0, r0
15ac6a0cf6SPaul Mundt	mov	#0xffffffe0, r1
16221c007bSPaul Mundt	!
17221c007bSPaul Mundt	! r4..(r4+31)&~32 	   -------- not aligned	[ Area 0 ]
18221c007bSPaul Mundt	! (r4+31)&~32..(r4+r5)&~32 -------- aligned	[ Area 1 ]
19221c007bSPaul Mundt	! (r4+r5)&~32..r4+r5       -------- not aligned	[ Area 2 ]
20221c007bSPaul Mundt	!
21221c007bSPaul Mundt	! Clear area 0
22221c007bSPaul Mundt	mov	r4, r2
23221c007bSPaul Mundt	!
24221c007bSPaul Mundt	tst	r1, r5		! length < 32
25221c007bSPaul Mundt	bt	.Larea2		! skip to remainder
26221c007bSPaul Mundt	!
27221c007bSPaul Mundt	add	#31, r2
28221c007bSPaul Mundt	and	r1, r2
29221c007bSPaul Mundt	cmp/eq	r4, r2
30221c007bSPaul Mundt	bt	.Larea1
31221c007bSPaul Mundt	mov	r2, r3
32221c007bSPaul Mundt	sub	r4, r3
33221c007bSPaul Mundt	mov	r3, r7
34221c007bSPaul Mundt	mov	r4, r2
35221c007bSPaul Mundt	!
36221c007bSPaul Mundt.L0:	dt	r3
37221c007bSPaul Mundt0:	mov.b	r0, @r2
38221c007bSPaul Mundt	bf/s	.L0
39221c007bSPaul Mundt	 add	#1, r2
40221c007bSPaul Mundt	!
41221c007bSPaul Mundt	sub	r7, r5
42221c007bSPaul Mundt	mov	r2, r4
43221c007bSPaul Mundt.Larea1:
44221c007bSPaul Mundt	mov	r4, r3
45221c007bSPaul Mundt	add	r5, r3
46221c007bSPaul Mundt	and	r1, r3
47221c007bSPaul Mundt	cmp/hi	r2, r3
48221c007bSPaul Mundt	bf	.Larea2
49221c007bSPaul Mundt	!
50221c007bSPaul Mundt	! Clear area 1
51221c007bSPaul Mundt#if defined(CONFIG_CPU_SH4)
52221c007bSPaul Mundt1:	movca.l	r0, @r2
53221c007bSPaul Mundt#else
54221c007bSPaul Mundt1:	mov.l	r0, @r2
55221c007bSPaul Mundt#endif
56221c007bSPaul Mundt	add	#4, r2
57221c007bSPaul Mundt2:	mov.l	r0, @r2
58221c007bSPaul Mundt	add	#4, r2
59221c007bSPaul Mundt3:	mov.l	r0, @r2
60221c007bSPaul Mundt	add	#4, r2
61221c007bSPaul Mundt4:	mov.l	r0, @r2
62221c007bSPaul Mundt	add	#4, r2
63221c007bSPaul Mundt5:	mov.l	r0, @r2
64221c007bSPaul Mundt	add	#4, r2
65221c007bSPaul Mundt6:	mov.l	r0, @r2
66221c007bSPaul Mundt	add	#4, r2
67221c007bSPaul Mundt7:	mov.l	r0, @r2
68221c007bSPaul Mundt	add	#4, r2
69221c007bSPaul Mundt8:	mov.l	r0, @r2
70221c007bSPaul Mundt	add	#4, r2
71221c007bSPaul Mundt	cmp/hi	r2, r3
72221c007bSPaul Mundt	bt/s	1b
73221c007bSPaul Mundt	 nop
74221c007bSPaul Mundt	!
75221c007bSPaul Mundt	! Clear area 2
76221c007bSPaul Mundt.Larea2:
77221c007bSPaul Mundt	mov	r4, r3
78221c007bSPaul Mundt	add	r5, r3
79221c007bSPaul Mundt	cmp/hs	r3, r2
80221c007bSPaul Mundt	bt/s	.Ldone
81221c007bSPaul Mundt	 sub	r2, r3
82221c007bSPaul Mundt.L2:	dt	r3
83221c007bSPaul Mundt9:	mov.b	r0, @r2
84221c007bSPaul Mundt	bf/s	.L2
85221c007bSPaul Mundt	 add	#1, r2
86221c007bSPaul Mundt	!
87221c007bSPaul Mundt.Ldone:	rts
88221c007bSPaul Mundt	 mov	#0, r0	! return 0 as normal return
89221c007bSPaul Mundt
90221c007bSPaul Mundt	! return the number of bytes remained
91221c007bSPaul Mundt.Lbad_clear_user:
92221c007bSPaul Mundt	mov	r4, r0
93221c007bSPaul Mundt	add	r5, r0
94221c007bSPaul Mundt	rts
95221c007bSPaul Mundt	 sub	r2, r0
96221c007bSPaul Mundt
97221c007bSPaul Mundt.section __ex_table,"a"
98221c007bSPaul Mundt	.align 2
99221c007bSPaul Mundt	.long	0b, .Lbad_clear_user
100221c007bSPaul Mundt	.long	1b, .Lbad_clear_user
101221c007bSPaul Mundt	.long	2b, .Lbad_clear_user
102221c007bSPaul Mundt	.long	3b, .Lbad_clear_user
103221c007bSPaul Mundt	.long	4b, .Lbad_clear_user
104221c007bSPaul Mundt	.long	5b, .Lbad_clear_user
105221c007bSPaul Mundt	.long	6b, .Lbad_clear_user
106221c007bSPaul Mundt	.long	7b, .Lbad_clear_user
107221c007bSPaul Mundt	.long	8b, .Lbad_clear_user
108221c007bSPaul Mundt	.long	9b, .Lbad_clear_user
109221c007bSPaul Mundt.previous
110