Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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.

authored by

Kyle McMartin and committed by
Kyle McMartin
089d5528 24b574d0

+27 -2
+1 -1
arch/parisc/kernel/head.S
··· 121 121 copy %r0,%r2 122 122 123 123 /* And the RFI Target address too */ 124 - load32 start_kernel,%r11 124 + load32 start_parisc,%r11 125 125 126 126 /* And the initial task pointer */ 127 127 load32 init_thread_union,%r6
+26 -1
arch/parisc/kernel/setup.c
··· 368 368 369 369 return 0; 370 370 } 371 - 372 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 + }