diff options
| author | Rabin Vincent <rabin@rab.in> | 2010-10-07 20:51:58 +0530 | 
|---|---|---|
| committer | Rabin Vincent <rabin@rab.in> | 2010-11-19 21:43:26 +0530 | 
| commit | 61b5cb1c3bff8875d2fd289c7b6ac344f95261fa (patch) | |
| tree | 05a10694778dc70c5eb6114a1ed8403745a2cfcd | |
| parent | ec763f0de879fa1a64b7641098271107f5e32c67 (diff) | |
| download | olio-linux-3.10-61b5cb1c3bff8875d2fd289c7b6ac344f95261fa.tar.xz olio-linux-3.10-61b5cb1c3bff8875d2fd289c7b6ac344f95261fa.zip  | |
ARM: place C irq handlers in IRQ_ENTRY for ftrace
When FUNCTION_GRAPH_TRACER is enabled, place do_IRQ() and friends in the
IRQ_ENTRY section so that the irq-related features of the function graph
tracer work.
Signed-off-by: Rabin Vincent <rabin@rab.in>
| -rw-r--r-- | arch/arm/include/asm/system.h | 5 | ||||
| -rw-r--r-- | arch/arm/include/asm/traps.h | 23 | ||||
| -rw-r--r-- | arch/arm/kernel/irq.c | 4 | ||||
| -rw-r--r-- | arch/arm/kernel/smp.c | 5 | ||||
| -rw-r--r-- | arch/arm/kernel/vmlinux.lds.S | 1 | 
5 files changed, 33 insertions, 5 deletions
diff --git a/arch/arm/include/asm/system.h b/arch/arm/include/asm/system.h index 1120f18a6b1..ec4327a4653 100644 --- a/arch/arm/include/asm/system.h +++ b/arch/arm/include/asm/system.h @@ -63,6 +63,11 @@  #include <asm/outercache.h>  #define __exception	__attribute__((section(".exception.text"))) +#ifdef CONFIG_FUNCTION_GRAPH_TRACER +#define __exception_irq_entry	__irq_entry +#else +#define __exception_irq_entry	__exception +#endif  struct thread_info;  struct task_struct; diff --git a/arch/arm/include/asm/traps.h b/arch/arm/include/asm/traps.h index 491960bf426..124475afb00 100644 --- a/arch/arm/include/asm/traps.h +++ b/arch/arm/include/asm/traps.h @@ -15,13 +15,32 @@ struct undef_hook {  void register_undef_hook(struct undef_hook *hook);  void unregister_undef_hook(struct undef_hook *hook); +#ifdef CONFIG_FUNCTION_GRAPH_TRACER +static inline int __in_irqentry_text(unsigned long ptr) +{ +	extern char __irqentry_text_start[]; +	extern char __irqentry_text_end[]; + +	return ptr >= (unsigned long)&__irqentry_text_start && +	       ptr < (unsigned long)&__irqentry_text_end; +} +#else +static inline int __in_irqentry_text(unsigned long ptr) +{ +	return 0; +} +#endif +  static inline int in_exception_text(unsigned long ptr)  {  	extern char __exception_text_start[];  	extern char __exception_text_end[]; +	int in; + +	in = ptr >= (unsigned long)&__exception_text_start && +	     ptr < (unsigned long)&__exception_text_end; -	return ptr >= (unsigned long)&__exception_text_start && -	       ptr < (unsigned long)&__exception_text_end; +	return in ? : __in_irqentry_text(ptr);  }  extern void __init early_trap_init(void); diff --git a/arch/arm/kernel/irq.c b/arch/arm/kernel/irq.c index 36ad3be4692..6d616333340 100644 --- a/arch/arm/kernel/irq.c +++ b/arch/arm/kernel/irq.c @@ -35,6 +35,7 @@  #include <linux/list.h>  #include <linux/kallsyms.h>  #include <linux/proc_fs.h> +#include <linux/ftrace.h>  #include <asm/system.h>  #include <asm/mach/irq.h> @@ -105,7 +106,8 @@ unlock:   * come via this function.  Instead, they should provide their   * own 'handler'   */ -asmlinkage void __exception asm_do_IRQ(unsigned int irq, struct pt_regs *regs) +asmlinkage void __exception_irq_entry +asm_do_IRQ(unsigned int irq, struct pt_regs *regs)  {  	struct pt_regs *old_regs = set_irq_regs(regs); diff --git a/arch/arm/kernel/smp.c b/arch/arm/kernel/smp.c index 8c195959025..bbca89872c1 100644 --- a/arch/arm/kernel/smp.c +++ b/arch/arm/kernel/smp.c @@ -16,6 +16,7 @@  #include <linux/cache.h>  #include <linux/profile.h>  #include <linux/errno.h> +#include <linux/ftrace.h>  #include <linux/mm.h>  #include <linux/err.h>  #include <linux/cpu.h> @@ -457,7 +458,7 @@ static void ipi_timer(void)  }  #ifdef CONFIG_LOCAL_TIMERS -asmlinkage void __exception do_local_timer(struct pt_regs *regs) +asmlinkage void __exception_irq_entry do_local_timer(struct pt_regs *regs)  {  	struct pt_regs *old_regs = set_irq_regs(regs);  	int cpu = smp_processor_id(); @@ -544,7 +545,7 @@ static void ipi_cpu_stop(unsigned int cpu)   *   *  Bit 0 - Inter-processor function call   */ -asmlinkage void __exception do_IPI(struct pt_regs *regs) +asmlinkage void __exception_irq_entry do_IPI(struct pt_regs *regs)  {  	unsigned int cpu = smp_processor_id();  	struct ipi_data *ipi = &per_cpu(ipi_data, cpu); diff --git a/arch/arm/kernel/vmlinux.lds.S b/arch/arm/kernel/vmlinux.lds.S index cead8893b46..897c1a8f169 100644 --- a/arch/arm/kernel/vmlinux.lds.S +++ b/arch/arm/kernel/vmlinux.lds.S @@ -101,6 +101,7 @@ SECTIONS  			__exception_text_start = .;  			*(.exception.text)  			__exception_text_end = .; +			IRQENTRY_TEXT  			TEXT_TEXT  			SCHED_TEXT  			LOCK_TEXT  |