mirror of
https://github.com/tbsdtv/linux_media.git
synced 2025-07-23 12:43:29 +02:00
sh: propage the calling conventions change down to csum_partial_copy_generic()
... and get rid of zeroing destination on error there. Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
@@ -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,
|
|||||||
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,
|
|||||||
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)
|
|||||||
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)
|
|||||||
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) )
|
|||||||
! 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 )
|
|||||||
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) )
|
|||||||
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 )
|
|||||||
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 )
|
|||||||
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 )
|
|||||||
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
|
||||||
|
Reference in New Issue
Block a user