diff options
author | David S. Miller <davem@davemloft.net> | 2006-05-31 01:24:02 -0700 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2006-05-31 01:24:02 -0700 |
commit | 951bc82c53f30ec6b4c2d04a051e74ea9a89b669 (patch) | |
tree | 5c8dfd8c9b56291705053cb98382cd79d990c770 /arch/sparc64/kernel/head.S | |
parent | e6ed89ac9f5da16fea5111651b6de0ff0a76a5c2 (diff) | |
download | blackbird-op-linux-951bc82c53f30ec6b4c2d04a051e74ea9a89b669.tar.gz blackbird-op-linux-951bc82c53f30ec6b4c2d04a051e74ea9a89b669.zip |
[SPARC64]: Make smp_processor_id() functional before start_kernel()
Uses of smp_processor_id() get pushed earlier and earlier in
the start_kernel() sequence. So just get it working before
we call start_kernel() to avoid all possible problems.
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'arch/sparc64/kernel/head.S')
-rw-r--r-- | arch/sparc64/kernel/head.S | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/arch/sparc64/kernel/head.S b/arch/sparc64/kernel/head.S index 3eadac5e171e..31c5892f5acc 100644 --- a/arch/sparc64/kernel/head.S +++ b/arch/sparc64/kernel/head.S @@ -10,6 +10,7 @@ #include <linux/config.h> #include <linux/version.h> #include <linux/errno.h> +#include <linux/threads.h> #include <asm/thread_info.h> #include <asm/asi.h> #include <asm/pstate.h> @@ -493,6 +494,35 @@ tlb_fixup_done: call prom_init mov %l7, %o0 ! OpenPROM cif handler + /* Initialize current_thread_info()->cpu as early as possible. + * In order to do that accurately we have to patch up the get_cpuid() + * assembler sequences. And that, in turn, requires that we know + * if we are on a Starfire box or not. While we're here, patch up + * the sun4v sequences as well. + */ + call check_if_starfire + nop + call per_cpu_patch + nop + call sun4v_patch + nop + +#ifdef CONFIG_SMP + call hard_smp_processor_id + nop + cmp %o0, NR_CPUS + blu,pt %xcc, 1f + nop + call boot_cpu_id_too_large + nop + /* Not reached... */ + +1: +#else + mov 0, %o0 +#endif + stb %o0, [%g6 + TI_CPU] + /* Off we go.... */ call start_kernel nop |