LTT for 2.5.44-bk2 9/10: MIPS trace support

LTT for 2.5.44-bk2 9/10: MIPS trace support

Post by Karim Yaghmou » Thu, 31 Oct 2002 00:10:09



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(-)

diff -urpN linux-2.5.44-bk2/arch/mips/baget/irq.c linux-2.5.44-bk2-ltt/arch/mips/baget/irq.c
--- linux-2.5.44-bk2/arch/mips/baget/irq.c      Sat Oct 19 00:02:24 2002
+++ linux-2.5.44-bk2-ltt/arch/mips/baget/irq.c  Tue Oct 29 15:24:18 2002
@@ -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. */
 }

diff -urpN linux-2.5.44-bk2/arch/mips/ddb5476/irq.c linux-2.5.44-bk2-ltt/arch/mips/ddb5476/irq.c
--- linux-2.5.44-bk2/arch/mips/ddb5476/irq.c    Sat Oct 19 00:02:28 2002
+++ linux-2.5.44-bk2-ltt/arch/mips/ddb5476/irq.c        Tue Oct 29 15:24:18 2002
@@ -3,6 +3,10 @@
  *
  *  Copyright (C) 2000 Geert Uytterhoeven <ge...@sonycom.com>
  *                     Sony Software Development Center Europe (SDCE), Brussels
+ *
+ *  ---- for LTT patch ----
+ * Copyright (C) 2001 Takuzo O'Hara (tak...@sm.sony.co.jp).
+ *
  */
 #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)
diff -urpN linux-2.5.44-bk2/arch/mips/dec/irq.c linux-2.5.44-bk2-ltt/arch/mips/dec/irq.c
--- linux-2.5.44-bk2/arch/mips/dec/irq.c        Sat Oct 19 00:01:57 2002
+++ linux-2.5.44-bk2-ltt/arch/mips/dec/irq.c    Tue Oct 29 15:24:18 2002
@@ -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. */
 }

diff -urpN linux-2.5.44-bk2/arch/mips/kernel/i8259.c linux-2.5.44-bk2-ltt/arch/mips/kernel/i8259.c
--- linux-2.5.44-bk2/arch/mips/kernel/i8259.c   Sat Oct 19 00:01:15 2002
+++ linux-2.5.44-bk2-ltt/arch/mips/kernel/i8259.c       Tue Oct 29 15:24:18 2002
@@ -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();
 }

 /*
diff -urpN linux-2.5.44-bk2/arch/mips/kernel/ipc.c linux-2.5.44-bk2-ltt/arch/mips/kernel/ipc.c
--- linux-2.5.44-bk2/arch/mips/kernel/ipc.c     Sat Oct 19 00:01:15 2002
+++ linux-2.5.44-bk2-ltt/arch/mips/kernel/ipc.c Tue Oct 29 15:24:18 2002
@@ -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);
diff -urpN linux-2.5.44-bk2/arch/mips/kernel/irq.c linux-2.5.44-bk2-ltt/arch/mips/kernel/irq.c
--- linux-2.5.44-bk2/arch/mips/kernel/irq.c     Sat Oct 19 00:01:14 2002
+++ linux-2.5.44-bk2-ltt/arch/mips/kernel/irq.c Tue Oct 29 15:24:18 2002
@@ -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;
diff -urpN linux-2.5.44-bk2/arch/mips/kernel/scall_o32.S linux-2.5.44-bk2-ltt/arch/mips/kernel/scall_o32.S
--- linux-2.5.44-bk2/arch/mips/kernel/scall_o32.S       Sat Oct 19 00:02:27 2002
+++ linux-2.5.44-bk2-ltt/arch/mips/kernel/scall_o32.S   Tue Oct 29 15:24:18 2002
@@ -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

diff -urpN linux-2.5.44-bk2/arch/mips/kernel/time.c linux-2.5.44-bk2-ltt/arch/mips/kernel/time.c
--- linux-2.5.44-bk2/arch/mips/kernel/time.c    Sat Oct 19 00:01:52 2002
+++ linux-2.5.44-bk2-ltt/arch/mips/kernel/time.c        Tue Oct 29 15:24:18 2002
@@ -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();
 }
diff -urpN linux-2.5.44-bk2/arch/mips/kernel/traps.c linux-2.5.44-bk2-ltt/arch/mips/kernel/traps.c
--- linux-2.5.44-bk2/arch/mips/kernel/traps.c   Sat Oct 19 00:01:52 2002
+++ linux-2.5.44-bk2-ltt/arch/mips/kernel/traps.c       Tue Oct 29 15:24:18 2002
@@ -19,6 +19,7 @@
 #include <linux/smp.h>
 #include <linux/smp_lock.h>
 #include <linux/spinlock.h>
+#include <linux/trace.h>

 #include <asm/bootinfo.h>
 #include <asm/branch.h>
@@ -34,6 +35,7 @@
 #include <asm/system.h>
 #include <asm/uaccess.h>
 #include <asm/mmu_context.h>
+#include <asm/unistd.h>

 /*
  * Machine specific interrupt handlers
@@ -312,20 +314,28 @@ static void default_be_board_handler(str

 asmlinkage void do_ibe(struct pt_regs *regs)
 {
+       TRACE_TRAP_ENTRY(CAUSE_EXCCODE(regs), CAUSE_EPC(regs));
        ibe_board_handler(regs);
+       TRACE_TRAP_EXIT();
 }

 asmlinkage void do_dbe(struct pt_regs *regs)
 {
+       TRACE_TRAP_ENTRY(CAUSE_EXCCODE(regs), CAUSE_EPC(regs));
        dbe_board_handler(regs);
+       TRACE_TRAP_EXIT();
 }

 asmlinkage void do_ov(struct pt_regs *regs)
 {
-       if (compute_return_epc(regs))
-               return;
+       TRACE_TRAP_ENTRY(CAUSE_EXCCODE(regs), CAUSE_EPC(regs));
+       if (compute_return_epc(regs)) {
+               TRACE_TRAP_EXIT();
+               return;
+       }

        force_sig(SIGFPE, current);
+       TRACE_TRAP_EXIT();
 }

 /*
@@ -333,6 +343,7 @@ asmlinkage void do_ov(struct pt_regs *re
  */
 asmlinkage void do_fpe(struct pt_regs *regs, unsigned long fcr31)
 {
+       TRACE_TRAP_ENTRY(CAUSE_EXCCODE(regs), CAUSE_EPC(regs));
        if (fcr31 & FPU_CSR_UNI_X) {
                extern void save_fp(struct task_struct *);
                extern void restore_fp(struct task_struct *);
@@ -366,14 +377,18 @@ asmlinkage void do_fpe(struct pt_regs *r
                if (sig)
                        force_sig(sig, current);

+               TRACE_TRAP_EXIT();
                return;
        }

-       if (compute_return_epc(regs))
+       if (compute_return_epc(regs)) {
+               TRACE_TRAP_EXIT();
                return;
+       }

        force_sig(SIGFPE, current);
        printk(KERN_DEBUG "Sent send SIGFPE to %s\n", current->comm);
+       TRACE_TRAP_EXIT();
 }

 static inline int get_insn_opcode(struct pt_regs *regs, unsigned int *opcode)
@@ -395,6 +410,8 @@ asmlinkage void do_bp(struct pt_regs *re
        unsigned int opcode, bcode;
        unsigned int *epc;

+       TRACE_TRAP_ENTRY(CAUSE_EXCCODE(regs), CAUSE_EPC(regs));
+
        epc = (unsigned int *) regs->cp0_epc +
              ((regs->cp0_cause & CAUSEF_BD) != 0);
        if (get_user(opcode, epc))
@@ -428,10 +445,12 @@ asmlinkage void do_bp(struct pt_regs *re
        default:
                force_sig(SIGTRAP, current);
        }
+       TRACE_TRAP_EXIT();
        return;

 sigsegv:
        force_sig(SIGSEGV, current);
+       TRACE_TRAP_EXIT();
 }

 asmlinkage void do_tr(struct pt_regs *regs)
@@ -440,6 +459,8 @@ asmlinkage void do_tr(struct pt_regs *re
        unsigned int opcode, bcode;
        unsigned *epc;

+       TRACE_TRAP_ENTRY(CAUSE_EXCCODE(regs), CAUSE_EPC(regs));
+
        epc = (unsigned int *) regs->cp0_epc +
              ((regs->cp0_cause & CAUSEF_BD) != 0);
        if (get_user(opcode, epc))
@@ -468,10 +489,12 @@ asmlinkage void do_tr(struct pt_regs *re
        default:
                force_sig(SIGTRAP, current);
        }
+       TRACE_TRAP_EXIT();
        return;

 sigsegv:
        force_sig(SIGSEGV, current);
+       TRACE_TRAP_EXIT();
 }

 #ifndef CONFIG_CPU_HAS_LLSC
@@ -493,21 +516,27 @@ asmlinkage void do_ri(struct pt_regs *re

        if (!user_mode(regs))
                BUG();
+       TRACE_TRAP_ENTRY(CAUSE_EXCCODE(regs), CAUSE_EPC(regs));

        if (!get_insn_opcode(regs, &opcode)) {
                if ((opcode & OPCODE) == LL) {
                        simulate_ll(regs, opcode);
+                       TRACE_TRAP_EXIT();
                        return;
                }
                if ((opcode & OPCODE) == SC) {
                        simulate_sc(regs, opcode);
+                       TRACE_TRAP_EXIT();
                        return;
                }
        }

-       if (compute_return_epc(regs))
+       if (compute_return_epc(regs)) {
+               TRACE_TRAP_EXIT();
                return;
+       }
        force_sig(SIGILL, current);
+       TRACE_TRAP_EXIT();
 }

 /*
@@ -623,6 +652,8 @@ asmlinkage void do_cpu(struct pt_regs *r
        void fpu_emulator_init_fpu(void);
        int sig;

+       TRACE_TRAP_ENTRY(CAUSE_EXCCODE(regs), CAUSE_EPC(regs));
+
        cpid = (regs->cp0_cause >> CAUSEB_CE) & 3;
        if (cpid != 1)
                goto bad_cid;
@@ -631,8 +662,10 @@ asmlinkage void do_cpu(struct pt_regs *r
                goto fp_emul;

        regs->cp0_status |= ST0_CU1;
-       if (last_task_used_math == current)
+       if (last_task_used_math == current) {
+               TRACE_TRAP_EXIT();
                return;
+       }

        if (current->used_math) {            /* Using the FPU again.  */
                lazy_fpu_switch(last_task_used_math);
@@ -641,6 +674,8 @@ asmlinkage void do_cpu(struct pt_regs *r
                current->used_math = 1;
        }
        last_task_used_math = current;
+
+       TRACE_TRAP_EXIT();
        return;

 fp_emul:
@@ -654,10 +689,12 @@ fp_emul:
        last_task_used_math = current;
        if (sig)
                force_sig(sig, current);
+       TRACE_TRAP_EXIT();
        return;

 bad_cid:
        force_sig(SIGILL, current);
+       TRACE_TRAP_EXIT();
 }

 asmlinkage void do_watch(struct pt_regs *regs)
@@ -666,13 +703,17 @@ asmlinkage void do_watch(struct pt_regs
         * We use the watch exception where available to detect stack
         * overflows.
         */
+       TRACE_TRAP_ENTRY(CAUSE_EXCCODE(regs), CAUSE_EPC(regs));
        show_regs(regs);
+       TRACE_TRAP_EXIT();
        panic("Caught WATCH exception - probably caused by stack overflow.");
 }

 asmlinkage void do_mcheck(struct pt_regs *regs)
 {
+       TRACE_TRAP_ENTRY(CAUSE_EXCCODE(regs), CAUSE_EPC(regs));
        show_regs(regs);
+       TRACE_TRAP_EXIT();
        panic("Caught Machine Check exception - probably caused by multiple "
              "matching entries in the TLB.");
 }
@@ -947,3 +988,75 @@ void __init trap_init(void)
        write_32bit_cp0_register(CP0_CONTEXT, smp_processor_id()<<23);
        current_pgd[0] = init_mm.pgd;
 }
+
+#if (CONFIG_TRACE)
+asmlinkage void trace_real_syscall_entry(struct pt_regs * regs)
+{
+       unsigned long       addr;
+       int                 depth = 0;
+       unsigned long       end_code;
+       unsigned long       lower_bound;
+       int                 seek_depth;
+       unsigned long       *stack;
+       unsigned long       start_code;
+       unsigned long       *start_stack;
+       trace_syscall_entry trace_syscall_event;
+       unsigned long       upper_bound;
+       int                 use_bounds;
+       int                 use_depth;
+
+       /* syscall_id will be negative for SVR4, IRIX5, BSD43, and POSIX
+        * syscalls -- these are not supported at this point by LTT
+        */
+       trace_syscall_event.syscall_id = (uint8_t) (regs->regs[2] - __NR_Linux);
+
+       trace_syscall_event.address  = regs->cp0_epc;
+
+       if (!user_mode(regs))
+               goto trace_syscall_end;
+
+       if (trace_get_config(&use_depth,
+                            &use_bounds,
+                            &seek_depth,
+                            (void*)&lower_bound,
+                            (void*)&upper_bound) < 0)
+               goto trace_syscall_end;
+
+       /* Heuristic that might work:
+        * (BUT DOESN'T WORK for any of the cases I tested...) zzz
+        * Search through stack until a value is found that is within the
+        * range start_code .. end_code.  (This is looking for a return
+        * pointer to where a shared library was called from.)  If a stack
+        * variable contains a valid code address then an incorrect
+        * result will be generated.
+        */
+       if ((use_depth == 1) || (use_bounds == 1)) {
+               stack       = (unsigned long*) regs->regs[29];
+               end_code    = current->mm->end_code;
+               start_code  = current->mm->start_code;
+               start_stack = (unsigned long *)current->mm->start_stack;
+
+               while ((stack <= start_stack) && (!__get_user(addr, stack))) {
+                       if ((addr > start_code) && (addr < end_code)) {
+                               if (((use_depth  == 1) && (depth == seek_depth)) ||
+                                   ((use_bounds == 1) && (addr > lower_bound) && (addr < upper_bound))) {
+                                       trace_syscall_event.address = addr;
+                                       goto trace_syscall_end;
+                               } else {
+                                       depth++;
+                               }
+                       }
+               stack++;
+               }
+       }
+
+trace_syscall_end:
+       trace_event(TRACE_EV_SYSCALL_ENTRY, &trace_syscall_event);
+}
+
+asmlinkage void trace_real_syscall_exit(void)
+{
+        trace_event(TRACE_EV_SYSCALL_EXIT, NULL);
+}
+
+#endif /* (CONFIG_TRACE) */
diff -urpN linux-2.5.44-bk2/arch/mips/kernel/unaligned.c linux-2.5.44-bk2-ltt/arch/mips/kernel/unaligned.c
--- linux-2.5.44-bk2/arch/mips/kernel/unaligned.c       Sat Oct 19 00:01:59 2002
+++ linux-2.5.44-bk2-ltt/arch/mips/kernel/unaligned.c   Tue Oct 29 15:24:18 2002
@@ -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;
 }
diff -urpN linux-2.5.44-bk2/arch/mips/mm/fault.c linux-2.5.44-bk2-ltt/arch/mips/mm/fault.c
--- linux-2.5.44-bk2/arch/mips/mm/fault.c       Sat Oct 19 00:01:19 2002
+++ linux-2.5.44-bk2-ltt/arch/mips/mm/fault.c   Tue Oct 29 15:24:18 2002
@@ -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();
 }
diff -urpN linux-2.5.44-bk2/include/asm-mips/trace.h linux-2.5.44-bk2-ltt/include/asm-mips/trace.h
--- linux-2.5.44-bk2/include/asm-mips/trace.h   Wed Dec 31 19:00:00 1969
+++ linux-2.5.44-bk2-ltt/include/asm-mips/trace.h       Tue Oct 29 15:24:18 2002
@@ -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
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/