aboutsummaryrefslogtreecommitdiffstats
path: root/arch/microblaze
diff options
context:
space:
mode:
authorMichal Simek <monstr@monstr.eu>2010-03-22 15:31:26 -0400
committerMichal Simek <monstr@monstr.eu>2010-04-01 02:38:25 -0400
commitca3865bae5ff86f5670edc9beebbd1f58c29de85 (patch)
tree78aa70b8baec6a877c18ff2cdf7b018582157c21 /arch/microblaze
parent6059b3cbeb27a38e3ca9ac9d2827f7b5be32e2ba (diff)
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>
Diffstat (limited to 'arch/microblaze')
-rw-r--r--arch/microblaze/lib/uaccess_old.S39
1 files changed, 25 insertions, 14 deletions
diff --git a/arch/microblaze/lib/uaccess_old.S b/arch/microblaze/lib/uaccess_old.S
index b327524a8032..5810cec54a7a 100644
--- a/arch/microblaze/lib/uaccess_old.S
+++ b/arch/microblaze/lib/uaccess_old.S
@@ -53,7 +53,6 @@ __strncpy_user:
53 nop 53 nop
54 .size __strncpy_user, . - __strncpy_user 54 .size __strncpy_user, . - __strncpy_user
55 55
56
57 .section .fixup, "ax" 56 .section .fixup, "ax"
58 .align 2 57 .align 2
594: 584:
@@ -95,7 +94,6 @@ __strnlen_user:
95 nop 94 nop
96 .size __strnlen_user, . - __strnlen_user 95 .size __strnlen_user, . - __strnlen_user
97 96
98
99 .section .fixup,"ax" 97 .section .fixup,"ax"
1004: 984:
101 brid 3b 99 brid 3b
@@ -121,21 +119,34 @@ __copy_tofrom_user:
121 * r7, r3 - count 119 * r7, r3 - count
122 * r4 - tempval 120 * r4 - tempval
123 */ 121 */
124 addik r3,r7,0 122 beqid r7, 3f /* zero size is not likely */
125 beqi r3,3f 123 andi r3, r7, 0x3 /* filter add count */
1261: 124 bneid r3, 4f /* if is odd value then byte copying */
127 lbu r4,r6,r0 125 or r3, r5, r6 /* find if is any to/from unaligned */
128 addik r6,r6,1 126 andi r3, r3, 0x3 /* mask unaligned */
1292: 127 bneid r3, 1f /* it is unaligned -> then jump */
130 sb r4,r5,r0 128 or r3, r0, r0
131 addik r3,r3,-1 129
132 bneid r3,1b 130/* at least one 4 byte copy */
133 addik r5,r5,1 /* delay slot */ 1315: lw r4, r6, r3
1326: sw r4, r5, r3
133 addik r7, r7, -4
134 bneid r7, 5b
135 addik r3, r3, 4
136 addik r3, r7, 0
137 rtsd r15, 8
138 nop
1394: or r3, r0, r0
1401: lbu r4,r6,r3
1412: sb r4,r5,r3
142 addik r7,r7,-1
143 bneid r7,1b
144 addik r3,r3,1 /* delay slot */
1343: 1453:
146 addik r3,r7,0
135 rtsd r15,8 147 rtsd r15,8
136 nop 148 nop
137 .size __copy_tofrom_user, . - __copy_tofrom_user 149 .size __copy_tofrom_user, . - __copy_tofrom_user
138 150
139
140 .section __ex_table,"a" 151 .section __ex_table,"a"
141 .word 1b,3b,2b,3b 152 .word 1b,3b,2b,3b,5b,3b,6b,3b