So the ARMv7 ARM says in B4.2.2:

  - on an implementation with separate data and instruction TLBs, any
    unified TLB operation operates on both TLBs
 
  - on an implementation with a unified TLB, any instruction TLB
    operation, and any data TLB operation, operates on the unified TLB

  - ARM deprecates use of instruction TLB operations and data TLB
    operations, and recommends that software always uses the unified
    TLB operations.

It seems that All the Cortex-A CPUs, with the exception of the
Cortex-A8 have a unified TLB.  Since the non-unified TLB operations
are deprecated, and using the unified TLB operations leads to some
code simplifications, I think it makes sense to switch armv7 to these.
This might be a slight pessimisation on Cortex-A8, although I'm not
sure it will be noticable.

Thoughts?

Tested on Cortex-A9.  Would be nice if somebody could test this on
Cortex-A8.


Index: arch/arm/arm/cpufunc_asm_armv7.S
===================================================================
RCS file: /cvs/src/sys/arch/arm/arm/cpufunc_asm_armv7.S,v
retrieving revision 1.10
diff -u -p -r1.10 cpufunc_asm_armv7.S
--- arch/arm/arm/cpufunc_asm_armv7.S    25 Apr 2016 04:46:56 -0000      1.10
+++ arch/arm/arm/cpufunc_asm_armv7.S    1 Aug 2016 14:34:36 -0000
@@ -55,15 +55,14 @@ ENTRY(armv7_setttb)
  * TLB functions
  */
 ENTRY(armv7_tlb_flushID_SE)
-       mcr     CP15_DTLBIMVA           /* flush D tlb single entry */
-       mcr     CP15_ITLBIMVA           /* flush I tlb single entry */
+       mcr     CP15_TLBIMVA(r0)        /* flush unified tlb single entry */
        mcr     CP15_BPIMVA             /* flush va from BP */
        dsb     sy
        isb     sy
        mov     pc, lr
 
 ENTRY(armv7_tlb_flushI_SE)
-       mcr     CP15_ITLBIMVA           /* flush I tlb single entry */
+       mcr     CP15_TLBIMVA(r0)        /* flush unified tlb single entry */
        mcr     CP15_BPIMVA             /* flush va from BP */
        dsb     sy
        isb     sy
@@ -73,27 +72,27 @@ ENTRY(armv7_tlb_flushI_SE)
  * TLB functions
  */
 ENTRY(armv7_tlb_flushID)
-       mcr     CP15_TLBIALL(r0)        /* flush I+D tlb */
+       mcr     CP15_TLBIALL(r0)        /* flush unified tlb */
        mcr     CP15_BPIALL             /* Flush BP cache */
        dsb     sy
        isb     sy
        mov     pc, lr
 
 ENTRY(armv7_tlb_flushI)
-       mcr     CP15_ITLBIALL           /* flush I tlb */
+       mcr     CP15_TLBIALL(r0)        /* flush unified tlb */
        mcr     CP15_BPIALL             /* Flush BP cache */
        dsb     sy
        isb     sy
        mov     pc, lr
 
 ENTRY(armv7_tlb_flushD)
-       mcr     CP15_DTLBIALL           /* flush D tlb */
+       mcr     CP15_TLBIALL(r0)        /* flush unified tlb */
        dsb     sy
        isb     sy
        mov     pc, lr
 
 ENTRY(armv7_tlb_flushD_SE)
-       mcr     CP15_DTLBIMVA           /* flush D tlb single entry */
+       mcr     CP15_TLBIMVA(r0)        /* flush unified tlb single entry */
        dsb     sy
        isb     sy
        mov     pc, lr
Index: arch/arm/arm/pmap7.c
===================================================================
RCS file: /cvs/src/sys/arch/arm/arm/pmap7.c,v
retrieving revision 1.31
diff -u -p -r1.31 pmap7.c
--- arch/arm/arm/pmap7.c        31 Jul 2016 22:27:07 -0000      1.31
+++ arch/arm/arm/pmap7.c        1 Aug 2016 14:34:37 -0000
@@ -1028,12 +1028,8 @@ pmap_clearbit(struct vm_page *pg, u_int 
                        *ptep = npte;
                        PTE_SYNC(ptep);
                        /* Flush the TLB entry if a current pmap. */
-                       if (l2pte_valid(opte)) {
-                               if (PV_BEEN_EXECD(oflags))
-                                       pmap_tlb_flushID_SE(pm, pv->pv_va);
-                               else
-                                       pmap_tlb_flushD_SE(pm, pv->pv_va);
-                       }
+                       if (l2pte_valid(opte))
+                               pmap_tlb_flushID_SE(pm, pv->pv_va);
                }
 
                NPDEBUG(PDB_BITS,
@@ -1281,7 +1277,6 @@ pmap_enter(pmap_t pm, vaddr_t va, paddr_
        ptep = &l2b->l2b_kva[l2pte_index(va)];
        opte = *ptep;
        npte = pa;
-       oflags = 0;
 
        if (opte != 0) {        /* not l2pte_valid!!! MIOD */
                /*
@@ -1367,7 +1362,6 @@ pmap_enter(pmap_t pm, vaddr_t va, paddr_
                                 * must remove it from the PV list
                                 */
                                pve = pmap_remove_pv(opg, pm, va);
-                               oflags = pve->pv_flags;
                        } else
                        if ((pve = pool_get(&pmap_pv_pool, PR_NOWAIT)) == NULL){
                                if ((flags & PMAP_CANFAIL) == 0)
@@ -1397,8 +1391,6 @@ pmap_enter(pmap_t pm, vaddr_t va, paddr_
                         * at this address.
                         */
                        pve = pmap_remove_pv(opg, pm, va);
-                       oflags = pve->pv_flags;
-
                        pool_put(&pmap_pv_pool, pve);
                }
        }
@@ -1449,12 +1441,8 @@ pmap_enter(pmap_t pm, vaddr_t va, paddr_
                        }
                }
 
-               if (l2pte_valid(opte)) {
-                       if (PV_BEEN_EXECD(oflags))
-                               pmap_tlb_flushID_SE(pm, va);
-                       else
-                               pmap_tlb_flushD_SE(pm, va);
-               }
+               if (l2pte_valid(opte))
+                       pmap_tlb_flushID_SE(pm, va);
        }
 
        /*
@@ -1480,7 +1468,7 @@ pmap_remove(pmap_t pm, vaddr_t sva, vadd
        struct l2_bucket *l2b;
        vaddr_t next_bucket;
        pt_entry_t *ptep;
-       u_int mappings, is_exec;
+       u_int mappings;
 
        NPDEBUG(PDB_REMOVE, printf("pmap_remove: pmap=%p sva=%08lx eva=%08lx\n",
            pm, sva, eva));
@@ -1520,7 +1508,6 @@ pmap_remove(pmap_t pm, vaddr_t sva, vadd
 
                        pm->pm_stats.resident_count--;
                        pa = l2pte_pa(pte);
-                       is_exec = 0;
 
                        /*
                         * Update flags. In a number of circumstances,
@@ -1531,10 +1518,8 @@ pmap_remove(pmap_t pm, vaddr_t sva, vadd
                        if (pg != NULL) {
                                struct pv_entry *pve;
                                pve = pmap_remove_pv(pg, pm, sva);
-                               if (pve != NULL) {
-                                       is_exec = PV_BEEN_EXECD(pve->pv_flags);
+                               if (pve != NULL)
                                        pool_put(&pmap_pv_pool, pve);
-                               }
                        }
 
                        /*
@@ -1547,12 +1532,8 @@ pmap_remove(pmap_t pm, vaddr_t sva, vadd
 
                        *ptep = L2_TYPE_INV;
                        PTE_SYNC(ptep);
-                       if (l2pte_valid(pte)) {
-                               if (is_exec)
-                                       pmap_tlb_flushID_SE(pm, sva);
-                               else
-                                       pmap_tlb_flushD_SE(pm, sva);
-                       }
+                       if (l2pte_valid(pte))
+                               pmap_tlb_flushID_SE(pm, sva);
 
                        sva += PAGE_SIZE;
                        ptep++;
@@ -1801,12 +1782,8 @@ NPDEBUG(PDB_PROTECT, printf("\n"));
 
                                if (flush >= 0) {
                                        flush++;
-                                       if (l2pte_valid(opte)) {
-                                               if (PV_BEEN_EXECD(f))
-                                                       cpu_tlb_flushID_SE(sva);
-                                               else
-                                                       cpu_tlb_flushD_SE(sva);
-                                       }
+                                       if (l2pte_valid(opte))
+                                               cpu_tlb_flushID_SE(sva);
                                } else
                                        flags |= f;
                        }
@@ -1816,12 +1793,9 @@ NPDEBUG(PDB_PROTECT, printf("\n"));
                }
        }
 
-       if (flush < 0) {
-               if (PV_BEEN_EXECD(flags))
-                       pmap_tlb_flushID(pm);
-               else
-                       pmap_tlb_flushD(pm);
-       }
+       if (flush < 0)
+               pmap_tlb_flushID(pm);
+
 NPDEBUG(PDB_PROTECT, printf("\n"));
 }
 

Reply via email to