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

Mark Millard via freebsd-ppc <[email protected]>
Newsgroups gmane.os.freebsd.devel.ppc
Message-ID <[email protected]>
[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.)

# svnlite diff /mnt/usr/src/sys/ | more
Index: /mnt/usr/src/sys/powerpc/aim/mp_cpudep.c
===================================================================
--- /mnt/usr/src/sys/powerpc/aim/mp_cpudep.c    (revision 347003)
+++ /mnt/usr/src/sys/powerpc/aim/mp_cpudep.c    (working copy)
@@ -68,6 +68,46 @@
        case IBM970:
        case IBM970FX:
        case IBM970MP:
+               /* 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();
+
                /* Restore HID4 and HID5, which are necessary for the MMU */
 
 #ifdef __powerpc64__
@@ -314,45 +354,6 @@
        case IBM970:
        case IBM970FX:
        case IBM970MP:
-               /* 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();
                break;
        case IBMCELLBE:
                #ifdef NOTYET /* Causes problems if in instruction stream on 970 */



===
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.