/* * Flush all user mappings from the TLBs. */ void zeus_tlb_flush_user(void) { u_long data, tag; u_int i, slot; for (i = 0; i < ZEUS_FTLB_ENTRIES; i++) { slot = TLB_DAR_SLOT(TLB_DAR_FTLB, i); data = ldxa(slot, ASI_DTLB_DATA_ACCESS_REG); tag = ldxa(slot, ASI_DTLB_TAG_READ_REG); if ((data & TD_V) != 0 && (data & TD_L) == 0 && TLB_TAR_CTX(tag) != TLB_CTX_KERNEL) stxa_sync(slot, ASI_DTLB_DATA_ACCESS_REG, 0); data = ldxa(slot, ASI_ITLB_DATA_ACCESS_REG); tag = ldxa(slot, ASI_ITLB_TAG_READ_REG); if ((data & TD_V) != 0 && (data & TD_L) == 0 && TLB_TAR_CTX(tag) != TLB_CTX_KERNEL) stxa_sync(slot, ASI_ITLB_DATA_ACCESS_REG, 0); } for (i = 0; i < ZEUS_STLB_ENTRIES; i++) { slot = TLB_DAR_SLOT(TLB_DAR_STLB, i); data = ldxa(slot, ASI_DTLB_DATA_ACCESS_REG); tag = ldxa(slot, ASI_DTLB_TAG_READ_REG); if ((data & TD_V) != 0 && (data & TD_L) == 0 && TLB_TAR_CTX(tag) != TLB_CTX_KERNEL) stxa_sync(slot, ASI_DTLB_DATA_ACCESS_REG, 0); data = ldxa(slot, ASI_ITLB_DATA_ACCESS_REG); tag = ldxa(slot, ASI_ITLB_TAG_READ_REG); if ((data & TD_V) != 0 && (data & TD_L) == 0 && TLB_TAR_CTX(tag) != TLB_CTX_KERNEL) stxa_sync(slot, ASI_ITLB_DATA_ACCESS_REG, 0); } }
void tlb_dump(void) { u_long data; u_long tag; int slot; for (slot = 0; slot < tlb_dtlb_entries; slot++) { data = ldxa(TLB_DAR_SLOT(slot), ASI_DTLB_DATA_ACCESS_REG); if ((data & TD_V) != 0) { tag = ldxa(TLB_DAR_SLOT(slot), ASI_DTLB_TAG_READ_REG); TR3("pmap_dump_tlb: dltb slot=%d data=%#lx tag=%#lx", slot, data, tag); } data = ldxa(TLB_DAR_SLOT(slot), ASI_ITLB_DATA_ACCESS_REG); if ((data & TD_V) != 0) { tag = ldxa(TLB_DAR_SLOT(slot), ASI_ITLB_TAG_READ_REG); TR3("pmap_dump_tlb: iltb slot=%d data=%#lx tag=%#lx", slot, data, tag); } } }
/* * Flush all user mappings from the TLBs. */ void cheetah_tlb_flush_user(void) { u_long data, tag; register_t s; u_int i, slot; /* * We read ASI_{D,I}TLB_DATA_ACCESS_REG twice back-to-back in order * to work around errata of USIII and beyond. */ for (i = 0; i < CHEETAH_T16_ENTRIES; i++) { slot = TLB_DAR_SLOT(TLB_DAR_T16, i); s = intr_disable(); (void)ldxa(slot, ASI_DTLB_DATA_ACCESS_REG); data = ldxa(slot, ASI_DTLB_DATA_ACCESS_REG); intr_restore(s); tag = ldxa(slot, ASI_DTLB_TAG_READ_REG); if ((data & TD_V) != 0 && (data & TD_L) == 0 && TLB_TAR_CTX(tag) != TLB_CTX_KERNEL) stxa_sync(slot, ASI_DTLB_DATA_ACCESS_REG, 0); s = intr_disable(); (void)ldxa(slot, ASI_ITLB_DATA_ACCESS_REG); data = ldxa(slot, ASI_ITLB_DATA_ACCESS_REG); intr_restore(s); tag = ldxa(slot, ASI_ITLB_TAG_READ_REG); if ((data & TD_V) != 0 && (data & TD_L) == 0 && TLB_TAR_CTX(tag) != TLB_CTX_KERNEL) stxa_sync(slot, ASI_ITLB_DATA_ACCESS_REG, 0); } for (i = 0; i < CHEETAH_DT512_ENTRIES; i++) { slot = TLB_DAR_SLOT(TLB_DAR_DT512_0, i); s = intr_disable(); (void)ldxa(slot, ASI_DTLB_DATA_ACCESS_REG); data = ldxa(slot, ASI_DTLB_DATA_ACCESS_REG); intr_restore(s); tag = ldxa(slot, ASI_DTLB_TAG_READ_REG); if ((data & TD_V) != 0 && TLB_TAR_CTX(tag) != TLB_CTX_KERNEL) stxa_sync(slot, ASI_DTLB_DATA_ACCESS_REG, 0); slot = TLB_DAR_SLOT(TLB_DAR_DT512_1, i); s = intr_disable(); (void)ldxa(slot, ASI_ITLB_DATA_ACCESS_REG); data = ldxa(slot, ASI_DTLB_DATA_ACCESS_REG); intr_restore(s); tag = ldxa(slot, ASI_DTLB_TAG_READ_REG); if ((data & TD_V) != 0 && TLB_TAR_CTX(tag) != TLB_CTX_KERNEL) stxa_sync(slot, ASI_DTLB_DATA_ACCESS_REG, 0); } if (PCPU_GET(impl) == CPU_IMPL_ULTRASPARCIVp) { for (i = 0; i < CHEETAH_IT512_ENTRIES; i++) { slot = TLB_DAR_SLOT(TLB_DAR_IT512, i); s = intr_disable(); (void)ldxa(slot, ASI_ITLB_DATA_ACCESS_REG); data = ldxa(slot, ASI_ITLB_DATA_ACCESS_REG); intr_restore(s); tag = ldxa(slot, ASI_ITLB_TAG_READ_REG); if ((data & TD_V) != 0 && TLB_TAR_CTX(tag) != TLB_CTX_KERNEL) stxa_sync(slot, ASI_ITLB_DATA_ACCESS_REG, 0); } } else { for (i = 0; i < CHEETAH_IT128_ENTRIES; i++) { slot = TLB_DAR_SLOT(TLB_DAR_IT128, i); s = intr_disable(); (void)ldxa(slot, ASI_ITLB_DATA_ACCESS_REG); data = ldxa(slot, ASI_ITLB_DATA_ACCESS_REG); tag = ldxa(slot, ASI_ITLB_TAG_READ_REG); intr_restore(s); if ((data & TD_V) != 0 && TLB_TAR_CTX(tag) != TLB_CTX_KERNEL) stxa_sync(slot, ASI_ITLB_DATA_ACCESS_REG, 0); } } }