| From 1979da7c6cb0aa247f3d2baa03b429cc90f723e1 Mon Sep 17 00:00:00 2001 |
| From: David S. Miller <davem@davemloft.net> |
| Date: Fri, 4 Sep 2009 03:38:54 -0700 |
| Subject: sparc64: Fix bootup with mcount in some configs. |
| |
| From: David S. Miller <davem@davemloft.net> |
| |
| [ Upstream commit bd4352cadfacb9084c97c853b025fac010266c26 ] |
| |
| Functions invoked early when booting up a cpu can't use |
| tracing because mcount requires a valid 'current_thread_info()' |
| and TLB mappings to be setup. |
| |
| The code path of sun4v_register_mondo_queues --> register_one_mondo |
| is one such case. sun4v_register_mondo_queues already has the |
| necessary 'notrace' annotation, but register_one_mondo does not. |
| |
| Normally register_one_mondo is inlined so the bug doesn't trigger, |
| but with some config/compiler combinations, it won't be so we |
| must properly mark it notrace. |
| |
| While we're here, add 'notrace' annoations to prom_printf and |
| prom_halt so that early error handling won't have the same problem. |
| |
| Reported-by: Alexander Beregalov <a.beregalov@gmail.com> |
| Reported-by: Leif Sawyer <lsawyer@gci.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| --- |
| arch/sparc/kernel/irq_64.c | 2 +- |
| arch/sparc/prom/misc_64.c | 2 +- |
| arch/sparc/prom/printf.c | 7 +++---- |
| 3 files changed, 5 insertions(+), 6 deletions(-) |
| |
| --- a/arch/sparc/kernel/irq_64.c |
| +++ b/arch/sparc/kernel/irq_64.c |
| @@ -902,7 +902,7 @@ void notrace init_irqwork_curcpu(void) |
| * Therefore you cannot make any OBP calls, not even prom_printf, |
| * from these two routines. |
| */ |
| -static void __cpuinit register_one_mondo(unsigned long paddr, unsigned long type, unsigned long qmask) |
| +static void __cpuinit notrace register_one_mondo(unsigned long paddr, unsigned long type, unsigned long qmask) |
| { |
| unsigned long num_entries = (qmask + 1) / 64; |
| unsigned long status; |
| --- a/arch/sparc/prom/misc_64.c |
| +++ b/arch/sparc/prom/misc_64.c |
| @@ -88,7 +88,7 @@ void prom_cmdline(void) |
| /* Drop into the prom, but completely terminate the program. |
| * No chance of continuing. |
| */ |
| -void prom_halt(void) |
| +void notrace prom_halt(void) |
| { |
| #ifdef CONFIG_SUN_LDOMS |
| if (ldom_domaining_enabled) |
| --- a/arch/sparc/prom/printf.c |
| +++ b/arch/sparc/prom/printf.c |
| @@ -14,14 +14,14 @@ |
| */ |
| |
| #include <linux/kernel.h> |
| +#include <linux/compiler.h> |
| |
| #include <asm/openprom.h> |
| #include <asm/oplib.h> |
| |
| static char ppbuf[1024]; |
| |
| -void |
| -prom_write(const char *buf, unsigned int n) |
| +void notrace prom_write(const char *buf, unsigned int n) |
| { |
| char ch; |
| |
| @@ -33,8 +33,7 @@ prom_write(const char *buf, unsigned int |
| } |
| } |
| |
| -void |
| -prom_printf(const char *fmt, ...) |
| +void notrace prom_printf(const char *fmt, ...) |
| { |
| va_list args; |
| int i; |