From owner-p4-projects@FreeBSD.ORG Thu Mar 22 20:18:52 2007 Return-Path: X-Original-To: p4-projects@freebsd.org Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 7F20016A406; Thu, 22 Mar 2007 20:18:52 +0000 (UTC) X-Original-To: perforce@FreeBSD.org Delivered-To: perforce@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id 273EC16A400 for ; Thu, 22 Mar 2007 20:18:52 +0000 (UTC) (envelope-from gonzo@FreeBSD.org) Received: from repoman.freebsd.org (repoman.freebsd.org [69.147.83.41]) by mx1.freebsd.org (Postfix) with ESMTP id 17F7513C45B for ; Thu, 22 Mar 2007 20:18:52 +0000 (UTC) (envelope-from gonzo@FreeBSD.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.13.8/8.13.8) with ESMTP id l2MKIpl7006808 for ; Thu, 22 Mar 2007 20:18:51 GMT (envelope-from gonzo@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.13.8/8.13.8/Submit) id l2MKIpD0006801 for perforce@freebsd.org; Thu, 22 Mar 2007 20:18:51 GMT (envelope-from gonzo@FreeBSD.org) Date: Thu, 22 Mar 2007 20:18:51 GMT Message-Id: <200703222018.l2MKIpD0006801@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to gonzo@FreeBSD.org using -f From: Oleksandr Tymoshenko To: Perforce Change Reviews Cc: Subject: PERFORCE change 116358 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 22 Mar 2007 20:18:52 -0000 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); } /*