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