Skip to content

Commit

Permalink
xtensa: reorganize irq flags tracing
Browse files Browse the repository at this point in the history
entry.s only disables IRQs on hardware IRQ, move trace_hardirqs_off call
into do_interrupt. Check actual intlevel that will be restored on return
from exception handler to decide if trace_hardirqs_on should be called.
Annotate IRQ on/off points in the TIF_* handling loop on return from
exception handler.

Signed-off-by: Max Filippov <jcmvbkbc@gmail.com>
  • Loading branch information
Max Filippov committed Aug 17, 2015
1 parent 18bc5b8 commit 7d5f6a9
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 26 deletions.
39 changes: 14 additions & 25 deletions arch/xtensa/kernel/entry.S
Original file line number Diff line number Diff line change
Expand Up @@ -399,21 +399,6 @@ common_exception:

save_xtregs_opt a1 a3 a4 a5 a6 a7 PT_XTREGS_OPT

#ifdef CONFIG_TRACE_IRQFLAGS
l32i a4, a1, PT_DEPC
/* Double exception means we came here with an exception
* while PS.EXCM was set, i.e. interrupts disabled.
*/
bgeui a4, VALID_DOUBLE_EXCEPTION_ADDRESS, 1f
bnei a2, EXCCAUSE_LEVEL1_INTERRUPT, 1f
/* We came here with an interrupt means interrupts were enabled
* and we've just disabled them.
*/
movi a4, trace_hardirqs_off
callx4 a4
1:
#endif

/* Go to second-level dispatcher. Set up parameters to pass to the
* exception handler and call the exception handler.
*/
Expand All @@ -434,6 +419,10 @@ common_exception_return:

1:
rsil a2, LOCKLEVEL
#ifdef CONFIG_TRACE_IRQFLAGS
movi a4, trace_hardirqs_off
callx4 a4
#endif

/* Jump if we are returning from kernel exceptions. */

Expand All @@ -458,6 +447,10 @@ common_exception_return:

/* Call do_signal() */

#ifdef CONFIG_TRACE_IRQFLAGS
movi a4, trace_hardirqs_on
callx4 a4
#endif
rsil a2, 0
movi a4, do_notify_resume # int do_notify_resume(struct pt_regs*)
mov a6, a1
Expand All @@ -466,6 +459,10 @@ common_exception_return:

3: /* Reschedule */

#ifdef CONFIG_TRACE_IRQFLAGS
movi a4, trace_hardirqs_on
callx4 a4
#endif
rsil a2, 0
movi a4, schedule # void schedule (void)
callx4 a4
Expand Down Expand Up @@ -494,16 +491,8 @@ common_exception_return:
6:
4:
#ifdef CONFIG_TRACE_IRQFLAGS
l32i a4, a1, PT_DEPC
/* Double exception means we came here with an exception
* while PS.EXCM was set, i.e. interrupts disabled.
*/
bgeui a4, VALID_DOUBLE_EXCEPTION_ADDRESS, 1f
l32i a4, a1, PT_EXCCAUSE
bnei a4, EXCCAUSE_LEVEL1_INTERRUPT, 1f
/* We came here with an interrupt means interrupts were enabled
* and we'll reenable them on return.
*/
extui a4, a3, PS_INTLEVEL_SHIFT, PS_INTLEVEL_WIDTH
bgei a4, LOCKLEVEL, 1f
movi a4, trace_hardirqs_on
callx4 a4
1:
Expand Down
5 changes: 4 additions & 1 deletion arch/xtensa/kernel/traps.c
Original file line number Diff line number Diff line change
Expand Up @@ -211,8 +211,11 @@ void do_interrupt(struct pt_regs *regs)
XCHAL_INTLEVEL6_MASK,
XCHAL_INTLEVEL7_MASK,
};
struct pt_regs *old_regs = set_irq_regs(regs);
struct pt_regs *old_regs;

trace_hardirqs_off();

old_regs = set_irq_regs(regs);
irq_enter();

for (;;) {
Expand Down

0 comments on commit 7d5f6a9

Please sign in to comment.