Blame view

arch/sh/lib/__clear_user.S 1.75 KB
510c72ad2   Paul Mundt   sh: Fixup various...
1
  /*
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2
3
4
5
   * __clear_user_page, __clear_user, clear_page implementation of SuperH
   *
   * Copyright (C) 2001  Kaz Kojima
   * Copyright (C) 2001, 2002  Niibe Yutaka
510c72ad2   Paul Mundt   sh: Fixup various...
6
   * Copyright (C) 2006  Paul Mundt
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
8
  #include <linux/linkage.h>
510c72ad2   Paul Mundt   sh: Fixup various...
9
  #include <asm/page.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
10

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
11
12
13
  ENTRY(__clear_user)
  	!
  	mov	#0, r0
fea966f75   Stuart Menefy   sh: Remove implic...
14
  	mov	#0xffffffe0, r1
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
  	!
  	! r4..(r4+31)&~32 	   -------- not aligned	[ Area 0 ]
  	! (r4+31)&~32..(r4+r5)&~32 -------- aligned	[ Area 1 ]
  	! (r4+r5)&~32..r4+r5       -------- not aligned	[ Area 2 ]
  	!
  	! Clear area 0
  	mov	r4, r2
  	!
  	tst	r1, r5		! length < 32
  	bt	.Larea2		! skip to remainder
  	!
  	add	#31, r2
  	and	r1, r2
  	cmp/eq	r4, r2
  	bt	.Larea1
  	mov	r2, r3
  	sub	r4, r3
  	mov	r3, r7
  	mov	r4, r2
  	!
  .L0:	dt	r3
  0:	mov.b	r0, @r2
  	bf/s	.L0
  	 add	#1, r2
  	!
  	sub	r7, r5
  	mov	r2, r4
  .Larea1:
  	mov	r4, r3
  	add	r5, r3
  	and	r1, r3
  	cmp/hi	r2, r3
  	bf	.Larea2
  	!
  	! Clear area 1
  #if defined(CONFIG_CPU_SH4)
  1:	movca.l	r0, @r2
  #else
  1:	mov.l	r0, @r2
  #endif
  	add	#4, r2
  2:	mov.l	r0, @r2
  	add	#4, r2
  3:	mov.l	r0, @r2
  	add	#4, r2
  4:	mov.l	r0, @r2
  	add	#4, r2
  5:	mov.l	r0, @r2
  	add	#4, r2
  6:	mov.l	r0, @r2
  	add	#4, r2
  7:	mov.l	r0, @r2
  	add	#4, r2
  8:	mov.l	r0, @r2
  	add	#4, r2
  	cmp/hi	r2, r3
  	bt/s	1b
  	 nop
  	!
  	! Clear area 2
  .Larea2:
  	mov	r4, r3
  	add	r5, r3
  	cmp/hs	r3, r2
  	bt/s	.Ldone
  	 sub	r2, r3
  .L2:	dt	r3
  9:	mov.b	r0, @r2
  	bf/s	.L2
  	 add	#1, r2
  	!
  .Ldone:	rts
  	 mov	#0, r0	! return 0 as normal return
  
  	! return the number of bytes remained
  .Lbad_clear_user:
  	mov	r4, r0
  	add	r5, r0
  	rts
  	 sub	r2, r0
  
  .section __ex_table,"a"
  	.align 2
  	.long	0b, .Lbad_clear_user
  	.long	1b, .Lbad_clear_user
  	.long	2b, .Lbad_clear_user
  	.long	3b, .Lbad_clear_user
  	.long	4b, .Lbad_clear_user
  	.long	5b, .Lbad_clear_user
  	.long	6b, .Lbad_clear_user
  	.long	7b, .Lbad_clear_user
  	.long	8b, .Lbad_clear_user
  	.long	9b, .Lbad_clear_user
  .previous