ARCv2: entry: push out the Z flag unclobber from common EXCEPTION_PROLOGUE
authorVineet Gupta <vgupta@synopsys.com>
Wed, 10 Apr 2019 02:16:37 +0000 (19:16 -0700)
committerVineet Gupta <vgupta@synopsys.com>
Mon, 1 Jul 2019 18:02:22 +0000 (11:02 -0700)
Upon a taken interrupt/exception from User mode, HS hardware auto sets Z flag.
This helps shave a few instructions from EXCEPTION_PROLOGUE by eliding
re-reading ERSTATUS and some bit fiddling.

However TLB Miss Exception handler can clobber the CPU flags and still end
up in EXCEPTION_PROLOGUE in the slow path handling TLB handling case:

   EV_TLBMissD
     do_slow_path_pf
       EV_TLBProtV (aliased to call_do_page_fault)
          EXCEPTION_PROLOGUE

As a result, EXCEPTION_PROLOGUE need to "unclobber" the Z flag which this
patch changes. It is now pushed out to TLB Miss Exception handler.
The reasons beings:

 - The flag restoration is only needed for slowpath TLB Miss Exception
   handling, but currently being in EXCEPTION_PROLOGUE penalizes all
   exceptions such as ProtV and syscall Trap, where Z flag is already
   as expected.

 - Pushing unclobber out to where it was clobbered is much cleaner and
   also serves to document the fact.

 - Makes EXCEPTION_PROLGUE similar to INTERRUPT_PROLOGUE so easier to
   refactor the common parts which is what this series aims to do

Signed-off-by: Vineet Gupta <vgupta@synopsys.com>
arch/arc/include/asm/entry-arcv2.h
arch/arc/mm/tlbex.S

index 1c3520d1fa4201bb672d805cdc14f9d30e840b2a..3209a676296064db739705f36fb93238cfc8ca13 100644 (file)
 
        ; -- for interrupts, regs above are auto-saved by h/w in that order --
        ; Now do what ISR prologue does (manually save r12, sp, fp, gp, r25)
-       ;
-       ; Set Z flag if this was from U mode (expected by INTERRUPT_PROLOGUE)
-       ; Although H/w exception micro-ops do set Z flag for U mode (just like
-       ; for interrupts), it could get clobbered in case we soft land here from
-       ; a TLB Miss exception handler (tlbex.S)
-
-       and     r10, r10, STATUS_U_MASK
-       xor.f   0, r10, STATUS_U_MASK
 
        INTERRUPT_PROLOGUE  exception
 
index 471a97bf492d54357cfa3219b9f9eb90f03cc400..c55d95dd2f3949f0fae10451ce8e02691ca03d9a 100644 (file)
@@ -393,6 +393,17 @@ EV_TLBMissD_fast_ret:      ; additional label for VDK OS-kit instrumentation
 ;-------- Common routine to call Linux Page Fault Handler -----------
 do_slow_path_pf:
 
+#ifdef CONFIG_ISA_ARCV2
+       ; Set Z flag if exception in U mode. Hardware micro-ops do this on any
+       ; taken interrupt/exception, and thus is already the case at the entry
+       ; above, but ensuing code would have already clobbered.
+       ; EXCEPTION_PROLOGUE called in slow path, relies on correct Z flag set
+
+       lr      r2, [erstatus]
+       and     r2, r2, STATUS_U_MASK
+       bxor.f  0, r2, STATUS_U_BIT
+#endif
+
        ; Restore the 4-scratch regs saved by fast path miss handler
        TLBMISS_RESTORE_REGS