970/PowerMac G5 cpudep_ap_bootstrap slb-related hangup *solved* . . .

Justin Hibbits chmeeedalf at gmail.com
Fri May 10 19:38:31 UTC 2019


Hi Mark,

On Fri, May 10, 2019 at 6:23 AM Mark Millard <marklmi at yahoo.com> wrote:
>
> [Having removed all my prior investigatory material, I include
> a svnlite diff that I've booted based on, a comparatively
> minimal diff from the head -r347003 that I started from.]
>
> On 2019-May-10, at 02:15, Mark Millard <marklmi at yahoo.com> wrote:
>
> > [This continues a prior message, but I choose a new subject
> > text for the testing that showed the kind of material working.]
> >
> > I have the slbtrap/handle_kernel_slb_spill working instead
> > of hanging up when it has an slb-miss (and well as when there
> > is no miss).
> >
> > In /usr/src/sys/powerpc/aim/mp_cpudep.c I moved the
> > 970 code for HID0 and HID1 from cpudep_ap_setup, code
> > that looks like,
> >
> >                /* Set HIOR to 0 */
> >                __asm __volatile("mtspr 311,%0" :: "r"(0));
> >                powerpc_sync();
> >
> >                /*
> >                 * The 970 has strange rules about how to update HID registers.
> >                 * See Table 2-3, 970MP manual
> >                 *
> >                 * Note: HID4 and HID5 restored already in
> >                 * cpudep_ap_early_bootstrap()
> >                 */
> >
> >                __asm __volatile("mtasr %0; sync" :: "r"(0));
> >        #ifdef __powerpc64__
> >                __asm __volatile(" \
> >                        sync; isync;                                    \
> >                        mtspr   %1, %0;                                 \
> >                        mfspr   %0, %1; mfspr   %0, %1; mfspr   %0, %1; \
> >                        mfspr   %0, %1; mfspr   %0, %1; mfspr   %0, %1; \
> >                        sync; isync"
> >                    :: "r"(bsp_state[0]), "K"(SPR_HID0));
> >                __asm __volatile("sync; isync;  \
> >                    mtspr %1, %0; mtspr %1, %0; sync; isync"
> >                    :: "r"(bsp_state[1]), "K"(SPR_HID1));
> >        #else
> >                __asm __volatile(" \
> >                        ld      %0,0(%2);                               \
> >                        sync; isync;                                    \
> >                        mtspr   %1, %0;                                 \
> >                        mfspr   %0, %1; mfspr   %0, %1; mfspr   %0, %1; \
> >                        mfspr   %0, %1; mfspr   %0, %1; mfspr   %0, %1; \
> >                        sync; isync"
> >                    : "=r"(reg) : "K"(SPR_HID0), "b"(bsp_state));
> >                __asm __volatile("ld %0, 8(%2); sync; isync;    \
> >                    mtspr %1, %0; mtspr %1, %0; sync; isync"
> >                    : "=r"(reg) : "K"(SPR_HID1), "b"(bsp_state));
> >        #endif
> >
> >                powerpc_sync();
> >
> > Here to? moved it to cpudep_ap_early_bootstrap, just before the
> > code for HID4 and HID5, and I commented out 2 #if/endif lines:
> >
> > void
> > cpudep_ap_early_bootstrap(void)
> > {
> > //#ifndef __powerpc64__
> >        register_t reg;
> > //#endif
> >
> >        switch (mfpvr() >> 16) {
> >        case IBM970:
> >        case IBM970FX:
> >        case IBM970MP:
> >> .>.> INSERT CODE HERE <.<.<.
> >
> >                /* 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;
> > . . .
> >
> > This does the initialization before cpudep_ap_bootstrap,
> > instead of after.
> >
> > With things then sufficiently initialized for PSL_IR|PSL_DR
> > code to doing things like pcpup->pc_curthread->td_pcb->
> > that sometimes have slb misses, it boots fine,
> > loading into the slb as needed. No more checkstop status
> > (or whatever it was).
> >
> > I do not know if non-970 contexts should have similar
> > changes in the ordering of initializations or not.
> > But, clearly, the 970 family members do need such.
> >
> > I'm not claiming that other material from other notes
> > that I sent out should be ignored, only that the above
> > changes the observed failing behavior, and so is a big
> > gain all by itself. And it is simple to do without
> > other investigations that might be involved in the
> > more overall context.
>
> Of course, whitespace details, may not be well preserved
> below. (The commenting out of the two #if/#endif lines
> was unnecessary and is not done in the below.)
>
<diff in PR 233863>

Good sleuthing.

I think the whole diff could be reduced to just moving the HIOR.  Can
you give r347463 a shot? It's the reduced diff of just moving HIOR.
If that's not sufficient, then I can move the HID0/HID1
initializations, but they didn't look relevant for early boot
stability when I reviewed.

- Justin


More information about the freebsd-ppc mailing list