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
|
@ -121,7 +121,7 @@ $pgt_fill_loop:
|
||||||
copy %r0,%r2
|
copy %r0,%r2
|
||||||
|
|
||||||
/* And the RFI Target address too */
|
/* And the RFI Target address too */
|
||||||
load32 start_kernel,%r11
|
load32 start_parisc,%r11
|
||||||
|
|
||||||
/* And the initial task pointer */
|
/* And the initial task pointer */
|
||||||
load32 init_thread_union,%r6
|
load32 init_thread_union,%r6
|
||||||
|
|
|
@ -368,6 +368,31 @@ static int __init parisc_init(void)
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
arch_initcall(parisc_init);
|
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 New Issue