/* | |
* Copyright 2004-2006 Atmel Corporation | |
* | |
* This program is free software; you can redistribute it and/or modify | |
* it under the terms of the GNU General Public License version 2 as | |
* published by the Free Software Foundation. | |
*/ | |
#include <asm/page.h> | |
#include <asm/thread_info.h> | |
#include <asm/asm.h> | |
.text | |
.align 1 | |
.global clear_user | |
.type clear_user, "function" | |
clear_user: | |
branch_if_kernel r8, __clear_user | |
ret_if_privileged r8, r12, r11, r11 | |
.global __clear_user | |
.type __clear_user, "function" | |
__clear_user: | |
mov r9, r12 | |
mov r8, 0 | |
andl r9, 3, COH | |
brne 5f | |
1: sub r11, 4 | |
brlt 2f | |
10: st.w r12++, r8 | |
sub r11, 4 | |
brge 10b | |
2: sub r11, -4 | |
reteq 0 | |
/* Unaligned count or address */ | |
bld r11, 1 | |
brcc 12f | |
11: st.h r12++, r8 | |
sub r11, 2 | |
reteq 0 | |
12: st.b r12++, r8 | |
retal 0 | |
/* Unaligned address */ | |
5: cp.w r11, 4 | |
brlt 2b | |
lsl r9, 2 | |
add pc, pc, r9 | |
13: st.b r12++, r8 | |
sub r11, 1 | |
14: st.b r12++, r8 | |
sub r11, 1 | |
15: st.b r12++, r8 | |
sub r11, 1 | |
rjmp 1b | |
.size clear_user, . - clear_user | |
.size __clear_user, . - __clear_user | |
.section .fixup, "ax" | |
.align 1 | |
18: sub r11, -4 | |
19: retal r11 | |
.section __ex_table, "a" | |
.align 2 | |
.long 10b, 18b | |
.long 11b, 19b | |
.long 12b, 19b | |
.long 13b, 19b | |
.long 14b, 19b | |
.long 15b, 19b |