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; |