X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=include%2Fasm-sparc64%2Fchecksum.h;h=dc8bed246fc982da713a3fcb74434a8eb9c84888;hb=f7f1b0f1e2fbadeab12d24236000e778aa9b1ead;hp=91136a643c27f359b5d51135fd6e021ea29abe77;hpb=6a77f38946aaee1cd85eeec6cf4229b204c15071;p=linux-2.6.git diff --git a/include/asm-sparc64/checksum.h b/include/asm-sparc64/checksum.h index 91136a643..dc8bed246 100644 --- a/include/asm-sparc64/checksum.h +++ b/include/asm-sparc64/checksum.h @@ -38,47 +38,44 @@ extern unsigned int csum_partial(const unsigned char * buff, int len, unsigned i * here even more important to align src and dst on a 32-bit (or even * better 64-bit) boundary */ -extern unsigned int csum_partial_copy_sparc64(const unsigned char *src, unsigned char *dst, +extern unsigned int csum_partial_copy_nocheck(const unsigned char *src, + unsigned char *dst, int len, unsigned int sum); - -static inline unsigned int -csum_partial_copy_nocheck (const unsigned char *src, unsigned char *dst, int len, - unsigned int sum) -{ - int ret; - unsigned char cur_ds = get_thread_current_ds(); - __asm__ __volatile__ ("wr %%g0, %0, %%asi" : : "i" (ASI_P)); - ret = csum_partial_copy_sparc64(src, dst, len, sum); - __asm__ __volatile__ ("wr %%g0, %0, %%asi" : : "r" (cur_ds)); - return ret; -} -static inline unsigned int -csum_partial_copy_from_user(const unsigned char __user *src, unsigned char *dst, int len, +extern long __csum_partial_copy_from_user(const unsigned char __user *src, + unsigned char *dst, int len, + unsigned int sum); + +static inline unsigned int +csum_partial_copy_from_user(const unsigned char __user *src, + unsigned char *dst, int len, unsigned int sum, int *err) { - __asm__ __volatile__ ("stx %0, [%%sp + 0x7ff + 128]" - : : "r" (err)); - return csum_partial_copy_sparc64((__force const char *) src, - dst, len, sum); + long ret = __csum_partial_copy_from_user(src, dst, len, sum); + if (ret < 0) + *err = -EFAULT; + return (unsigned int) ret; } /* * Copy and checksum to user */ #define HAVE_CSUM_COPY_USER -extern unsigned int csum_partial_copy_user_sparc64(const unsigned char *src, unsigned char __user *dst, - int len, unsigned int sum); +extern long __csum_partial_copy_to_user(const unsigned char *src, + unsigned char __user *dst, int len, + unsigned int sum); -static inline unsigned int -csum_and_copy_to_user(const unsigned char *src, unsigned char __user *dst, int len, +static inline unsigned int +csum_and_copy_to_user(const unsigned char *src, + unsigned char __user *dst, int len, unsigned int sum, int *err) { - __asm__ __volatile__ ("stx %0, [%%sp + 0x7ff + 128]" - : : "r" (err)); - return csum_partial_copy_user_sparc64(src, dst, len, sum); + long ret = __csum_partial_copy_to_user(src, dst, len, sum); + if (ret < 0) + *err = -EFAULT; + return (unsigned int) ret; } - + /* ihl is always 5 or greater, almost always is 5, and iph is word aligned * the majority of the time. */