Commit | Line | Data |
---|---|---|
5f97f7f9 HS |
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 |