2 * Copyright (C) 2002 Paul Mackerras, IBM Corp.
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation; either version
7 * 2 of the License, or (at your option) any later version.
9 #include <asm/processor.h>
10 #include <asm/ppc_asm.h>
13 _GLOBAL(__copy_tofrom_user)
14 /* first check for a whole page copy on a page boundary */
18 neg r6,r3 /* LS 3 bits = # bytes to 8-byte dest bdry */
21 crand cr0*4+2,cr0*4+2,cr6*4+2
81 24: ld r9,0(r4) /* 3+2n loads, 2+2n stores */
92 28: ld r0,0(r4) /* 4+2n loads, 3+2n stores */
138 PPC_MTOCRF 0x01,r6 /* put #bytes to 8B bdry into cr7 */
153 3: PPC_MTOCRF 0x01,r5
183 * exception handlers follow
184 * we have to return the number of bytes not copied
185 * for an exception on a load, we set the rest of the destination to 0
218 * here we have had a fault on a load and r3 points to the first
219 * unmodified byte of the destination
226 subf r5,r6,r5 /* #bytes left to go */
229 * first see if we can copy any more bytes before hitting another exception
237 li r3,0 /* huh? all copied successfully this time? */
241 * here we have trapped again, need to clear ctr bytes starting at r3
246 mr r3,r5 /* return the number of bytes not copied */
270 * exception handlers for stores: we just need to work
271 * out how many bytes weren't copied
303 subf r3,r3,r6 /* #bytes not copied */
307 blr /* #bytes not copied in r3 */
309 .section __ex_table,"a"
362 * Routine to copy a whole page of data, optimized for POWER4.
363 * On POWER4 it is more than 50% faster than the simple loop
364 * above (following the .Ldst_aligned label) but it runs slightly
481 * on an exception, reset to the beginning and jump back into the
482 * standard __copy_tofrom_user
501 .section __ex_table,"a"