Commit | Line | Data |
---|---|---|
920dae64 AT |
1 | // ========== Copyright Header Begin ========================================== |
2 | // | |
3 | // OpenSPARC T2 Processor File: BL_Hsiao_256_10_Synd.cc | |
4 | // Copyright (c) 2006 Sun Microsystems, Inc. All Rights Reserved. | |
5 | // DO NOT ALTER OR REMOVE COPYRIGHT NOTICES. | |
6 | // | |
7 | // The above named program is free software; you can redistribute it and/or | |
8 | // modify it under the terms of the GNU General Public | |
9 | // License version 2 as published by the Free Software Foundation. | |
10 | // | |
11 | // The above named program is distributed in the hope that it will be | |
12 | // useful, but WITHOUT ANY WARRANTY; without even the implied warranty of | |
13 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
14 | // General Public License for more details. | |
15 | // | |
16 | // You should have received a copy of the GNU General Public | |
17 | // License along with this work; if not, write to the Free Software | |
18 | // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. | |
19 | // | |
20 | // ========== Copyright Header End ============================================ | |
21 | /************************************************************************ | |
22 | ** | |
23 | ** Copyright (C) 2006, Sun Microsystems, Inc. | |
24 | ** | |
25 | ** Sun considers its source code as an unpublished, proprietary | |
26 | ** trade secret and it is available only under strict license provisions. | |
27 | ** This copyright notice is placed here only to protect Sun in the event | |
28 | ** the source is deemed a published work. Disassembly, decompilation, | |
29 | ** or other means of reducing the object code to human readable form | |
30 | ** is prohibited by the license agreement under which this code is | |
31 | ** provided to the user or company in possession of this copy. | |
32 | ** | |
33 | *************************************************************************/ | |
34 | ||
35 | #include <stdlib.h> | |
36 | #include "BL_Types.h" | |
37 | #include "BL_Hsiao_256_10_Synd.h" | |
38 | ||
39 | ||
40 | BL_EccBits BL_Hsiao_256_10_Synd::Patterns::syndromes[256]; | |
41 | ||
42 | BL_Hsiao_256_10_Synd::Patterns BL_Hsiao_256_10_Synd::hsiao_256_10_patterns; | |
43 | ||
44 | BL_Hsiao_256_10_Synd::Patterns::Patterns() | |
45 | { | |
46 | // These syndromes are defined in PRM 1.3 Section 16.14.1 | |
47 | // Note they are written in base 2 so we use strtoul() to convert them. | |
48 | syndromes[0] = strtoul("1110000000", NULL, 2); | |
49 | syndromes[1] = strtoul("1101000000", NULL, 2); | |
50 | syndromes[2] = strtoul("1011000000", NULL, 2); | |
51 | syndromes[3] = strtoul("0111000000", NULL, 2); | |
52 | syndromes[4] = strtoul("1100100000", NULL, 2); | |
53 | syndromes[5] = strtoul("1010100000", NULL, 2); | |
54 | syndromes[6] = strtoul("0110100000", NULL, 2); | |
55 | syndromes[7] = strtoul("1001100000", NULL, 2); | |
56 | syndromes[8] = strtoul("0101100000", NULL, 2); | |
57 | syndromes[9] = strtoul("0011100000", NULL, 2); | |
58 | syndromes[10] = strtoul("1100010000", NULL, 2); | |
59 | syndromes[11] = strtoul("1010010000", NULL, 2); | |
60 | syndromes[12] = strtoul("0110010000", NULL, 2); | |
61 | syndromes[13] = strtoul("1001010000", NULL, 2); | |
62 | syndromes[14] = strtoul("0101010000", NULL, 2); | |
63 | syndromes[15] = strtoul("0011010000", NULL, 2); | |
64 | syndromes[16] = strtoul("1000110000", NULL, 2); | |
65 | syndromes[17] = strtoul("0100110000", NULL, 2); | |
66 | syndromes[18] = strtoul("0010110000", NULL, 2); | |
67 | syndromes[19] = strtoul("0001110000", NULL, 2); | |
68 | syndromes[20] = strtoul("1100001000", NULL, 2); | |
69 | syndromes[21] = strtoul("1010001000", NULL, 2); | |
70 | syndromes[22] = strtoul("0110001000", NULL, 2); | |
71 | syndromes[23] = strtoul("1001001000", NULL, 2); | |
72 | syndromes[24] = strtoul("0101001000", NULL, 2); | |
73 | syndromes[25] = strtoul("0011001000", NULL, 2); | |
74 | syndromes[26] = strtoul("1000101000", NULL, 2); | |
75 | syndromes[27] = strtoul("0100101000", NULL, 2); | |
76 | syndromes[28] = strtoul("0010101000", NULL, 2); | |
77 | syndromes[29] = strtoul("0001101000", NULL, 2); | |
78 | syndromes[30] = strtoul("1000011000", NULL, 2); | |
79 | syndromes[31] = strtoul("0100011000", NULL, 2); | |
80 | syndromes[32] = strtoul("0010011000", NULL, 2); | |
81 | syndromes[33] = strtoul("0001011000", NULL, 2); | |
82 | syndromes[34] = strtoul("0000111000", NULL, 2); | |
83 | syndromes[35] = strtoul("1100000100", NULL, 2); | |
84 | syndromes[36] = strtoul("1010000100", NULL, 2); | |
85 | syndromes[37] = strtoul("0110000100", NULL, 2); | |
86 | syndromes[38] = strtoul("1001000100", NULL, 2); | |
87 | syndromes[39] = strtoul("0101000100", NULL, 2); | |
88 | syndromes[40] = strtoul("0011000100", NULL, 2); | |
89 | syndromes[41] = strtoul("1000100100", NULL, 2); | |
90 | syndromes[42] = strtoul("0100100100", NULL, 2); | |
91 | syndromes[43] = strtoul("0010100100", NULL, 2); | |
92 | syndromes[44] = strtoul("0001100100", NULL, 2); | |
93 | syndromes[45] = strtoul("1000010100", NULL, 2); | |
94 | syndromes[46] = strtoul("0100010100", NULL, 2); | |
95 | syndromes[47] = strtoul("0010010100", NULL, 2); | |
96 | syndromes[48] = strtoul("0001010100", NULL, 2); | |
97 | syndromes[49] = strtoul("0000110100", NULL, 2); | |
98 | syndromes[50] = strtoul("1000001100", NULL, 2); | |
99 | syndromes[51] = strtoul("0100001100", NULL, 2); | |
100 | syndromes[52] = strtoul("0010001100", NULL, 2); | |
101 | syndromes[53] = strtoul("0001001100", NULL, 2); | |
102 | syndromes[54] = strtoul("0000101100", NULL, 2); | |
103 | syndromes[55] = strtoul("0000011100", NULL, 2); | |
104 | syndromes[56] = strtoul("1100000010", NULL, 2); | |
105 | syndromes[57] = strtoul("1010000010", NULL, 2); | |
106 | syndromes[58] = strtoul("0110000010", NULL, 2); | |
107 | syndromes[59] = strtoul("1001000010", NULL, 2); | |
108 | syndromes[60] = strtoul("0101000010", NULL, 2); | |
109 | syndromes[61] = strtoul("0011000010", NULL, 2); | |
110 | syndromes[62] = strtoul("1000100010", NULL, 2); | |
111 | syndromes[63] = strtoul("0100100010", NULL, 2); | |
112 | syndromes[64] = strtoul("0010100010", NULL, 2); | |
113 | syndromes[65] = strtoul("0001100010", NULL, 2); | |
114 | syndromes[66] = strtoul("1000010010", NULL, 2); | |
115 | syndromes[67] = strtoul("0100010010", NULL, 2); | |
116 | syndromes[68] = strtoul("0010010010", NULL, 2); | |
117 | syndromes[69] = strtoul("0001010010", NULL, 2); | |
118 | syndromes[70] = strtoul("0000110010", NULL, 2); | |
119 | syndromes[71] = strtoul("1000001010", NULL, 2); | |
120 | syndromes[72] = strtoul("0100001010", NULL, 2); | |
121 | syndromes[73] = strtoul("0010001010", NULL, 2); | |
122 | syndromes[74] = strtoul("0001001010", NULL, 2); | |
123 | syndromes[75] = strtoul("0000101010", NULL, 2); | |
124 | syndromes[76] = strtoul("0000011010", NULL, 2); | |
125 | syndromes[77] = strtoul("1000000110", NULL, 2); | |
126 | syndromes[78] = strtoul("0100000110", NULL, 2); | |
127 | syndromes[79] = strtoul("0010000110", NULL, 2); | |
128 | syndromes[80] = strtoul("0001000110", NULL, 2); | |
129 | syndromes[81] = strtoul("0000100110", NULL, 2); | |
130 | syndromes[82] = strtoul("0000010110", NULL, 2); | |
131 | syndromes[83] = strtoul("0000001110", NULL, 2); | |
132 | syndromes[84] = strtoul("1100000001", NULL, 2); | |
133 | syndromes[85] = strtoul("1010000001", NULL, 2); | |
134 | syndromes[86] = strtoul("0110000001", NULL, 2); | |
135 | syndromes[87] = strtoul("1001000001", NULL, 2); | |
136 | syndromes[88] = strtoul("0101000001", NULL, 2); | |
137 | syndromes[89] = strtoul("0011000001", NULL, 2); | |
138 | syndromes[90] = strtoul("1000100001", NULL, 2); | |
139 | syndromes[91] = strtoul("0100100001", NULL, 2); | |
140 | syndromes[92] = strtoul("0010100001", NULL, 2); | |
141 | syndromes[93] = strtoul("0001100001", NULL, 2); | |
142 | syndromes[94] = strtoul("1000010001", NULL, 2); | |
143 | syndromes[95] = strtoul("0100010001", NULL, 2); | |
144 | syndromes[96] = strtoul("0010010001", NULL, 2); | |
145 | syndromes[97] = strtoul("0001010001", NULL, 2); | |
146 | syndromes[98] = strtoul("0000110001", NULL, 2); | |
147 | syndromes[99] = strtoul("1000001001", NULL, 2); | |
148 | syndromes[100] = strtoul("0100001001", NULL, 2); | |
149 | syndromes[101] = strtoul("0010001001", NULL, 2); | |
150 | syndromes[102] = strtoul("0001001001", NULL, 2); | |
151 | syndromes[103] = strtoul("0000101001", NULL, 2); | |
152 | syndromes[104] = strtoul("0000011001", NULL, 2); | |
153 | syndromes[105] = strtoul("1000000101", NULL, 2); | |
154 | syndromes[106] = strtoul("0100000101", NULL, 2); | |
155 | syndromes[107] = strtoul("0010000101", NULL, 2); | |
156 | syndromes[108] = strtoul("0001000101", NULL, 2); | |
157 | syndromes[109] = strtoul("0000100101", NULL, 2); | |
158 | syndromes[110] = strtoul("0000010101", NULL, 2); | |
159 | syndromes[111] = strtoul("0000001101", NULL, 2); | |
160 | syndromes[112] = strtoul("1000000011", NULL, 2); | |
161 | syndromes[113] = strtoul("0100000011", NULL, 2); | |
162 | syndromes[114] = strtoul("0010000011", NULL, 2); | |
163 | syndromes[115] = strtoul("0001000011", NULL, 2); | |
164 | syndromes[116] = strtoul("0000100011", NULL, 2); | |
165 | syndromes[117] = strtoul("0000010011", NULL, 2); | |
166 | syndromes[118] = strtoul("0000001011", NULL, 2); | |
167 | syndromes[119] = strtoul("0000000111", NULL, 2); | |
168 | syndromes[120] = strtoul("1111100000", NULL, 2); | |
169 | syndromes[121] = strtoul("0000011111", NULL, 2); | |
170 | syndromes[122] = strtoul("1111010000", NULL, 2); | |
171 | syndromes[123] = strtoul("0000101111", NULL, 2); | |
172 | syndromes[124] = strtoul("0111101000", NULL, 2); | |
173 | syndromes[125] = strtoul("1000010111", NULL, 2); | |
174 | syndromes[126] = strtoul("0011100110", NULL, 2); | |
175 | syndromes[127] = strtoul("1100011001", NULL, 2); | |
176 | syndromes[128] = strtoul("1100010110", NULL, 2); | |
177 | syndromes[129] = strtoul("0011101001", NULL, 2); | |
178 | syndromes[130] = strtoul("1010010110", NULL, 2); | |
179 | syndromes[131] = strtoul("0101101001", NULL, 2); | |
180 | syndromes[132] = strtoul("0110010110", NULL, 2); | |
181 | syndromes[133] = strtoul("1001101001", NULL, 2); | |
182 | syndromes[134] = strtoul("1001010110", NULL, 2); | |
183 | syndromes[135] = strtoul("0110101001", NULL, 2); | |
184 | syndromes[136] = strtoul("0101010110", NULL, 2); | |
185 | syndromes[137] = strtoul("1010101001", NULL, 2); | |
186 | syndromes[138] = strtoul("0011010110", NULL, 2); | |
187 | syndromes[139] = strtoul("1100101001", NULL, 2); | |
188 | syndromes[140] = strtoul("1000110110", NULL, 2); | |
189 | syndromes[141] = strtoul("0111001001", NULL, 2); | |
190 | syndromes[142] = strtoul("0100110110", NULL, 2); | |
191 | syndromes[143] = strtoul("1011001001", NULL, 2); | |
192 | syndromes[144] = strtoul("0010110110", NULL, 2); | |
193 | syndromes[145] = strtoul("1101001001", NULL, 2); | |
194 | syndromes[146] = strtoul("1110011000", NULL, 2); | |
195 | syndromes[147] = strtoul("0001100111", NULL, 2); | |
196 | syndromes[148] = strtoul("0001110110", NULL, 2); | |
197 | syndromes[149] = strtoul("1110001001", NULL, 2); | |
198 | syndromes[150] = strtoul("1100001110", NULL, 2); | |
199 | syndromes[151] = strtoul("0011110001", NULL, 2); | |
200 | syndromes[152] = strtoul("1010001110", NULL, 2); | |
201 | syndromes[153] = strtoul("0101110001", NULL, 2); | |
202 | syndromes[154] = strtoul("0110001110", NULL, 2); | |
203 | syndromes[155] = strtoul("1001110001", NULL, 2); | |
204 | syndromes[156] = strtoul("1001001110", NULL, 2); | |
205 | syndromes[157] = strtoul("0110110001", NULL, 2); | |
206 | syndromes[158] = strtoul("0101001110", NULL, 2); | |
207 | syndromes[159] = strtoul("1010110001", NULL, 2); | |
208 | syndromes[160] = strtoul("0011001110", NULL, 2); | |
209 | syndromes[161] = strtoul("1100110001", NULL, 2); | |
210 | syndromes[162] = strtoul("1000101110", NULL, 2); | |
211 | syndromes[163] = strtoul("0111010001", NULL, 2); | |
212 | syndromes[164] = strtoul("0100101110", NULL, 2); | |
213 | syndromes[165] = strtoul("1011010001", NULL, 2); | |
214 | syndromes[166] = strtoul("0010101110", NULL, 2); | |
215 | syndromes[167] = strtoul("1101010001", NULL, 2); | |
216 | syndromes[168] = strtoul("1101011000", NULL, 2); | |
217 | syndromes[169] = strtoul("0010100111", NULL, 2); | |
218 | syndromes[170] = strtoul("0001101110", NULL, 2); | |
219 | syndromes[171] = strtoul("1110010001", NULL, 2); | |
220 | syndromes[172] = strtoul("1000011110", NULL, 2); | |
221 | syndromes[173] = strtoul("0111100001", NULL, 2); | |
222 | syndromes[174] = strtoul("0100011110", NULL, 2); | |
223 | syndromes[175] = strtoul("1011100001", NULL, 2); | |
224 | syndromes[176] = strtoul("0010011110", NULL, 2); | |
225 | syndromes[177] = strtoul("1101100001", NULL, 2); | |
226 | syndromes[178] = strtoul("0001011110", NULL, 2); | |
227 | syndromes[179] = strtoul("1110100001", NULL, 2); | |
228 | syndromes[180] = strtoul("0000111110", NULL, 2); | |
229 | syndromes[181] = strtoul("1111000001", NULL, 2); | |
230 | syndromes[182] = strtoul("1011011000", NULL, 2); | |
231 | syndromes[183] = strtoul("0100100111", NULL, 2); | |
232 | syndromes[184] = strtoul("0111011000", NULL, 2); | |
233 | syndromes[185] = strtoul("1000100111", NULL, 2); | |
234 | syndromes[186] = strtoul("1100111000", NULL, 2); | |
235 | syndromes[187] = strtoul("0011000111", NULL, 2); | |
236 | syndromes[188] = strtoul("1010011001", NULL, 2); | |
237 | syndromes[189] = strtoul("0101100110", NULL, 2); | |
238 | syndromes[190] = strtoul("0110011001", NULL, 2); | |
239 | syndromes[191] = strtoul("1001100110", NULL, 2); | |
240 | syndromes[192] = strtoul("1001011001", NULL, 2); | |
241 | syndromes[193] = strtoul("0110100110", NULL, 2); | |
242 | syndromes[194] = strtoul("0101011001", NULL, 2); | |
243 | syndromes[195] = strtoul("1010100110", NULL, 2); | |
244 | syndromes[196] = strtoul("0011011001", NULL, 2); | |
245 | syndromes[197] = strtoul("1100100110", NULL, 2); | |
246 | syndromes[198] = strtoul("1000111001", NULL, 2); | |
247 | syndromes[199] = strtoul("0111000110", NULL, 2); | |
248 | syndromes[200] = strtoul("0100111001", NULL, 2); | |
249 | syndromes[201] = strtoul("1011000110", NULL, 2); | |
250 | syndromes[202] = strtoul("0010111001", NULL, 2); | |
251 | syndromes[203] = strtoul("1101000110", NULL, 2); | |
252 | syndromes[204] = strtoul("1010111000", NULL, 2); | |
253 | syndromes[205] = strtoul("0101000111", NULL, 2); | |
254 | syndromes[206] = strtoul("0001111001", NULL, 2); | |
255 | syndromes[207] = strtoul("1110000110", NULL, 2); | |
256 | syndromes[208] = strtoul("1110000101", NULL, 2); | |
257 | syndromes[209] = strtoul("0001111010", NULL, 2); | |
258 | syndromes[210] = strtoul("1101000101", NULL, 2); | |
259 | syndromes[211] = strtoul("0010111010", NULL, 2); | |
260 | syndromes[212] = strtoul("1011000101", NULL, 2); | |
261 | syndromes[213] = strtoul("0100111010", NULL, 2); | |
262 | syndromes[214] = strtoul("0111000101", NULL, 2); | |
263 | syndromes[215] = strtoul("1000111010", NULL, 2); | |
264 | syndromes[216] = strtoul("1100100101", NULL, 2); | |
265 | syndromes[217] = strtoul("0011011010", NULL, 2); | |
266 | syndromes[218] = strtoul("1010100101", NULL, 2); | |
267 | syndromes[219] = strtoul("0101011010", NULL, 2); | |
268 | syndromes[220] = strtoul("0110100101", NULL, 2); | |
269 | syndromes[221] = strtoul("1001011010", NULL, 2); | |
270 | syndromes[222] = strtoul("1001100101", NULL, 2); | |
271 | syndromes[223] = strtoul("0110011010", NULL, 2); | |
272 | syndromes[224] = strtoul("0101100101", NULL, 2); | |
273 | syndromes[225] = strtoul("1010011010", NULL, 2); | |
274 | syndromes[226] = strtoul("0110111000", NULL, 2); | |
275 | syndromes[227] = strtoul("1001000111", NULL, 2); | |
276 | syndromes[228] = strtoul("0011100101", NULL, 2); | |
277 | syndromes[229] = strtoul("1100011010", NULL, 2); | |
278 | syndromes[230] = strtoul("1100010101", NULL, 2); | |
279 | syndromes[231] = strtoul("0011101010", NULL, 2); | |
280 | syndromes[232] = strtoul("1010010101", NULL, 2); | |
281 | syndromes[233] = strtoul("0101101010", NULL, 2); | |
282 | syndromes[234] = strtoul("0110010101", NULL, 2); | |
283 | syndromes[235] = strtoul("1001101010", NULL, 2); | |
284 | syndromes[236] = strtoul("1001010101", NULL, 2); | |
285 | syndromes[237] = strtoul("0110101010", NULL, 2); | |
286 | syndromes[238] = strtoul("0101010101", NULL, 2); | |
287 | syndromes[239] = strtoul("1010101010", NULL, 2); | |
288 | syndromes[240] = strtoul("0011010101", NULL, 2); | |
289 | syndromes[241] = strtoul("1100101010", NULL, 2); | |
290 | syndromes[242] = strtoul("1000110101", NULL, 2); | |
291 | syndromes[243] = strtoul("0111001010", NULL, 2); | |
292 | syndromes[244] = strtoul("0100110101", NULL, 2); | |
293 | syndromes[245] = strtoul("1011001010", NULL, 2); | |
294 | syndromes[246] = strtoul("0010110101", NULL, 2); | |
295 | syndromes[247] = strtoul("1101001010", NULL, 2); | |
296 | syndromes[248] = strtoul("1001111000", NULL, 2); | |
297 | syndromes[249] = strtoul("0110000111", NULL, 2); | |
298 | syndromes[250] = strtoul("0001110101", NULL, 2); | |
299 | syndromes[251] = strtoul("1110001010", NULL, 2); | |
300 | syndromes[252] = strtoul("1100001101", NULL, 2); | |
301 | syndromes[253] = strtoul("0011110010", NULL, 2); | |
302 | syndromes[254] = strtoul("1010001101", NULL, 2); | |
303 | syndromes[255] = strtoul("0101110010", NULL, 2); | |
304 | ||
305 | // Convert the syndromes for each single bit error into the H matrix. | |
306 | // Each pattern (there are 10) is multiplied by the data (a | |
307 | // BL_Uint256) to generate one bit of ECC. | |
308 | for (uint_t pattern_ndx = 0; pattern_ndx < 10; ++pattern_ndx) | |
309 | { | |
310 | for (uint_t syndrome_ndx = 0; syndrome_ndx < 256; syndrome_ndx += 64) | |
311 | { | |
312 | patterns[9 - pattern_ndx].set(syndrome_ndx/64, | |
313 | calc_pattern(syndrome_ndx, pattern_ndx)); | |
314 | } | |
315 | } | |
316 | ||
317 | // self check | |
318 | // For Hsiao ECC, the check bits and the syndrome are calculated | |
319 | // using the same algorithm. | |
320 | // Check that inverting one data bit and calculating the resulting | |
321 | // ECC matching the bit's syndrome. | |
322 | for (uint_t syndrome_ndx = 0; syndrome_ndx < 256; ++syndrome_ndx) | |
323 | { | |
324 | BL_Uint256 data; | |
325 | data.invert(syndrome_ndx); | |
326 | ||
327 | if (calc_checks(10, patterns, data).get() != syndromes[syndrome_ndx].get()) | |
328 | { | |
329 | fprintf(stderr, | |
330 | "syndrome mismatch: ndx %d calc_check 0x%x syndrome 0x%x\n", | |
331 | syndrome_ndx, | |
332 | calc_checks(10, patterns, data).get(), | |
333 | syndromes[syndrome_ndx].get()); | |
334 | exit(-1); | |
335 | } | |
336 | } | |
337 | } | |
338 | ||
339 | uint64_t BL_Hsiao_256_10_Synd::Patterns::calc_pattern(uint_t syndrome_ndx, | |
340 | uint_t pattern_ndx) | |
341 | { | |
342 | uint64_t pattern = 0; | |
343 | ||
344 | for (uint_t ndx = 0; ndx < 64; ++ndx) | |
345 | { | |
346 | if (syndromes[syndrome_ndx + ndx].get() == 0) | |
347 | { | |
348 | fprintf(stderr, "bad zero syndrome: %d\n", syndrome_ndx + ndx); | |
349 | exit(-1); | |
350 | } | |
351 | ||
352 | pattern |= ((syndromes[syndrome_ndx + ndx].get() >> pattern_ndx) & 0x1ULL) | |
353 | << ndx; | |
354 | } | |
355 | ||
356 | return pattern; | |
357 | } |