xref: /freebsd/sys/cddl/boot/zfs/fletcher.c (revision 10b9d77bf1ccf2f3affafa6261692cb92cf7e992)
11ba4a712SPawel Jakub Dawidek /*
21ba4a712SPawel Jakub Dawidek  * CDDL HEADER START
31ba4a712SPawel Jakub Dawidek  *
41ba4a712SPawel Jakub Dawidek  * The contents of this file are subject to the terms of the
51ba4a712SPawel Jakub Dawidek  * Common Development and Distribution License (the "License").
61ba4a712SPawel Jakub Dawidek  * You may not use this file except in compliance with the License.
71ba4a712SPawel Jakub Dawidek  *
81ba4a712SPawel Jakub Dawidek  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
91ba4a712SPawel Jakub Dawidek  * or http://www.opensolaris.org/os/licensing.
101ba4a712SPawel Jakub Dawidek  * See the License for the specific language governing permissions
111ba4a712SPawel Jakub Dawidek  * and limitations under the License.
121ba4a712SPawel Jakub Dawidek  *
131ba4a712SPawel Jakub Dawidek  * When distributing Covered Code, include this CDDL HEADER in each
141ba4a712SPawel Jakub Dawidek  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
151ba4a712SPawel Jakub Dawidek  * If applicable, add the following below this CDDL HEADER, with the
161ba4a712SPawel Jakub Dawidek  * fields enclosed by brackets "[]" replaced with your own identifying
171ba4a712SPawel Jakub Dawidek  * information: Portions Copyright [yyyy] [name of copyright owner]
181ba4a712SPawel Jakub Dawidek  *
191ba4a712SPawel Jakub Dawidek  * CDDL HEADER END
201ba4a712SPawel Jakub Dawidek  */
211ba4a712SPawel Jakub Dawidek /*
221ba4a712SPawel Jakub Dawidek  * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
231ba4a712SPawel Jakub Dawidek  * Use is subject to license terms.
241ba4a712SPawel Jakub Dawidek  */
251ba4a712SPawel Jakub Dawidek 
261ba4a712SPawel Jakub Dawidek /*#pragma ident	"%Z%%M%	%I%	%E% SMI"*/
271ba4a712SPawel Jakub Dawidek 
281ba4a712SPawel Jakub Dawidek static void
291ba4a712SPawel Jakub Dawidek fletcher_2_native(const void *buf, uint64_t size, zio_cksum_t *zcp)
301ba4a712SPawel Jakub Dawidek {
311ba4a712SPawel Jakub Dawidek 	const uint64_t *ip = buf;
321ba4a712SPawel Jakub Dawidek 	const uint64_t *ipend = ip + (size / sizeof (uint64_t));
331ba4a712SPawel Jakub Dawidek 	uint64_t a0, b0, a1, b1;
341ba4a712SPawel Jakub Dawidek 
351ba4a712SPawel Jakub Dawidek 	for (a0 = b0 = a1 = b1 = 0; ip < ipend; ip += 2) {
361ba4a712SPawel Jakub Dawidek 		a0 += ip[0];
371ba4a712SPawel Jakub Dawidek 		a1 += ip[1];
381ba4a712SPawel Jakub Dawidek 		b0 += a0;
391ba4a712SPawel Jakub Dawidek 		b1 += a1;
401ba4a712SPawel Jakub Dawidek 	}
411ba4a712SPawel Jakub Dawidek 
421ba4a712SPawel Jakub Dawidek 	ZIO_SET_CHECKSUM(zcp, a0, a1, b0, b1);
431ba4a712SPawel Jakub Dawidek }
441ba4a712SPawel Jakub Dawidek 
451ba4a712SPawel Jakub Dawidek static void
46*10b9d77bSPawel Jakub Dawidek fletcher_2_byteswap(const void *buf, uint64_t size, zio_cksum_t *zcp)
47*10b9d77bSPawel Jakub Dawidek {
48*10b9d77bSPawel Jakub Dawidek 	const uint64_t *ip = buf;
49*10b9d77bSPawel Jakub Dawidek 	const uint64_t *ipend = ip + (size / sizeof (uint64_t));
50*10b9d77bSPawel Jakub Dawidek 	uint64_t a0, b0, a1, b1;
51*10b9d77bSPawel Jakub Dawidek 
52*10b9d77bSPawel Jakub Dawidek 	for (a0 = b0 = a1 = b1 = 0; ip < ipend; ip += 2) {
53*10b9d77bSPawel Jakub Dawidek 		a0 += BSWAP_64(ip[0]);
54*10b9d77bSPawel Jakub Dawidek 		a1 += BSWAP_64(ip[1]);
55*10b9d77bSPawel Jakub Dawidek 		b0 += a0;
56*10b9d77bSPawel Jakub Dawidek 		b1 += a1;
57*10b9d77bSPawel Jakub Dawidek 	}
58*10b9d77bSPawel Jakub Dawidek 
59*10b9d77bSPawel Jakub Dawidek 	ZIO_SET_CHECKSUM(zcp, a0, a1, b0, b1);
60*10b9d77bSPawel Jakub Dawidek }
61*10b9d77bSPawel Jakub Dawidek 
62*10b9d77bSPawel Jakub Dawidek static void
631ba4a712SPawel Jakub Dawidek fletcher_4_native(const void *buf, uint64_t size, zio_cksum_t *zcp)
641ba4a712SPawel Jakub Dawidek {
651ba4a712SPawel Jakub Dawidek 	const uint32_t *ip = buf;
661ba4a712SPawel Jakub Dawidek 	const uint32_t *ipend = ip + (size / sizeof (uint32_t));
671ba4a712SPawel Jakub Dawidek 	uint64_t a, b, c, d;
681ba4a712SPawel Jakub Dawidek 
691ba4a712SPawel Jakub Dawidek 	for (a = b = c = d = 0; ip < ipend; ip++) {
701ba4a712SPawel Jakub Dawidek 		a += ip[0];
711ba4a712SPawel Jakub Dawidek 		b += a;
721ba4a712SPawel Jakub Dawidek 		c += b;
731ba4a712SPawel Jakub Dawidek 		d += c;
741ba4a712SPawel Jakub Dawidek 	}
751ba4a712SPawel Jakub Dawidek 
761ba4a712SPawel Jakub Dawidek 	ZIO_SET_CHECKSUM(zcp, a, b, c, d);
771ba4a712SPawel Jakub Dawidek }
78*10b9d77bSPawel Jakub Dawidek 
79*10b9d77bSPawel Jakub Dawidek static void
80*10b9d77bSPawel Jakub Dawidek fletcher_4_byteswap(const void *buf, uint64_t size, zio_cksum_t *zcp)
81*10b9d77bSPawel Jakub Dawidek {
82*10b9d77bSPawel Jakub Dawidek 	const uint32_t *ip = buf;
83*10b9d77bSPawel Jakub Dawidek 	const uint32_t *ipend = ip + (size / sizeof (uint32_t));
84*10b9d77bSPawel Jakub Dawidek 	uint64_t a, b, c, d;
85*10b9d77bSPawel Jakub Dawidek 
86*10b9d77bSPawel Jakub Dawidek 	for (a = b = c = d = 0; ip < ipend; ip++) {
87*10b9d77bSPawel Jakub Dawidek 		a += BSWAP_32(ip[0]);
88*10b9d77bSPawel Jakub Dawidek 		b += a;
89*10b9d77bSPawel Jakub Dawidek 		c += b;
90*10b9d77bSPawel Jakub Dawidek 		d += c;
91*10b9d77bSPawel Jakub Dawidek 	}
92*10b9d77bSPawel Jakub Dawidek 
93*10b9d77bSPawel Jakub Dawidek 	ZIO_SET_CHECKSUM(zcp, a, b, c, d);
94*10b9d77bSPawel Jakub Dawidek }
95