xref: /freebsd/sys/cddl/boot/zfs/fletcher.c (revision ed04e0c3dcea4b07d73bda30b678beaf67829a67)
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 static void
fletcher_2_native(const void * buf,uint64_t size,const void * ctx_template __unused,zio_cksum_t * zcp)27*2c55d090SToomas Soome fletcher_2_native(const void *buf, uint64_t size,
28*2c55d090SToomas Soome     const void *ctx_template __unused, zio_cksum_t *zcp)
291ba4a712SPawel Jakub Dawidek {
301ba4a712SPawel Jakub Dawidek 	const uint64_t *ip = buf;
311ba4a712SPawel Jakub Dawidek 	const uint64_t *ipend = ip + (size / sizeof (uint64_t));
321ba4a712SPawel Jakub Dawidek 	uint64_t a0, b0, a1, b1;
331ba4a712SPawel Jakub Dawidek 
341ba4a712SPawel Jakub Dawidek 	for (a0 = b0 = a1 = b1 = 0; ip < ipend; ip += 2) {
351ba4a712SPawel Jakub Dawidek 		a0 += ip[0];
361ba4a712SPawel Jakub Dawidek 		a1 += ip[1];
371ba4a712SPawel Jakub Dawidek 		b0 += a0;
381ba4a712SPawel Jakub Dawidek 		b1 += a1;
391ba4a712SPawel Jakub Dawidek 	}
401ba4a712SPawel Jakub Dawidek 
411ba4a712SPawel Jakub Dawidek 	ZIO_SET_CHECKSUM(zcp, a0, a1, b0, b1);
421ba4a712SPawel Jakub Dawidek }
431ba4a712SPawel Jakub Dawidek 
441ba4a712SPawel Jakub Dawidek static void
fletcher_2_byteswap(const void * buf,uint64_t size,const void * ctx_template __unused,zio_cksum_t * zcp)45*2c55d090SToomas Soome fletcher_2_byteswap(const void *buf, uint64_t size,
46*2c55d090SToomas Soome     const void *ctx_template __unused, zio_cksum_t *zcp)
4710b9d77bSPawel Jakub Dawidek {
4810b9d77bSPawel Jakub Dawidek 	const uint64_t *ip = buf;
4910b9d77bSPawel Jakub Dawidek 	const uint64_t *ipend = ip + (size / sizeof (uint64_t));
5010b9d77bSPawel Jakub Dawidek 	uint64_t a0, b0, a1, b1;
5110b9d77bSPawel Jakub Dawidek 
5210b9d77bSPawel Jakub Dawidek 	for (a0 = b0 = a1 = b1 = 0; ip < ipend; ip += 2) {
5310b9d77bSPawel Jakub Dawidek 		a0 += BSWAP_64(ip[0]);
5410b9d77bSPawel Jakub Dawidek 		a1 += BSWAP_64(ip[1]);
5510b9d77bSPawel Jakub Dawidek 		b0 += a0;
5610b9d77bSPawel Jakub Dawidek 		b1 += a1;
5710b9d77bSPawel Jakub Dawidek 	}
5810b9d77bSPawel Jakub Dawidek 
5910b9d77bSPawel Jakub Dawidek 	ZIO_SET_CHECKSUM(zcp, a0, a1, b0, b1);
6010b9d77bSPawel Jakub Dawidek }
6110b9d77bSPawel Jakub Dawidek 
6210b9d77bSPawel Jakub Dawidek static void
fletcher_4_native(const void * buf,uint64_t size,const void * ctx_template __unused,zio_cksum_t * zcp)63*2c55d090SToomas Soome fletcher_4_native(const void *buf, uint64_t size,
64*2c55d090SToomas Soome     const void *ctx_template __unused, zio_cksum_t *zcp)
651ba4a712SPawel Jakub Dawidek {
661ba4a712SPawel Jakub Dawidek 	const uint32_t *ip = buf;
671ba4a712SPawel Jakub Dawidek 	const uint32_t *ipend = ip + (size / sizeof (uint32_t));
681ba4a712SPawel Jakub Dawidek 	uint64_t a, b, c, d;
691ba4a712SPawel Jakub Dawidek 
701ba4a712SPawel Jakub Dawidek 	for (a = b = c = d = 0; ip < ipend; ip++) {
711ba4a712SPawel Jakub Dawidek 		a += ip[0];
721ba4a712SPawel Jakub Dawidek 		b += a;
731ba4a712SPawel Jakub Dawidek 		c += b;
741ba4a712SPawel Jakub Dawidek 		d += c;
751ba4a712SPawel Jakub Dawidek 	}
761ba4a712SPawel Jakub Dawidek 
771ba4a712SPawel Jakub Dawidek 	ZIO_SET_CHECKSUM(zcp, a, b, c, d);
781ba4a712SPawel Jakub Dawidek }
7910b9d77bSPawel Jakub Dawidek 
8010b9d77bSPawel Jakub Dawidek static void
fletcher_4_byteswap(const void * buf,uint64_t size,const void * ctx_template __unused,zio_cksum_t * zcp)81*2c55d090SToomas Soome fletcher_4_byteswap(const void *buf, uint64_t size,
82*2c55d090SToomas Soome     const void *ctx_template __unused, zio_cksum_t *zcp)
8310b9d77bSPawel Jakub Dawidek {
8410b9d77bSPawel Jakub Dawidek 	const uint32_t *ip = buf;
8510b9d77bSPawel Jakub Dawidek 	const uint32_t *ipend = ip + (size / sizeof (uint32_t));
8610b9d77bSPawel Jakub Dawidek 	uint64_t a, b, c, d;
8710b9d77bSPawel Jakub Dawidek 
8810b9d77bSPawel Jakub Dawidek 	for (a = b = c = d = 0; ip < ipend; ip++) {
8910b9d77bSPawel Jakub Dawidek 		a += BSWAP_32(ip[0]);
9010b9d77bSPawel Jakub Dawidek 		b += a;
9110b9d77bSPawel Jakub Dawidek 		c += b;
9210b9d77bSPawel Jakub Dawidek 		d += c;
9310b9d77bSPawel Jakub Dawidek 	}
9410b9d77bSPawel Jakub Dawidek 
9510b9d77bSPawel Jakub Dawidek 	ZIO_SET_CHECKSUM(zcp, a, b, c, d);
9610b9d77bSPawel Jakub Dawidek }
97