Browse Source

[SPARC64]: Fix missing fold at end of checksums.

Both csum_partial() and the csum_partial_copy*() family of routines
forget to do a final fold on the computed checksum value on sparc64.
So do the standard Sparc "add + set condition codes, add carry"
sequence, then make sure the high 32-bits of the return value are
clear.

Based upon some excellent detective work and debugging done by
Richard Braun and Samuel Thibault.

Signed-off-by: David S. Miller <davem@davemloft.net>
David S. Miller 19 years ago
parent
commit
ae5de0ff0b
2 changed files with 6 additions and 4 deletions
  1. 3 2
      arch/sparc64/lib/checksum.S
  2. 3 2
      arch/sparc64/lib/csum_copy.S

+ 3 - 2
arch/sparc64/lib/checksum.S

@@ -165,8 +165,9 @@ csum_partial_end_cruft:
 	sll		%g1, 8, %g1
 	sll		%g1, 8, %g1
 	or		%o5, %g1, %o4
 	or		%o5, %g1, %o4
 
 
-1:	add		%o2, %o4, %o2
+1:	addcc		%o2, %o4, %o2
+	addc		%g0, %o2, %o2
 
 
 csum_partial_finish:
 csum_partial_finish:
 	retl
 	retl
-	 mov		%o2, %o0
+	 srl		%o2, 0, %o0

+ 3 - 2
arch/sparc64/lib/csum_copy.S

@@ -221,11 +221,12 @@ FUNC_NAME:		/* %o0=src, %o1=dst, %o2=len, %o3=sum */
 	sll		%g1, 8, %g1
 	sll		%g1, 8, %g1
 	or		%o5, %g1, %o4
 	or		%o5, %g1, %o4
 
 
-1:	add		%o3, %o4, %o3
+1:	addcc		%o3, %o4, %o3
+	addc		%g0, %o3, %o3
 
 
 70:
 70:
 	retl
 	retl
-	 mov		%o3, %o0
+	 srl		%o3, 0, %o0
 
 
 95:	mov		0, GLOBAL_SPARE
 95:	mov		0, GLOBAL_SPARE
 	brlez,pn	%o2, 4f
 	brlez,pn	%o2, 4f