Commit dc16c8a9 authored by Al Viro's avatar Al Viro

sh: propage the calling conventions change down to csum_partial_copy_generic()

... and get rid of zeroing destination on error there.
Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent 66aa3880
...@@ -30,9 +30,7 @@ asmlinkage __wsum csum_partial(const void *buff, int len, __wsum sum); ...@@ -30,9 +30,7 @@ asmlinkage __wsum csum_partial(const void *buff, int len, __wsum sum);
* better 64-bit) boundary * better 64-bit) boundary
*/ */
asmlinkage __wsum csum_partial_copy_generic(const void *src, void *dst, asmlinkage __wsum csum_partial_copy_generic(const void *src, void *dst, int len);
int len, __wsum sum,
int *src_err_ptr, int *dst_err_ptr);
#define _HAVE_ARCH_CSUM_AND_COPY #define _HAVE_ARCH_CSUM_AND_COPY
/* /*
...@@ -45,21 +43,16 @@ asmlinkage __wsum csum_partial_copy_generic(const void *src, void *dst, ...@@ -45,21 +43,16 @@ asmlinkage __wsum csum_partial_copy_generic(const void *src, void *dst,
static inline static inline
__wsum csum_partial_copy_nocheck(const void *src, void *dst, int len) __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 #define _HAVE_ARCH_COPY_AND_CSUM_FROM_USER
static inline static inline
__wsum csum_and_copy_from_user(const void __user *src, void *dst, int len) __wsum csum_and_copy_from_user(const void __user *src, void *dst, int len)
{ {
int err = 0;
__wsum sum = ~0U;
if (!access_ok(src, len)) if (!access_ok(src, len))
return 0; return 0;
sum = csum_partial_copy_generic((__force const void *)src, dst, return csum_partial_copy_generic((__force const void *)src, dst, len);
len, sum, &err, NULL);
return err ? 0 : sum;
} }
/* /*
...@@ -202,13 +195,8 @@ static inline __wsum csum_and_copy_to_user(const void *src, ...@@ -202,13 +195,8 @@ static inline __wsum csum_and_copy_to_user(const void *src,
void __user *dst, void __user *dst,
int len) int len)
{ {
int err = 0;
__wsum sum = ~0U;
if (!access_ok(dst, len)) if (!access_ok(dst, len))
return 0; return 0;
sum = csum_partial_copy_generic((__force const void *)src, return csum_partial_copy_generic((__force const void *)src, dst, len);
dst, len, sum, NULL, &err);
return err ? 0 : sum;
} }
#endif /* __ASM_SH_CHECKSUM_H */ #endif /* __ASM_SH_CHECKSUM_H */
...@@ -173,47 +173,27 @@ ENTRY(csum_partial) ...@@ -173,47 +173,27 @@ ENTRY(csum_partial)
mov r6, r0 mov r6, r0
/* /*
unsigned int csum_partial_copy_generic (const char *src, char *dst, int len, unsigned int csum_partial_copy_generic (const char *src, char *dst, int len)
int sum, int *src_err_ptr, int *dst_err_ptr)
*/ */
/* /*
* Copy from ds while checksumming, otherwise like csum_partial * Copy from ds while checksumming, otherwise like csum_partial with initial
* * sum being ~0U
* The macros SRC and DST specify the type of access for the instruction.
* thus we can call a custom exception handler for all access types.
*
* FIXME: could someone double-check whether I haven't mixed up some SRC and
* DST definitions? It's damn hard to trigger all cases. I hope I got
* them all but there's no guarantee.
*/ */
#define SRC(...) \ #define EXC(...) \
9999: __VA_ARGS__ ; \ 9999: __VA_ARGS__ ; \
.section __ex_table, "a"; \ .section __ex_table, "a"; \
.long 9999b, 6001f ; \ .long 9999b, 6001f ; \
.previous .previous
#define DST(...) \
9999: __VA_ARGS__ ; \
.section __ex_table, "a"; \
.long 9999b, 6002f ; \
.previous
! !
! r4: const char *SRC ! r4: const char *SRC
! r5: char *DST ! r5: char *DST
! r6: int LEN ! r6: int LEN
! r7: int SUM
!
! on stack:
! int *SRC_ERR_PTR
! int *DST_ERR_PTR
! !
ENTRY(csum_partial_copy_generic) ENTRY(csum_partial_copy_generic)
mov.l r5,@-r15 mov #-1,r7
mov.l r6,@-r15
mov #3,r0 ! Check src and dest are equally aligned mov #3,r0 ! Check src and dest are equally aligned
mov r4,r1 mov r4,r1
and r0,r1 and r0,r1
...@@ -243,11 +223,11 @@ ENTRY(csum_partial_copy_generic) ...@@ -243,11 +223,11 @@ ENTRY(csum_partial_copy_generic)
clrt clrt
.align 2 .align 2
5: 5:
SRC( mov.b @r4+,r1 ) EXC( mov.b @r4+,r1 )
SRC( mov.b @r4+,r0 ) EXC( mov.b @r4+,r0 )
extu.b r1,r1 extu.b r1,r1
DST( mov.b r1,@r5 ) EXC( mov.b r1,@r5 )
DST( mov.b r0,@(1,r5) ) EXC( mov.b r0,@(1,r5) )
extu.b r0,r0 extu.b r0,r0
add #2,r5 add #2,r5
...@@ -276,8 +256,8 @@ DST( mov.b r0,@(1,r5) ) ...@@ -276,8 +256,8 @@ DST( mov.b r0,@(1,r5) )
! Handle first two bytes as a special case ! Handle first two bytes as a special case
.align 2 .align 2
1: 1:
SRC( mov.w @r4+,r0 ) EXC( mov.w @r4+,r0 )
DST( mov.w r0,@r5 ) EXC( mov.w r0,@r5 )
add #2,r5 add #2,r5
extu.w r0,r0 extu.w r0,r0
addc r0,r7 addc r0,r7
...@@ -292,32 +272,32 @@ DST( mov.w r0,@r5 ) ...@@ -292,32 +272,32 @@ DST( mov.w r0,@r5 )
clrt clrt
.align 2 .align 2
1: 1:
SRC( mov.l @r4+,r0 ) EXC( mov.l @r4+,r0 )
SRC( mov.l @r4+,r1 ) EXC( mov.l @r4+,r1 )
addc r0,r7 addc r0,r7
DST( mov.l r0,@r5 ) EXC( mov.l r0,@r5 )
DST( mov.l r1,@(4,r5) ) EXC( mov.l r1,@(4,r5) )
addc r1,r7 addc r1,r7
SRC( mov.l @r4+,r0 ) EXC( mov.l @r4+,r0 )
SRC( mov.l @r4+,r1 ) EXC( mov.l @r4+,r1 )
addc r0,r7 addc r0,r7
DST( mov.l r0,@(8,r5) ) EXC( mov.l r0,@(8,r5) )
DST( mov.l r1,@(12,r5) ) EXC( mov.l r1,@(12,r5) )
addc r1,r7 addc r1,r7
SRC( mov.l @r4+,r0 ) EXC( mov.l @r4+,r0 )
SRC( mov.l @r4+,r1 ) EXC( mov.l @r4+,r1 )
addc r0,r7 addc r0,r7
DST( mov.l r0,@(16,r5) ) EXC( mov.l r0,@(16,r5) )
DST( mov.l r1,@(20,r5) ) EXC( mov.l r1,@(20,r5) )
addc r1,r7 addc r1,r7
SRC( mov.l @r4+,r0 ) EXC( mov.l @r4+,r0 )
SRC( mov.l @r4+,r1 ) EXC( mov.l @r4+,r1 )
addc r0,r7 addc r0,r7
DST( mov.l r0,@(24,r5) ) EXC( mov.l r0,@(24,r5) )
DST( mov.l r1,@(28,r5) ) EXC( mov.l r1,@(28,r5) )
addc r1,r7 addc r1,r7
add #32,r5 add #32,r5
movt r0 movt r0
...@@ -335,9 +315,9 @@ DST( mov.l r1,@(28,r5) ) ...@@ -335,9 +315,9 @@ DST( mov.l r1,@(28,r5) )
clrt clrt
shlr2 r6 shlr2 r6
3: 3:
SRC( mov.l @r4+,r0 ) EXC( mov.l @r4+,r0 )
addc r0,r7 addc r0,r7
DST( mov.l r0,@r5 ) EXC( mov.l r0,@r5 )
add #4,r5 add #4,r5
movt r0 movt r0
dt r6 dt r6
...@@ -353,8 +333,8 @@ DST( mov.l r0,@r5 ) ...@@ -353,8 +333,8 @@ DST( mov.l r0,@r5 )
mov #2,r1 mov #2,r1
cmp/hs r1,r6 cmp/hs r1,r6
bf 5f bf 5f
SRC( mov.w @r4+,r0 ) EXC( mov.w @r4+,r0 )
DST( mov.w r0,@r5 ) EXC( mov.w r0,@r5 )
extu.w r0,r0 extu.w r0,r0
add #2,r5 add #2,r5
cmp/eq r1,r6 cmp/eq r1,r6
...@@ -363,8 +343,8 @@ DST( mov.w r0,@r5 ) ...@@ -363,8 +343,8 @@ DST( mov.w r0,@r5 )
shll16 r0 shll16 r0
addc r0,r7 addc r0,r7
5: 5:
SRC( mov.b @r4+,r0 ) EXC( mov.b @r4+,r0 )
DST( mov.b r0,@r5 ) EXC( mov.b r0,@r5 )
extu.b r0,r0 extu.b r0,r0
#ifndef __LITTLE_ENDIAN__ #ifndef __LITTLE_ENDIAN__
shll8 r0 shll8 r0
...@@ -373,42 +353,13 @@ DST( mov.b r0,@r5 ) ...@@ -373,42 +353,13 @@ DST( mov.b r0,@r5 )
mov #0,r0 mov #0,r0
addc r0,r7 addc r0,r7
7: 7:
5000:
# Exception handler: # Exception handler:
.section .fixup, "ax" .section .fixup, "ax"
6001: 6001:
mov.l @(8,r15),r0 ! src_err_ptr rts
mov #-EFAULT,r1 mov #0,r0
mov.l r1,@r0
! zero the complete destination - computing the rest
! is too much work
mov.l @(4,r15),r5 ! dst
mov.l @r15,r6 ! len
mov #0,r7
1: mov.b r7,@r5
dt r6
bf/s 1b
add #1,r5
mov.l 8000f,r0
jmp @r0
nop
.align 2
8000: .long 5000b
6002:
mov.l @(12,r15),r0 ! dst_err_ptr
mov #-EFAULT,r1
mov.l r1,@r0
mov.l 8001f,r0
jmp @r0
nop
.align 2
8001: .long 5000b
.previous .previous
add #8,r15
rts rts
mov r7,r0 mov r7,r0
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment