114,6 → 114,7 |
panic("%p: PHT Refill Exception at %p (%s<-%s)\n", badvaddr, istate->pc, symbol, sym2); |
} |
|
|
static void pht_insert(const __address vaddr, const pfn_t pfn) |
{ |
__u32 page = (vaddr >> 12) & 0xffff; |
130,16 → 131,32 |
__u32 hash = ((vsid ^ page) & 0x3ff) << 3; |
|
__u32 i; |
bool found = false; |
/* Find unused PTE in PTEG */ |
for (i = 0; i < 8; i++) { |
if (!phte[hash + i].v) |
if (!phte[hash + i].v) { |
found = true; |
break; |
} |
} |
|
// TODO: Check access/change bits, secondary hash |
if (!found) { |
/* Secondary hash (not) */ |
hash = ~hash; |
|
if (i == 8) |
/* Find unused PTE in PTEG */ |
for (i = 0; i < 8; i++) { |
if (!phte[hash + i].v) { |
found = true; |
break; |
} |
} |
|
if (!found) { |
// TODO: A/C precedence groups |
i = page % 8; |
} |
} |
|
phte[hash + i].v = 1; |
phte[hash + i].vsid = vsid; |
195,7 → 212,6 |
return; |
default: |
panic("Unexpected pfrc (%d)\n", pfcr); |
break; |
} |
} |
|
214,16 → 230,7 |
void pht_init(void) |
{ |
memsetb((__address) phte, 1 << PHT_BITS, 0); |
|
/* Insert global kernel mapping */ |
|
__address cur; |
for (cur = 0; cur < last_frame; cur += FRAME_SIZE) { |
pte_t *pte = page_mapping_find(AS_KERNEL, PA2KA(cur)); |
if ((pte) && (pte->p) && (pte->g)) |
pht_insert(PA2KA(cur), pte->pfn); |
} |
} |
|
|
void page_arch_init(void) |
256,9 → 263,5 |
: |
: "r" ((__address) physical_phte) |
); |
|
/* Invalidate block address translation registers, |
thus remove the temporary mapping */ |
// invalidate_bat(); |
} |
} |