Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 089d5528 authored by Kyle McMartin's avatar Kyle McMartin Committed by Kyle McMartin
Browse files

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.
parent 24b574d0
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -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
+26 −1
Original line number Diff line number Diff line
@@ -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
}