1080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King/*
2080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King *  linux/arch/arm/lib/uaccess.S
3080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King *
4080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King *  Copyright (C) 1995, 1996,1997,1998 Russell King
5080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King *
6080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King * This program is free software; you can redistribute it and/or modify
7080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King * it under the terms of the GNU General Public License version 2 as
8080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King * published by the Free Software Foundation.
9080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King *
10080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King *  Routines to block copy data to/from user memory
11080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King *   These are highly optimised both for the 4k page size
12080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King *   and for various alignments.
13080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King */
14080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King#include <linux/linkage.h>
15080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King#include <asm/assembler.h>
16080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King#include <asm/errno.h>
17080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King#include <asm/domain.h>
18080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King
19080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		.text
20080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King
21080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King#define PAGE_SHIFT 12
22080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King
23080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King/* Prototype: int __copy_to_user(void *to, const char *from, size_t n)
24080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King * Purpose  : copy a block to user memory from kernel memory
25080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King * Params   : to   - user memory
26080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King *          : from - kernel memory
27080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King *          : n    - number of bytes to copy
28080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King * Returns  : Number of bytes NOT copied.
29080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King */
30080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King
31080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King.Lc2u_dest_not_aligned:
32080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		rsb	ip, ip, #4
33080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		cmp	ip, #2
34080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		ldrb	r3, [r1], #1
35080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell KingUSER(	TUSER(	strb)	r3, [r0], #1)			@ May fault
36080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		ldrgeb	r3, [r1], #1
37080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell KingUSER(	TUSER(	strgeb) r3, [r0], #1)			@ May fault
38080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		ldrgtb	r3, [r1], #1
39080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell KingUSER(	TUSER(	strgtb) r3, [r0], #1)			@ May fault
40080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		sub	r2, r2, ip
41080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		b	.Lc2u_dest_aligned
42080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King
43080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell KingENTRY(__copy_to_user)
44080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		stmfd	sp!, {r2, r4 - r7, lr}
45080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		cmp	r2, #4
46080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		blt	.Lc2u_not_enough
47080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		ands	ip, r0, #3
48080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		bne	.Lc2u_dest_not_aligned
49080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King.Lc2u_dest_aligned:
50080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King
51080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		ands	ip, r1, #3
52080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		bne	.Lc2u_src_not_aligned
53080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King/*
54080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King * Seeing as there has to be at least 8 bytes to copy, we can
55080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King * copy one word, and force a user-mode page fault...
56080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King */
57080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King
58080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King.Lc2u_0fupi:	subs	r2, r2, #4
59080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		addmi	ip, r2, #4
60080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		bmi	.Lc2u_0nowords
61080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		ldr	r3, [r1], #4
62080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell KingUSER(	TUSER(	str)	r3, [r0], #4)			@ May fault
63080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		mov	ip, r0, lsl #32 - PAGE_SHIFT	@ On each page, use a ld/st??t instruction
64080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		rsb	ip, ip, #0
65080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		movs	ip, ip, lsr #32 - PAGE_SHIFT
66080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		beq	.Lc2u_0fupi
67080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King/*
68080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King * ip = max no. of bytes to copy before needing another "strt" insn
69080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King */
70080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		cmp	r2, ip
71080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		movlt	ip, r2
72080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		sub	r2, r2, ip
73080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		subs	ip, ip, #32
74080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		blt	.Lc2u_0rem8lp
75080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King
76080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King.Lc2u_0cpy8lp:	ldmia	r1!, {r3 - r6}
77080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		stmia	r0!, {r3 - r6}			@ Shouldnt fault
78080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		ldmia	r1!, {r3 - r6}
79080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		subs	ip, ip, #32
80080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		stmia	r0!, {r3 - r6}			@ Shouldnt fault
81080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		bpl	.Lc2u_0cpy8lp
82080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King
83080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King.Lc2u_0rem8lp:	cmn	ip, #16
84080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		ldmgeia	r1!, {r3 - r6}
85080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		stmgeia	r0!, {r3 - r6}			@ Shouldnt fault
86080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		tst	ip, #8
87080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		ldmneia	r1!, {r3 - r4}
88080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		stmneia	r0!, {r3 - r4}			@ Shouldnt fault
89080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		tst	ip, #4
90080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		ldrne	r3, [r1], #4
91080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King	TUSER(	strne) r3, [r0], #4			@ Shouldnt fault
92080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		ands	ip, ip, #3
93080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		beq	.Lc2u_0fupi
94080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King.Lc2u_0nowords:	teq	ip, #0
95080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		beq	.Lc2u_finished
96080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King.Lc2u_nowords:	cmp	ip, #2
97080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		ldrb	r3, [r1], #1
98080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell KingUSER(	TUSER(	strb)	r3, [r0], #1)			@ May fault
99080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		ldrgeb	r3, [r1], #1
100080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell KingUSER(	TUSER(	strgeb) r3, [r0], #1)			@ May fault
101080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		ldrgtb	r3, [r1], #1
102080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell KingUSER(	TUSER(	strgtb) r3, [r0], #1)			@ May fault
103080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		b	.Lc2u_finished
104080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King
105080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King.Lc2u_not_enough:
106080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		movs	ip, r2
107080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		bne	.Lc2u_nowords
108080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King.Lc2u_finished:	mov	r0, #0
109080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		ldmfd	sp!, {r2, r4 - r7, pc}
110080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King
111080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King.Lc2u_src_not_aligned:
112080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		bic	r1, r1, #3
113080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		ldr	r7, [r1], #4
114080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		cmp	ip, #2
115080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		bgt	.Lc2u_3fupi
116080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		beq	.Lc2u_2fupi
117080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King.Lc2u_1fupi:	subs	r2, r2, #4
118080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		addmi	ip, r2, #4
119080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		bmi	.Lc2u_1nowords
120d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky		mov	r3, r7, lspull #8
121080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		ldr	r7, [r1], #4
122d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky		orr	r3, r3, r7, lspush #24
123080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell KingUSER(	TUSER(	str)	r3, [r0], #4)			@ May fault
124080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		mov	ip, r0, lsl #32 - PAGE_SHIFT
125080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		rsb	ip, ip, #0
126080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		movs	ip, ip, lsr #32 - PAGE_SHIFT
127080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		beq	.Lc2u_1fupi
128080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		cmp	r2, ip
129080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		movlt	ip, r2
130080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		sub	r2, r2, ip
131080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		subs	ip, ip, #16
132080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		blt	.Lc2u_1rem8lp
133080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King
134d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky.Lc2u_1cpy8lp:	mov	r3, r7, lspull #8
135080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		ldmia	r1!, {r4 - r7}
136080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		subs	ip, ip, #16
137d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky		orr	r3, r3, r4, lspush #24
138d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky		mov	r4, r4, lspull #8
139d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky		orr	r4, r4, r5, lspush #24
140d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky		mov	r5, r5, lspull #8
141d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky		orr	r5, r5, r6, lspush #24
142d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky		mov	r6, r6, lspull #8
143d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky		orr	r6, r6, r7, lspush #24
144080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		stmia	r0!, {r3 - r6}			@ Shouldnt fault
145080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		bpl	.Lc2u_1cpy8lp
146080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King
147080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King.Lc2u_1rem8lp:	tst	ip, #8
148d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky		movne	r3, r7, lspull #8
149080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		ldmneia	r1!, {r4, r7}
150d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky		orrne	r3, r3, r4, lspush #24
151d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky		movne	r4, r4, lspull #8
152d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky		orrne	r4, r4, r7, lspush #24
153080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		stmneia	r0!, {r3 - r4}			@ Shouldnt fault
154080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		tst	ip, #4
155d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky		movne	r3, r7, lspull #8
156080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		ldrne	r7, [r1], #4
157d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky		orrne	r3, r3, r7, lspush #24
158080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King	TUSER(	strne) r3, [r0], #4			@ Shouldnt fault
159080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		ands	ip, ip, #3
160080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		beq	.Lc2u_1fupi
161080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King.Lc2u_1nowords:	mov	r3, r7, get_byte_1
162080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		teq	ip, #0
163080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		beq	.Lc2u_finished
164080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		cmp	ip, #2
165080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell KingUSER(	TUSER(	strb)	r3, [r0], #1)			@ May fault
166080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		movge	r3, r7, get_byte_2
167080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell KingUSER(	TUSER(	strgeb) r3, [r0], #1)			@ May fault
168080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		movgt	r3, r7, get_byte_3
169080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell KingUSER(	TUSER(	strgtb) r3, [r0], #1)			@ May fault
170080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		b	.Lc2u_finished
171080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King
172080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King.Lc2u_2fupi:	subs	r2, r2, #4
173080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		addmi	ip, r2, #4
174080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		bmi	.Lc2u_2nowords
175d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky		mov	r3, r7, lspull #16
176080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		ldr	r7, [r1], #4
177d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky		orr	r3, r3, r7, lspush #16
178080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell KingUSER(	TUSER(	str)	r3, [r0], #4)			@ May fault
179080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		mov	ip, r0, lsl #32 - PAGE_SHIFT
180080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		rsb	ip, ip, #0
181080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		movs	ip, ip, lsr #32 - PAGE_SHIFT
182080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		beq	.Lc2u_2fupi
183080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		cmp	r2, ip
184080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		movlt	ip, r2
185080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		sub	r2, r2, ip
186080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		subs	ip, ip, #16
187080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		blt	.Lc2u_2rem8lp
188080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King
189d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky.Lc2u_2cpy8lp:	mov	r3, r7, lspull #16
190080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		ldmia	r1!, {r4 - r7}
191080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		subs	ip, ip, #16
192d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky		orr	r3, r3, r4, lspush #16
193d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky		mov	r4, r4, lspull #16
194d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky		orr	r4, r4, r5, lspush #16
195d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky		mov	r5, r5, lspull #16
196d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky		orr	r5, r5, r6, lspush #16
197d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky		mov	r6, r6, lspull #16
198d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky		orr	r6, r6, r7, lspush #16
199080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		stmia	r0!, {r3 - r6}			@ Shouldnt fault
200080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		bpl	.Lc2u_2cpy8lp
201080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King
202080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King.Lc2u_2rem8lp:	tst	ip, #8
203d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky		movne	r3, r7, lspull #16
204080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		ldmneia	r1!, {r4, r7}
205d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky		orrne	r3, r3, r4, lspush #16
206d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky		movne	r4, r4, lspull #16
207d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky		orrne	r4, r4, r7, lspush #16
208080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		stmneia	r0!, {r3 - r4}			@ Shouldnt fault
209080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		tst	ip, #4
210d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky		movne	r3, r7, lspull #16
211080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		ldrne	r7, [r1], #4
212d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky		orrne	r3, r3, r7, lspush #16
213080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King	TUSER(	strne) r3, [r0], #4			@ Shouldnt fault
214080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		ands	ip, ip, #3
215080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		beq	.Lc2u_2fupi
216080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King.Lc2u_2nowords:	mov	r3, r7, get_byte_2
217080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		teq	ip, #0
218080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		beq	.Lc2u_finished
219080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		cmp	ip, #2
220080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell KingUSER(	TUSER(	strb)	r3, [r0], #1)			@ May fault
221080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		movge	r3, r7, get_byte_3
222080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell KingUSER(	TUSER(	strgeb) r3, [r0], #1)			@ May fault
223080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		ldrgtb	r3, [r1], #0
224080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell KingUSER(	TUSER(	strgtb) r3, [r0], #1)			@ May fault
225080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		b	.Lc2u_finished
226080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King
227080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King.Lc2u_3fupi:	subs	r2, r2, #4
228080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		addmi	ip, r2, #4
229080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		bmi	.Lc2u_3nowords
230d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky		mov	r3, r7, lspull #24
231080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		ldr	r7, [r1], #4
232d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky		orr	r3, r3, r7, lspush #8
233080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell KingUSER(	TUSER(	str)	r3, [r0], #4)			@ May fault
234080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		mov	ip, r0, lsl #32 - PAGE_SHIFT
235080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		rsb	ip, ip, #0
236080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		movs	ip, ip, lsr #32 - PAGE_SHIFT
237080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		beq	.Lc2u_3fupi
238080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		cmp	r2, ip
239080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		movlt	ip, r2
240080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		sub	r2, r2, ip
241080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		subs	ip, ip, #16
242080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		blt	.Lc2u_3rem8lp
243080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King
244d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky.Lc2u_3cpy8lp:	mov	r3, r7, lspull #24
245080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		ldmia	r1!, {r4 - r7}
246080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		subs	ip, ip, #16
247d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky		orr	r3, r3, r4, lspush #8
248d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky		mov	r4, r4, lspull #24
249d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky		orr	r4, r4, r5, lspush #8
250d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky		mov	r5, r5, lspull #24
251d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky		orr	r5, r5, r6, lspush #8
252d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky		mov	r6, r6, lspull #24
253d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky		orr	r6, r6, r7, lspush #8
254080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		stmia	r0!, {r3 - r6}			@ Shouldnt fault
255080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		bpl	.Lc2u_3cpy8lp
256080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King
257080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King.Lc2u_3rem8lp:	tst	ip, #8
258d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky		movne	r3, r7, lspull #24
259080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		ldmneia	r1!, {r4, r7}
260d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky		orrne	r3, r3, r4, lspush #8
261d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky		movne	r4, r4, lspull #24
262d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky		orrne	r4, r4, r7, lspush #8
263080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		stmneia	r0!, {r3 - r4}			@ Shouldnt fault
264080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		tst	ip, #4
265d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky		movne	r3, r7, lspull #24
266080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		ldrne	r7, [r1], #4
267d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky		orrne	r3, r3, r7, lspush #8
268080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King	TUSER(	strne) r3, [r0], #4			@ Shouldnt fault
269080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		ands	ip, ip, #3
270080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		beq	.Lc2u_3fupi
271080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King.Lc2u_3nowords:	mov	r3, r7, get_byte_3
272080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		teq	ip, #0
273080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		beq	.Lc2u_finished
274080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		cmp	ip, #2
275080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell KingUSER(	TUSER(	strb)	r3, [r0], #1)			@ May fault
276080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		ldrgeb	r3, [r1], #1
277080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell KingUSER(	TUSER(	strgeb) r3, [r0], #1)			@ May fault
278080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		ldrgtb	r3, [r1], #0
279080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell KingUSER(	TUSER(	strgtb) r3, [r0], #1)			@ May fault
280080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		b	.Lc2u_finished
281080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell KingENDPROC(__copy_to_user)
282080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King
283080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		.pushsection .fixup,"ax"
284080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		.align	0
285080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King9001:		ldmfd	sp!, {r0, r4 - r7, pc}
286080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		.popsection
287080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King
288080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King/* Prototype: unsigned long __copy_from_user(void *to,const void *from,unsigned long n);
289080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King * Purpose  : copy a block from user memory to kernel memory
290080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King * Params   : to   - kernel memory
291080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King *          : from - user memory
292080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King *          : n    - number of bytes to copy
293080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King * Returns  : Number of bytes NOT copied.
294080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King */
295080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King.Lcfu_dest_not_aligned:
296080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		rsb	ip, ip, #4
297080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		cmp	ip, #2
298080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell KingUSER(	TUSER(	ldrb)	r3, [r1], #1)			@ May fault
299080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		strb	r3, [r0], #1
300080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell KingUSER(	TUSER(	ldrgeb) r3, [r1], #1)			@ May fault
301080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		strgeb	r3, [r0], #1
302080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell KingUSER(	TUSER(	ldrgtb) r3, [r1], #1)			@ May fault
303080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		strgtb	r3, [r0], #1
304080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		sub	r2, r2, ip
305080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		b	.Lcfu_dest_aligned
306080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King
307080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell KingENTRY(__copy_from_user)
308080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		stmfd	sp!, {r0, r2, r4 - r7, lr}
309080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		cmp	r2, #4
310080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		blt	.Lcfu_not_enough
311080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		ands	ip, r0, #3
312080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		bne	.Lcfu_dest_not_aligned
313080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King.Lcfu_dest_aligned:
314080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		ands	ip, r1, #3
315080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		bne	.Lcfu_src_not_aligned
316080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King
317080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King/*
318080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King * Seeing as there has to be at least 8 bytes to copy, we can
319080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King * copy one word, and force a user-mode page fault...
320080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King */
321080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King
322080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King.Lcfu_0fupi:	subs	r2, r2, #4
323080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		addmi	ip, r2, #4
324080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		bmi	.Lcfu_0nowords
325080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell KingUSER(	TUSER(	ldr)	r3, [r1], #4)
326080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		str	r3, [r0], #4
327080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		mov	ip, r1, lsl #32 - PAGE_SHIFT	@ On each page, use a ld/st??t instruction
328080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		rsb	ip, ip, #0
329080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		movs	ip, ip, lsr #32 - PAGE_SHIFT
330080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		beq	.Lcfu_0fupi
331080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King/*
332080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King * ip = max no. of bytes to copy before needing another "strt" insn
333080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King */
334080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		cmp	r2, ip
335080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		movlt	ip, r2
336080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		sub	r2, r2, ip
337080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		subs	ip, ip, #32
338080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		blt	.Lcfu_0rem8lp
339080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King
340080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King.Lcfu_0cpy8lp:	ldmia	r1!, {r3 - r6}			@ Shouldnt fault
341080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		stmia	r0!, {r3 - r6}
342080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		ldmia	r1!, {r3 - r6}			@ Shouldnt fault
343080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		subs	ip, ip, #32
344080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		stmia	r0!, {r3 - r6}
345080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		bpl	.Lcfu_0cpy8lp
346080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King
347080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King.Lcfu_0rem8lp:	cmn	ip, #16
348080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		ldmgeia	r1!, {r3 - r6}			@ Shouldnt fault
349080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		stmgeia	r0!, {r3 - r6}
350080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		tst	ip, #8
351080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		ldmneia	r1!, {r3 - r4}			@ Shouldnt fault
352080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		stmneia	r0!, {r3 - r4}
353080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		tst	ip, #4
354080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King	TUSER(	ldrne) r3, [r1], #4			@ Shouldnt fault
355080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		strne	r3, [r0], #4
356080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		ands	ip, ip, #3
357080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		beq	.Lcfu_0fupi
358080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King.Lcfu_0nowords:	teq	ip, #0
359080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		beq	.Lcfu_finished
360080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King.Lcfu_nowords:	cmp	ip, #2
361080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell KingUSER(	TUSER(	ldrb)	r3, [r1], #1)			@ May fault
362080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		strb	r3, [r0], #1
363080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell KingUSER(	TUSER(	ldrgeb) r3, [r1], #1)			@ May fault
364080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		strgeb	r3, [r0], #1
365080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell KingUSER(	TUSER(	ldrgtb) r3, [r1], #1)			@ May fault
366080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		strgtb	r3, [r0], #1
367080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		b	.Lcfu_finished
368080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King
369080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King.Lcfu_not_enough:
370080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		movs	ip, r2
371080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		bne	.Lcfu_nowords
372080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King.Lcfu_finished:	mov	r0, #0
373080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		add	sp, sp, #8
374080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		ldmfd	sp!, {r4 - r7, pc}
375080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King
376080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King.Lcfu_src_not_aligned:
377080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		bic	r1, r1, #3
378080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell KingUSER(	TUSER(	ldr)	r7, [r1], #4)			@ May fault
379080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		cmp	ip, #2
380080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		bgt	.Lcfu_3fupi
381080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		beq	.Lcfu_2fupi
382080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King.Lcfu_1fupi:	subs	r2, r2, #4
383080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		addmi	ip, r2, #4
384080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		bmi	.Lcfu_1nowords
385d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky		mov	r3, r7, lspull #8
386080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell KingUSER(	TUSER(	ldr)	r7, [r1], #4)			@ May fault
387d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky		orr	r3, r3, r7, lspush #24
388080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		str	r3, [r0], #4
389080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		mov	ip, r1, lsl #32 - PAGE_SHIFT
390080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		rsb	ip, ip, #0
391080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		movs	ip, ip, lsr #32 - PAGE_SHIFT
392080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		beq	.Lcfu_1fupi
393080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		cmp	r2, ip
394080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		movlt	ip, r2
395080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		sub	r2, r2, ip
396080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		subs	ip, ip, #16
397080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		blt	.Lcfu_1rem8lp
398080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King
399d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky.Lcfu_1cpy8lp:	mov	r3, r7, lspull #8
400080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		ldmia	r1!, {r4 - r7}			@ Shouldnt fault
401080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		subs	ip, ip, #16
402d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky		orr	r3, r3, r4, lspush #24
403d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky		mov	r4, r4, lspull #8
404d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky		orr	r4, r4, r5, lspush #24
405d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky		mov	r5, r5, lspull #8
406d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky		orr	r5, r5, r6, lspush #24
407d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky		mov	r6, r6, lspull #8
408d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky		orr	r6, r6, r7, lspush #24
409080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		stmia	r0!, {r3 - r6}
410080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		bpl	.Lcfu_1cpy8lp
411080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King
412080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King.Lcfu_1rem8lp:	tst	ip, #8
413d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky		movne	r3, r7, lspull #8
414080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		ldmneia	r1!, {r4, r7}			@ Shouldnt fault
415d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky		orrne	r3, r3, r4, lspush #24
416d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky		movne	r4, r4, lspull #8
417d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky		orrne	r4, r4, r7, lspush #24
418080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		stmneia	r0!, {r3 - r4}
419080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		tst	ip, #4
420d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky		movne	r3, r7, lspull #8
421080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell KingUSER(	TUSER(	ldrne) r7, [r1], #4)			@ May fault
422d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky		orrne	r3, r3, r7, lspush #24
423080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		strne	r3, [r0], #4
424080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		ands	ip, ip, #3
425080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		beq	.Lcfu_1fupi
426080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King.Lcfu_1nowords:	mov	r3, r7, get_byte_1
427080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		teq	ip, #0
428080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		beq	.Lcfu_finished
429080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		cmp	ip, #2
430080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		strb	r3, [r0], #1
431080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		movge	r3, r7, get_byte_2
432080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		strgeb	r3, [r0], #1
433080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		movgt	r3, r7, get_byte_3
434080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		strgtb	r3, [r0], #1
435080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		b	.Lcfu_finished
436080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King
437080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King.Lcfu_2fupi:	subs	r2, r2, #4
438080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		addmi	ip, r2, #4
439080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		bmi	.Lcfu_2nowords
440d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky		mov	r3, r7, lspull #16
441080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell KingUSER(	TUSER(	ldr)	r7, [r1], #4)			@ May fault
442d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky		orr	r3, r3, r7, lspush #16
443080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		str	r3, [r0], #4
444080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		mov	ip, r1, lsl #32 - PAGE_SHIFT
445080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		rsb	ip, ip, #0
446080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		movs	ip, ip, lsr #32 - PAGE_SHIFT
447080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		beq	.Lcfu_2fupi
448080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		cmp	r2, ip
449080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		movlt	ip, r2
450080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		sub	r2, r2, ip
451080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		subs	ip, ip, #16
452080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		blt	.Lcfu_2rem8lp
453080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King
454080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King
455d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky.Lcfu_2cpy8lp:	mov	r3, r7, lspull #16
456080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		ldmia	r1!, {r4 - r7}			@ Shouldnt fault
457080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		subs	ip, ip, #16
458d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky		orr	r3, r3, r4, lspush #16
459d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky		mov	r4, r4, lspull #16
460d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky		orr	r4, r4, r5, lspush #16
461d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky		mov	r5, r5, lspull #16
462d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky		orr	r5, r5, r6, lspush #16
463d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky		mov	r6, r6, lspull #16
464d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky		orr	r6, r6, r7, lspush #16
465080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		stmia	r0!, {r3 - r6}
466080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		bpl	.Lcfu_2cpy8lp
467080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King
468080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King.Lcfu_2rem8lp:	tst	ip, #8
469d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky		movne	r3, r7, lspull #16
470080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		ldmneia	r1!, {r4, r7}			@ Shouldnt fault
471d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky		orrne	r3, r3, r4, lspush #16
472d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky		movne	r4, r4, lspull #16
473d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky		orrne	r4, r4, r7, lspush #16
474080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		stmneia	r0!, {r3 - r4}
475080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		tst	ip, #4
476d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky		movne	r3, r7, lspull #16
477080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell KingUSER(	TUSER(	ldrne) r7, [r1], #4)			@ May fault
478d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky		orrne	r3, r3, r7, lspush #16
479080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		strne	r3, [r0], #4
480080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		ands	ip, ip, #3
481080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		beq	.Lcfu_2fupi
482080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King.Lcfu_2nowords:	mov	r3, r7, get_byte_2
483080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		teq	ip, #0
484080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		beq	.Lcfu_finished
485080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		cmp	ip, #2
486080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		strb	r3, [r0], #1
487080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		movge	r3, r7, get_byte_3
488080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		strgeb	r3, [r0], #1
489080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell KingUSER(	TUSER(	ldrgtb) r3, [r1], #0)			@ May fault
490080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		strgtb	r3, [r0], #1
491080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		b	.Lcfu_finished
492080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King
493080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King.Lcfu_3fupi:	subs	r2, r2, #4
494080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		addmi	ip, r2, #4
495080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		bmi	.Lcfu_3nowords
496d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky		mov	r3, r7, lspull #24
497080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell KingUSER(	TUSER(	ldr)	r7, [r1], #4)			@ May fault
498d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky		orr	r3, r3, r7, lspush #8
499080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		str	r3, [r0], #4
500080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		mov	ip, r1, lsl #32 - PAGE_SHIFT
501080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		rsb	ip, ip, #0
502080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		movs	ip, ip, lsr #32 - PAGE_SHIFT
503080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		beq	.Lcfu_3fupi
504080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		cmp	r2, ip
505080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		movlt	ip, r2
506080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		sub	r2, r2, ip
507080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		subs	ip, ip, #16
508080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		blt	.Lcfu_3rem8lp
509080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King
510d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky.Lcfu_3cpy8lp:	mov	r3, r7, lspull #24
511080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		ldmia	r1!, {r4 - r7}			@ Shouldnt fault
512d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky		orr	r3, r3, r4, lspush #8
513d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky		mov	r4, r4, lspull #24
514d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky		orr	r4, r4, r5, lspush #8
515d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky		mov	r5, r5, lspull #24
516d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky		orr	r5, r5, r6, lspush #8
517d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky		mov	r6, r6, lspull #24
518d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky		orr	r6, r6, r7, lspush #8
519080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		stmia	r0!, {r3 - r6}
520080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		subs	ip, ip, #16
521080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		bpl	.Lcfu_3cpy8lp
522080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King
523080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King.Lcfu_3rem8lp:	tst	ip, #8
524d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky		movne	r3, r7, lspull #24
525080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		ldmneia	r1!, {r4, r7}			@ Shouldnt fault
526d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky		orrne	r3, r3, r4, lspush #8
527d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky		movne	r4, r4, lspull #24
528d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky		orrne	r4, r4, r7, lspush #8
529080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		stmneia	r0!, {r3 - r4}
530080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		tst	ip, #4
531d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky		movne	r3, r7, lspull #24
532080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell KingUSER(	TUSER(	ldrne) r7, [r1], #4)			@ May fault
533d98b90ea22b0a28d9d787769704a9cf1ea5a513aVictor Kamensky		orrne	r3, r3, r7, lspush #8
534080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		strne	r3, [r0], #4
535080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		ands	ip, ip, #3
536080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		beq	.Lcfu_3fupi
537080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King.Lcfu_3nowords:	mov	r3, r7, get_byte_3
538080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		teq	ip, #0
539080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		beq	.Lcfu_finished
540080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		cmp	ip, #2
541080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		strb	r3, [r0], #1
542080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell KingUSER(	TUSER(	ldrgeb) r3, [r1], #1)			@ May fault
543080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		strgeb	r3, [r0], #1
544080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell KingUSER(	TUSER(	ldrgtb) r3, [r1], #1)			@ May fault
545080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		strgtb	r3, [r0], #1
546080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		b	.Lcfu_finished
547080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell KingENDPROC(__copy_from_user)
548080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King
549080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		.pushsection .fixup,"ax"
550080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		.align	0
551080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		/*
552080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		 * We took an exception.  r0 contains a pointer to
553080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		 * the byte not copied.
554080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		 */
555080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King9001:		ldr	r2, [sp], #4			@ void *to
556080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		sub	r2, r0, r2			@ bytes copied
557080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		ldr	r1, [sp], #4			@ unsigned long count
558080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		subs	r4, r1, r2			@ bytes left to copy
559080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		movne	r1, r4
560080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		blne	__memzero
561080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		mov	r0, r4
562080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		ldmfd	sp!, {r4 - r7, pc}
563080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King		.popsection
564080fc66fb5b6feae19fbbe8c6cbd7b11a4dac636Russell King
565