svn commit: r206590 - in user/jmallett/octeon/sys/mips: include mips
Juli Mallett
jmallett at FreeBSD.org
Wed Apr 14 05:54:00 UTC 2010
Author: jmallett
Date: Wed Apr 14 05:53:59 2010
New Revision: 206590
URL: http://svn.freebsd.org/changeset/base/206590
Log:
o) Add a routine to invalidate all TLB entries associated with a specific or
any non-kernel pmap.
Modified:
user/jmallett/octeon/sys/mips/include/tlb.h
user/jmallett/octeon/sys/mips/mips/pmap.c
user/jmallett/octeon/sys/mips/mips/tlb.c
Modified: user/jmallett/octeon/sys/mips/include/tlb.h
==============================================================================
--- user/jmallett/octeon/sys/mips/include/tlb.h Wed Apr 14 05:44:02 2010 (r206589)
+++ user/jmallett/octeon/sys/mips/include/tlb.h Wed Apr 14 05:53:59 2010 (r206590)
@@ -31,6 +31,7 @@
void tlb_invalidate_address(struct pmap *, vm_offset_t);
void tlb_invalidate_all(void);
+void tlb_invalidate_all_user(struct pmap *);
void tlb_update(struct pmap *, vm_offset_t, pt_entry_t);
#endif /* !_MACHINE_TLB_H_ */
Modified: user/jmallett/octeon/sys/mips/mips/pmap.c
==============================================================================
--- user/jmallett/octeon/sys/mips/mips/pmap.c Wed Apr 14 05:44:02 2010 (r206589)
+++ user/jmallett/octeon/sys/mips/mips/pmap.c Wed Apr 14 05:53:59 2010 (r206590)
@@ -588,13 +588,14 @@ pmap_invalidate_all_action(void *arg)
#endif
- if (pmap->pm_active & PCPU_GET(cpumask)) {
- /*
- * XXX/juli
- * Add something like TBIAP.
- */
+ if (pmap == kernel_pmap) {
tlb_invalidate_all();
- } else
+ return;
+ }
+
+ if (pmap->pm_active & PCPU_GET(cpumask))
+ tlb_invalidate_all_user(pmap);
+ else
pmap->pm_asid[PCPU_GET(cpuid)].gen = 0;
}
@@ -2907,11 +2908,7 @@ pmap_asid_alloc(pmap)
pmap->pm_asid[PCPU_GET(cpuid)].gen == PCPU_GET(asid_generation));
else {
if (PCPU_GET(next_asid) == pmap_max_asid) {
- /*
- * XXX/juli
- * Add something like TBIAP.
- */
- tlb_invalidate_all();
+ tlb_invalidate_all_user(NULL);
PCPU_SET(asid_generation,
(PCPU_GET(asid_generation) + 1) & ASIDGEN_MASK);
if (PCPU_GET(asid_generation) == 0) {
Modified: user/jmallett/octeon/sys/mips/mips/tlb.c
==============================================================================
--- user/jmallett/octeon/sys/mips/mips/tlb.c Wed Apr 14 05:44:02 2010 (r206589)
+++ user/jmallett/octeon/sys/mips/mips/tlb.c Wed Apr 14 05:53:59 2010 (r206590)
@@ -127,6 +127,43 @@ tlb_invalidate_all(void)
}
void
+tlb_invalidate_all_user(struct pmap *pmap)
+{
+ register_t mask, 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++) {
+ register_t uasid;
+
+ mips_wr_index(i);
+ tlb_read();
+
+ uasid = mips_rd_entryhi() & TLBHI_ASID_MASK;
+ if (pmap == NULL) {
+ /*
+ * Invalidate all non-kernel entries.
+ */
+ if (uasid == 0)
+ continue;
+ } else {
+ /*
+ * Invalidate this pmap's entries.
+ */
+ if (uasid != pmap_asid(pmap))
+ continue;
+ }
+ tlb_invalidate_one(i);
+ }
+ mips_wr_entryhi(asid);
+ mips_wr_pagemask(mask);
+ intr_restore(s);
+}
+
+void
tlb_update(struct pmap *pmap, vm_offset_t va, pt_entry_t pte)
{
register_t mask, asid;
More information about the svn-src-user
mailing list