aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Ellerman <michael@ellerman.id.au>2006-06-27 23:18:53 -0400
committerPaul Mackerras <paulus@samba.org>2006-06-29 02:22:47 -0400
commit33dbcf72f607f5da791402e161feaf1ccf5d5be4 (patch)
treeb7c1b9de64e5855b3d0972e8cfdde862e0de9777
parentfeb76c7b23fb660f015583359a4c75a1139c0d36 (diff)
[POWERPC] Make sure smp_processor_id works very early in boot
There's a small period early in boot where we don't know which cpu we're running on. That's ok, except that it means we have no paca, or more correctly that our paca pointer points somewhere random. So that we can safely call things like smp_processor_id(), we need a paca, so just assume we're on cpu 0. No code should _write_ to the paca before we've set the correct one up. We setup the proper paca after we've scanned the flat device tree in early_setup(), so there's no need to do it again in start_here_common. Signed-off-by: Michael Ellerman <michael@ellerman.id.au> Signed-off-by: Paul Mackerras <paulus@samba.org>
-rw-r--r--arch/powerpc/kernel/head_64.S11
-rw-r--r--arch/powerpc/kernel/setup_64.c3
2 files changed, 3 insertions, 11 deletions
diff --git a/arch/powerpc/kernel/head_64.S b/arch/powerpc/kernel/head_64.S
index f2fab687a01c..8cfd040d1f50 100644
--- a/arch/powerpc/kernel/head_64.S
+++ b/arch/powerpc/kernel/head_64.S
@@ -1583,9 +1583,6 @@ _GLOBAL(__start_initialization_multiplatform)
1583 /* Setup some critical 970 SPRs before switching MMU off */ 1583 /* Setup some critical 970 SPRs before switching MMU off */
1584 bl .__970_cpu_preinit 1584 bl .__970_cpu_preinit
1585 1585
1586 /* cpu # */
1587 li r24,0
1588
1589 /* Switch off MMU if not already */ 1586 /* Switch off MMU if not already */
1590 LOAD_REG_IMMEDIATE(r4, .__after_prom_start - KERNELBASE) 1587 LOAD_REG_IMMEDIATE(r4, .__after_prom_start - KERNELBASE)
1591 add r4,r4,r30 1588 add r4,r4,r30
@@ -1946,14 +1943,6 @@ _STATIC(start_here_common)
1946 li r3,0 1943 li r3,0
1947 bl .do_cpu_ftr_fixups 1944 bl .do_cpu_ftr_fixups
1948 1945
1949 LOAD_REG_IMMEDIATE(r26, boot_cpuid)
1950 lwz r26,0(r26)
1951
1952 LOAD_REG_IMMEDIATE(r24, paca) /* Get base vaddr of paca array */
1953 mulli r13,r26,PACA_SIZE /* Calculate vaddr of right paca */
1954 add r13,r13,r24 /* for this processor. */
1955 mtspr SPRN_SPRG3,r13
1956
1957 /* ptr to current */ 1946 /* ptr to current */
1958 LOAD_REG_IMMEDIATE(r4, init_task) 1947 LOAD_REG_IMMEDIATE(r4, init_task)
1959 std r4,PACACURRENT(r13) 1948 std r4,PACACURRENT(r13)
diff --git a/arch/powerpc/kernel/setup_64.c b/arch/powerpc/kernel/setup_64.c
index a2fb2e627aad..175539c9afa0 100644
--- a/arch/powerpc/kernel/setup_64.c
+++ b/arch/powerpc/kernel/setup_64.c
@@ -177,6 +177,9 @@ void __init setup_paca(int cpu)
177 177
178void __init early_setup(unsigned long dt_ptr) 178void __init early_setup(unsigned long dt_ptr)
179{ 179{
180 /* Assume we're on cpu 0 for now. Don't write to the paca yet! */
181 setup_paca(0);
182
180 /* Enable early debugging if any specified (see udbg.h) */ 183 /* Enable early debugging if any specified (see udbg.h) */
181 udbg_early_init(); 184 udbg_early_init();
182 185