svn commit: r209645 - in head/sys/mips: include mips

Jayachandran C. jchandra at FreeBSD.org
Fri Jul 2 12:01:47 UTC 2010


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 <lists.br at gmail.com>
  Tested by:   Luiz Otavio O Souza <lists.br at gmail.com>
  
  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);
 }
 


More information about the svn-src-head mailing list