Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/sys/cddl/boot/zfs/fletcher.c
101160 views
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 __unused, 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 __unused, 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 __unused, 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 __unused, 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
98