Rev 2071 | Rev 2089 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 2071 | Rev 2078 | ||
---|---|---|---|
Line 406... | Line 406... | ||
406 | { |
406 | { |
407 | int i; |
407 | int i; |
408 | tlb_data_t d; |
408 | tlb_data_t d; |
409 | tlb_tag_read_reg_t t; |
409 | tlb_tag_read_reg_t t; |
410 | 410 | ||
- | 411 | /* |
|
- | 412 | * Walk all ITLB and DTLB entries and remove all unlocked mappings. |
|
- | 413 | * |
|
- | 414 | * The kernel doesn't use global mappings so any locked global mappings |
|
- | 415 | * found must have been created by someone else. Their only purpose now |
|
- | 416 | * is to collide with proper mappings. Invalidate immediately. It should |
|
- | 417 | * be safe to invalidate them as late as now. |
|
- | 418 | */ |
|
- | 419 | ||
411 | for (i = 0; i < ITLB_ENTRY_COUNT; i++) { |
420 | for (i = 0; i < ITLB_ENTRY_COUNT; i++) { |
412 | d.value = itlb_data_access_read(i); |
421 | d.value = itlb_data_access_read(i); |
413 | if (!d.l) { |
422 | if (!d.l || d.g) { |
414 | t.value = itlb_tag_read_read(i); |
423 | t.value = itlb_tag_read_read(i); |
415 | d.v = false; |
424 | d.v = false; |
416 | itlb_tag_access_write(t.value); |
425 | itlb_tag_access_write(t.value); |
417 | itlb_data_access_write(i, d.value); |
426 | itlb_data_access_write(i, d.value); |
418 | } |
427 | } |
419 | } |
428 | } |
420 | 429 | ||
421 | for (i = 0; i < DTLB_ENTRY_COUNT; i++) { |
430 | for (i = 0; i < DTLB_ENTRY_COUNT; i++) { |
422 | d.value = dtlb_data_access_read(i); |
431 | d.value = dtlb_data_access_read(i); |
423 | if (!d.l) { |
432 | if (!d.l || d.g) { |
424 | t.value = dtlb_tag_read_read(i); |
433 | t.value = dtlb_tag_read_read(i); |
425 | d.v = false; |
434 | d.v = false; |
426 | dtlb_tag_access_write(t.value); |
435 | dtlb_tag_access_write(t.value); |
427 | dtlb_data_access_write(i, d.value); |
436 | dtlb_data_access_write(i, d.value); |
428 | } |
437 | } |