Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

+25 -14
+25 -14
arch/microblaze/lib/uaccess_old.S
··· 53 53 nop 54 54 .size __strncpy_user, . - __strncpy_user 55 55 56 - 57 56 .section .fixup, "ax" 58 57 .align 2 59 58 4: ··· 94 95 nop 95 96 .size __strnlen_user, . - __strnlen_user 96 97 97 - 98 98 .section .fixup,"ax" 99 99 4: 100 100 brid 3b ··· 119 121 * r7, r3 - count 120 122 * r4 - tempval 121 123 */ 122 - addik r3,r7,0 123 - beqi r3,3f 124 - 1: 125 - lbu r4,r6,r0 126 - addik r6,r6,1 127 - 2: 128 - sb r4,r5,r0 129 - addik r3,r3,-1 130 - bneid r3,1b 131 - addik r5,r5,1 /* delay slot */ 124 + beqid r7, 3f /* zero size is not likely */ 125 + andi r3, r7, 0x3 /* filter add count */ 126 + bneid r3, 4f /* if is odd value then byte copying */ 127 + or r3, r5, r6 /* find if is any to/from unaligned */ 128 + andi r3, r3, 0x3 /* mask unaligned */ 129 + bneid r3, 1f /* it is unaligned -> then jump */ 130 + or r3, r0, r0 131 + 132 + /* at least one 4 byte copy */ 133 + 5: lw r4, r6, r3 134 + 6: sw r4, r5, r3 135 + addik r7, r7, -4 136 + bneid r7, 5b 137 + addik r3, r3, 4 138 + addik r3, r7, 0 139 + rtsd r15, 8 140 + nop 141 + 4: or r3, r0, r0 142 + 1: lbu r4,r6,r3 143 + 2: sb r4,r5,r3 144 + addik r7,r7,-1 145 + bneid r7,1b 146 + addik r3,r3,1 /* delay slot */ 132 147 3: 148 + addik r3,r7,0 133 149 rtsd r15,8 134 150 nop 135 151 .size __copy_tofrom_user, . - __copy_tofrom_user 136 152 137 - 138 153 .section __ex_table,"a" 139 - .word 1b,3b,2b,3b 154 + .word 1b,3b,2b,3b,5b,3b,6b,3b