diff options
| author | Rabin Vincent <rabin@rab.in> | 2010-10-07 11:21:58 -0400 |
|---|---|---|
| committer | Rabin Vincent <rabin@rab.in> | 2010-11-19 11:13:26 -0500 |
| commit | 61b5cb1c3bff8875d2fd289c7b6ac344f95261fa (patch) | |
| tree | 05a10694778dc70c5eb6114a1ed8403745a2cfcd | |
| parent | ec763f0de879fa1a64b7641098271107f5e32c67 (diff) | |
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 1120f18a6b17..ec4327a4653d 100644 --- a/arch/arm/include/asm/system.h +++ b/arch/arm/include/asm/system.h | |||
| @@ -63,6 +63,11 @@ | |||
| 63 | #include <asm/outercache.h> | 63 | #include <asm/outercache.h> |
| 64 | 64 | ||
| 65 | #define __exception __attribute__((section(".exception.text"))) | 65 | #define __exception __attribute__((section(".exception.text"))) |
| 66 | #ifdef CONFIG_FUNCTION_GRAPH_TRACER | ||
| 67 | #define __exception_irq_entry __irq_entry | ||
| 68 | #else | ||
| 69 | #define __exception_irq_entry __exception | ||
| 70 | #endif | ||
| 66 | 71 | ||
| 67 | struct thread_info; | 72 | struct thread_info; |
| 68 | struct task_struct; | 73 | struct task_struct; |
diff --git a/arch/arm/include/asm/traps.h b/arch/arm/include/asm/traps.h index 491960bf4260..124475afb007 100644 --- a/arch/arm/include/asm/traps.h +++ b/arch/arm/include/asm/traps.h | |||
| @@ -15,13 +15,32 @@ struct undef_hook { | |||
| 15 | void register_undef_hook(struct undef_hook *hook); | 15 | void register_undef_hook(struct undef_hook *hook); |
| 16 | void unregister_undef_hook(struct undef_hook *hook); | 16 | void unregister_undef_hook(struct undef_hook *hook); |
| 17 | 17 | ||
| 18 | #ifdef CONFIG_FUNCTION_GRAPH_TRACER | ||
| 19 | static inline int __in_irqentry_text(unsigned long ptr) | ||
| 20 | { | ||
| 21 | extern char __irqentry_text_start[]; | ||
| 22 | extern char __irqentry_text_end[]; | ||
| 23 | |||
| 24 | return ptr >= (unsigned long)&__irqentry_text_start && | ||
| 25 | ptr < (unsigned long)&__irqentry_text_end; | ||
| 26 | } | ||
| 27 | #else | ||
| 28 | static inline int __in_irqentry_text(unsigned long ptr) | ||
| 29 | { | ||
| 30 | return 0; | ||
| 31 | } | ||
| 32 | #endif | ||
| 33 | |||
| 18 | static inline int in_exception_text(unsigned long ptr) | 34 | static inline int in_exception_text(unsigned long ptr) |
| 19 | { | 35 | { |
| 20 | extern char __exception_text_start[]; | 36 | extern char __exception_text_start[]; |
| 21 | extern char __exception_text_end[]; | 37 | extern char __exception_text_end[]; |
| 38 | int in; | ||
| 39 | |||
| 40 | in = ptr >= (unsigned long)&__exception_text_start && | ||
| 41 | ptr < (unsigned long)&__exception_text_end; | ||
| 22 | 42 | ||
| 23 | return ptr >= (unsigned long)&__exception_text_start && | 43 | return in ? : __in_irqentry_text(ptr); |
| 24 | ptr < (unsigned long)&__exception_text_end; | ||
| 25 | } | 44 | } |
| 26 | 45 | ||
| 27 | extern void __init early_trap_init(void); | 46 | extern void __init early_trap_init(void); |
diff --git a/arch/arm/kernel/irq.c b/arch/arm/kernel/irq.c index 36ad3be4692a..6d616333340f 100644 --- a/arch/arm/kernel/irq.c +++ b/arch/arm/kernel/irq.c | |||
| @@ -35,6 +35,7 @@ | |||
| 35 | #include <linux/list.h> | 35 | #include <linux/list.h> |
| 36 | #include <linux/kallsyms.h> | 36 | #include <linux/kallsyms.h> |
| 37 | #include <linux/proc_fs.h> | 37 | #include <linux/proc_fs.h> |
| 38 | #include <linux/ftrace.h> | ||
| 38 | 39 | ||
| 39 | #include <asm/system.h> | 40 | #include <asm/system.h> |
| 40 | #include <asm/mach/irq.h> | 41 | #include <asm/mach/irq.h> |
| @@ -105,7 +106,8 @@ unlock: | |||
| 105 | * come via this function. Instead, they should provide their | 106 | * come via this function. Instead, they should provide their |
| 106 | * own 'handler' | 107 | * own 'handler' |
| 107 | */ | 108 | */ |
| 108 | asmlinkage void __exception asm_do_IRQ(unsigned int irq, struct pt_regs *regs) | 109 | asmlinkage void __exception_irq_entry |
| 110 | asm_do_IRQ(unsigned int irq, struct pt_regs *regs) | ||
| 109 | { | 111 | { |
| 110 | struct pt_regs *old_regs = set_irq_regs(regs); | 112 | struct pt_regs *old_regs = set_irq_regs(regs); |
| 111 | 113 | ||
diff --git a/arch/arm/kernel/smp.c b/arch/arm/kernel/smp.c index 8c1959590252..bbca89872c18 100644 --- a/arch/arm/kernel/smp.c +++ b/arch/arm/kernel/smp.c | |||
| @@ -16,6 +16,7 @@ | |||
| 16 | #include <linux/cache.h> | 16 | #include <linux/cache.h> |
| 17 | #include <linux/profile.h> | 17 | #include <linux/profile.h> |
| 18 | #include <linux/errno.h> | 18 | #include <linux/errno.h> |
| 19 | #include <linux/ftrace.h> | ||
| 19 | #include <linux/mm.h> | 20 | #include <linux/mm.h> |
| 20 | #include <linux/err.h> | 21 | #include <linux/err.h> |
| 21 | #include <linux/cpu.h> | 22 | #include <linux/cpu.h> |
| @@ -457,7 +458,7 @@ static void ipi_timer(void) | |||
| 457 | } | 458 | } |
| 458 | 459 | ||
| 459 | #ifdef CONFIG_LOCAL_TIMERS | 460 | #ifdef CONFIG_LOCAL_TIMERS |
| 460 | asmlinkage void __exception do_local_timer(struct pt_regs *regs) | 461 | asmlinkage void __exception_irq_entry do_local_timer(struct pt_regs *regs) |
| 461 | { | 462 | { |
| 462 | struct pt_regs *old_regs = set_irq_regs(regs); | 463 | struct pt_regs *old_regs = set_irq_regs(regs); |
| 463 | int cpu = smp_processor_id(); | 464 | int cpu = smp_processor_id(); |
| @@ -544,7 +545,7 @@ static void ipi_cpu_stop(unsigned int cpu) | |||
| 544 | * | 545 | * |
| 545 | * Bit 0 - Inter-processor function call | 546 | * Bit 0 - Inter-processor function call |
| 546 | */ | 547 | */ |
| 547 | asmlinkage void __exception do_IPI(struct pt_regs *regs) | 548 | asmlinkage void __exception_irq_entry do_IPI(struct pt_regs *regs) |
| 548 | { | 549 | { |
| 549 | unsigned int cpu = smp_processor_id(); | 550 | unsigned int cpu = smp_processor_id(); |
| 550 | struct ipi_data *ipi = &per_cpu(ipi_data, cpu); | 551 | 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 cead8893b46b..897c1a8f1694 100644 --- a/arch/arm/kernel/vmlinux.lds.S +++ b/arch/arm/kernel/vmlinux.lds.S | |||
| @@ -101,6 +101,7 @@ SECTIONS | |||
| 101 | __exception_text_start = .; | 101 | __exception_text_start = .; |
| 102 | *(.exception.text) | 102 | *(.exception.text) |
| 103 | __exception_text_end = .; | 103 | __exception_text_end = .; |
| 104 | IRQENTRY_TEXT | ||
| 104 | TEXT_TEXT | 105 | TEXT_TEXT |
| 105 | SCHED_TEXT | 106 | SCHED_TEXT |
| 106 | LOCK_TEXT | 107 | LOCK_TEXT |
