On Tue, Aug 02, 2016 at 01:43:10PM +0200, Mark Kettenis wrote:
> > Date: Tue, 2 Aug 2016 02:02:57 +1000
> > From: Jonathan Gray <j...@jsg.id.au>
> 
> Adding back tech@ just in case a knwoledgable person there wants to
> chime in...
> 
> > On Mon, Aug 01, 2016 at 05:10:48PM +0200, Mark Kettenis wrote:
> > > 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.
> > 
> > We could just drop the I and D specific functions like FreeBSD did?
> > 
> >         /*
> >          * TLB functions.  ARMv7 does all TLB ops based on a unified TLB 
> > model
> >          * whether the hardware implements separate I+D or not, so we use 
> > the
> >          * same 'ID' functions for all 3 variations.
> >          */
> > 
> >         armv7_tlb_flushID,              /* tlb_flushID          */
> >         armv7_tlb_flushID_SE,           /* tlb_flushID_SE       */
> >         armv7_tlb_flushID,              /* tlb_flushD           */
> >         armv7_tlb_flushID_SE,           /* tlb_flushD_SE        */
> > 
> > https://lists.freebsd.org/pipermail/freebsd-arm/2014-March/007849.html
> 
> I think it makes sense to keep the distinction betwwen the ID and D
> variants for now.  The ID variants also flush the branch predictor
> wheras the D variants don't.
> 
> That raises some question about my simplifications of the armv7 pmap.
> Those replace the conditional executation of ID or D variants with
> unconditional executaion of D variants.  I think that that is still
> worth doing.  In theory there is some additional overhead for flushing
> the branch prediction.  But the elemination of the branch instructions
> will at least partly compensate for that.  And on most, if not all,
> Cortex CPUs flushing the branch predictor isn't necessary.  So on
> those we can simply change the function pointers to always use the D
> variants.  I'll do that in a fllowup diff.
> 
> So, as a first step I'd like to commit the diff below.
> 
> ok?

You seem to be missing a cpufunc.c diff, I think this is
what you meant to send?

In which case ok jsg@

Index: cpufunc.c
===================================================================
RCS file: /cvs/src/sys/arch/arm/arm/cpufunc.c,v
retrieving revision 1.42
diff -u -p -r1.42 cpufunc.c
--- cpufunc.c   31 Jul 2016 03:49:51 -0000      1.42
+++ cpufunc.c   2 Aug 2016 12:09:04 -0000
@@ -109,8 +109,8 @@ struct cpu_functions armv7_cpufuncs = {
 
        armv7_tlb_flushID,              /* tlb_flushID          */
        armv7_tlb_flushID_SE,           /* tlb_flushID_SE       */
-       armv7_tlb_flushI,               /* tlb_flushI           */
-       armv7_tlb_flushI_SE,            /* tlb_flushI_SE        */
+       armv7_tlb_flushID,              /* tlb_flushI           */
+       armv7_tlb_flushID_SE,           /* tlb_flushI_SE        */
        armv7_tlb_flushD,               /* tlb_flushD           */
        armv7_tlb_flushD_SE,            /* tlb_flushD_SE        */
 
Index: 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
--- cpufunc_asm_armv7.S 25 Apr 2016 04:46:56 -0000      1.10
+++ cpufunc_asm_armv7.S 2 Aug 2016 12:09:04 -0000
@@ -45,7 +45,7 @@ ENTRY(armv7_setttb)
        isb     sy
 
        mcr     CP15_TTBR0(r0)          /* load new TTB */
-       mcr     CP15_TLBIALL(r0)        /* invalidate I+D TLBs */
+       mcr     CP15_TLBIALL(r0)        /* invalidate unified TLB */
        dsb     sy
        isb     sy
 
@@ -55,45 +55,27 @@ 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_BPIMVA             /* flush va from BP */
-       dsb     sy
-       isb     sy
-       mov     pc, lr
-
-/*
- * 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_BPIALL             /* Flush BP cache */
+ENTRY(armv7_tlb_flushD_SE)
+       mcr     CP15_TLBIMVA(r0)        /* flush unified tlb single entry */
        dsb     sy
        isb     sy
        mov     pc, lr
 
 ENTRY(armv7_tlb_flushD)
-       mcr     CP15_DTLBIALL           /* flush D tlb */
-       dsb     sy
-       isb     sy
-       mov     pc, lr
-
-ENTRY(armv7_tlb_flushD_SE)
-       mcr     CP15_DTLBIMVA           /* flush D tlb single entry */
+       mcr     CP15_TLBIALL(r0)        /* flush unified tlb */
        dsb     sy
        isb     sy
        mov     pc, lr
@@ -251,7 +233,7 @@ ENTRY(armv7_context_switch)
        isb     sy
 
        mcr     CP15_TTBR0(r0)          /* set the new TTB */
-       mcr     CP15_TLBIALL(r0)        /* and flush the I+D tlbs */
+       mcr     CP15_TLBIALL(r0)        /* and flush the unified tlb */
        dsb     sy
        isb     sy
        mov     pc, lr

Reply via email to