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