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:
parent
24b574d052
commit
089d55289d
2 changed files with 27 additions and 2 deletions
|
@ -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
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue