Re: Some evidence about the PowerMac G5 multiprocessor boot hang ups with the modern VM_MAX_KERNEL_ADDRESS value

Mark Millard via freebsd-ppc <[email protected]>
Newsgroups gmane.os.freebsd.devel.ppc
Message-ID <[email protected]>

On 2019-Feb-14, at 12:56, Dennis Clarke <dclarke at blastwave.org> wrote:

> On 2/13/19 10:35 PM, Mark Millard via freebsd-ppc wrote:
>> I added some bootverbose messages to:
> 
> I clearly need to apply your "HACK" verbosity because I am seeing odd
> behavior where I now need to set kern.smp.disabled=1 to get a boot AND
> then I get all four cores online.
> 
> Here is the /var/run/dmesg.boot with some 'malloc' lines snipped out.
> 
> Everything comes to a screetching halt at vt_upgrade(&vt_consdev) unless I set kern.smp.disabled=1 and then I get a normal boot.
> 
> . . .


Even without my additions, using boot -v at the
loader prompt would echo more information,
including during:

subsystem f000000
  cpu_mp_unleash(0)... done.

(where I get a hangup much of the time). boot -v is
independent of debug.verbose_sysinit=1 : they can be
together or separately.

Looks like I did not include the svnlite diff output
as of my adding the address information and such. But
I only added to the cpu_mp_unleash related activity
overall.

My updates svnlite diff is as follows:

# svnlite diff /usr/src/sys/powerpc/powermac/platform_powermac.c /usr/src/sys/powerpc/powerpc/mp_machdep.c                                                                                      Index: /usr/src/sys/powerpc/powermac/platform_powermac.c
===================================================================
--- /usr/src/sys/powerpc/powermac/platform_powermac.c	(revision 344018)
+++ /usr/src/sys/powerpc/powermac/platform_powermac.c	(working copy)
@@ -344,6 +344,10 @@
 
 	cpu = pc->pc_hwref;
 	res = OF_getprop(cpu, "soft-reset", &reset, sizeof(reset));
+        if (bootverbose) // HACK!!!
+                printf("powermac_smp_start_cpu 's OF_getprop for CPU %d, hwref=%jx, awake=%x: res=%d, reset=%x\n",
+                    pc->pc_cpuid, (uintmax_t)pc->pc_hwref,
+                    pc->pc_awake, res, reset);
 	if (res < 0) {
 		reset = 0x58;
 
@@ -363,14 +367,33 @@
 		default:
 			return (ENXIO);
 		}
+		if (bootverbose) // HACK!!!
+			printf("powermac_smp_start_cpu for res<0 for CPU %d, hwref=%jx, awake=%x: res=%d, reset=%x\n",
+			    pc->pc_cpuid, (uintmax_t)pc->pc_hwref,
+			    pc->pc_awake, res, reset);
 	}
 
 	ap_pcpu = pc;
 
 	if (rstvec_virtbase == NULL)
+	{ // HACK!!!
 		rstvec_virtbase = pmap_mapdev(0x80000000, PAGE_SIZE);
+		if (bootverbose) // HACK!!!
+			printf("powermac_smp_start_cpu for CPU %d, hwref=%jx, awake=%x: rstvec_virtbase=%p\n",
+			    pc->pc_cpuid, (uintmax_t)pc->pc_hwref,
+			    pc->pc_awake, rstvec_virtbase);
+	} // HACK!!!
 
 	rstvec = rstvec_virtbase + reset;
+	if (bootverbose) // HACK!!!
+		printf("powermac_smp_start_cpu for CPU %d, hwref=%jx, awake=%x: rstvec=%p\n",
+		    pc->pc_cpuid, (uintmax_t)pc->pc_hwref,
+		    pc->pc_awake, rstvec);
+ 
+        if (bootverbose) // HACK!!!
+                printf("Before reset 4&0 for CPU %d, hwref=%jx, awake=%x\n",
+                    pc->pc_cpuid, (uintmax_t)pc->pc_hwref,
+                    pc->pc_awake);
 
 	*rstvec = 4;
 	powerpc_sync();
@@ -382,10 +405,20 @@
 	(void)(*rstvec);
 	powerpc_sync();
 
+        if (bootverbose) // HACK!!!
+                printf("After reset 4&0 for CPU %d, hwref=%jx, awake=%x\n",
+                    pc->pc_cpuid, (uintmax_t)pc->pc_hwref,
+                    pc->pc_awake);
+
 	timeout = 10000;
 	while (!pc->pc_awake && timeout--)
 		DELAY(100);
 
+        if (bootverbose) // HACK!!!
+                printf("After attempted wait for awake CPU %d, hwref=%jx, awake=%x\n",
+                    pc->pc_cpuid, (uintmax_t)pc->pc_hwref,
+                    pc->pc_awake);
+
 	return ((pc->pc_awake) ? 0 : EBUSY);
 #else
 	/* No SMP support */
Index: /usr/src/sys/powerpc/powerpc/mp_machdep.c
===================================================================
--- /usr/src/sys/powerpc/powerpc/mp_machdep.c	(revision 344018)
+++ /usr/src/sys/powerpc/powerpc/mp_machdep.c	(working copy)
@@ -97,6 +97,9 @@
 	/* Initialize decrementer */
 	decr_ap_init();
 
+        if (bootverbose) // HACK!!!
+                printf("machdep_ap_bootstrap before ap_boot_mtx lock: AP CPU #%d launched\n", PCPU_GET(cpuid));
+
 	/* Serialize console output and AP count increment */
 	mtx_lock_spin(&ap_boot_mtx);
 	ap_awake++;
@@ -109,6 +112,8 @@
 
 	while(smp_started == 0)
 		;
+        if (bootverbose) // HACK!!!
+                printf("machdep_ap_bootstrap after smp_started!=0: AP CPU #%d launched\n", PCPU_GET(cpuid));
 
 	/* Start per-CPU event timers. */
 	cpu_initclocks_ap();
@@ -238,10 +243,19 @@
 
 			ret = platform_smp_start_cpu(pc);
 			if (ret == 0) {
+                                if (bootverbose) // HACK!!!
+                                        printf("cpu_mp_unleash attempting to wait for pc_awake: CPU %d, hwref=%jx, awake=%x\n",
+                                            pc->pc_cpuid, (uintmax_t)pc->pc_hwref,
+                                            pc->pc_awake);
+
 				timeout = 2000;	/* wait 2sec for the AP */
 				while (!pc->pc_awake && --timeout > 0)
 					DELAY(1000);
 			}
+                        if (bootverbose) // HACK!!!
+                                printf("cpu_mp_unleash after platform_smp_start_cpu and waiting: CPU %d, hwref=%jx, awake=%x\n",
+                                    pc->pc_cpuid, (uintmax_t)pc->pc_hwref,
+                                    pc->pc_awake);
 		} else {
 			pc->pc_awake = 1;
 		}
@@ -252,7 +266,13 @@
 				    pc->pc_awake);
 			smp_cpus++;
 		} else
+                { // HACK!!!
+                        if (bootverbose) // HACK!!!
+                                printf("cpu_mp_unleash adding pc_cpuid to stopped_cpus: CPU %d (dev=%x)\n",
+                                    pc->pc_cpuid, (int)pc->pc_hwref);
 			CPU_SET(pc->pc_cpuid, &stopped_cpus);
+                } // HACK!!!
+
 	}
 
 	ap_awake = 1;

(The above may not preserve all whitespace detail.)

I'll note that I did some experimenting with a system-clang
based kernel build, used with devel/powerpc64-binutils ,
avoiding loading kernel modules dynamically. I did not have
any boot problems but I'd not done enough activity to
infer too much. My normal builds are based on
devel/powerpc64-xoolchain-gcc related tools, including
devel/powerpc64-gcc .


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

_______________________________________________
[email protected] mailing list
https://lists.freebsd.org/mailman/listinfo/freebsd-ppc
To unsubscribe, send any mail to "[email protected]"
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.