LTT for 2.5.38 9/9: ARM trace support
PATCH 1/1 LTT for 2.5.38 9/9: ARM trace support
This patch adds ARM trace support. Syscall slow path trace not yet added.
Here are the file modifications:
arch/arm/config.in | 2 arch/arm/kernel/entry-common.S | 18 ++++++++ arch/arm/kernel/irq.c | 5 ++ arch/arm/kernel/process.c | 5 ++ arch/arm/kernel/sys_arm.c | 3 + arch/arm/kernel/traps.c | 85 +++++++++++++++++++++++++++++++++++++++++ arch/arm/mm/fault-common.c | 15 +++++-- include/asm-arm/trace.h | 15 +++++++ 8 files changed, 145 insertions, 3 deletions
arch/arm/config.in +2 -0
@@ -655,6 +655,8 @@ source drivers/usb/Config.in source net/bluetooth/Config.in +source drivers/trace/Config.in + mainmenu_option next_comment comment 'Kernel hacking'
arch/arm/kernel/entry-common.S +18 -0
@@ -35,6 +35,11 @@ ENTRY(__do_softirq) * stack. */ ret_fast_syscall: +#if (CONFIG_TRACE || CONFIG_TRACE_MODULE) + mov r7, r0 @ save returned r0 + bl SYMBOL_NAME(trace_real_syscall_exit) + mov r0, r7 +#endif disable_irq r1 @ disable interrupts ldr r1, [tsk, #TI_FLAGS] tst r1, #_TIF_WORK_MASK
@@ -134,6 +139,16 @@ ENTRY(vector_swi) mcr p15, 0, ip, c1, c0 @ update control register #endif enable_irq ip +#if (CONFIG_TRACE || CONFIG_TRACE_MODULE) + /* zzz note that validity of scno is not yet checked. + * zzz The visualizer checks it. + */ + add r1, sp, #S_R0 @ pointer to regs + mov r0, scno @ syscall number + bl SYMBOL_NAME(trace_real_syscall_entry) + add r1, sp, #S_R0 @ pointer to regs + ldmia r1, {r0 - r3} @ have to reload r0 - r3 +#endif str r4, [sp, #-S_OFF]! @ push fifth arg
@@ -174,6 +189,9 @@ __sys_trace: __sys_trace_return: str r0, [sp, #S_R0 + S_OFF]! @ save returned r0 +#if (CONFIG_TRACE || CONFIG_TRACE_MODULE) + bl SYMBOL_NAME(trace_real_syscall_exit) +#endif mov r1, sp mov r0, #1 @ trace exit [IP = 1] bl syscall_trace
arch/arm/kernel/irq.c +5 -0
@@ -30,6 +30,7 @@#include <linux/init.h> #include <linux/seq_file.h> #include <linux/errno.h> +#include <linux/trace.h> #include <asm/irq.h> #include <asm/system.h>
@@ -338,6 +339,8 @@ asmlinkage void asm_do_IRQ(int irq, stru {struct irqdesc *desc = irq_desc + irq; +TRACE_IRQ_ENTRY (irq, !(user_mode (regs))); +/* * Some hardware gives randomly wrong interrupts. Rather * than crashing, do something sensible.
@@ -348,6 +351,8 @@ asmlinkage void asm_do_IRQ(int irq, struspin_lock (&irq_controller_lock); desc->handle (irq, desc, regs);spin_unlock (&irq_controller_lock); + +TRACE_IRQ_EXIT ();if (softirq_pending (smp_processor_id ()))do_softirq ();
arch/arm/kernel/process.c +5 -0
@@ -24,6 +24,7 @@#include <linux/reboot.h> #include <linux/interrupt.h> #include <linux/init.h> +#include <linux/trace.h> #include <asm/system.h> #include <asm/io.h>
@@ -398,6 +399,10 @@ pid_t kernel_thread(int (*fn)(void *), v : "=r" (__ret) : "Ir" (flags), "I" (CLONE_VM), "r" (fn), "r" (arg) : "r0", "r1", "lr"); +#if (CONFIG_TRACE ||CONFIG_TRACE_MODULE ) +if (__ret >0 ) +TRACE_PROCESS (TRACE_EV_PROCESS_KTHREAD , __ret, (int ) fn); +#endif return __ret; }
arch/arm/kernel/sys_arm.c +3 -0
@@ -24,6 +24,7 @@#include <linux/fs.h> #include <linux/file.h> #include <linux/utsname.h> +#include <linux/trace.h> #include <asm/uaccess.h> #include <asm/ipc.h>
@@ -166,6 +167,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 :
arch/arm/kernel/traps.c +85 -0
127 lines not on this page · raw message
arch/arm/mm/fault-common.c +12 -3
@@ -21,6 +21,7 @@#include <linux/interrupt.h> #include <linux/proc_fs.h> #include <linux/init.h> +#include <linux/trace.h> #include <asm/system.h> #include <asm/pgtable.h>
@@ -253,6 +254,8 @@ int do_page_fault(unsigned long addr, unif (in_interrupt () || !mm) goto no_context; +TRACE_TRAP_ENTRY (14 ,instruction_pointer (regs)); +down_read (&mm->mmap_sem); fault =__do_page_fault (mm, addr, fsr, tsk);up_read (&mm->mmap_sem);
@@ -260,8 +263,10 @@ int do_page_fault(unsigned long addr, un/* * Handle the "normal" case first */ -if (fault >0 ) -return 0 ; +if (fault >0 ) { +TRACE_TRAP_EXIT (); +return 0 ; + }/* * We had some memory, but were unable to
@@ -287,6 +292,7 @@ int do_page_fault(unsigned long addr, un }else __do_user_fault (tsk, addr, fsr, fault ==-1 ?SEGV_ACCERR :SEGV_MAPERR , regs); +TRACE_TRAP_EXIT ();return 0 ;
@@ -309,11 +315,14 @@ do_sigbus:#endif /* Kernel mode? Handle exceptions or die */ -if (user_mode (regs)) +if (user_mode (regs)) { +TRACE_TRAP_EXIT ();return 0 ; + } no_context:__do_kernel_fault (mm, addr, fsr, regs); +TRACE_TRAP_EXIT ();return 0 ; }
include/asm-arm/trace.h +15 -0
@@ -0,0 +1,15 @@ +/* +* linux/include/asm-arm/trace.h +* +* Copyright (C) 2002, Karim Yaghmour +* +* ARM definitions for tracing system +*/ + +#include <linux/trace.h> + +/* Current arch type */ +#define TRACE_ARCH_TYPE TRACE_ARCH_TYPE_ARM + +/* Current variant type */ +#define TRACE_ARCH_VARIANT TRACE_ARCH_VARIANT_NONE