From owner-svn-src-all@FreeBSD.ORG Fri Jul 2 12:01:47 2010 Return-Path: Delivered-To: svn-src-all@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 314B1106567A; Fri, 2 Jul 2010 12:01:47 +0000 (UTC) (envelope-from jchandra@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 166568FC2A; Fri, 2 Jul 2010 12:01:47 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id o62C1ka3086241; Fri, 2 Jul 2010 12:01:46 GMT (envelope-from jchandra@svn.freebsd.org) Received: (from jchandra@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id o62C1khS086240; Fri, 2 Jul 2010 12:01:46 GMT (envelope-from jchandra@svn.freebsd.org) Message-Id: <201007021201.o62C1khS086240@svn.freebsd.org> From: "Jayachandran C." Date: Fri, 2 Jul 2010 12:01:46 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r209645 - in head/sys/mips: include mips X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 02 Jul 2010 12:01:47 -0000 Author: jchandra Date: Fri Jul 2 12:01:46 2010 New Revision: 209645 URL: http://svn.freebsd.org/changeset/base/209645 Log: Remove save/restore of PageMask in tlb.c functions introduced in r209243. If we save/restore the PageMask, the value set by the bootloader will persist, and will cause problems later in TLB exception handler. This caused a crash in AR71xx boards. Also fixes the EntryHi mask in pte.h Reported by: Luiz Otavio O Souza Tested by: Luiz Otavio O Souza Approved by: rrs (mentor) Modified: head/sys/mips/include/pte.h head/sys/mips/mips/tlb.c Modified: head/sys/mips/include/pte.h ============================================================================== --- head/sys/mips/include/pte.h Fri Jul 2 09:53:26 2010 (r209644) +++ head/sys/mips/include/pte.h Fri Jul 2 12:01:46 2010 (r209645) @@ -73,7 +73,8 @@ * Note that in FreeBSD, we map 2 TLB pages is equal to 1 VM page. */ #define TLBHI_ASID_MASK (0xff) -#define TLBHI_ENTRY(va, asid) (((va) & ~PAGE_MASK) | ((asid) & TLBHI_ASID_MASK)) +#define TLBHI_PAGE_MASK (2 * PAGE_SIZE - 1) +#define TLBHI_ENTRY(va, asid) (((va) & ~TLBHI_PAGE_MASK) | ((asid) & TLBHI_ASID_MASK)) #ifndef _LOCORE typedef uint32_t pt_entry_t; Modified: head/sys/mips/mips/tlb.c ============================================================================== --- head/sys/mips/mips/tlb.c Fri Jul 2 09:53:26 2010 (r209644) +++ head/sys/mips/mips/tlb.c Fri Jul 2 12:01:46 2010 (r209645) @@ -91,13 +91,12 @@ static void tlb_invalidate_one(unsigned) void tlb_insert_wired(unsigned i, vm_offset_t va, pt_entry_t pte0, pt_entry_t pte1) { - register_t mask, asid; + register_t asid; register_t s; va &= ~PAGE_MASK; s = intr_disable(); - mask = mips_rd_pagemask(); asid = mips_rd_entryhi() & TLBHI_ASID_MASK; mips_wr_index(i); @@ -108,21 +107,19 @@ tlb_insert_wired(unsigned i, vm_offset_t tlb_write_indexed(); mips_wr_entryhi(asid); - mips_wr_pagemask(mask); intr_restore(s); } void tlb_invalidate_address(struct pmap *pmap, vm_offset_t va) { - register_t mask, asid; + register_t asid; register_t s; int i; va &= ~PAGE_MASK; s = intr_disable(); - mask = mips_rd_pagemask(); asid = mips_rd_entryhi() & TLBHI_ASID_MASK; mips_wr_pagemask(0); @@ -133,38 +130,34 @@ tlb_invalidate_address(struct pmap *pmap tlb_invalidate_one(i); mips_wr_entryhi(asid); - mips_wr_pagemask(mask); intr_restore(s); } void tlb_invalidate_all(void) { - register_t mask, asid; + register_t asid; register_t s; unsigned i; s = intr_disable(); - mask = mips_rd_pagemask(); asid = mips_rd_entryhi() & TLBHI_ASID_MASK; for (i = mips_rd_wired(); i < num_tlbentries; i++) tlb_invalidate_one(i); mips_wr_entryhi(asid); - mips_wr_pagemask(mask); intr_restore(s); } void tlb_invalidate_all_user(struct pmap *pmap) { - register_t mask, asid; + register_t asid; register_t s; unsigned i; s = intr_disable(); - mask = mips_rd_pagemask(); asid = mips_rd_entryhi() & TLBHI_ASID_MASK; for (i = mips_rd_wired(); i < num_tlbentries; i++) { @@ -191,7 +184,6 @@ tlb_invalidate_all_user(struct pmap *pma } mips_wr_entryhi(asid); - mips_wr_pagemask(mask); intr_restore(s); } @@ -217,7 +209,7 @@ tlb_save(void) void tlb_update(struct pmap *pmap, vm_offset_t va, pt_entry_t pte) { - register_t mask, asid; + register_t asid; register_t s; int i; @@ -225,7 +217,6 @@ tlb_update(struct pmap *pmap, vm_offset_ pte &= ~TLBLO_SWBITS_MASK; s = intr_disable(); - mask = mips_rd_pagemask(); asid = mips_rd_entryhi() & TLBHI_ASID_MASK; mips_wr_pagemask(0); @@ -244,7 +235,6 @@ tlb_update(struct pmap *pmap, vm_offset_ } mips_wr_entryhi(asid); - mips_wr_pagemask(mask); intr_restore(s); }