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