Skip to contentSkip to conversation

LTT for 2.5.44 9/10: MIPS trace support

PATCH New Karim Yaghmour 1 participant 1 message Oct 19, 2002

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

PATCH 1/1 LTT for 2.5.44 9/10: MIPS trace support

D: This patch adds the bare-minimum MIPS-specific low-level trace
D: statements.

diffstat:

 arch/mips/baget/irq.c        |    5 +
 arch/mips/ddb5476/irq.c      |   10 +++
 arch/mips/dec/irq.c          |    5 +
 arch/mips/kernel/i8259.c     |    4 +
 arch/mips/kernel/ipc.c       |    3 +
 arch/mips/kernel/irq.c       |    5 +
 arch/mips/kernel/scall_o32.S |   22 +++++++
 arch/mips/kernel/time.c      |    5 +
 arch/mips/kernel/traps.c     |  123 +++++++++++++++++++++++++++++++++++++++++--
 arch/mips/kernel/unaligned.c |   10 +++
 arch/mips/mm/fault.c         |    9 +++
 include/asm-mips/trace.h     |   16 +++++
 12 files changed, 211 insertions(+), 6 deletions(-)
arch/mips/baget/irq.c +5 -0
diff -urpN linux-2.5.44/arch/mips/baget/irq.c linux-2.5.44-ltt/arch/mips/baget/irq.c
@@ -18,6 +18,7 @@
 #include <linux/random.h>
 #include <linux/delay.h>
 #include <linux/seq_file.h>
+#include <linux/trace.h>
 
 #include <asm/bitops.h>
 #include <asm/bootinfo.h>
@@ -178,6 +179,8 @@ static void do_IRQ(int irq, struct pt_re
 	struct irqaction *action;
 	int do_random, cpu;
 
+	TRACE_IRQ_ENTRY(irq, !user_mode(regs));
+
 	cpu = smp_processor_id();
 	irq_enter(cpu, irq);
 	kstat.irqs[cpu][irq]++;
@@ -203,6 +206,8 @@ static void do_IRQ(int irq, struct pt_re
 	unmask_irq(irq);
 	irq_exit(cpu, irq);
 
+	TRACE_IRQ_EXIT();
+
 	/* unmasking and bottom half handling is done magically for us. */
 }
 
arch/mips/ddb5476/irq.c +10 -0
diff -urpN linux-2.5.44/arch/mips/ddb5476/irq.c linux-2.5.44-ltt/arch/mips/ddb5476/irq.c
@@ -3,6 +3,10 @@
  *
  *  Copyright (C) 2000 Geert Uytterhoeven <[email protected]>
  *                     Sony Software Development Center Europe (SDCE), Brussels
+ *
+ *  ---- for LTT patch ----
+ * Copyright (C) 2001 Takuzo O'Hara ([email protected]).
+ *
  */
 #include <linux/config.h>
 #include <linux/init.h>
@@ -12,6 +16,8 @@
 #include <linux/interrupt.h>
 #include <linux/ioport.h>
 
+#include <linux/trace.h>
+
 #include <asm/io.h>
 #include <asm/irq.h>
 #include <asm/ptrace.h>
@@ -184,6 +190,7 @@ void ddb_local0_irqdispatch(struct pt_re
 	/* Handle the timer interrupt first */
 	if (mask & (1 << NILE4_INT_GPT)) {
 		nile4_disable_irq(NILE4_INT_GPT);
+		TRACE_IRQ_ENTRY(nile4_to_irq(NILE4_INT_GPT), ((regs->cp0_status & ST0_KSU) == KSU_KERNEL));
 		do_IRQ(nile4_to_irq(NILE4_INT_GPT), regs);
 		nile4_enable_irq(NILE4_INT_GPT);
 		mask &= ~(1 << NILE4_INT_GPT);
@@ -193,8 +200,10 @@ void ddb_local0_irqdispatch(struct pt_re
 			nile4_disable_irq(nile4_irq);
 			if (nile4_irq == NILE4_INT_INTC) {
 				int i8259_irq = nile4_i8259_iack();
+				TRACE_IRQ_ENTRY(i8259_irq, ((regs->cp0_status & ST0_KSU) == KSU_KERNEL));
 				i8259_do_irq(i8259_irq, regs);
 			} else {
+			        TRACE_IRQ_ENTRY(nile4_to_irq(nile4_irq), ((regs->cp0_status & ST0_KSU) == KSU_KERNEL));
 				do_IRQ(nile4_to_irq(nile4_irq), regs);
 			}
 			nile4_enable_irq(nile4_irq);
@@ -204,6 +213,7 @@ void ddb_local0_irqdispatch(struct pt_re
 		ddb5476_led_d3(0);
 	ddb5476_led_hex(nesting < 16 ? nesting : 15);
 #endif
+        TRACE_IRQ_EXIT();
 }
 
 void ddb_local1_irqdispatch(void)
arch/mips/dec/irq.c +5 -0
diff -urpN linux-2.5.44/arch/mips/dec/irq.c linux-2.5.44-ltt/arch/mips/dec/irq.c
@@ -16,6 +16,7 @@
 #include <linux/slab.h>
 #include <linux/random.h>
 #include <linux/seq_file.h>
+#include <linux/trace.h>
 
 #include <asm/bitops.h>
 #include <asm/bootinfo.h>
@@ -128,6 +129,8 @@ asmlinkage void do_IRQ(int irq, struct p
     struct irqaction *action;
     int do_random, cpu;
 
+    TRACE_IRQ_ENTRY(irq, !user_mode(regs));
+
     cpu = smp_processor_id();
     irq_enter(cpu, irq);
     kstat.irqs[cpu][irq]++;
@@ -151,6 +154,8 @@ asmlinkage void do_IRQ(int irq, struct p
     }
     irq_exit(cpu, irq);
 
+    TRACE_IRQ_EXIT();
+
     /* unmasking and bottom half handling is done magically for us. */
 }
 
arch/mips/kernel/i8259.c +4 -0
diff -urpN linux-2.5.44/arch/mips/kernel/i8259.c linux-2.5.44-ltt/arch/mips/kernel/i8259.c
@@ -15,6 +15,7 @@
 #include <linux/interrupt.h>
 #include <linux/kernel.h>
 #include <linux/spinlock.h>
+#include <linux/trace.h>
 
 #include <asm/io.h>
 
@@ -267,6 +268,9 @@ void __init init_8259A(int auto_eoi)
 asmlinkage void i8259_do_irq(int irq, struct pt_regs regs)
 {
 	panic("i8259_do_irq: I want to be implemented");
+
+	TRACE_IRQ_ENTRY(irq, !user_mode(regs));
+	TRACE_IRQ_EXIT();
 }
 
 /*
arch/mips/kernel/ipc.c +3 -0
diff -urpN linux-2.5.44/arch/mips/kernel/ipc.c linux-2.5.44-ltt/arch/mips/kernel/ipc.c
@@ -13,6 +13,7 @@
 #include <linux/sem.h>
 #include <linux/msg.h>
 #include <linux/shm.h>
+#include <linux/trace.h>
 
 #include <asm/ipc.h>
 #include <asm/uaccess.h>
@@ -30,6 +31,8 @@ asmlinkage int sys_ipc (uint call, int f
 	version = call >> 16; /* hack for backward compatibility */
 	call &= 0xffff;
 
+	TRACE_IPC(TRACE_EV_IPC_CALL, call, first);
+
 	switch (call) {
 	case SEMOP:
 		return sys_semop (first, (struct sembuf *)ptr, second);
arch/mips/kernel/irq.c +5 -0
diff -urpN linux-2.5.44/arch/mips/kernel/irq.c linux-2.5.44-ltt/arch/mips/kernel/irq.c
@@ -18,6 +18,7 @@
 #include <linux/random.h>
 #include <linux/sched.h>
 #include <linux/seq_file.h>
+#include <linux/trace.h>
 
 #include <asm/system.h>
 
@@ -244,6 +245,8 @@ asmlinkage unsigned int do_IRQ(int irq, 
 	struct irqaction * action;
 	unsigned int status;
 
+	TRACE_IRQ_ENTRY(irq, !user_mode(regs));
+
 	kstat.irqs[cpu][irq]++;
 	spin_lock(&desc->lock);
 	desc->handler->ack(irq);
@@ -303,6 +306,8 @@ out:
 	desc->handler->end(irq);
 	spin_unlock(&desc->lock);
 
+	TRACE_IRQ_EXIT();
+
 	if (softirq_pending(cpu))
 		do_softirq();
 	return 1;
arch/mips/kernel/scall_o32.S +22 -0
diff -urpN linux-2.5.44/arch/mips/kernel/scall_o32.S linux-2.5.44-ltt/arch/mips/kernel/scall_o32.S
@@ -5,6 +5,7 @@
  *
  * Copyright (C) 1997, 1998, 1999, 2000 by Ralf Baechle
  */
+	
 #include <asm/asm.h>
 #include <linux/errno.h>
 #include <asm/current.h>
@@ -49,6 +50,19 @@ NESTED(handle_sys, PT_SIZE, sp)
 
 stack_done:
         sw      a3, PT_R26(sp)          # save for syscall restart
+
+#if (CONFIG_TRACE)
+	sw	t2, PT_R1(sp)
+	move	a0, sp
+	jal	trace_real_syscall_entry
+	lw	t2, PT_R1(sp)
+
+	lw	a0, PT_R4(sp)		# Restore argument registers
+	lw	a1, PT_R5(sp)
+	lw	a2, PT_R6(sp)
+	lw	a3, PT_R7(sp)
+#endif /* (CONFIG_TRACE) */
+
 #error	lw	t0, TASK_PTRACE($28)	# syscall tracing enabled?
 	andi	t0, PT_TRACESYS
 	bnez	t0, trace_a_syscall
@@ -64,6 +78,10 @@ stack_done:
 	sw	v0, PT_R0(sp)		# set flag for syscall restarting
 1:	sw	v0, PT_R2(sp)		# result
 
+#if (CONFIG_TRACE)
+	jal	trace_real_syscall_exit
+#endif /* (CONFIG_TRACE) */
+
 EXPORT(o32_ret_from_sys_call)
 	mfc0	t0, CP0_STATUS		# need_resched and signals atomic test
 	ori	t0, t0, 1
@@ -119,6 +137,10 @@ trace_a_syscall:
 	sw	v0, PT_R0(sp)		# set flag for syscall restarting
 1:	sw	v0, PT_R2(sp)		# result
 
+#if (CONFIG_TRACE)
+	jal	trace_real_syscall_exit
+#endif /* (CONFIG_TRACE) */
+
 #error	jal	syscall_trace
 	j	ret_from_sys_call
 
arch/mips/kernel/time.c +5 -0
diff -urpN linux-2.5.44/arch/mips/kernel/time.c linux-2.5.44-ltt/arch/mips/kernel/time.c
@@ -21,6 +21,7 @@
 #include <linux/kernel_stat.h>
 #include <linux/spinlock.h>
 #include <linux/interrupt.h>
+#include <linux/trace.h>
 
 #include <asm/bootinfo.h>
 #include <asm/cpu.h>
@@ -368,6 +369,8 @@ asmlinkage void ll_timer_interrupt(int i
 {
 	int cpu = smp_processor_id();
 
+	TRACE_TRAP_ENTRY(irq, CAUSE_EPC(regs));
+
 	irq_enter(cpu, irq);
 	kstat.irqs[cpu][irq]++;
 
@@ -376,6 +379,8 @@ asmlinkage void ll_timer_interrupt(int i
 	
 	irq_exit(cpu, irq);
 
+	TRACE_IRQ_EXIT();
+
 	if (softirq_pending(cpu))
 		do_softirq();
 }
arch/mips/kernel/traps.c +118 -5

269 lines not on this page · raw message

arch/mips/kernel/unaligned.c +9 -1
diff -urpN linux-2.5.44/arch/mips/kernel/unaligned.c linux-2.5.44-ltt/arch/mips/kernel/unaligned.c
@@ -77,6 +77,7 @@
 #include <linux/signal.h>
 #include <linux/smp.h>
 #include <linux/smp_lock.h>
+#include <linux/trace.h>
 
 #include <asm/asm.h>
 #include <asm/branch.h>
@@ -388,6 +389,8 @@ asmlinkage void do_ade(struct pt_regs *r
 	unsigned long pc;
 	extern int do_dsemulret(struct pt_regs *);
 
+	TRACE_TRAP_ENTRY(CAUSE_EXCCODE(regs), CAUSE_EPC(regs));
+
 	/* 
 	 * Address errors may be deliberately induced
 	 * by the FPU emulator to take retake control
@@ -397,6 +400,7 @@ asmlinkage void do_ade(struct pt_regs *r
 
 	if ((unsigned long)regs->cp0_epc == current->thread.dsemul_aerpc) {
 		do_dsemulret(regs);
+		TRACE_TRAP_EXIT();
 		return;
 	}
 
@@ -409,8 +413,10 @@ asmlinkage void do_ade(struct pt_regs *r
 		goto sigbus;
 
 	pc = regs->cp0_epc + ((regs->cp0_cause & CAUSEF_BD) ? 4 : 0);
-	if (compute_return_epc(regs))
+	if (compute_return_epc(regs)) {
+		TRACE_TRAP_EXIT();
 		return;
+	}
 	if ((current->thread.mflags & MF_FIXADE) == 0)
 		goto sigbus;
 
@@ -419,11 +425,13 @@ asmlinkage void do_ade(struct pt_regs *r
 	unaligned_instructions++;
 #endif
 
+	TRACE_TRAP_EXIT();
 	return;
 
 sigbus:
 	die_if_kernel ("Kernel unaligned instruction access", regs);
 	force_sig(SIGBUS, current);
 
+	TRACE_TRAP_EXIT();
 	return;
 }
arch/mips/mm/fault.c +9 -0
diff -urpN linux-2.5.44/arch/mips/mm/fault.c linux-2.5.44-ltt/arch/mips/mm/fault.c
@@ -18,6 +18,7 @@
 #include <linux/smp.h>
 #include <linux/smp_lock.h>
 #include <linux/version.h>
+#include <linux/trace.h>
 
 #include <asm/hardirq.h>
 #include <asm/pgalloc.h>
@@ -25,6 +26,7 @@
 #include <asm/softirq.h>
 #include <asm/system.h>
 #include <asm/uaccess.h>
+#include <asm/mipsregs.h>
 
 #define development_version (LINUX_VERSION_CODE & 0x100)
 
@@ -49,6 +51,8 @@ asmlinkage void do_page_fault(struct pt_
 	unsigned long fixup;
 	siginfo_t info;
 
+	TRACE_TRAP_ENTRY(CAUSE_EXCCODE(regs), CAUSE_EPC(regs));
+
 	/*
 	 * We fault-in kernel-space virtual memory on-demand. The
 	 * 'reference' page table is init_mm.pgd.
@@ -116,6 +120,7 @@ good_area:
 	}
 
 	up_read(&mm->mmap_sem);
+	TRACE_TRAP_EXIT();
 	return;
 
 /*
@@ -144,6 +149,7 @@ bad_area_nosemaphore:
 		/* info.si_code has been set above */
 		info.si_addr = (void *) address;
 		force_sig_info(SIGSEGV, &info, tsk);
+		TRACE_TRAP_EXIT();
 		return;
 	}
 
@@ -159,6 +165,7 @@ no_context:
 			printk(KERN_DEBUG "%s: Exception at [<%lx>] (%lx)\n",
 			       tsk->comm, regs->cp0_epc, new_epc);
 		regs->cp0_epc = new_epc;
+		TRACE_TRAP_EXIT();
 		return;
 	}
 
@@ -201,6 +208,7 @@ do_sigbus:
 	if (!user_mode(regs))
 		goto no_context;
 
+	TRACE_TRAP_EXIT();
 	return;
 
 vmalloc_fault:
@@ -230,4 +238,5 @@ vmalloc_fault:
 			goto bad_area_nosemaphore;
 		set_pmd(pmd, *pmd_k);
 	}
+	TRACE_TRAP_EXIT();
 }
include/asm-mips/trace.h +16 -0
diff -urpN linux-2.5.44/include/asm-mips/trace.h linux-2.5.44-ltt/include/asm-mips/trace.h
@@ -0,0 +1,16 @@
+/*
+ * linux/include/asm-mips/trace.h
+ *
+ * Copyright (C) 2002, Karim Yaghmour
+ *
+ * MIPS definitions for tracing system
+ */
+
+#include <linux/trace.h>
+#include <asm-generic/trace.h>
+
+/* Current arch type */
+#define TRACE_ARCH_TYPE TRACE_ARCH_TYPE_MIPS
+
+/* Current variant type */
+#define TRACE_ARCH_VARIANT TRACE_ARCH_VARIANT_NONE