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.
This commit is contained in:
Kyle McMartin 2008-07-29 00:11:13 -04:00 committed by Kyle McMartin
parent 24b574d052
commit 089d55289d
2 changed files with 27 additions and 2 deletions

View file

@ -121,7 +121,7 @@ $pgt_fill_loop:
copy %r0,%r2
/* And the RFI Target address too */
load32 start_kernel,%r11
load32 start_parisc,%r11
/* And the initial task pointer */
load32 init_thread_union,%r6

View file

@ -368,6 +368,31 @@ static int __init parisc_init(void)
return 0;
}
arch_initcall(parisc_init);
void start_parisc(void)
{
extern void start_kernel(void);
int ret, cpunum;
struct pdc_coproc_cfg coproc_cfg;
cpunum = smp_processor_id();
set_firmware_width_unlocked();
ret = pdc_coproc_cfg_unlocked(&coproc_cfg);
if (ret >= 0 && coproc_cfg.ccr_functional) {
mtctl(coproc_cfg.ccr_functional, 10);
cpu_data[cpunum].fp_rev = coproc_cfg.revision;
cpu_data[cpunum].fp_model = coproc_cfg.model;
asm volatile ("fstd %fr0,8(%sp)");
} else {
panic("must have an fpu to boot linux");
}
start_kernel();
// not reached
}