1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 /* 22 * Copyright 2006 Sun Microsystems, Inc. All rights reserved. 23 * Use is subject to license terms. 24 */ 25 26 static void 27 fletcher_2_native(const void *buf, uint64_t size, 28 const void *ctx_template, zio_cksum_t *zcp) 29 { 30 const uint64_t *ip = buf; 31 const uint64_t *ipend = ip + (size / sizeof (uint64_t)); 32 uint64_t a0, b0, a1, b1; 33 34 for (a0 = b0 = a1 = b1 = 0; ip < ipend; ip += 2) { 35 a0 += ip[0]; 36 a1 += ip[1]; 37 b0 += a0; 38 b1 += a1; 39 } 40 41 ZIO_SET_CHECKSUM(zcp, a0, a1, b0, b1); 42 } 43 44 static void 45 fletcher_2_byteswap(const void *buf, uint64_t size, 46 const void *ctx_template, zio_cksum_t *zcp) 47 { 48 const uint64_t *ip = buf; 49 const uint64_t *ipend = ip + (size / sizeof (uint64_t)); 50 uint64_t a0, b0, a1, b1; 51 52 for (a0 = b0 = a1 = b1 = 0; ip < ipend; ip += 2) { 53 a0 += BSWAP_64(ip[0]); 54 a1 += BSWAP_64(ip[1]); 55 b0 += a0; 56 b1 += a1; 57 } 58 59 ZIO_SET_CHECKSUM(zcp, a0, a1, b0, b1); 60 } 61 62 static void 63 fletcher_4_native(const void *buf, uint64_t size, 64 const void *ctx_template, zio_cksum_t *zcp) 65 { 66 const uint32_t *ip = buf; 67 const uint32_t *ipend = ip + (size / sizeof (uint32_t)); 68 uint64_t a, b, c, d; 69 70 for (a = b = c = d = 0; ip < ipend; ip++) { 71 a += ip[0]; 72 b += a; 73 c += b; 74 d += c; 75 } 76 77 ZIO_SET_CHECKSUM(zcp, a, b, c, d); 78 } 79 80 static void 81 fletcher_4_byteswap(const void *buf, uint64_t size, 82 const void *ctx_template, zio_cksum_t *zcp) 83 { 84 const uint32_t *ip = buf; 85 const uint32_t *ipend = ip + (size / sizeof (uint32_t)); 86 uint64_t a, b, c, d; 87 88 for (a = b = c = d = 0; ip < ipend; ip++) { 89 a += BSWAP_32(ip[0]); 90 b += a; 91 c += b; 92 d += c; 93 } 94 95 ZIO_SET_CHECKSUM(zcp, a, b, c, d); 96 } 97