xref: /openbsd/gnu/usr.bin/binutils/gdb/rdi-share/crc.c (revision d415bd75)
1 /*
2  * Copyright (C) 1995 Advanced RISC Machines Limited. All rights reserved.
3  *
4  * This software may be freely used, copied, modified, and distributed
5  * provided that the above copyright notice is preserved in all copies of the
6  * software.
7  */
8 
9 /* -*-C-*-
10  *
11  * $Revision: 1.3 $
12  *     $Date: 2004/12/27 14:00:54 $
13  *
14  *
15  * crc.c - provides some "standard" CRC calculation routines.
16  *
17  */
18 #include "crc.h"    /* describes this code */
19 
20 /**********************************************************************/
21 
22 /*
23  * crc32                                                IEEE-802.3 32bit CRC
24  * -----                                                --------------------
25  */
26 
27 /* This table was generated by the "crctable" program */
28 static const unsigned int crc32table[256] = {
29                    /* 0x00 */ 0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA,
30                    /* 0x04 */ 0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3,
31                    /* 0x08 */ 0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988,
32                    /* 0x0C */ 0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91,
33                    /* 0x10 */ 0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE,
34                    /* 0x14 */ 0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7,
35                    /* 0x18 */ 0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC,
36                    /* 0x1C */ 0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5,
37                    /* 0x20 */ 0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172,
38                    /* 0x24 */ 0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B,
39                    /* 0x28 */ 0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940,
40                    /* 0x2C */ 0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59,
41                    /* 0x30 */ 0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116,
42                    /* 0x34 */ 0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F,
43                    /* 0x38 */ 0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924,
44                    /* 0x3C */ 0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D,
45                    /* 0x40 */ 0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A,
46                    /* 0x44 */ 0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433,
47                    /* 0x48 */ 0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818,
48                    /* 0x4C */ 0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01,
49                    /* 0x50 */ 0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E,
50                    /* 0x54 */ 0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457,
51                    /* 0x58 */ 0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C,
52                    /* 0x5C */ 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65,
53                    /* 0x60 */ 0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2,
54                    /* 0x64 */ 0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB,
55                    /* 0x68 */ 0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0,
56                    /* 0x6C */ 0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9,
57                    /* 0x70 */ 0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086,
58                    /* 0x74 */ 0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F,
59                    /* 0x78 */ 0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4,
60                    /* 0x7C */ 0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD,
61                    /* 0x80 */ 0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A,
62                    /* 0x84 */ 0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683,
63                    /* 0x88 */ 0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8,
64                    /* 0x8C */ 0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1,
65                    /* 0x90 */ 0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE,
66                    /* 0x94 */ 0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7,
67                    /* 0x98 */ 0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC,
68                    /* 0x9C */ 0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5,
69                    /* 0xA0 */ 0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252,
70                    /* 0xA4 */ 0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B,
71                    /* 0xA8 */ 0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60,
72                    /* 0xAC */ 0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79,
73                    /* 0xB0 */ 0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236,
74                    /* 0xB4 */ 0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F,
75                    /* 0xB8 */ 0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04,
76                    /* 0xBC */ 0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D,
77                    /* 0xC0 */ 0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A,
78                    /* 0xC4 */ 0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713,
79                    /* 0xC8 */ 0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38,
80                    /* 0xCC */ 0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21,
81                    /* 0xD0 */ 0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E,
82                    /* 0xD4 */ 0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777,
83                    /* 0xD8 */ 0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C,
84                    /* 0xDC */ 0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45,
85                    /* 0xE0 */ 0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2,
86                    /* 0xE4 */ 0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB,
87                    /* 0xE8 */ 0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0,
88                    /* 0xEC */ 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9,
89                    /* 0xF0 */ 0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6,
90                    /* 0xF4 */ 0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF,
91                    /* 0xF8 */ 0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94,
92                    /* 0xFC */ 0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D,
93                                             };
94 unsigned int crc32(unsigned char *address, unsigned int size, unsigned int crc)
95 {
96 #if 0
97   /* FAST, but bigger and only good for word-aligned data */
98   unsigned int *daddr = (unsigned int *)address;
99   unsigned int  data = FALSE; /* little-endian by default */
100 
101  /*
102   * TODO: We should really get the current processor big- or
103   * little-endian state and set "data" accordingly.
104   */
105 
106   /* Perform word loop to save on memory accesses */
107   if (data)
108     /* big-endian */
109     for (; (size > 0); size -= sizeof(unsigned int))
110     {
111       data = *daddr++;
112       crc = (((crc >> 8) & 0x00FFFFFF) ^
113              crc32table[(crc ^ ((data >> 24) & 0xFF)) & 0xFF]);
114       crc = (((crc >> 8) & 0x00FFFFFF) ^
115              crc32table[(crc ^ ((data >> 16) & 0xFF)) & 0xFF]);
116       crc = (((crc >> 8) & 0x00FFFFFF) ^
117              crc32table[(crc ^ ((data >>  8) & 0xFF)) & 0xFF]);
118       crc = (((crc >> 8) & 0x00FFFFFF) ^
119              crc32table[(crc ^ ((data >>  0) & 0xFF)) & 0xFF]);
120     }
121   else
122     for (; (size > 0); size -= sizeof(unsigned int))
123     {
124       data = *daddr++;
125       crc = (((crc >> 8) & 0x00FFFFFF) ^
126              crc32table[(crc ^ ((data >>  0) & 0xFF)) & 0xFF]);
127       crc = (((crc >> 8) & 0x00FFFFFF) ^
128              crc32table[(crc ^ ((data >>  8) & 0xFF)) & 0xFF]);
129       crc = (((crc >> 8) & 0x00FFFFFF) ^
130              crc32table[(crc ^ ((data >> 16) & 0xFF)) & 0xFF]);
131       crc = (((crc >> 8) & 0x00FFFFFF) ^
132              crc32table[(crc ^ ((data >> 24) & 0xFF)) & 0xFF]);
133     }
134 #else
135   for (; (size > 0); size--)
136     /* byte loop */
137     crc = (((crc >> 8) & 0x00FFFFFF) ^
138            crc32table[(crc ^ *address++) & 0x000000FF]);
139 #endif
140 
141   return(crc);
142 }
143 
144 /**********************************************************************/
145 
146 /*
147  * crc16                                                     16bit CRC-CCITT
148  * -----                                                     ---------------
149  * This function provides a table driven 16bit CRC generation for byte data.
150  * This CRC is also known as the HDLC CRC.
151  */
152 /*
153  * 960201 KWelton
154  *
155  *TODO: Is this correct?  The compiler predefines __arm, *not* __ARM
156  */
157 #ifdef __ARM
158 /*
159  * To make the code quicker on the ARM, we double the table size and
160  * use integer slots rather than short slots for the table.
161  */
162 static const unsigned int crctableA[16] = {
163 #else
164 static const unsigned short crctableA[16] = {
165 #endif
166                                              0x0000,
167                                              0x1081,
168                                              0x2102,
169                                              0x3183,
170                                              0x4204,
171                                              0x5285,
172                                              0x6306,
173                                              0x7387,
174                                              0x8408,
175                                              0x9489,
176                                              0xA50A,
177                                              0xB58B,
178                                              0xC60C,
179                                              0xD68D,
180                                              0xE70E,
181                                              0xF78F
182                                             };
183 
184 #ifdef __ARM
185 /* See comments above */
186 static const unsigned int crctableB[16] = {
187 #else
188 static const unsigned short crctableB[16] = {
189 #endif
190                                              0x0000,
191                                              0x1189,
192                                              0x2312,
193                                              0x329B,
194                                              0x4624,
195                                              0x57AD,
196                                              0x6536,
197                                              0x74BF,
198                                              0x8C48,
199                                              0x9DC1,
200                                              0xAF5A,
201                                              0xBED3,
202                                              0xCA6C,
203                                              0xDBE5,
204                                              0xE97E,
205                                              0xF8F7
206                                             };
207 
208 unsigned short crc16(unsigned char *address, unsigned int size,
209                      unsigned short crc)
210 {
211   for (; (size > 0); size--)
212   {
213     /* byte loop */
214     unsigned char data = *address++; /* fetch the next data byte */
215 
216     data ^= crc; /* EOR data with current CRC value */
217     crc = ((crctableA[(data & 0xF0) >> 4] ^ crctableB[data & 0x0F]) ^
218            (crc >> 8));
219   }
220 
221   return(crc);
222 }
223 
224 /**********************************************************************/
225 
226 #if 0 /* not required at the moment */
227 
228 /*
229  * elf_hash
230  * --------
231  * This function is derived from the one on page 68 of chapter of the "Unix
232  * SVR4 Programmer's Guide". It is used to generate a hash-code from a
233  * symbol name.
234  */
235 unsigned int elf_hash(const unsigned char *name)
236 {
237   unsigned int h = 0;
238   unsigned int g;
239 
240   /* NULL pointer returns a hash of zero */
241   while (name && (*name))
242   {
243     h = ((h << 4) + *name++);
244 
245     if (g = (h & 0xF0000000))
246       h ^= (g >> 24);
247 
248     h &= ~g;
249   }
250 
251   return(h);
252 }
253 #endif
254 
255 /**********************************************************************/
256 
257 /* EOF crc.c */
258