Loading arch/xtensa/include/asm/checksum.h +4 −16 Original line number Diff line number Diff line Loading @@ -37,9 +37,7 @@ asmlinkage __wsum csum_partial(const void *buff, int len, __wsum sum); * better 64-bit) boundary */ asmlinkage __wsum csum_partial_copy_generic(const void *src, void *dst, int len, __wsum sum, int *src_err_ptr, int *dst_err_ptr); asmlinkage __wsum csum_partial_copy_generic(const void *src, void *dst, int len); #define _HAVE_ARCH_CSUM_AND_COPY /* Loading @@ -49,7 +47,7 @@ asmlinkage __wsum csum_partial_copy_generic(const void *src, void *dst, static inline __wsum csum_partial_copy_nocheck(const void *src, void *dst, int len) { return csum_partial_copy_generic(src, dst, len, 0, NULL, NULL); return csum_partial_copy_generic(src, dst, len); } #define _HAVE_ARCH_COPY_AND_CSUM_FROM_USER Loading @@ -57,14 +55,9 @@ static inline __wsum csum_and_copy_from_user(const void __user *src, void *dst, int len) { int err = 0; if (!access_ok(src, len)) return 0; sum = csum_partial_copy_generic((__force const void *)src, dst, len, ~0U, &err, NULL); return err ? 0 : sum; return csum_partial_copy_generic((__force const void *)src, dst, len); } /* Loading Loading @@ -247,13 +240,8 @@ static __inline__ __sum16 csum_ipv6_magic(const struct in6_addr *saddr, static __inline__ __wsum csum_and_copy_to_user(const void *src, void __user *dst, int len) { int err = 0; __wsum sum = ~0U; if (!access_ok(dst, len)) return 0; sum = csum_partial_copy_generic(src,dst,len,sum,NULL,&err); return err ? 0 : sum; return csum_partial_copy_generic(src, (__force void *)dst, len); } #endif arch/xtensa/lib/checksum.S +15 −52 Original line number Diff line number Diff line Loading @@ -175,19 +175,14 @@ ENDPROC(csum_partial) */ /* unsigned int csum_partial_copy_generic (const char *src, char *dst, int len, int sum, int *src_err_ptr, int *dst_err_ptr) unsigned int csum_partial_copy_generic (const char *src, char *dst, int len) a2 = src a3 = dst a4 = len a5 = sum a6 = src_err_ptr a7 = dst_err_ptr a8 = temp a9 = temp a10 = temp a11 = original len for exception handling a12 = original dst for exception handling This function is optimized for 4-byte aligned addresses. Other alignments work, but not nearly as efficiently. Loading @@ -196,8 +191,7 @@ unsigned int csum_partial_copy_generic (const char *src, char *dst, int len, ENTRY(csum_partial_copy_generic) abi_entry_default mov a12, a3 mov a11, a4 movi a5, -1 or a10, a2, a3 /* We optimize the following alignment tests for the 4-byte Loading Loading @@ -228,26 +222,26 @@ ENTRY(csum_partial_copy_generic) #endif EX(10f) l32i a9, a2, 0 EX(10f) l32i a8, a2, 4 EX(11f) s32i a9, a3, 0 EX(11f) s32i a8, a3, 4 EX(10f) s32i a9, a3, 0 EX(10f) s32i a8, a3, 4 ONES_ADD(a5, a9) ONES_ADD(a5, a8) EX(10f) l32i a9, a2, 8 EX(10f) l32i a8, a2, 12 EX(11f) s32i a9, a3, 8 EX(11f) s32i a8, a3, 12 EX(10f) s32i a9, a3, 8 EX(10f) s32i a8, a3, 12 ONES_ADD(a5, a9) ONES_ADD(a5, a8) EX(10f) l32i a9, a2, 16 EX(10f) l32i a8, a2, 20 EX(11f) s32i a9, a3, 16 EX(11f) s32i a8, a3, 20 EX(10f) s32i a9, a3, 16 EX(10f) s32i a8, a3, 20 ONES_ADD(a5, a9) ONES_ADD(a5, a8) EX(10f) l32i a9, a2, 24 EX(10f) l32i a8, a2, 28 EX(11f) s32i a9, a3, 24 EX(11f) s32i a8, a3, 28 EX(10f) s32i a9, a3, 24 EX(10f) s32i a8, a3, 28 ONES_ADD(a5, a9) ONES_ADD(a5, a8) addi a2, a2, 32 Loading @@ -267,7 +261,7 @@ EX(11f) s32i a8, a3, 28 .Loop6: #endif EX(10f) l32i a9, a2, 0 EX(11f) s32i a9, a3, 0 EX(10f) s32i a9, a3, 0 ONES_ADD(a5, a9) addi a2, a2, 4 addi a3, a3, 4 Loading Loading @@ -298,7 +292,7 @@ EX(11f) s32i a9, a3, 0 .Loop7: #endif EX(10f) l16ui a9, a2, 0 EX(11f) s16i a9, a3, 0 EX(10f) s16i a9, a3, 0 ONES_ADD(a5, a9) addi a2, a2, 2 addi a3, a3, 2 Loading @@ -309,7 +303,7 @@ EX(11f) s16i a9, a3, 0 /* This section processes a possible trailing odd byte. */ _bbci.l a4, 0, 8f /* 1-byte chunk */ EX(10f) l8ui a9, a2, 0 EX(11f) s8i a9, a3, 0 EX(10f) s8i a9, a3, 0 #ifdef __XTENSA_EB__ slli a9, a9, 8 /* shift byte to bits 8..15 */ #endif Loading @@ -334,8 +328,8 @@ EX(11f) s8i a9, a3, 0 #endif EX(10f) l8ui a9, a2, 0 EX(10f) l8ui a8, a2, 1 EX(11f) s8i a9, a3, 0 EX(11f) s8i a8, a3, 1 EX(10f) s8i a9, a3, 0 EX(10f) s8i a8, a3, 1 #ifdef __XTENSA_EB__ slli a9, a9, 8 /* combine into a single 16-bit value */ #else /* for checksum computation */ Loading @@ -356,38 +350,7 @@ ENDPROC(csum_partial_copy_generic) # Exception handler: .section .fixup, "ax" /* a6 = src_err_ptr a7 = dst_err_ptr a11 = original len for exception handling a12 = original dst for exception handling */ 10: _movi a2, -EFAULT s32i a2, a6, 0 /* src_err_ptr */ # clear the complete destination - computing the rest # is too much work movi a2, 0 #if XCHAL_HAVE_LOOPS loopgtz a11, 2f #else beqz a11, 2f add a11, a11, a12 /* a11 = ending address */ .Leloop: #endif s8i a2, a12, 0 addi a12, a12, 1 #if !XCHAL_HAVE_LOOPS blt a12, a11, .Leloop #endif 2: abi_ret_default 11: movi a2, -EFAULT s32i a2, a7, 0 /* dst_err_ptr */ movi a2, 0 abi_ret_default Loading Loading
arch/xtensa/include/asm/checksum.h +4 −16 Original line number Diff line number Diff line Loading @@ -37,9 +37,7 @@ asmlinkage __wsum csum_partial(const void *buff, int len, __wsum sum); * better 64-bit) boundary */ asmlinkage __wsum csum_partial_copy_generic(const void *src, void *dst, int len, __wsum sum, int *src_err_ptr, int *dst_err_ptr); asmlinkage __wsum csum_partial_copy_generic(const void *src, void *dst, int len); #define _HAVE_ARCH_CSUM_AND_COPY /* Loading @@ -49,7 +47,7 @@ asmlinkage __wsum csum_partial_copy_generic(const void *src, void *dst, static inline __wsum csum_partial_copy_nocheck(const void *src, void *dst, int len) { return csum_partial_copy_generic(src, dst, len, 0, NULL, NULL); return csum_partial_copy_generic(src, dst, len); } #define _HAVE_ARCH_COPY_AND_CSUM_FROM_USER Loading @@ -57,14 +55,9 @@ static inline __wsum csum_and_copy_from_user(const void __user *src, void *dst, int len) { int err = 0; if (!access_ok(src, len)) return 0; sum = csum_partial_copy_generic((__force const void *)src, dst, len, ~0U, &err, NULL); return err ? 0 : sum; return csum_partial_copy_generic((__force const void *)src, dst, len); } /* Loading Loading @@ -247,13 +240,8 @@ static __inline__ __sum16 csum_ipv6_magic(const struct in6_addr *saddr, static __inline__ __wsum csum_and_copy_to_user(const void *src, void __user *dst, int len) { int err = 0; __wsum sum = ~0U; if (!access_ok(dst, len)) return 0; sum = csum_partial_copy_generic(src,dst,len,sum,NULL,&err); return err ? 0 : sum; return csum_partial_copy_generic(src, (__force void *)dst, len); } #endif
arch/xtensa/lib/checksum.S +15 −52 Original line number Diff line number Diff line Loading @@ -175,19 +175,14 @@ ENDPROC(csum_partial) */ /* unsigned int csum_partial_copy_generic (const char *src, char *dst, int len, int sum, int *src_err_ptr, int *dst_err_ptr) unsigned int csum_partial_copy_generic (const char *src, char *dst, int len) a2 = src a3 = dst a4 = len a5 = sum a6 = src_err_ptr a7 = dst_err_ptr a8 = temp a9 = temp a10 = temp a11 = original len for exception handling a12 = original dst for exception handling This function is optimized for 4-byte aligned addresses. Other alignments work, but not nearly as efficiently. Loading @@ -196,8 +191,7 @@ unsigned int csum_partial_copy_generic (const char *src, char *dst, int len, ENTRY(csum_partial_copy_generic) abi_entry_default mov a12, a3 mov a11, a4 movi a5, -1 or a10, a2, a3 /* We optimize the following alignment tests for the 4-byte Loading Loading @@ -228,26 +222,26 @@ ENTRY(csum_partial_copy_generic) #endif EX(10f) l32i a9, a2, 0 EX(10f) l32i a8, a2, 4 EX(11f) s32i a9, a3, 0 EX(11f) s32i a8, a3, 4 EX(10f) s32i a9, a3, 0 EX(10f) s32i a8, a3, 4 ONES_ADD(a5, a9) ONES_ADD(a5, a8) EX(10f) l32i a9, a2, 8 EX(10f) l32i a8, a2, 12 EX(11f) s32i a9, a3, 8 EX(11f) s32i a8, a3, 12 EX(10f) s32i a9, a3, 8 EX(10f) s32i a8, a3, 12 ONES_ADD(a5, a9) ONES_ADD(a5, a8) EX(10f) l32i a9, a2, 16 EX(10f) l32i a8, a2, 20 EX(11f) s32i a9, a3, 16 EX(11f) s32i a8, a3, 20 EX(10f) s32i a9, a3, 16 EX(10f) s32i a8, a3, 20 ONES_ADD(a5, a9) ONES_ADD(a5, a8) EX(10f) l32i a9, a2, 24 EX(10f) l32i a8, a2, 28 EX(11f) s32i a9, a3, 24 EX(11f) s32i a8, a3, 28 EX(10f) s32i a9, a3, 24 EX(10f) s32i a8, a3, 28 ONES_ADD(a5, a9) ONES_ADD(a5, a8) addi a2, a2, 32 Loading @@ -267,7 +261,7 @@ EX(11f) s32i a8, a3, 28 .Loop6: #endif EX(10f) l32i a9, a2, 0 EX(11f) s32i a9, a3, 0 EX(10f) s32i a9, a3, 0 ONES_ADD(a5, a9) addi a2, a2, 4 addi a3, a3, 4 Loading Loading @@ -298,7 +292,7 @@ EX(11f) s32i a9, a3, 0 .Loop7: #endif EX(10f) l16ui a9, a2, 0 EX(11f) s16i a9, a3, 0 EX(10f) s16i a9, a3, 0 ONES_ADD(a5, a9) addi a2, a2, 2 addi a3, a3, 2 Loading @@ -309,7 +303,7 @@ EX(11f) s16i a9, a3, 0 /* This section processes a possible trailing odd byte. */ _bbci.l a4, 0, 8f /* 1-byte chunk */ EX(10f) l8ui a9, a2, 0 EX(11f) s8i a9, a3, 0 EX(10f) s8i a9, a3, 0 #ifdef __XTENSA_EB__ slli a9, a9, 8 /* shift byte to bits 8..15 */ #endif Loading @@ -334,8 +328,8 @@ EX(11f) s8i a9, a3, 0 #endif EX(10f) l8ui a9, a2, 0 EX(10f) l8ui a8, a2, 1 EX(11f) s8i a9, a3, 0 EX(11f) s8i a8, a3, 1 EX(10f) s8i a9, a3, 0 EX(10f) s8i a8, a3, 1 #ifdef __XTENSA_EB__ slli a9, a9, 8 /* combine into a single 16-bit value */ #else /* for checksum computation */ Loading @@ -356,38 +350,7 @@ ENDPROC(csum_partial_copy_generic) # Exception handler: .section .fixup, "ax" /* a6 = src_err_ptr a7 = dst_err_ptr a11 = original len for exception handling a12 = original dst for exception handling */ 10: _movi a2, -EFAULT s32i a2, a6, 0 /* src_err_ptr */ # clear the complete destination - computing the rest # is too much work movi a2, 0 #if XCHAL_HAVE_LOOPS loopgtz a11, 2f #else beqz a11, 2f add a11, a11, a12 /* a11 = ending address */ .Leloop: #endif s8i a2, a12, 0 addi a12, a12, 1 #if !XCHAL_HAVE_LOOPS blt a12, a11, .Leloop #endif 2: abi_ret_default 11: movi a2, -EFAULT s32i a2, a7, 0 /* dst_err_ptr */ movi a2, 0 abi_ret_default Loading