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

Justin Hibbits <[email protected]>
Newsgroups gmane.os.freebsd.devel.ppc
Message-ID <CAHSQbTD3ZvBp_+gWcoSZ=nOY+G0xLdp4qBCJ2Ty0DXi4x608VA@mail.gmail.com>
Hi Mark,

On Fri, May 10, 2019 at 6:23 AM Mark Millard <[email protected]> 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
_______________________________________________
[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.