diff options
| author | David S. Miller <davem@davemloft.net> | 2009-09-04 06:38:54 -0400 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2009-09-04 06:39:45 -0400 |
| commit | bd4352cadfacb9084c97c853b025fac010266c26 (patch) | |
| tree | ef54f0801dce4822df71cca587421446ad259ebd /arch/sparc | |
| parent | e6617c6ec28a17cf2f90262b835ec05b9b861400 (diff) | |
sparc64: Fix bootup with mcount in some configs.
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>
Diffstat (limited to 'arch/sparc')
| -rw-r--r-- | arch/sparc/kernel/irq_64.c | 2 | ||||
| -rw-r--r-- | arch/sparc/prom/misc_64.c | 2 | ||||
| -rw-r--r-- | arch/sparc/prom/printf.c | 7 |
3 files changed, 5 insertions, 6 deletions
diff --git a/arch/sparc/kernel/irq_64.c b/arch/sparc/kernel/irq_64.c index f0ee79055409..8daab33fc17d 100644 --- a/arch/sparc/kernel/irq_64.c +++ b/arch/sparc/kernel/irq_64.c | |||
| @@ -886,7 +886,7 @@ void notrace init_irqwork_curcpu(void) | |||
| 886 | * Therefore you cannot make any OBP calls, not even prom_printf, | 886 | * Therefore you cannot make any OBP calls, not even prom_printf, |
| 887 | * from these two routines. | 887 | * from these two routines. |
| 888 | */ | 888 | */ |
| 889 | static void __cpuinit register_one_mondo(unsigned long paddr, unsigned long type, unsigned long qmask) | 889 | static void __cpuinit notrace register_one_mondo(unsigned long paddr, unsigned long type, unsigned long qmask) |
| 890 | { | 890 | { |
| 891 | unsigned long num_entries = (qmask + 1) / 64; | 891 | unsigned long num_entries = (qmask + 1) / 64; |
| 892 | unsigned long status; | 892 | unsigned long status; |
diff --git a/arch/sparc/prom/misc_64.c b/arch/sparc/prom/misc_64.c index eedffb4fec2d..39fc6af21b7c 100644 --- a/arch/sparc/prom/misc_64.c +++ b/arch/sparc/prom/misc_64.c | |||
| @@ -88,7 +88,7 @@ void prom_cmdline(void) | |||
| 88 | /* Drop into the prom, but completely terminate the program. | 88 | /* Drop into the prom, but completely terminate the program. |
| 89 | * No chance of continuing. | 89 | * No chance of continuing. |
| 90 | */ | 90 | */ |
| 91 | void prom_halt(void) | 91 | void notrace prom_halt(void) |
| 92 | { | 92 | { |
| 93 | #ifdef CONFIG_SUN_LDOMS | 93 | #ifdef CONFIG_SUN_LDOMS |
| 94 | if (ldom_domaining_enabled) | 94 | if (ldom_domaining_enabled) |
diff --git a/arch/sparc/prom/printf.c b/arch/sparc/prom/printf.c index 660943ee4c2a..ca869266b9f3 100644 --- a/arch/sparc/prom/printf.c +++ b/arch/sparc/prom/printf.c | |||
| @@ -14,14 +14,14 @@ | |||
| 14 | */ | 14 | */ |
| 15 | 15 | ||
| 16 | #include <linux/kernel.h> | 16 | #include <linux/kernel.h> |
| 17 | #include <linux/compiler.h> | ||
| 17 | 18 | ||
| 18 | #include <asm/openprom.h> | 19 | #include <asm/openprom.h> |
| 19 | #include <asm/oplib.h> | 20 | #include <asm/oplib.h> |
| 20 | 21 | ||
| 21 | static char ppbuf[1024]; | 22 | static char ppbuf[1024]; |
| 22 | 23 | ||
| 23 | void | 24 | void notrace prom_write(const char *buf, unsigned int n) |
| 24 | prom_write(const char *buf, unsigned int n) | ||
| 25 | { | 25 | { |
| 26 | char ch; | 26 | char ch; |
| 27 | 27 | ||
| @@ -33,8 +33,7 @@ prom_write(const char *buf, unsigned int n) | |||
| 33 | } | 33 | } |
| 34 | } | 34 | } |
| 35 | 35 | ||
| 36 | void | 36 | void notrace prom_printf(const char *fmt, ...) |
| 37 | prom_printf(const char *fmt, ...) | ||
| 38 | { | 37 | { |
| 39 | va_list args; | 38 | va_list args; |
| 40 | int i; | 39 | int i; |
