[PATCH] avr32 architecture
[linux-2.6.git] / arch / avr32 / lib / clear_user.S
1 /*
2  * Copyright 2004-2006 Atmel Corporation
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License version 2 as
6  * published by the Free Software Foundation.
7  */
8 #include <asm/page.h>
9 #include <asm/thread_info.h>
10 #include <asm/asm.h>
11
12         .text
13         .align  1
14         .global clear_user
15         .type   clear_user, "function"
16 clear_user:
17         branch_if_kernel r8, __clear_user
18         ret_if_privileged r8, r12, r11, r11
19
20         .global __clear_user
21         .type   __clear_user, "function"
22 __clear_user:
23         mov     r9, r12
24         mov     r8, 0
25         andl    r9, 3, COH
26         brne    5f
27
28 1:      sub     r11, 4
29         brlt    2f
30
31 10:     st.w    r12++, r8
32         sub     r11, 4
33         brge    10b
34
35 2:      sub     r11, -4
36         reteq   0
37
38         /* Unaligned count or address */
39         bld     r11, 1
40         brcc    12f
41 11:     st.h    r12++, r8
42         sub     r11, 2
43         reteq   0
44 12:     st.b    r12++, r8
45         retal   0
46
47         /* Unaligned address */
48 5:      cp.w    r11, 4
49         brlt    2b
50
51         lsl     r9, 2
52         add     pc, pc, r9
53 13:     st.b    r12++, r8
54         sub     r11, 1
55 14:     st.b    r12++, r8
56         sub     r11, 1
57 15:     st.b    r12++, r8
58         sub     r11, 1
59         rjmp    1b
60
61         .size   clear_user, . - clear_user
62         .size   __clear_user, . - __clear_user
63
64         .section .fixup, "ax"
65         .align  1
66 18:     sub     r11, -4
67 19:     retal   r11
68
69         .section __ex_table, "a"
70         .align  2
71         .long   10b, 18b
72         .long   11b, 19b
73         .long   12b, 19b
74         .long   13b, 19b
75         .long   14b, 19b
76         .long   15b, 19b