An experimental hack that appears to allow old PowerMacG5 4-core (system total) system to boot reliably (head -r343884 based context)

Mark Millard marklmi at yahoo.com
Sat Feb 23 19:36:23 UTC 2019


For sys/powerpc/aim/mp_cpudep.c 's cpudep_ap_bootstrap I added as shown below:

+extern void hack_into_slb_if_needed(void* vap); // HACK!!!
+
 uintptr_t
 cpudep_ap_bootstrap(void)
 {
. . .
+	hack_into_slb_if_needed(pcpup->pc_curpcb); // HACK!!!
+
 	sp = pcpup->pc_curpcb->pcb_sp;

and in src/sys/powerpc/aim/slb.c I added an implementation:

+void hack_into_slb_if_needed(void* vap); // HACK!!!
+void hack_into_slb_if_needed(void* vap) // HACK!!!
+{ // HACK!!!
+	struct slb *cache= PCPU_GET(aim.slb);
+	vm_offset_t va=    (vm_offset_t)vap;
+	uint64_t    slbv=  kernel_va_to_slbv(va);
+	uint64_t    esid=  va>>ADDR_SR_SHFT;
+	uint64_t    slbe=  (esid<<SLBE_ESID_SHIFT) | SLBE_VALID;
+	int i;
+
+	for (i = 0; i < n_slbs; i++) {
+		if (i == USER_SLB_SLOT)
+			continue;
+		if (cache[i].slbe == (slbe | i))
+			break;
+	}
+
+	if (i==n_slbs)
+		slb_insert_kernel(slbe,slbv);
+} // HACK!!!
+

So far I've not had any boot hang-ups after this.

Given the random nature of the hang-ups it will be a
while before I conclude for sure how reliable this
change makes booting, but so far so good.

(I recognize that the "break" could be "return"
and then then the "if (i==n_slbs)" would not be
needed.)


Other issues not fixed by this:

This does not change the buf*daemon* randomly getting
hung up (and so timing out on shutdown). This appears
to be the same issue that leads to the fans sometimes
starting to run full-rate because of pmac_thermal
being hun -up.

For  buf*daemon* "top -SHIopid" before shutdown shows
just the ones that will not hang-up. The same goes for
seeing before hand for pmac_thermal vs. the fans.

===
Mark Millard
marklmi at yahoo.com
( dsl-only.net went
away in early 2018-Mar)



More information about the freebsd-ppc mailing list