diff options
author | Kyle McMartin <kyle@mcmartin.ca> | 2008-07-29 00:11:13 -0400 |
---|---|---|
committer | Kyle McMartin <kyle@hera.kernel.org> | 2008-10-10 12:32:30 -0400 |
commit | 089d55289db5d58d938d73b47a415b2b82ee19ac (patch) | |
tree | 4d7cdbc5a7dc8fb7fccf0d579f4296197f05f086 /arch/parisc/kernel | |
parent | 24b574d052a1996bac42fbd56715ab602092c291 (diff) |
parisc: hijack jump to start_kernel
Bang in our own start_parisc call, which initializes the PDC
width, and turns on the FPU.
Previously, if CONFIG_PRINTK_TIME was on, we'd attempt to use
the FPU before we had enabled it, resulting in a difficult
to diagnose panic.
This patch causes init_per_cpu to redundantly set these for
cpu0, but this is harmless.
Diffstat (limited to 'arch/parisc/kernel')
-rw-r--r-- | arch/parisc/kernel/head.S | 2 | ||||
-rw-r--r-- | arch/parisc/kernel/setup.c | 27 |
2 files changed, 27 insertions, 2 deletions
diff --git a/arch/parisc/kernel/head.S b/arch/parisc/kernel/head.S index a84e31e82876..0e3d9f9b9e33 100644 --- a/arch/parisc/kernel/head.S +++ b/arch/parisc/kernel/head.S | |||
@@ -121,7 +121,7 @@ $pgt_fill_loop: | |||
121 | copy %r0,%r2 | 121 | copy %r0,%r2 |
122 | 122 | ||
123 | /* And the RFI Target address too */ | 123 | /* And the RFI Target address too */ |
124 | load32 start_kernel,%r11 | 124 | load32 start_parisc,%r11 |
125 | 125 | ||
126 | /* And the initial task pointer */ | 126 | /* And the initial task pointer */ |
127 | load32 init_thread_union,%r6 | 127 | load32 init_thread_union,%r6 |
diff --git a/arch/parisc/kernel/setup.c b/arch/parisc/kernel/setup.c index 39e7c5a5946a..a59b71efdbe5 100644 --- a/arch/parisc/kernel/setup.c +++ b/arch/parisc/kernel/setup.c | |||
@@ -368,6 +368,31 @@ static int __init parisc_init(void) | |||
368 | 368 | ||
369 | return 0; | 369 | return 0; |
370 | } | 370 | } |
371 | |||
372 | arch_initcall(parisc_init); | 371 | arch_initcall(parisc_init); |
373 | 372 | ||
373 | void start_parisc(void) | ||
374 | { | ||
375 | extern void start_kernel(void); | ||
376 | |||
377 | int ret, cpunum; | ||
378 | struct pdc_coproc_cfg coproc_cfg; | ||
379 | |||
380 | cpunum = smp_processor_id(); | ||
381 | |||
382 | set_firmware_width_unlocked(); | ||
383 | |||
384 | ret = pdc_coproc_cfg_unlocked(&coproc_cfg); | ||
385 | if (ret >= 0 && coproc_cfg.ccr_functional) { | ||
386 | mtctl(coproc_cfg.ccr_functional, 10); | ||
387 | |||
388 | cpu_data[cpunum].fp_rev = coproc_cfg.revision; | ||
389 | cpu_data[cpunum].fp_model = coproc_cfg.model; | ||
390 | |||
391 | asm volatile ("fstd %fr0,8(%sp)"); | ||
392 | } else { | ||
393 | panic("must have an fpu to boot linux"); | ||
394 | } | ||
395 | |||
396 | start_kernel(); | ||
397 | // not reached | ||
398 | } | ||