Skip to content

Commit

Permalink
ARC: [arcompact] entry.S: Elide extra check/branch in exception ret path
Browse files Browse the repository at this point in the history
This is done by improving the laddering logic !

Before:

   if Exception
      goto excep_or_pure_k_ret

   if !Interrupt(L2)
      goto l1_chk
   else
      INTERRUPT_EPILOGUE 2

 l1_chk:
   if !Interrupt(L1)  (i.e. pure kernel mode)
      goto excep_or_pure_k_ret
   else
      INTERRUPT_EPILOGUE 1

 excep_or_pure_k_ret:
   EXCEPTION_EPILOGUE

Now:

   if !Interrupt(L1 or L2) (i.e. exception or pure kernel mode)
      goto excep_or_pure_k_ret

  ; guaranteed to be an interrupt
   if !Interrupt(L2)
      goto l1_ret
   else
      INTERRUPT_EPILOGUE 2

 ; by virtue of above, no need to chk for L1 active
 l1_ret:
    INTERRUPT_EPILOGUE 1

 excep_or_pure_k_ret:
    EXCEPTION_EPILOGUE

Signed-off-by: Vineet Gupta <vgupta@synopsys.com>
  • Loading branch information
Vineet Gupta committed Oct 17, 2015
1 parent 5f88808 commit 9fabcc6
Showing 1 changed file with 6 additions and 12 deletions.
18 changes: 6 additions & 12 deletions arch/arc/kernel/entry-compact.S
Original file line number Diff line number Diff line change
Expand Up @@ -333,11 +333,10 @@ END(call_do_page_fault)
; Note that we use realtime STATUS32 (not pt_regs->status32) to
; decide that.

; if Returning from Exception
btst r10, STATUS_AE_BIT
bnz .Lexcep_ret
and.f 0, r10, (STATUS_A1_MASK|STATUS_A2_MASK)
bz .Lexcep_or_pure_K_ret

; Not Exception so maybe Interrupts (Level 1 or 2)
; Returning from Interrupts (Level 1 or 2)

#ifdef CONFIG_ARC_COMPACT_IRQ_LEVELS

Expand Down Expand Up @@ -378,24 +377,19 @@ END(call_do_page_fault)
st r9, [r10, THREAD_INFO_PREEMPT_COUNT]

149:
;return from level 2
INTERRUPT_EPILOGUE 2
INTERRUPT_EPILOGUE 2 ; return from level 2 interrupt
debug_marker_l2:
rtie

not_level2_interrupt:

#endif

bbit0 r10, STATUS_A1_BIT, .Lpure_k_mode_ret

;return from level 1
INTERRUPT_EPILOGUE 1
INTERRUPT_EPILOGUE 1 ; return from level 1 interrupt
debug_marker_l1:
rtie

.Lexcep_ret:
.Lpure_k_mode_ret:
.Lexcep_or_pure_K_ret:

;this case is for syscalls or Exceptions or pure kernel mode

Expand Down

0 comments on commit 9fabcc6

Please sign in to comment.