PERFORCE change 106744 for review

Oleksandr Tymoshenko gonzo at FreeBSD.org
Tue Sep 26 13:50:34 PDT 2006


http://perforce.freebsd.org/chv.cgi?CH=106744

Change 106744 by gonzo at gonzo_hq on 2006/09/26 20:50:17

	o Make tlb_update and tlb_invalidate_page ASID-aware.
	o Add some *very* initial ASID initialization.

Affected files ...

.. //depot/projects/mips2/src/sys/mips/include/tlb.h#5 edit
.. //depot/projects/mips2/src/sys/mips/mips/pmap.c#11 edit
.. //depot/projects/mips2/src/sys/mips/mips/tlb.c#9 edit
.. //depot/projects/mips2/src/sys/mips/mips/trap.c#8 edit

Differences ...

==== //depot/projects/mips2/src/sys/mips/include/tlb.h#5 (text+ko) ====

@@ -23,7 +23,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $P4: //depot/projects/mips2/src/sys/mips/include/tlb.h#4 $
+ * $P4: //depot/projects/mips2/src/sys/mips/include/tlb.h#5 $
  */
 
 #ifndef	_MACHINE_TLB_H_
@@ -39,11 +39,11 @@
 void tlb_enter(pmap_t, vm_offset_t, vm_paddr_t, pt_entry_t);
 void tlb_invalidate_all(void);
 void tlb_invalidate_one(int);
-void tlb_invalidate_page(vm_offset_t);
+void tlb_invalidate_page(vm_offset_t, uint32_t);
 void tlb_modified(pmap_t, void *);
 void tlb_remove(pmap_t, vm_offset_t);
 void tlb_remove_pages(pmap_t, vm_offset_t, int);
 void tlb_remove_range(pmap_t, vm_offset_t, vm_offset_t);
-void tlb_update(vm_offset_t, pt_entry_t, pt_entry_t);
+void tlb_update(vm_offset_t, uint32_t, pt_entry_t, pt_entry_t);
 
 #endif /* _MACHINE_TLB_H_ */

==== //depot/projects/mips2/src/sys/mips/mips/pmap.c#11 (text+ko) ====

@@ -455,7 +455,7 @@
 {
 
 	if (pmap->pm_active) {
-		tlb_invalidate_page(va);
+		tlb_invalidate_page(va, pmap->pm_asid);
 		/* XXX ensure coherency? */
 	} else {
 		pmap_invalidate_asid(pmap);
@@ -758,8 +758,9 @@
 
 	pmap->pm_ptphint = NULL;
 	pmap->pm_active = 0;
-	pmap->pm_asid = 0;
-	pmap->pm_asidgen = 0;
+	/* XXXMIPS: put proper asid generation here */
+	pmap->pm_asid = 1;
+	pmap->pm_asidgen = 1;
 	TAILQ_INIT(&pmap->pm_pvlist);
 	bzero(&pmap->pm_stats, sizeof pmap->pm_stats);
 	mtx_lock_spin(&allpmaps_lock);

==== //depot/projects/mips2/src/sys/mips/mips/tlb.c#9 (text+ko) ====

@@ -136,7 +136,7 @@
 
 	pte = pmap_pte(pmap, va);
 	if (pte_valid(pte))
-		tlb_invalidate_page(va);
+		tlb_invalidate_page(va, pmap->pm_asid);
 	else
 		mips_dcache_wbinv_range_index(va, PAGE_SIZE);
 	if ((bits & PG_V) == 0)
@@ -147,9 +147,9 @@
 	*pte |= PG_C_UNCACHED;
 
 	if ((va >> PAGE_SHIFT) & 1)
-		tlb_update(va, pte[-1], pte[0]);
+		tlb_update(va, pmap->pm_asid, pte[-1], pte[0]);
 	else 
-		tlb_update(va, pte[0], pte[1]);
+		tlb_update(va, pmap->pm_asid, pte[0], pte[1]);
 }
 
 void
@@ -161,7 +161,7 @@
 
 	pte = pmap_pte(pmap, va);
 	pte_clear(pte, PG_V);
-	tlb_invalidate_page(va);
+	tlb_invalidate_page(va, pmap->pm_asid);
 }
 
 void
@@ -181,13 +181,13 @@
 }
 
 void
-tlb_update(vm_offset_t va, pt_entry_t pte0, pt_entry_t pte1)
+tlb_update(vm_offset_t va, uint32_t asid, pt_entry_t pte0, pt_entry_t pte1)
 {
 	u_long ehi;
 	int i;
 
 	va &= ~PAGE_MASK;
-	ehi = MIPS_HI_ENTRY(va, /*asid*/0);
+	ehi = MIPS_HI_ENTRY(va, asid);
 	mips_wr_entryhi(ehi);
 	mips_tlbp();
 	i = mips_rd_index();
@@ -227,13 +227,13 @@
 }
 
 void
-tlb_invalidate_page(vm_offset_t va)
+tlb_invalidate_page(vm_offset_t va, uint32_t asid)
 {
 	u_long ehi;
 	int i;
 
 	va &= ~PAGE_MASK;
-	ehi = MIPS_HI_ENTRY(va, /*asid*/0);
+	ehi = MIPS_HI_ENTRY(va, asid);
 	mips_wr_entryhi(ehi);
 	mips_tlbp();
 	i = mips_rd_index();
@@ -270,8 +270,8 @@
 	*pte |= PG_D;
 
 	if ((va >> PAGE_SHIFT) & 1) {
-		tlb_update(va, pte[-1], pte[0]);
+		tlb_update(va, pmap->pm_asid, pte[-1], pte[0]);
 	} else {
-		tlb_update(va, pte[0], pte[1]);
+		tlb_update(va, pmap->pm_asid, pte[0], pte[1]);
 	}
 }

==== //depot/projects/mips2/src/sys/mips/mips/trap.c#8 (text+ko) ====

@@ -144,9 +144,11 @@
 			}
 
 			if ((va >> PAGE_SHIFT) & 1)
-				tlb_update(va, pte[-1], pte[0]);
+				tlb_update(va, kernel_pmap->pm_asid,
+						pte[-1], pte[0]);
 			else
-				tlb_update(va, pte[0], pte[1]);
+				tlb_update(va, kernel_pmap->pm_asid,
+						pte[0], pte[1]);
 			goto done;
 		} else
 			map = &td->td_proc->p_vmspace->vm_map;


More information about the p4-projects mailing list