Rev 3838 | Rev 3856 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 3838 | Rev 3839 | ||
---|---|---|---|
Line 154... | Line 154... | ||
154 | uint32_t hash = vsid ^ page; |
154 | uint32_t hash = vsid ^ page; |
155 | uint32_t base = (hash & 0x3ff) << 3; |
155 | uint32_t base = (hash & 0x3ff) << 3; |
156 | uint32_t i; |
156 | uint32_t i; |
157 | bool found = false; |
157 | bool found = false; |
158 | 158 | ||
159 | /* Find unused or colliding PTE in PTEG */ |
159 | /* Find colliding PTE in PTEG */ |
160 | for (i = 0; i < 8; i++) { |
160 | for (i = 0; i < 8; i++) { |
161 | if ((!phte[base + i].v) || |
161 | if ((phte[base + i].v) |
162 | ((phte[base + i].vsid == vsid) |
162 | && (phte[base + i].vsid == vsid) |
163 | && (phte[base + i].api == api) |
163 | && (phte[base + i].api == api) |
164 | && (phte[base + i].h == 0))) { |
164 | && (phte[base + i].h == 0)) { |
165 | found = true; |
165 | found = true; |
166 | break; |
166 | break; |
167 | } |
167 | } |
168 | } |
168 | } |
169 | 169 | ||
170 | if (!found) { |
170 | if (!found) { |
- | 171 | /* Find unused PTE in PTEG */ |
|
- | 172 | for (i = 0; i < 8; i++) { |
|
- | 173 | if (!phte[base + i].v) { |
|
- | 174 | found = true; |
|
- | 175 | break; |
|
- | 176 | } |
|
- | 177 | } |
|
- | 178 | } |
|
- | 179 | ||
- | 180 | if (!found) { |
|
171 | /* Secondary hash (not) */ |
181 | /* Secondary hash (not) */ |
172 | uint32_t base2 = (~hash & 0x3ff) << 3; |
182 | uint32_t base2 = (~hash & 0x3ff) << 3; |
173 | 183 | ||
174 | /* Find unused or colliding PTE in PTEG */ |
184 | /* Find colliding PTE in PTEG */ |
175 | for (i = 0; i < 8; i++) { |
185 | for (i = 0; i < 8; i++) { |
176 | if ((!phte[base2 + i].v) || |
186 | if ((phte[base2 + i].v) |
177 | ((phte[base2 + i].vsid == vsid) |
187 | && (phte[base2 + i].vsid == vsid) |
178 | && (phte[base2 + i].api == api) |
188 | && (phte[base2 + i].api == api) |
179 | && (phte[base2 + i].h == 1))) { |
189 | && (phte[base2 + i].h == 1)) { |
180 | found = true; |
190 | found = true; |
181 | base = base2; |
191 | base = base2; |
182 | h = 1; |
192 | h = 1; |
183 | break; |
193 | break; |
184 | } |
194 | } |
185 | } |
195 | } |
186 | 196 | ||
- | 197 | if (!found) { |
|
- | 198 | /* Find unused PTE in PTEG */ |
|
- | 199 | for (i = 0; i < 8; i++) { |
|
- | 200 | if (!phte[base2 + i].v) { |
|
- | 201 | found = true; |
|
- | 202 | base = base2; |
|
- | 203 | h = 1; |
|
- | 204 | break; |
|
- | 205 | } |
|
- | 206 | } |
|
- | 207 | } |
|
- | 208 | ||
187 | if (!found) |
209 | if (!found) |
188 | i = RANDI(seed) % 8; |
210 | i = RANDI(seed) % 8; |
189 | } |
211 | } |
190 | 212 | ||
191 | phte[base + i].v = 1; |
213 | phte[base + i].v = 1; |
Line 306... | Line 328... | ||
306 | uint32_t hash = vsid ^ page; |
328 | uint32_t hash = vsid ^ page; |
307 | uint32_t base = (hash & 0x3ff) << 3; |
329 | uint32_t base = (hash & 0x3ff) << 3; |
308 | uint32_t i; |
330 | uint32_t i; |
309 | bool found = false; |
331 | bool found = false; |
310 | 332 | ||
311 | /* Find unused or colliding PTE in PTEG */ |
333 | /* Find colliding PTE in PTEG */ |
312 | for (i = 0; i < 8; i++) { |
334 | for (i = 0; i < 8; i++) { |
313 | if ((!phte_real[base + i].v) || |
335 | if ((phte_real[base + i].v) |
314 | ((phte_real[base + i].vsid == vsid) |
336 | && (phte_real[base + i].vsid == vsid) |
315 | && (phte_real[base + i].api == api) |
337 | && (phte_real[base + i].api == api) |
316 | && (phte_real[base + i].h == 0))) { |
338 | && (phte_real[base + i].h == 0)) { |
317 | found = true; |
339 | found = true; |
318 | break; |
340 | break; |
319 | } |
341 | } |
320 | } |
342 | } |
321 | 343 | ||
322 | if (!found) { |
344 | if (!found) { |
- | 345 | /* Find unused PTE in PTEG */ |
|
- | 346 | for (i = 0; i < 8; i++) { |
|
- | 347 | if (!phte_real[base + i].v) { |
|
- | 348 | found = true; |
|
- | 349 | break; |
|
- | 350 | } |
|
- | 351 | } |
|
- | 352 | } |
|
- | 353 | ||
- | 354 | if (!found) { |
|
323 | /* Secondary hash (not) */ |
355 | /* Secondary hash (not) */ |
324 | uint32_t base2 = (~hash & 0x3ff) << 3; |
356 | uint32_t base2 = (~hash & 0x3ff) << 3; |
325 | 357 | ||
326 | /* Find unused or colliding PTE in PTEG */ |
358 | /* Find colliding PTE in PTEG */ |
327 | for (i = 0; i < 8; i++) { |
359 | for (i = 0; i < 8; i++) { |
328 | if ((!phte_real[base2 + i].v) || |
360 | if ((phte_real[base2 + i].v) |
329 | ((phte_real[base2 + i].vsid == vsid) |
361 | && (phte_real[base2 + i].vsid == vsid) |
330 | && (phte_real[base2 + i].api == api) |
362 | && (phte_real[base2 + i].api == api) |
331 | && (phte_real[base2 + i].h == 1))) { |
363 | && (phte_real[base2 + i].h == 1)) { |
332 | found = true; |
364 | found = true; |
333 | base = base2; |
365 | base = base2; |
334 | h = 1; |
366 | h = 1; |
335 | break; |
367 | break; |
336 | } |
368 | } |
337 | } |
369 | } |
338 | 370 | ||
339 | if (!found) { |
371 | if (!found) { |
- | 372 | /* Find unused PTE in PTEG */ |
|
- | 373 | for (i = 0; i < 8; i++) { |
|
- | 374 | if (!phte_real[base2 + i].v) { |
|
- | 375 | found = true; |
|
- | 376 | base = base2; |
|
- | 377 | h = 1; |
|
- | 378 | break; |
|
- | 379 | } |
|
- | 380 | } |
|
- | 381 | } |
|
- | 382 | ||
- | 383 | if (!found) { |
|
340 | /* Use secondary hash to avoid collisions |
384 | /* Use secondary hash to avoid collisions |
341 | with usual PHT refill handler. */ |
385 | with usual PHT refill handler. */ |
342 | i = RANDI(seed_real) % 8; |
386 | i = RANDI(seed_real) % 8; |
343 | base = base2; |
387 | base = base2; |
344 | h = 1; |
388 | h = 1; |