tlb
struct tlb tlb;
mips3_TLBRead(tlbno, &tlb);
if (tlb.tlb_lo0 & MIPS3_PG_V || tlb.tlb_lo1 & MIPS3_PG_V) {
printf("TLB %2d vad 0x%08x ", tlbno, tlb.tlb_hi);
printf("TLB*%2d vad 0x%08x ", tlbno, tlb.tlb_hi);
printf("0=0x%08x ", mips_tlbpfn_to_paddr(tlb.tlb_lo0));
printf("%c", tlb.tlb_lo0 & MIPS3_PG_M ? 'M' : ' ');
printf("%c", tlb.tlb_lo0 & MIPS3_PG_G ? 'G' : ' ');
printf(" atr %x ", (tlb.tlb_lo0 >> 3) & 7);
printf("1=0x%08x ", mips_tlbpfn_to_paddr(tlb.tlb_lo1));
printf("%c", tlb.tlb_lo1 & MIPS3_PG_M ? 'M' : ' ');
printf("%c", tlb.tlb_lo1 & MIPS3_PG_G ? 'G' : ' ');
printf(" atr %x ", (tlb.tlb_lo1 >> 3) & 7);
printf(" sz=%x\n", tlb.tlb_mask);
struct tlbmask tlb;
tlb.tlb_hi = INTERRUPT_CONTROLLER_DEFAULT_ADDRESS;
tlb.tlb_lo0 = INTERRUPT_CONTROLLER_DEFAULT_ADDRESS | 0xf02;
tlb_write_entry(4, &tlb);
tlb.tlb_hi = TIMER_DEFAULT_ADDRESS;
tlb.tlb_lo0 = TIMER_DEFAULT_ADDRESS | 0xf02;
tlb_write_entry(5, &tlb);
struct tlbmask tlb;
tlb.tlb_hi = USART_DEFAULT_ADDRESS;
tlb.tlb_lo0 = USART_DEFAULT_ADDRESS | 0xf02;
tlb_write_entry(3, &tlb);
struct tlbmask tlb;
tlb.tlb_hi = USART_DEFAULT_ADDRESS;
tlb.tlb_lo0 = USART_DEFAULT_ADDRESS | 0xf02;
tlb_write_entry(3, &tlb);
__tlb_pagemask(struct tlb *e)
static void __tlb_pagemask(struct tlb *);
struct tlb *e;
#define PTE_PROT(tlb) ((tlb) >> PTE_PROT_SHIFT)
struct tlbmask tlb;
tlb_read_entry(i, &tlb);
if (valid_only && !(tlb.tlb_lo1 & MIPS1_PG_V))
(tlb.tlb_lo1 & MIPS1_PG_V) ? ' ' : '*',
i, tlb.tlb_hi,
tlb.tlb_lo1 & MIPS1_PG_FRAME);
(tlb.tlb_lo1 & MIPS1_PG_D) ? 'D' : ' ',
(tlb.tlb_lo1 & MIPS1_PG_G) ? 'G' : ' ',
(tlb.tlb_lo1 & MIPS1_PG_N) ? 'N' : ' ');
tlb_read_entry(i, &tlb);
!((tlb.tlb_lo0 | tlb.tlb_lo1) & MIPS3_PG_V))
(tlb.tlb_lo0 | tlb.tlb_lo1) & MIPS3_PG_V ? ' ' : '*',
tlb_count_width, i, tlb.tlb_hi);
(uint64_t)mips_tlbpfn_to_paddr(tlb.tlb_lo0),
(tlb.tlb_lo0 & MIPS3_PG_D) ? 'D' : ' ',
(tlb.tlb_lo0 & MIPS3_PG_G) ? 'G' : ' ',
(int)(tlb.tlb_lo0 >> 3) & 7);
(uint64_t)mips_tlbpfn_to_paddr(tlb.tlb_lo1),
(tlb.tlb_lo1 & MIPS3_PG_D) ? 'D' : ' ',
(tlb.tlb_lo1 & MIPS3_PG_G) ? 'G' : ' ',
(int)(tlb.tlb_lo1 >> 3) & 7,
tlb.tlb_mask);
tlb_read_entry(size_t tlbno, struct tlbmask *tlb)
(*mips_locore_jumpvec.ljv_tlb_read_entry)(tlbno, tlb);
tlb_write_entry(size_t tlbno, const struct tlbmask *tlb)
(*mips_locore_jumpvec.ljv_tlb_write_entry)(tlbno, tlb);
tlb.tlb_mask = mips3_wired_map[index].pgmask;
tlb.tlb_hi = mips3_vad_to_vpn(va0);
tlb.tlb_lo0 = MIPS3_PG_G;
tlb.tlb_lo0 =
tlb.tlb_lo1 = MIPS3_PG_G;
tlb.tlb_lo1 = mips3_paddr_to_tlbpfn(
tlb_write_entry(MIPS3_TLB_WIRED_UPAGES + index, &tlb);
struct tlbmask tlb;
tlb_read_entry(size_t pos, struct tlbmask *tlb)
(*cpu_md_ops.md_tlb_ops->md_tlb_read_entry)(pos, tlb);
tlb_write_entry(size_t pos, const struct tlbmask *tlb)
(*cpu_md_ops.md_tlb_ops->md_tlb_write_entry)(pos, tlb);
struct e500_tlb tlb;
tlb.tlb_va = MAS2_EPN & hwtlb.hwtlb_mas2;
tlb.tlb_size = 1024 << (2 * MASX_TSIZE_GET(hwtlb.hwtlb_mas1));
tlb.tlb_asid = MASX_TID_GET(hwtlb.hwtlb_mas1);
tlb.tlb_pte = (hwtlb.hwtlb_mas2 & MAS2_WIMGE)
tlb.tlb_pte |= (prot_mask & hwtlb.hwtlb_mas3) << prot_shift;
return tlb;
tlb_to_hwtlb(const struct e500_tlb tlb)
KASSERT(trunc_page(tlb.tlb_va) == tlb.tlb_va);
KASSERT(tlb.tlb_size != 0);
KASSERT((tlb.tlb_size & (tlb.tlb_size - 1)) == 0);
const uint32_t prot_mask = tlb.tlb_pte & PTE_RWX_MASK;
if (__predict_true(tlb.tlb_size == PAGE_SIZE)) {
if (tlb.tlb_asid) {
| MASX_TID_MAKE(tlb.tlb_asid);
if (tlb.tlb_pte & PTE_UNMODIFIED)
if (tlb.tlb_pte & PTE_UNSYNCED)
KASSERT(tlb.tlb_asid == 0);
KASSERT((tlb.tlb_size & 0xaaaaa7ff) == 0);
u_int cntlz = __builtin_clz(tlb.tlb_size);
hwtlb.hwtlb_mas2 = tlb.tlb_va | (tlb.tlb_pte & PTE_WIMGE_MASK);
hwtlb.hwtlb_mas3 |= tlb.tlb_pte & PTE_RPN_MASK;
e500_tlb_write_entry(size_t index, const struct tlbmask *tlb)
e500_tlb_read_entry(size_t index, struct tlbmask *tlb)
struct e500_tlb tlb = hwtlb_to_tlb(hwtlb);
tlb.tlb_va, tlb.tlb_asid, tlb.tlb_pte);
tlb.tlb_pte & PTE_RPN_MASK,
tlb.tlb_pte & PTE_xR ? "R" : "",
tlb.tlb_pte & PTE_xW ? "W" : "",
tlb.tlb_pte & PTE_UNMODIFIED ? "*" : "",
tlb.tlb_pte & PTE_xX ? "X" : "",
tlb.tlb_pte & PTE_UNSYNCED ? "*" : "",
tlb.tlb_pte & PTE_W ? "W" : "",
tlb.tlb_pte & PTE_I ? "I" : "",
tlb.tlb_pte & PTE_M ? "M" : "",
tlb.tlb_pte & PTE_G ? "G" : "",
tlb.tlb_pte & PTE_E ? "E" : "");
struct e500_tlb tlb = hwtlb_to_tlb(hwtlb);
if (!(*func)(ctx, tlb.tlb_va, tlb.tlb_asid,
tlb.tlb_pte))
bi_itlb->tlb[i].te_va = itlb_store[i].te_va;
bi_itlb->tlb[i].te_pa = itlb_store[i].te_pa;
bi_dtlb->tlb[i].te_va = dtlb_store[i].te_va;
bi_dtlb->tlb[i].te_pa = dtlb_store[i].te_pa;
struct tlb_entry tlb[1];
kernel_tlbs = &bi_tlb->tlb[0];
tlb = (struct pv_entry **) kmem_kvm_cur_start;
addr = thunk_mmap(tlb, pm_entries_size,
if (addr != (void *) tlb)
memset(tlb, 0, pm_entries_size); /* test and clear */
va = (vaddr_t) tlb + pg;
if (tlb[pv->pv_lpn] == NULL) {
tlb[pv->pv_lpn] = NULL;
tlb[pv->pv_lpn] = pv;
if (!tlb[pv->pv_lpn])
if (tlb[pv->pv_lpn]->pv_mmap_ppl == THUNK_PROT_NONE)
tlb[pv->pv_lpn] = NULL;
static struct pv_entry **tlb; /* current tlb mappings (direct mapped) */