MIPS: asm: checksum: Split kernel and user copy operations
In EVA mode, different instructions need to be used to read/write from kernel and userland. In non-EVA mode, there is no functional difference. The current address limit is checked to decide the type of operation that will be performed. Signed-off-by: Leonid Yegoshin <Leonid.Yegoshin@imgtec.com> Signed-off-by: Markos Chandras <markos.chandras@imgtec.com>
This commit is contained in:
parent
6f85cebe49
commit
fb316913f8
@ -37,7 +37,6 @@ __wsum __csum_partial_copy_from_user(const void *src, void *dst,
|
|||||||
int len, __wsum sum, int *err_ptr);
|
int len, __wsum sum, int *err_ptr);
|
||||||
__wsum __csum_partial_copy_to_user(const void *src, void *dst,
|
__wsum __csum_partial_copy_to_user(const void *src, void *dst,
|
||||||
int len, __wsum sum, int *err_ptr);
|
int len, __wsum sum, int *err_ptr);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* this is a new version of the above that records errors it finds in *errp,
|
* this is a new version of the above that records errors it finds in *errp,
|
||||||
* but continues and zeros the rest of the buffer.
|
* but continues and zeros the rest of the buffer.
|
||||||
@ -47,8 +46,12 @@ __wsum csum_partial_copy_from_user(const void __user *src, void *dst, int len,
|
|||||||
__wsum sum, int *err_ptr)
|
__wsum sum, int *err_ptr)
|
||||||
{
|
{
|
||||||
might_fault();
|
might_fault();
|
||||||
return __csum_partial_copy_from_user((__force void *)src, dst,
|
if (segment_eq(get_fs(), get_ds()))
|
||||||
len, sum, err_ptr);
|
return __csum_partial_copy_kernel((__force void *)src, dst,
|
||||||
|
len, sum, err_ptr);
|
||||||
|
else
|
||||||
|
return __csum_partial_copy_from_user((__force void *)src, dst,
|
||||||
|
len, sum, err_ptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -60,9 +63,16 @@ __wsum csum_and_copy_to_user(const void *src, void __user *dst, int len,
|
|||||||
__wsum sum, int *err_ptr)
|
__wsum sum, int *err_ptr)
|
||||||
{
|
{
|
||||||
might_fault();
|
might_fault();
|
||||||
if (access_ok(VERIFY_WRITE, dst, len))
|
if (access_ok(VERIFY_WRITE, dst, len)) {
|
||||||
return __csum_partial_copy_to_user(src, (__force void *)dst,
|
if (segment_eq(get_fs(), get_ds()))
|
||||||
len, sum, err_ptr);
|
return __csum_partial_copy_kernel(src,
|
||||||
|
(__force void *)dst,
|
||||||
|
len, sum, err_ptr);
|
||||||
|
else
|
||||||
|
return __csum_partial_copy_to_user(src,
|
||||||
|
(__force void *)dst,
|
||||||
|
len, sum, err_ptr);
|
||||||
|
}
|
||||||
if (len)
|
if (len)
|
||||||
*err_ptr = -EFAULT;
|
*err_ptr = -EFAULT;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user