Implement CRC32 algorithm for RISC-V.
[openocd.git] / contrib / loaders / checksum / riscv_crc.c
1 /*
2 * SPDX-License-Identifier: GPL-2.0-or-later
3 * Copyright (C) 2009-2021 Free Software Foundation, Inc.
4 */
5
6 /* Copied from https://github.com/gcc-mirror/gcc/blob/master/libiberty/crc32.c
7 * and then tweaked a little. */
8
9 /* This table was generated by the following program.
10 #include <stdio.h>
11 int
12 main ()
13 {
14 unsigned int i, j;
15 unsigned int c;
16 int table[256];
17 for (i = 0; i < 256; i++)
18 {
19 for (c = i << 24, j = 8; j > 0; --j)
20 c = c & 0x80000000 ? (c << 1) ^ 0x04c11db7 : (c << 1);
21 table[i] = c;
22 }
23 printf ("static const unsigned int crc32_table[] =\n{\n");
24 for (i = 0; i < 256; i += 4)
25 {
26 printf (" 0x%08x, 0x%08x, 0x%08x, 0x%08x",
27 table[i + 0], table[i + 1], table[i + 2], table[i + 3]);
28 if (i + 4 < 256)
29 putchar (',');
30 putchar ('\n');
31 }
32 printf ("};\n");
33 return 0;
34 }
35 For more information on CRC, see, e.g.,
36 http://www.ross.net/crc/download/crc_v3.txt. */
37
38 static const unsigned int crc32_table[] = {
39 0x00000000, 0x04c11db7, 0x09823b6e, 0x0d4326d9,
40 0x130476dc, 0x17c56b6b, 0x1a864db2, 0x1e475005,
41 0x2608edb8, 0x22c9f00f, 0x2f8ad6d6, 0x2b4bcb61,
42 0x350c9b64, 0x31cd86d3, 0x3c8ea00a, 0x384fbdbd,
43 0x4c11db70, 0x48d0c6c7, 0x4593e01e, 0x4152fda9,
44 0x5f15adac, 0x5bd4b01b, 0x569796c2, 0x52568b75,
45 0x6a1936c8, 0x6ed82b7f, 0x639b0da6, 0x675a1011,
46 0x791d4014, 0x7ddc5da3, 0x709f7b7a, 0x745e66cd,
47 0x9823b6e0, 0x9ce2ab57, 0x91a18d8e, 0x95609039,
48 0x8b27c03c, 0x8fe6dd8b, 0x82a5fb52, 0x8664e6e5,
49 0xbe2b5b58, 0xbaea46ef, 0xb7a96036, 0xb3687d81,
50 0xad2f2d84, 0xa9ee3033, 0xa4ad16ea, 0xa06c0b5d,
51 0xd4326d90, 0xd0f37027, 0xddb056fe, 0xd9714b49,
52 0xc7361b4c, 0xc3f706fb, 0xceb42022, 0xca753d95,
53 0xf23a8028, 0xf6fb9d9f, 0xfbb8bb46, 0xff79a6f1,
54 0xe13ef6f4, 0xe5ffeb43, 0xe8bccd9a, 0xec7dd02d,
55 0x34867077, 0x30476dc0, 0x3d044b19, 0x39c556ae,
56 0x278206ab, 0x23431b1c, 0x2e003dc5, 0x2ac12072,
57 0x128e9dcf, 0x164f8078, 0x1b0ca6a1, 0x1fcdbb16,
58 0x018aeb13, 0x054bf6a4, 0x0808d07d, 0x0cc9cdca,
59 0x7897ab07, 0x7c56b6b0, 0x71159069, 0x75d48dde,
60 0x6b93dddb, 0x6f52c06c, 0x6211e6b5, 0x66d0fb02,
61 0x5e9f46bf, 0x5a5e5b08, 0x571d7dd1, 0x53dc6066,
62 0x4d9b3063, 0x495a2dd4, 0x44190b0d, 0x40d816ba,
63 0xaca5c697, 0xa864db20, 0xa527fdf9, 0xa1e6e04e,
64 0xbfa1b04b, 0xbb60adfc, 0xb6238b25, 0xb2e29692,
65 0x8aad2b2f, 0x8e6c3698, 0x832f1041, 0x87ee0df6,
66 0x99a95df3, 0x9d684044, 0x902b669d, 0x94ea7b2a,
67 0xe0b41de7, 0xe4750050, 0xe9362689, 0xedf73b3e,
68 0xf3b06b3b, 0xf771768c, 0xfa325055, 0xfef34de2,
69 0xc6bcf05f, 0xc27dede8, 0xcf3ecb31, 0xcbffd686,
70 0xd5b88683, 0xd1799b34, 0xdc3abded, 0xd8fba05a,
71 0x690ce0ee, 0x6dcdfd59, 0x608edb80, 0x644fc637,
72 0x7a089632, 0x7ec98b85, 0x738aad5c, 0x774bb0eb,
73 0x4f040d56, 0x4bc510e1, 0x46863638, 0x42472b8f,
74 0x5c007b8a, 0x58c1663d, 0x558240e4, 0x51435d53,
75 0x251d3b9e, 0x21dc2629, 0x2c9f00f0, 0x285e1d47,
76 0x36194d42, 0x32d850f5, 0x3f9b762c, 0x3b5a6b9b,
77 0x0315d626, 0x07d4cb91, 0x0a97ed48, 0x0e56f0ff,
78 0x1011a0fa, 0x14d0bd4d, 0x19939b94, 0x1d528623,
79 0xf12f560e, 0xf5ee4bb9, 0xf8ad6d60, 0xfc6c70d7,
80 0xe22b20d2, 0xe6ea3d65, 0xeba91bbc, 0xef68060b,
81 0xd727bbb6, 0xd3e6a601, 0xdea580d8, 0xda649d6f,
82 0xc423cd6a, 0xc0e2d0dd, 0xcda1f604, 0xc960ebb3,
83 0xbd3e8d7e, 0xb9ff90c9, 0xb4bcb610, 0xb07daba7,
84 0xae3afba2, 0xaafbe615, 0xa7b8c0cc, 0xa379dd7b,
85 0x9b3660c6, 0x9ff77d71, 0x92b45ba8, 0x9675461f,
86 0x8832161a, 0x8cf30bad, 0x81b02d74, 0x857130c3,
87 0x5d8a9099, 0x594b8d2e, 0x5408abf7, 0x50c9b640,
88 0x4e8ee645, 0x4a4ffbf2, 0x470cdd2b, 0x43cdc09c,
89 0x7b827d21, 0x7f436096, 0x7200464f, 0x76c15bf8,
90 0x68860bfd, 0x6c47164a, 0x61043093, 0x65c52d24,
91 0x119b4be9, 0x155a565e, 0x18197087, 0x1cd86d30,
92 0x029f3d35, 0x065e2082, 0x0b1d065b, 0x0fdc1bec,
93 0x3793a651, 0x3352bbe6, 0x3e119d3f, 0x3ad08088,
94 0x2497d08d, 0x2056cd3a, 0x2d15ebe3, 0x29d4f654,
95 0xc5a92679, 0xc1683bce, 0xcc2b1d17, 0xc8ea00a0,
96 0xd6ad50a5, 0xd26c4d12, 0xdf2f6bcb, 0xdbee767c,
97 0xe3a1cbc1, 0xe760d676, 0xea23f0af, 0xeee2ed18,
98 0xf0a5bd1d, 0xf464a0aa, 0xf9278673, 0xfde69bc4,
99 0x89b8fd09, 0x8d79e0be, 0x803ac667, 0x84fbdbd0,
100 0x9abc8bd5, 0x9e7d9662, 0x933eb0bb, 0x97ffad0c,
101 0xafb010b1, 0xab710d06, 0xa6322bdf, 0xa2f33668,
102 0xbcb4666d, 0xb8757bda, 0xb5365d03, 0xb1f740b4
103 };
104
105 /*
106 @deftypefn Extension {unsigned int} crc32 (const unsigned char *@var{buf}, @
107 int @var{len}, unsigned int @var{init})
108 Compute the 32-bit CRC of @var{buf} which has length @var{len}. The
109 starting value is 0xffffffff.
110 This is used by the @command{gdb} remote protocol for the @samp{qCRC}
111 command.
112 This CRC can be specified as:
113 Width : 32
114 Poly : 0x04c11db7
115 Init : 0xffffffff
116 RefIn : false
117 RefOut : false
118 XorOut : 0
119 This differs from the "standard" CRC-32 algorithm in that the values
120 are not reflected, and there is no final XOR value. These differences
121 make it easy to compose the values of multiple blocks.
122 @end deftypefn
123 */
124
125 #include <stdint.h>
126
127 unsigned int
128 xcrc32(const unsigned char *buf, int len)
129 {
130 uint32_t crc = 0xffffffff;
131 while (len--) {
132 crc = (crc << 8) ^ crc32_table[((crc >> 24) ^ *buf) & 255];
133 buf++;
134 }
135 asm("mv a0, %0;"
136 "ebreak;"
137 :
138 : "r"(crc));
139 return crc;
140 }

Linking to existing account procedure

If you already have an account and want to add another login method you MUST first sign in with your existing account and then change URL to read https://review.openocd.org/login/?link to get to this page again but this time it'll work for linking. Thank you.

SSH host keys fingerprints

1024 SHA256:YKx8b7u5ZWdcbp7/4AeXNaqElP49m6QrwfXaqQGJAOk gerrit-code-review@openocd.zylin.com (DSA)
384 SHA256:jHIbSQa4REvwCFG4cq5LBlBLxmxSqelQPem/EXIrxjk gerrit-code-review@openocd.org (ECDSA)
521 SHA256:UAOPYkU9Fjtcao0Ul/Rrlnj/OsQvt+pgdYSZ4jOYdgs gerrit-code-review@openocd.org (ECDSA)
256 SHA256:A13M5QlnozFOvTllybRZH6vm7iSt0XLxbA48yfc2yfY gerrit-code-review@openocd.org (ECDSA)
256 SHA256:spYMBqEYoAOtK7yZBrcwE8ZpYt6b68Cfh9yEVetvbXg gerrit-code-review@openocd.org (ED25519)
+--[ED25519 256]--+
|=..              |
|+o..   .         |
|*.o   . .        |
|+B . . .         |
|Bo. = o S        |
|Oo.+ + =         |
|oB=.* = . o      |
| =+=.+   + E     |
|. .=o   . o      |
+----[SHA256]-----+
2048 SHA256:0Onrb7/PHjpo6iVZ7xQX2riKN83FJ3KGU0TvI0TaFG4 gerrit-code-review@openocd.zylin.com (RSA)