| /* |
| * 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 |