Date: Thu, 22 Mar 2007 20:18:51 GMT From: Oleksandr Tymoshenko <gonzo@FreeBSD.org> To: Perforce Change Reviews <perforce@FreeBSD.org> Subject: PERFORCE change 116358 for review Message-ID: <200703222018.l2MKIpD0006801@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=116358 Change 116358 by gonzo@gonzo_jeeves on 2007/03/22 20:18:43 o Save EntryHi (we need ASID part only) before start messing with it and then restore before resume. EntryHi should be set to pm_asid by pmap_activate and should be kept during process's lifecycle in userland. Affected files ... .. //depot/projects/mips2/src/sys/mips/mips/swtch.S#10 edit .. //depot/projects/mips2/src/sys/mips/mips/tlb.c#12 edit Differences ... ==== //depot/projects/mips2/src/sys/mips/mips/swtch.S#10 (text+ko) ==== @@ -60,6 +60,7 @@ break entry0: + mfc0 t0, MIPS_COP_0_TLB_HI # Save old ASID mtc0 v0, MIPS_COP_0_TLB_HI # VPN = va COP0_SYNC nop @@ -87,6 +88,7 @@ nop mtc0 v0, MIPS_COP_0_TLB_HI # set VPN again COP0_SYNC + entry0set: mtc0 zero, MIPS_COP_0_TLB_INDEX # TLB entry #0 COP0_SYNC @@ -102,9 +104,9 @@ COP0_SYNC nop nop + mtc0 t0, MIPS_COP_0_TLB_HI # Restore old ASID + resume: - - .set at lw t2, pcpup .set noat @@ -156,7 +158,6 @@ li v0, 0 jr ra nop - END(savectx) /* @@ -167,7 +168,6 @@ */ ENTRY(fork_trampoline) - mtc0 zero, MIPS_COP_0_STATUS # disable int COP0_SYNC nop # 3 op delay @@ -195,5 +195,4 @@ jal exception_restore_registers nop eret - END(fork_trampoline) ==== //depot/projects/mips2/src/sys/mips/mips/tlb.c#12 (text+ko) ==== @@ -181,21 +181,25 @@ void tlb_update(vm_offset_t va, uint32_t asid, pt_entry_t pte0, pt_entry_t pte1) { - u_long ehi; + register_t ehi, old_ehi; int i; va &= ~PAGE_MASK; ehi = MIPS_HI_ENTRY(va, asid); + old_ehi = mips_rd_entryhi(); mips_wr_entryhi(ehi); mips_tlbp(); i = mips_rd_index(); mips_wr_entrylo0(pte0); mips_wr_entrylo1(pte1); mips_wr_entryhi(ehi); + if (i < 0) mips_tlbwr(); else mips_tlbwi(); + + mips_wr_entryhi(old_ehi); } /* @@ -204,12 +208,9 @@ void tlb_invalidate_all(void) { - u_long asid; int i; - asid = mips_rd_entryhi(); for (i = 0; i < mips_num_tlb_entries; i++) tlb_invalidate_one(i); - mips_wr_entryhi(asid); } /* @@ -219,12 +220,9 @@ void tlb_invalidate_nonwired(void) { - u_long asid; int i; - asid = mips_rd_entryhi(); for (i = mips_rd_wired(); i < mips_num_tlb_entries; i++) tlb_invalidate_one(i); - mips_wr_entryhi(asid); } /* @@ -246,7 +244,10 @@ tlb_invalidate_one(int i) { u_long ehi; + u_long old_ehi; + old_ehi = mips_rd_entryhi(); + /* Bogus VPN2. */ ehi = MIPS_KSEG3_START + 0x0fff0000 + 2 * i * PAGE_SIZE; mips_wr_index(i); @@ -254,22 +255,30 @@ mips_wr_entrylo1(0); mips_wr_entryhi(ehi); mips_tlbwi(); + + mips_wr_entryhi(old_ehi); } void tlb_invalidate_page(vm_offset_t va, uint32_t asid) { - u_long ehi; + u_long ehi, old_ehi; int i; + old_ehi = mips_rd_entryhi(); + va &= ~PAGE_MASK; ehi = MIPS_HI_ENTRY(va, asid); mips_wr_entryhi(ehi); mips_tlbp(); i = mips_rd_index(); + if (i >= 0) tlb_invalidate_one(i); + mips_dcache_wbinv_range_index(va, PAGE_SIZE); + + mips_wr_entryhi(old_ehi); } /*
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200703222018.l2MKIpD0006801>
