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"
16clear_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
281:	sub	r11, 4
29	brlt	2f
30
3110:	st.w	r12++, r8
32	sub	r11, 4
33	brge	10b
34
352:	sub	r11, -4
36	reteq	0
37
38	/* Unaligned count or address */
39	bld	r11, 1
40	brcc	12f
4111:	st.h	r12++, r8
42	sub	r11, 2
43	reteq	0
4412:	st.b	r12++, r8
45	retal	0
46
47	/* Unaligned address */
485:	cp.w	r11, 4
49	brlt	2b
50
51	lsl	r9, 2
52	add	pc, pc, r9
5313:	st.b	r12++, r8
54	sub	r11, 1
5514:	st.b	r12++, r8
56	sub	r11, 1
5715:	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
6618:	sub	r11, -4
6719:	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
77