77 строки
1.2 KiB
ArmAsm
77 строки
1.2 KiB
ArmAsm
/*
|
|
* 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
|