Date: Fri, 15 Feb 2019 20:32:38 -0800 From: Mark Millard <marklmi@yahoo.com> To: Justin Hibbits <chmeeedalf@gmail.com> Cc: Mark Millard via freebsd-ppc <freebsd-ppc@freebsd.org> Subject: Re: Some evidence about the PowerMac G5 multiprocessor boot hang ups with the modern VM_MAX_KERNEL_ADDRESS value Message-ID: <C35575A8-6316-40CB-B6E7-B2FB7F438EA4@yahoo.com> In-Reply-To: <20190215180421.61afcae3@ralga.knownspace> References: <11680D15-D43D-4115-AF4F-5F6E4E0022C9@yahoo.com> <9FBCA729-CE80-44CD-8873-431853E55231@yahoo.com> <1F3411CF-3D28-43C0-BEF1-4672B5CC1543@yahoo.com> <20190215151710.35545a26@ralga.knownspace> <6445CE54-26AA-4E21-B17E-921D72D4081A@yahoo.com> <20190215160942.1b282f71@ralga.knownspace> <744610C7-90EB-42A0-8B08-AFA0F12E5994@yahoo.com> <20190215180421.61afcae3@ralga.knownspace>
next in thread | previous in thread | raw e-mail | index | archive | help
[I've had to search for an address that would not have my values corrupted/replaced. I did not find one. I've added the assignment requested before the PCPU_SET but until I find an address to use that preserves the values that I assign, it likely does not matter.] On 2019-Feb-15, at 16:04, Justin Hibbits <chmeeedalf at gmail.com> wrote: > On Fri, 15 Feb 2019 15:26:09 -0800 > Mark Millard <marklmi@yahoo.com> wrote: > >> On 2019-Feb-15, at 14:09, Justin Hibbits <chmeeedalf at gmail.com> >> wrote: >> >>> On Fri, 15 Feb 2019 14:01:18 -0800 >>> Mark Millard <marklmi@yahoo.com> wrote: >>> >>>> . . . >>>> >>>> Just to be sure, was the 0xc prefix a typo >>>> (vs. 0xe as a prefix)?: >>>> >>>> 0xc000000000000010 >>>> vs. >>>> 0xe000000000000010 >>> >>> No, 0xc is correct. 0xc... is the address of the DMAP, and it so >>> happens that the upper bits are ignored in real mode, simply by the >>> fact that they're not placed onto the address bus. We take >>> advantage of that elsewhere as well. So writing to 0xc000....10 >>> actually writes to 0x0000...10, both in real mode and translated >>> mode. Writing to this at various points when the AP is starting >>> up, we can see just how far into the boot it gets. >>> >>>> . . . >> >> I got an odd result from a successful boot. But first >> notes what I did to the code: >> >> I used 0xc000000000000010 via: >> >> + *(unsigned long*)0xc000000000000010 = 0x10; // HACK!!! >> + powerpc_sync(); // HACK!!! >> >> just before returning from cpudep_ap_early_bootstrap >> >> + *(unsigned long*)0xc000000000000010 = 0x20; // HACK!!! >> + powerpc_sync(); // HACK!!! >> >> just before return from pmap_cpu_bootstrap >> >> + *(unsigned long*)0xc000000000000010 = 0x30; // HACK!!! >> + powerpc_sync(); // HACK!!! >> >> just before return from cpudep_ap_bootstrap >> >> + *(unsigned long*)0xc000000000000010 = 0x40; // HACK!!! >> + powerpc_sync(); // HACK!!! >> >> just before returning from cpudep_ap_setup >> >> + *(unsigned long*)0xc000000000000010 = 0x51; // HACK!!! >> + powerpc_sync(); // HACK!!! >> >> just before the ap_letgo loop in machdep_ap_boostrap [so just >> after the PCPU_SET(away,1)] >> >> + *(unsigned long*)0xc000000000000010 = 0x50; // HACK!!! >> + powerpc_sync(); // HACK!!! >> >> just before sched_throw(NULL) in machdep_ap_bootstrap >> >> >> For CPU 3 just after the two (void)*rstvec related >> code sequences powermac_smp_start_cpu reported: >> >> *(unsigned long*)0xc000000000000010=0xffa34878A >> >> For CPU 2 just after the two (void)*rstvec related >> code sequences powermac_smp_start_cpu reported: >> >> *(unsigned long*)0xc000000000000010=0x51 >> >> For CPU 1 just after the two (void)*rstvec related >> code sequences powermac_smp_start_cpu reported: >> >> *(unsigned long*)0xc000000000000010=0x51 >> >> It looks to me like something is using the memory >> that 0xc000000000000010 maps to. >> >> None of them reported the 0x50 from just before >> the sched_throw(NULL) . >> >> >> === >> Mark Millard >> marklmi at yahoo.com >> ( dsl-only.net went >> away in early 2018-Mar) >> > > Interesting. That value looks like it could be an OpenFirmware > phandle. PowerISA does state that the first 256 bytes of memory is > free for the OS (or firmware) to use as it sees fit, and we already > know address 0x80 is special for OF. Maybe pick another address if you > wish to continue this experiment. Can you write at the beginning of > machdep_ap_bootstrap() some value, just before the PCPU_SET()? And then > right after the sync? Using 0xc000000000000020 resulted in the CPU 3 case showing: *(unsigned long*)0xc000000000000020=0x0 CPU 2 and CPU 1 again showed 0x51, as expected. The same happened for 0xc000000000000030 . After that I added the 0x5F hack shown below (showing the 0xc0...40 address attempt): void machdep_ap_bootstrap(void) { *(unsigned long*)0xc000000000000040 = 0x5F; // HACK!!! powerpc_sync(); // HACK!!! PCPU_SET(awake, 1); __asm __volatile("msync; isync"); *(unsigned long*)0xc000000000000040 = 0x51; // HACK!!! powerpc_sync(); // HACK!!! while (ap_letgo == 0) __asm __volatile("or 31,31,31"); __asm __volatile("or 6,6,6"); . . . Then I continued my search for an address where my assigned values would survive over the duration required. The same happened for 0xc000000000000040 . The same happened for 0xc000000000000050 . The same happened for 0xc000000000000060 . The same happened for 0xc000000000000070 . Is there another reasonable address range to try? (I've not tried any 0xc0000000000000?8 addresses.) I'll remind that machdep_ap_bootstrap for CPU 3 does echo its own messages even when the hang up happens, proving that it gets past the PCPU_SET(awake,1) and the ap_letgo loop. May be whatever clobbers 0xc0000000000000?0 content sometimes clobbers something important to getting pc_awake for CPU 3 set in the right place and to the handling of CPU 2? === Mark Millard marklmi at yahoo.com ( dsl-only.net went away in early 2018-Mar)
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?C35575A8-6316-40CB-B6E7-B2FB7F438EA4>