Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 13 May 2018 17:35:01 -0700
From:      Nathan Whitehorn <nwhitehorn@freebsd.org>
To:        freebsd-ppc@freebsd.org
Subject:   Re: head -r333575's kernel: fails to boot old PowerMac G5 so-called "Quad Core", failing very early
Message-ID:  <1c62913a-0caa-aa6e-b0b6-97c338aa50c7@freebsd.org>
In-Reply-To: <94E173AD-74C0-43ED-9D0D-86D9A56C2A74@yahoo.com>
References:  <94E173AD-74C0-43ED-9D0D-86D9A56C2A74@yahoo.com>

next in thread | previous in thread | raw e-mail | index | archive | help
This should be fixed if you update past r333594.
-Nathan

On 05/13/18 16:12, Mark Millard via freebsd-ppc wrote:
> I'd had to revert to the old kernel from the last time I'd
> updated the old PowerMac G5 "Quad Core" for powerpc64 style
> use [back in early Jan.]:
>
> # uname -apKU
> FreeBSD FBSDG5L 12.0-CURRENT FreeBSD 12.0-CURRENT  r327364M  powerpc powerpc64 1200054 1200063
>
> because buildkernel instalkernel for -r333575 results for
> all the following fail in the same way:
>
> A) devel/powerpc64-xtoolchain-gcc based build
>     (from /usr/ports/ -r469767 so before the upgrade to 6.4)
> B) gcc 4.2.1 based build
> C) system clang6 based build
>
> These were all amd64 -> powerpc64 cross builds. Each is a
> non-debug build --but with symbols.
>
> The following 3 lines are displayed and nothing more
> visible happens after that in the boot sequence, the
> lines are the ones that start with:
>
> GDB: no debug ports present
> KDB: debugger backends:
> KDB: current backend:
>
> It does not display any Copyright notice line or even
> clear the screen.
>
> The old -r327364 kernel boots the old PowerMac G5 "Quad Core"
> just fine (with the -r333575 world at this point).
>
> So far, this much suggests the issue is not toolchain related,
> although in all 3 cases devel/powerpc64-binutils is in use
> so it can not be eliminated as easily.
>
> [A problem is I'm very restricted on the amount of time
> I can be involved in bisecting this and 333575-327364==6211
> for the version span. Another problem is that, at the failure
> stage, getting information about failure details is
> problematical on the old PowerMac, even if I could apply
> the time for such.]
>
>
> For powerpc64 context I have:
>
> # more /usr/src/sys/powerpc/conf/GENERIC64vtsc-NODBG
> #
> # GENERIC -- Custom configuration for the powerpc/powerpc64
> #
>
> include "GENERIC64"
>
> ident   GENERIC64vtsc-NODBG
>
> makeoptions     DEBUG=-g                # Build kernel with gdb(1) debug symbols
>
> nooptions       PS3                     # Sony Playstation 3               HACK!!! to allow sc
>
> options         KDB                     # Enable kernel debugger support
>
> options         ALT_BREAK_TO_DEBUGGER
> options         BREAK_TO_DEBUGGER
>
> # For minimum debugger support (stable branch) use:
> options         KDB_TRACE               # Print a stack trace for a panic
> options         DDB                     # Enable the kernel debugger
> options         GDB                     # HACK!!! ...
>
> # Extra stuff:
> #options        VERBOSE_SYSINIT         # Enable verbose sysinit messages
> #options        BOOTVERBOSE=1
> #options        BOOTHOWTO=RB_VERBOSE
> #options        KTR
> #options        KTR_MASK=KTR_TRAP
> ##options       KTR_CPUMASK=0xF
> #options        KTR_VERBOSE
>
> # HACK!!! to allow sc for 2560x1440 display on Radeon X1950 that vt historically mishandled during booting
> device          sc
> #device                 kbdmux          # HACK: already listed by vt
> options         SC_OFWFB        # OFW frame buffer
> options         SC_DFLT_FONT    # compile font in
> makeoptions     SC_DFLT_FONT=cp437
>
>
> # Disable any extra checking for. . .
> nooptions       DEADLKRES               # Enable the deadlock resolver
> nooptions       INVARIANTS              # Enable calls of extra sanity checking
> nooptions       INVARIANT_SUPPORT       # Extra sanity checks of internal structures, required by INVARIANTS
> nooptions       WITNESS                 # Enable checks to detect deadlocks and cycles
> nooptions       WITNESS_SKIPSPIN        # Don't run witness on spinlocks for speed
> nooptions       DIAGNOSTIC
> nooptions       MALLOC_DEBUG_MAXZONES   # Separate malloc(9) zones
>
> device          filemon
> device          geom_label
>
>
>
> # svnlite diff /usr/src/contrib/llvm/lib/Target/PowerPC/PPCFrameLowering.cpp
> Index: /usr/src/contrib/llvm/lib/Target/PowerPC/PPCFrameLowering.cpp
> ===================================================================
> --- /usr/src/contrib/llvm/lib/Target/PowerPC/PPCFrameLowering.cpp       (revision 333575)
> +++ /usr/src/contrib/llvm/lib/Target/PowerPC/PPCFrameLowering.cpp       (working copy)
> @@ -1176,7 +1176,7 @@
>         // For SVR4, don't emit a move for the CR spill slot if we haven't
>         // spilled CRs.
>         if (isSVR4ABI && (PPC::CR2 <= Reg && Reg <= PPC::CR4)
> -          && !MustSaveCR)
> +          && (!MustSaveCR && isPPC64))
>           continue;
>
>         // For 64-bit SVR4 when we have spilled CRs, the spill location
>
>
>
> Note: The following file does not intend a powerpc64 functional change
> but a powerpc (32-bit) change:
>
> # svnlite diff /usr/src/sys/powerpc/ofw/ofw_machdep.c
> Index: /usr/src/sys/powerpc/ofw/ofw_machdep.c
> ===================================================================
> --- /usr/src/sys/powerpc/ofw/ofw_machdep.c      (revision 333575)
> +++ /usr/src/sys/powerpc/ofw/ofw_machdep.c      (working copy)
> @@ -116,26 +116,27 @@
>           * Assume that interrupt are disabled at this point, or
>           * SPRG1-3 could be trashed
>           */
> -#ifdef __powerpc64__
> -       __asm __volatile("mtsprg1 %0\n\t"
> -                        "mtsprg2 %1\n\t"
> -                        "mtsprg3 %2\n\t"
> -                        :
> -                        : "r"(ofmsr[2]),
> -                        "r"(ofmsr[3]),
> -                        "r"(ofmsr[4]));
> -#else
> -       __asm __volatile("mfsprg0 %0\n\t"
> -                        "mtsprg0 %1\n\t"
> -                        "mtsprg1 %2\n\t"
> -                        "mtsprg2 %3\n\t"
> -                        "mtsprg3 %4\n\t"
> -                        : "=&r"(ofw_sprg0_save)
> -                        : "r"(ofmsr[1]),
> -                        "r"(ofmsr[2]),
> -                        "r"(ofmsr[3]),
> -                        "r"(ofmsr[4]));
> +#ifndef __powerpc64__
> +       if (!(cpu_features & PPC_FEATURE_64))
> +               __asm __volatile("mfsprg0 %0\n\t"
> +                                "mtsprg0 %1\n\t"
> +                                "mtsprg1 %2\n\t"
> +                                "mtsprg2 %3\n\t"
> +                                "mtsprg3 %4\n\t"
> +                                : "=&r"(ofw_sprg0_save)
> +                                : "r"(ofmsr[1]),
> +                                "r"(ofmsr[2]),
> +                                "r"(ofmsr[3]),
> +                                "r"(ofmsr[4]));
> +       else
>   #endif
> +               __asm __volatile("mtsprg1 %0\n\t"
> +                                "mtsprg2 %1\n\t"
> +                                "mtsprg3 %2\n\t"
> +                                :
> +                                : "r"(ofmsr[2]),
> +                                "r"(ofmsr[3]),
> +                                "r"(ofmsr[4]));
>   }
>
>   static __inline void
> @@ -152,7 +153,8 @@
>           * PCPU data cannot be used until this routine is called !
>           */
>   #ifndef __powerpc64__
> -       __asm __volatile("mtsprg0 %0" :: "r"(ofw_sprg0_save));
> +       if (!(cpu_features & PPC_FEATURE_64))
> +               __asm __volatile("mtsprg0 %0" :: "r"(ofw_sprg0_save));
>   #endif
>   }
>   #endif
>
>
>
> Note: The following file's change is actually for
> !defined(__powerpc64__) added code . . .
>
> # svnlite diff /usr/src/sys/powerpc/aim/mmu_oea64.c
> Index: /usr/src/sys/powerpc/aim/mmu_oea64.c
> ===================================================================
> --- /usr/src/sys/powerpc/aim/mmu_oea64.c        (revision 333575)
> +++ /usr/src/sys/powerpc/aim/mmu_oea64.c        (working copy)
> @@ -1820,6 +1820,18 @@
>          PV_PAGE_UNLOCK(m);
>   }
>
> +#if defined(AIM) && !defined(__powerpc64__)
> +//
> +// Part of PowerMac G5 HACK FOR PROBLEM FINDING. . .
> +// (G5 used via 32-bit FreeBSD.)
> +//
> +
> +extern char _GOT_START_[]; // beginning of .got/.got.plt
> +extern char _GOT_END_[];   // ending    of .got/.got.plt
> +
> +extern vm_offset_t       __startkernel, __endkernel;
> +#endif
> +
>   /*
>    * Map a wired page into kernel virtual address space.
>    */
> @@ -1830,6 +1842,52 @@
>          struct pvo_entry *pvo, *oldpvo;
>
>          pvo = alloc_pvo_entry(0);
> +#if defined(AIM) && !defined(__powerpc64__)
> +       //
> +       // PowerMac G5 HACK FOR PROBLEM FINDING. . .
> +       // (G5 used via 32-bit FreeBSD.)
> +       //
> +       // As a problem-finding-aid try to catch some examples of
> +       // jumping to non-code in the kernel before it tries to
> +       // execute that that code. Hopefully this will show where
> +       // the bad jump into the likes of the .hash section is
> +       // happening. (dbb bt and vmcore.*'s have not lead to
> +       // that information so far.)
> +       //
> +       if (cpu_features & PPC_FEATURE_64)
> +       {
> +               // First deal with pages that should have the original
> +               // VM_PROT_EXECUTE status for something on the page
> +               // (most pages in the kernel area). So pages with some
> +               // byte(s) from .text, .got, or .got.plt, along with
> +               // any requested from before where __startkernel
> +               // indicates. Also any va requested from a page
> +               // containing where __endkernel indicates or later
> +               // gets VM_PROT_EXECUTE if such a va is requested.
> +               //
> +               // So: have just the rest of the kernel area not have
> +               // VM_PROT_EXECUTE status in hopes that it will report
> +               // where the code is that is making bad jumps to
> +               // non-code, such as jumping into the .hash section
> +               // instead of reporting on illegal instructions
> +               // from the incorrect traget area.
> +               //
> +               if ( va < ((vm_offset_t)(etext+(PAGE_SIZE-1)) & ~PAGE_MASK) )
> +                       pvo->pvo_pte.prot = VM_PROT_READ | VM_PROT_WRITE | VM_PROT_EXECUTE;
> +
> +               else if (  ((vm_offset_t)_GOT_START_ & ~PAGE_MASK) <= va
> +                       && va < ((vm_offset_t)(_GOT_END_+(PAGE_SIZE-1)) & ~PAGE_MASK)
> +                       )
> +                       pvo->pvo_pte.prot = VM_PROT_READ | VM_PROT_WRITE | VM_PROT_EXECUTE;
> +
> +               else if ( va < (__endkernel & ~PAGE_MASK) )
> +                       pvo->pvo_pte.prot = VM_PROT_READ | VM_PROT_WRITE;
> +
> +               else // Otherwise do as before the HACK:
> +                       pvo->pvo_pte.prot = VM_PROT_READ | VM_PROT_WRITE | VM_PROT_EXECUTE;
> +       }
> +       else
> +#endif
>          pvo->pvo_pte.prot = VM_PROT_READ | VM_PROT_WRITE | VM_PROT_EXECUTE;
>          pvo->pvo_pte.pa = (pa & ~ADDR_POFF) | moea64_calc_wimg(pa, ma);
>          pvo->pvo_vaddr |= PVO_WIRED;
>
>
>
> Note: The following should not matter because it is only for
> devel/powerpc64-gcc but gcc 4.2.1 and system clang6 got the
> same result:
>
> # svnlite diff /usr/ports/devel/powerpc64-gcc/Makefile
> Index: /usr/ports/devel/powerpc64-gcc/Makefile
> ===================================================================
> --- /usr/ports/devel/powerpc64-gcc/Makefile     (revision 469767)
> +++ /usr/ports/devel/powerpc64-gcc/Makefile     (working copy)
> @@ -2,7 +2,7 @@
>
>   PORTNAME=      gcc
>   PORTVERSION=   6.3.0
> -PORTREVISION=  5
> +PORTREVISION=  6
>   CATEGORIES=    devel
>   MASTER_SITES=  GCC/releases/gcc-${DISTVERSION}
>   PKGNAMEPREFIX?=        powerpc64-
> @@ -42,6 +42,7 @@
>   GNU_CONFIGURE= yes
>   CONFIGURE_OUTSOURCE=   yes
>   CONFIGURE_ARGS+=--target=${GCC_TARGET} --disable-nls --enable-languages=c,c++ \
> +               --enable-gnu-indirect-function \
>                  --without-headers \
>                  --with-gmp=${LOCALBASE} \
>                  --with-pkgversion="FreeBSD Ports Collection for ${PKGNAMEPREFIX:C/-//g}" \
> @@ -104,6 +105,6 @@
>
>   # This port and all its slave ports fail on aarch64 -- but not all
>   # the same way.  Provide this definition for the master.
> -BROKEN_aarch64?=       fails to package
> +#BROKEN_aarch64?=      fails to package
>
>   .include <bsd.port.post.mk>
>
>
> ===
> Mark Millard
> marklmi26-fbsd at yahoo.com
> ( dsl-only.net went
> away in early 2018-Mar)
>
>
>
>
>
>
> _______________________________________________
> freebsd-ppc@freebsd.org mailing list
> https://lists.freebsd.org/mailman/listinfo/freebsd-ppc
> To unsubscribe, send any mail to "freebsd-ppc-unsubscribe@freebsd.org"
>




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?1c62913a-0caa-aa6e-b0b6-97c338aa50c7>