mirror of
https://github.com/torvalds/linux.git
synced 2024-11-23 20:51:44 +00:00
ARCv2: entry: push out the Z flag unclobber from common EXCEPTION_PROLOGUE
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>
This commit is contained in:
parent
45869eb0c0
commit
23c0cbd0c7
@ -225,14 +225,6 @@
|
||||
|
||||
; -- 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
|
||||
|
||||
|
@ -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
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user