Some evidence about the PowerMac G5 multiprocessor boot hang ups with the modern VM_MAX_KERNEL_ADDRESS value [found yet more staging info]

Mark Millard marklmi at yahoo.com
Sat Feb 16 22:37:47 UTC 2019


[I referred to 2 resets where I should have referred to
between the last reset and the ps_awake loop. So fixing
that .  . .]

On 2019-Feb-16, at 13:15, Mark Millard <marklmi at yahoo.com> wrote:

> [I got a successful boot and so report its messages
> from starting the CPUs. It has one interesting value
> display.]
> 
> On 2019-Feb-16, at 12:49, Mark Millard <marklmi at yahoo.com> wrote:
> 
>> [I added to moea64_cpu_bootstrap_native to see
>> more staging infomrtion.]
>> 
>> On 2019-Feb-16, at 12:07, Mark Millard <marklmi at yahoo.com> wrote:
>> 
>>> [I needed to allow more time after the 2 resets before
>>> having CPU 0 look at the memory. It was reporting
>>> older values instead of my added writes. The odd
>>> non-zero value was from before the activity of interest.]
>>> 
>>> I start with the new result found, then give supporting
>>> material.
>>> 
>>> I've now seen hangs with:
>>> 
>>> *(unsigned long*)0xc0000000000000f0)=0x10
>>> 
>>> for CPU 3. So the following completed:
>>> 
>>> void
>>> cpudep_ap_early_bootstrap(void)
>>> {
>>> #ifndef __powerpc64__
>>>      register_t reg;
>>> #endif
>>> 
>>>      switch (mfpvr() >> 16) {
>>>      case IBM970:
>>>      case IBM970FX:
>>>      case IBM970MP:
>>>              /* Restore HID4 and HID5, which are necessary for the MMU */
>>> 
>>> #ifdef __powerpc64__
>>>              mtspr(SPR_HID4, bsp_state[2]); powerpc_sync(); isync();
>>>              mtspr(SPR_HID5, bsp_state[3]); powerpc_sync(); isync();
>>> #else
>>>              __asm __volatile("ld %0, 16(%2); sync; isync;   \
>>>                  mtspr %1, %0; sync; isync;"
>>>                  : "=r"(reg) : "K"(SPR_HID4), "b"(bsp_state));
>>>              __asm __volatile("ld %0, 24(%2); sync; isync;   \
>>>                  mtspr %1, %0; sync; isync;"
>>>                  : "=r"(reg) : "K"(SPR_HID5), "b"(bsp_state));
>>> #endif
>>>              powerpc_sync();
>>>              break;
>>>      case IBMPOWER8:
>>>      case IBMPOWER8E:
>>>      case IBMPOWER9:
>>> #ifdef __powerpc64__
>>>              if (mfmsr() & PSL_HV) {
>>>                      isync();
>>>                      /*
>>>                       * Direct interrupts to SRR instead of HSRR and
>>>                       * reset LPCR otherwise
>>>                       */
>>>                      mtspr(SPR_LPID, 0);
>>>                      isync();
>>> 
>>>                      mtspr(SPR_LPCR, lpcr);
>>>                      isync();
>>>              }
>>> #endif
>>>              break;
>>>      }
>>> 
>>>      __asm __volatile("mtsprg 0, %0" :: "r"(ap_pcpu));
>>>      powerpc_sync();
>>> 
>>>      *(unsigned long*)0xc0000000000000f0 = 0x10; // HACK!!!
>>>      powerpc_sync(); // HACK!!!
>>> }
>>> 
>>> but the following (and later) did not complete:
>>> 
>>> void
>>> pmap_cpu_bootstrap(int ap)
>>> {
>>>      /*      
>>>       * No KTR here because our console probably doesn't work yet
>>>       */
>>> 
>>>      return (MMU_CPU_BOOTSTRAP(mmu_obj, ap));
>>> 
>>>      *(unsigned long*)0xc0000000000000f0 = 0x20; // HACK!!!
>>>      powerpc_sync(); // HACK!!!
>>> }
>>> 
>>> 
>>> . . .
>> 
>> The below additions lead to moea64_cpu_bootstrap_native
>> lead to:
>> 
>> *(unsigned long*)0xc0000000000000f0)=0x25
>> 
>> which indicates that moea64_cpu_bootstrap_native
>> got to its end but pmap_cpu_bootstrap (the caller
>> via MMU_CPU_BOOTSTRAP) did not record its:
>> 
>> *(unsigned long*)0xc0000000000000f0 = 0x20;
>> 
>> from after the call. moea64_cpu_bootstrap_native
>> (and MMU_CPU_BOOTRAP) seems to have trouble
>> returning to pmap_cpu_bootstrap.
>> 
>> 
>> The below // HACK!!! lines are what I added:
>> 
>> static void
>> moea64_cpu_bootstrap_native(mmu_t mmup, int ap)
>> {
>>       int i = 0;
>>       #ifdef __powerpc64__
>>       struct slb *slb = PCPU_GET(aim.slb);
>>       register_t seg0;
>>       #endif
>> 
>>       /*
>>        * Initialize segment registers and MMU
>>        */
>> 
>>       mtmsr(mfmsr() & ~PSL_DR & ~PSL_IR);
>> 
>>       *(unsigned long*)0xc0000000000000f0 = 0x21; // HACK!!!
>>       powerpc_sync(); // HACK!!!
>> 
>>       /*
>>        * Install kernel SLB entries
>>        */
>> 
>>       #ifdef __powerpc64__
>>               __asm __volatile ("slbia");
>>               __asm __volatile ("slbmfee %0,%1; slbie %0;" : "=r"(seg0) :
>>                   "r"(0));
>> 
>>               *(unsigned long*)0xc0000000000000f0 = 0x22; // HACK!!!
>>               powerpc_sync(); // HACK!!!
>> 
>>               for (i = 0; i < n_slbs; i++) {
>>                       if (!(slb[i].slbe & SLBE_VALID))
>>                               continue;
>> 
>>                       __asm __volatile ("slbmte %0, %1" ::
>>                           "r"(slb[i].slbv), "r"(slb[i].slbe));
>>               }
>> 
>>               *(unsigned long*)0xc0000000000000f0 = 0x23; // HACK!!!
>>               powerpc_sync(); // HACK!!!
>>       #else
>>               for (i = 0; i < 16; i++)
>>                       mtsrin(i << ADDR_SR_SHFT, kernel_pmap->pm_sr[i]);
>>       #endif
>> 
>>       /*
>>        * Install page table
>>        */
>> 
>>       __asm __volatile ("ptesync; mtsdr1 %0; isync"
>>           :: "r"(((uintptr_t)moea64_pteg_table & ~DMAP_BASE_ADDRESS)
>>                    | (uintptr_t)(flsl(moea64_pteg_mask >> 11))));
>> 
>>       *(unsigned long*)0xc0000000000000f0 = 0x24; // HACK!!!
>>       powerpc_sync(); // HACK!!!
>> 
>>       tlbia();
>> 
>>       *(unsigned long*)0xc0000000000000f0 = 0x25; // HACK!!!
>>       powerpc_sync(); // HACK!!!
>> }
>> 
> 
> From a successful boot, for reference:
> 
> Adding CPU 0, hwref=cd38, awake=1
> Trying to mount root from ufs:/dev/ufs/FBSDG5L2rootfs [rw,noatime]...
> Waking up CPU 3 (dev=c480)
> powermac_smp_start_cpu 's OF_getprop for CPU 3, hwref=c480, awake=0: res=4, reset=8c
> powermac_smp_start_cpu for CPU 3, hwref=c480, awake=0: rstvec_virtbase=0xe000000087fd2000
> powermac_smp_start_cpu for CPU 3, hwref=c480, awake=0: rstvec=0xe000000087fd208c
> Before reset 4&0 for CPU 3, hwref=c480, awake=0
> After reset 4&0 for CPU 3, hwref=c480, awake=0, *(unsigned long*)0xc0000000000000e0=0x0, *(unsigned long*)0xc0000000000000f0=0x25
> After attempted wait for awake CPU 3, hwref=c480, awake=1, *(unsigned long*)0xc0000000000000e0=0xc0000000016c6100, *(unsigned long*)0xc0000000000000f0=0x51
> cpu_mp_unleash attempting to wait for pc_awake: CPU 3, hwref=c480, awake=1
> cpu_mp_unleash after platform_smp_start_cpu and waiting: CPU 3, hwref=c480, awake=1
> Adding CPU 3, hwref=c480, awake=1
> Waking up CPU 2 (dev=c768)
> powermac_smp_start_cpu 's OF_getprop for CPU 2, hwref=c768, awake=0: res=4, reset=8b
> powermac_smp_start_cpu for CPU 2, hwref=c768, awake=0: rstvec=0xe000000087fd208b
> Before reset 4&0 for CPU 2, hwref=c768, awake=0
> After reset 4&0 for CPU 2, hwref=c768, awake=0, *(unsigned long*)0xc0000000000000e0=0xc0000000016c6100, *(unsigned long*)0xc0000000000000f0=0x51
> After attempted wait for awake CPU 2, hwref=c768, awake=1, *(unsigned long*)0xc0000000000000e0=0xc0000000016c5100, *(unsigned long*)0xc0000000000000f0=0x51
> cpu_mp_unleash attempting to wait for pc_awake: CPU 2, hwref=c768, awake=1
> cpu_mp_unleash after platform_smp_start_cpu and waiting: CPU 2, hwref=c768, awake=1
> Adding CPU 2, hwref=c768, awake=1
> Waking up CPU 1 (dev=ca50)
> powermac_smp_start_cpu 's OF_getprop for CPU 1, hwref=ca50, awake=0: res=4, reset=8a
> powermac_smp_start_cpu for CPU 1, hwref=ca50, awake=0: rstvec=0xe000000087fd208a
> Before reset 4&0 for CPU 1, hwref=ca50, awake=0
> After reset 4&0 for CPU 1, hwref=ca50, awake=0, *(unsigned long*)0xc0000000000000e0=0xc0000000016c5100, *(unsigned long*)0xc0000000000000f0=0x51
> After attempted wait for awake CPU 1, hwref=ca50, awake=1, *(unsigned long*)0xc0000000000000e0=0xc0000000016c4100, *(unsigned long*)0xc0000000000000f0=0x51
> cpu_mp_unleash attempting to wait for pc_awake: CPU 1, hwref=ca50, awake=1
> cpu_mp_unleash after platform_smp_start_cpu and waiting: CPU 1, hwref=ca50, awake=1
> Adding CPU 1, hwref=ca50, awake=1
> machdep_ap_bootstrap before ap_boot_mtx lock: AP CPU #3 launched
> machdep_ap_bootstrap before ap_boot_mtx lock: AP CPU #2 launched
> machdep_ap_bootstrap before ap_boot_mtx lock: AP CPU #1 launched
> SMP: AP CPU #3 launched
> SMP: AP CPU #2 launched
> SMP: AP CPU #1 launched
> machdep_ap_bootstrap after smp_started!=0: AP CPU #3 launched
> machdep_ap_bootstrap after smp_started!=0: AP CPU #2 launched
> machdep_ap_bootstrap after smp_started!=0: AP CPU #1 launched

The below has the bad reference to the 2 resets:

> Interstingly the 0x25 shows before the CPU 3 tied resets instead of
> the laster 0x20 (from pmap_cpu_bootstrap), 0x30 (from
> cpudep_ap_bootstrap), or 0x40 (from cpudep_ap_setup). The 0x51
> does show after the pc_awake loop.
> 

The 0x25 was shown after the 2 resets but before the pc_awake
wait loop. The 0x51 was seen after the pc_awake wait loop.

I'm going to delete the code reporting a bunch of information
that has been stable for both successful boots and hang-up
boots (for the modern VM_MAX_KERNEL_ADDRESS value).

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



More information about the freebsd-ppc mailing list