Loading arch/arc/Kconfig +6 −0 Original line number Diff line number Diff line Loading @@ -35,6 +35,12 @@ config ARC select PERF_USE_VMALLOC select HAVE_DEBUG_STACKOVERFLOW config TRACE_IRQFLAGS_SUPPORT def_bool y config LOCKDEP_SUPPORT def_bool y config SCHED_OMIT_FRAME_POINTER def_bool y Loading arch/arc/include/asm/irqflags.h +22 −0 Original line number Diff line number Diff line Loading @@ -151,16 +151,38 @@ static inline void arch_unmask_irq(unsigned int irq) #else #ifdef CONFIG_TRACE_IRQFLAGS .macro TRACE_ASM_IRQ_DISABLE bl trace_hardirqs_off .endm .macro TRACE_ASM_IRQ_ENABLE bl trace_hardirqs_on .endm #else .macro TRACE_ASM_IRQ_DISABLE .endm .macro TRACE_ASM_IRQ_ENABLE .endm #endif .macro IRQ_DISABLE scratch lr \scratch, [status32] bic \scratch, \scratch, (STATUS_E1_MASK | STATUS_E2_MASK) flag \scratch TRACE_ASM_IRQ_DISABLE .endm .macro IRQ_ENABLE scratch lr \scratch, [status32] or \scratch, \scratch, (STATUS_E1_MASK | STATUS_E2_MASK) flag \scratch TRACE_ASM_IRQ_ENABLE .endm #endif /* __ASSEMBLY__ */ Loading arch/arc/kernel/entry.S +11 −0 Original line number Diff line number Diff line Loading @@ -250,6 +250,14 @@ ARC_ENTRY handle_interrupt_level1 lr r0, [icause1] and r0, r0, 0x1f #ifdef CONFIG_TRACE_IRQFLAGS ; icause1 needs to be read early, before calling tracing, which ; can clobber scratch regs, hence use of stack to stash it push r0 TRACE_ASM_IRQ_DISABLE pop r0 #endif bl.d @arch_do_IRQ mov r1, sp Loading Loading @@ -570,6 +578,7 @@ resume_user_mode_begin: ; --- (Slow Path #2) pending signal --- mov r0, sp ; pt_regs for arg to do_signal()/do_notify_resume() GET_CURR_THR_INFO_FLAGS r9 bbit0 r9, TIF_SIGPENDING, .Lchk_notify_resume ; Normal Trap/IRQ entry only saves Scratch (caller-saved) regs Loading Loading @@ -635,6 +644,8 @@ resume_kernel_mode: restore_regs : TRACE_ASM_IRQ_ENABLE lr r10, [status32] ; Restore REG File. In case multiple Events outstanding, Loading arch/arc/kernel/stacktrace.c +3 −1 Original line number Diff line number Diff line Loading @@ -237,11 +237,13 @@ unsigned int get_wchan(struct task_struct *tsk) */ void save_stack_trace_tsk(struct task_struct *tsk, struct stack_trace *trace) { /* Assumes @tsk is sleeping so unwinds from __switch_to */ arc_unwind_core(tsk, NULL, __collect_all_but_sched, trace); } void save_stack_trace(struct stack_trace *trace) { arc_unwind_core(current, NULL, __collect_all, trace); /* Pass NULL for task so it unwinds the current call frame */ arc_unwind_core(NULL, NULL, __collect_all, trace); } #endif Loading
arch/arc/Kconfig +6 −0 Original line number Diff line number Diff line Loading @@ -35,6 +35,12 @@ config ARC select PERF_USE_VMALLOC select HAVE_DEBUG_STACKOVERFLOW config TRACE_IRQFLAGS_SUPPORT def_bool y config LOCKDEP_SUPPORT def_bool y config SCHED_OMIT_FRAME_POINTER def_bool y Loading
arch/arc/include/asm/irqflags.h +22 −0 Original line number Diff line number Diff line Loading @@ -151,16 +151,38 @@ static inline void arch_unmask_irq(unsigned int irq) #else #ifdef CONFIG_TRACE_IRQFLAGS .macro TRACE_ASM_IRQ_DISABLE bl trace_hardirqs_off .endm .macro TRACE_ASM_IRQ_ENABLE bl trace_hardirqs_on .endm #else .macro TRACE_ASM_IRQ_DISABLE .endm .macro TRACE_ASM_IRQ_ENABLE .endm #endif .macro IRQ_DISABLE scratch lr \scratch, [status32] bic \scratch, \scratch, (STATUS_E1_MASK | STATUS_E2_MASK) flag \scratch TRACE_ASM_IRQ_DISABLE .endm .macro IRQ_ENABLE scratch lr \scratch, [status32] or \scratch, \scratch, (STATUS_E1_MASK | STATUS_E2_MASK) flag \scratch TRACE_ASM_IRQ_ENABLE .endm #endif /* __ASSEMBLY__ */ Loading
arch/arc/kernel/entry.S +11 −0 Original line number Diff line number Diff line Loading @@ -250,6 +250,14 @@ ARC_ENTRY handle_interrupt_level1 lr r0, [icause1] and r0, r0, 0x1f #ifdef CONFIG_TRACE_IRQFLAGS ; icause1 needs to be read early, before calling tracing, which ; can clobber scratch regs, hence use of stack to stash it push r0 TRACE_ASM_IRQ_DISABLE pop r0 #endif bl.d @arch_do_IRQ mov r1, sp Loading Loading @@ -570,6 +578,7 @@ resume_user_mode_begin: ; --- (Slow Path #2) pending signal --- mov r0, sp ; pt_regs for arg to do_signal()/do_notify_resume() GET_CURR_THR_INFO_FLAGS r9 bbit0 r9, TIF_SIGPENDING, .Lchk_notify_resume ; Normal Trap/IRQ entry only saves Scratch (caller-saved) regs Loading Loading @@ -635,6 +644,8 @@ resume_kernel_mode: restore_regs : TRACE_ASM_IRQ_ENABLE lr r10, [status32] ; Restore REG File. In case multiple Events outstanding, Loading
arch/arc/kernel/stacktrace.c +3 −1 Original line number Diff line number Diff line Loading @@ -237,11 +237,13 @@ unsigned int get_wchan(struct task_struct *tsk) */ void save_stack_trace_tsk(struct task_struct *tsk, struct stack_trace *trace) { /* Assumes @tsk is sleeping so unwinds from __switch_to */ arc_unwind_core(tsk, NULL, __collect_all_but_sched, trace); } void save_stack_trace(struct stack_trace *trace) { arc_unwind_core(current, NULL, __collect_all, trace); /* Pass NULL for task so it unwinds the current call frame */ arc_unwind_core(NULL, NULL, __collect_all, trace); } #endif