提交 ce645515 编写于 作者: Z Zhou Xuemei 提交者: guzitao

sw64: fix floating point register corruption

Sunway inclusion
category: bugfix
bugzilla: https://gitee.com/openeuler/kernel/issues/I5GFS3

--------------------------------

When csum_partial_copy_from_user is called in an interrupt,
__copy_from_user will modify floating point register f10-f15
without restore register value. This will cause the value of
the userspace register to be corrupted. Use memcpy() instead
when called from kernel space.
Signed-off-by: NZhou Xuemei <zhouxuemei@wxiat.com>
Signed-off-by: NGu Zitao <guzitao@wxiat.com>
上级 0d22be5a
......@@ -61,7 +61,11 @@ csum_partial_cfu_dest_aligned(const unsigned long __user *src,
unsigned long checksum = ~0U;
int err = 0;
err = __copy_from_user(dst, src, len+8);
if (likely(!uaccess_kernel()))
err = __copy_from_user(dst, src, len + 8);
else
memcpy(dst, src, len + 8);
while (len > 0) {
word = *dst;
checksum += word;
......@@ -89,7 +93,10 @@ csum_partial_cfu_dest_unaligned(const unsigned long __user *src,
unsigned long checksum = ~0U;
int err = 0;
err = __copy_from_user(dst, src, len+8);
if (likely(!uaccess_kernel()))
err = __copy_from_user(dst, src, len + 8);
else
memcpy(dst, src, len + 8);
dst = (unsigned long *)((unsigned long)dst & (~7UL));
word = *dst;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册