Browse Source

CRISv32: add support for irqflags tracing

Add support irqflags tracing, which is required for things like lockdep
and ftrace.

Signed-off-by: Rabin Vincent <rabin@rab.in>
Signed-off-by: Jesper Nilsson <jesper.nilsson@axis.com>
Rabin Vincent 10 years ago
parent
commit
444e0c2881
3 changed files with 20 additions and 1 deletions
  1. 4 0
      arch/cris/Kconfig
  2. 11 0
      arch/cris/arch-v32/kernel/entry.S
  3. 5 1
      arch/cris/kernel/irq.c

+ 4 - 0
arch/cris/Kconfig

@@ -36,6 +36,10 @@ config FORCE_MAX_ZONEORDER
 	int
 	int
 	default 6
 	default 6
 
 
+config TRACE_IRQFLAGS_SUPPORT
+	depends on ETRAX_ARCH_V32
+	def_bool y
+
 config CRIS
 config CRIS
 	bool
 	bool
 	default y
 	default y

+ 11 - 0
arch/cris/arch-v32/kernel/entry.S

@@ -240,6 +240,17 @@ ret_from_sys_call:
 
 
 	.type	_Rexit,@function
 	.type	_Rexit,@function
 _Rexit:
 _Rexit:
+#if defined(CONFIG_TRACE_IRQFLAGS)
+	addoq	+PT_ccs, $sp, $acr
+	move.d	[$acr], $r0
+	btstq	15, $r0		; I1
+	bpl	1f
+	nop
+	jsr	trace_hardirqs_on
+	nop
+1:
+#endif
+
 	;; This epilogue MUST match the prologues in multiple_interrupt, irq.h
 	;; This epilogue MUST match the prologues in multiple_interrupt, irq.h
 	;; and ptregs.h.
 	;; and ptregs.h.
 	addq	4, $sp		; Skip orig_r10.
 	addq	4, $sp		; Skip orig_r10.

+ 5 - 1
arch/cris/kernel/irq.c

@@ -45,7 +45,11 @@
 asmlinkage void do_IRQ(int irq, struct pt_regs * regs)
 asmlinkage void do_IRQ(int irq, struct pt_regs * regs)
 {
 {
 	unsigned long sp;
 	unsigned long sp;
-	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();
 	irq_enter();
 	sp = rdsp();
 	sp = rdsp();
 	if (unlikely((sp & (PAGE_SIZE - 1)) < (PAGE_SIZE/8))) {
 	if (unlikely((sp & (PAGE_SIZE - 1)) < (PAGE_SIZE/8))) {