microblaze: Support word copying in copy_tofrom_user

Word copying is used only for aligned addresses.
Here is space for improving to use any better copying technique.
Look at memcpy implementation.

Signed-off-by: Michal Simek <monstr@monstr.eu>
This commit is contained in:
Michal Simek 2010-03-22 20:31:26 +01:00
parent 6059b3cbeb
commit ca3865bae5

View File

@ -53,7 +53,6 @@ __strncpy_user:
nop nop
.size __strncpy_user, . - __strncpy_user .size __strncpy_user, . - __strncpy_user
.section .fixup, "ax" .section .fixup, "ax"
.align 2 .align 2
4: 4:
@ -95,7 +94,6 @@ __strnlen_user:
nop nop
.size __strnlen_user, . - __strnlen_user .size __strnlen_user, . - __strnlen_user
.section .fixup,"ax" .section .fixup,"ax"
4: 4:
brid 3b brid 3b
@ -121,21 +119,34 @@ __copy_tofrom_user:
* r7, r3 - count * r7, r3 - count
* r4 - tempval * r4 - tempval
*/ */
addik r3,r7,0 beqid r7, 3f /* zero size is not likely */
beqi r3,3f andi r3, r7, 0x3 /* filter add count */
1: bneid r3, 4f /* if is odd value then byte copying */
lbu r4,r6,r0 or r3, r5, r6 /* find if is any to/from unaligned */
addik r6,r6,1 andi r3, r3, 0x3 /* mask unaligned */
2: bneid r3, 1f /* it is unaligned -> then jump */
sb r4,r5,r0 or r3, r0, r0
addik r3,r3,-1
bneid r3,1b /* at least one 4 byte copy */
addik r5,r5,1 /* delay slot */ 5: lw r4, r6, r3
6: sw r4, r5, r3
addik r7, r7, -4
bneid r7, 5b
addik r3, r3, 4
addik r3, r7, 0
rtsd r15, 8
nop
4: or r3, r0, r0
1: lbu r4,r6,r3
2: sb r4,r5,r3
addik r7,r7,-1
bneid r7,1b
addik r3,r3,1 /* delay slot */
3: 3:
addik r3,r7,0
rtsd r15,8 rtsd r15,8
nop nop
.size __copy_tofrom_user, . - __copy_tofrom_user .size __copy_tofrom_user, . - __copy_tofrom_user
.section __ex_table,"a" .section __ex_table,"a"
.word 1b,3b,2b,3b .word 1b,3b,2b,3b,5b,3b,6b,3b