Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0dafafc3 authored by Vineet Gupta's avatar Vineet Gupta
Browse files

ARC: Add support for irqflags tracing and lockdep



Lockdep required a small fix to stacktrace API which was incorrectly
unwindign out of __switch_to for the current call frame.

Signed-off-by: default avatarVineet Gupta <vgupta@synopsys.com>
parent 54c8bff1
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -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

+22 −0
Original line number Diff line number Diff line
@@ -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__ */
+11 −0
Original line number Diff line number Diff line
@@ -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

@@ -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
@@ -635,6 +644,8 @@ resume_kernel_mode:

restore_regs :

	TRACE_ASM_IRQ_ENABLE

	lr	r10, [status32]

	; Restore REG File. In case multiple Events outstanding,
+3 −1
Original line number Diff line number Diff line
@@ -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