浏览代码

powerpc/32: Fix csum_partial_copy_generic()

Commit 7aef4136566b0 ("powerpc32: rewrite csum_partial_copy_generic()
based on copy_tofrom_user()") introduced a bug when destination
address is odd and initial csum is not null

In that (rare) case the initial csum value has to be rotated one byte
as well as the resulting value is

This patch also fixes related comments

Fixes: 7aef4136566b0 ("powerpc32: rewrite csum_partial_copy_generic() based on copy_tofrom_user()")
Signed-off-by: Christophe Leroy <christophe.leroy@c-s.fr>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Christophe Leroy 9 年之前
父节点
当前提交
1bc8b816cb
共有 1 个文件被更改,包括 4 次插入3 次删除
  1. 4 3
      arch/powerpc/lib/checksum_32.S

+ 4 - 3
arch/powerpc/lib/checksum_32.S

@@ -127,8 +127,9 @@ _GLOBAL(csum_partial_copy_generic)
 	stw	r7,12(r1)
 	stw	r7,12(r1)
 	stw	r8,8(r1)
 	stw	r8,8(r1)
 
 
-	andi.	r0,r4,1			/* is destination address even ? */
-	cmplwi	cr7,r0,0
+	rlwinm	r0,r4,3,0x8
+	rlwnm	r6,r6,r0,0,31	/* odd destination address: rotate one byte */
+	cmplwi	cr7,r0,0	/* is destination address even ? */
 	addic	r12,r6,0
 	addic	r12,r6,0
 	addi	r6,r4,-4
 	addi	r6,r4,-4
 	neg	r0,r4
 	neg	r0,r4
@@ -237,7 +238,7 @@ _GLOBAL(csum_partial_copy_generic)
 66:	addze	r3,r12
 66:	addze	r3,r12
 	addi	r1,r1,16
 	addi	r1,r1,16
 	beqlr+	cr7
 	beqlr+	cr7
-	rlwinm	r3,r3,8,0,31	/* swap bytes for odd destination */
+	rlwinm	r3,r3,8,0,31	/* odd destination address: rotate one byte */
 	blr
 	blr
 
 
 /* read fault */
 /* read fault */