Author: bdragon
Date: Tue Sep 22 23:55:34 2020
New Revision: 366033
URL: https://svnweb.freebsd.org/changeset/base/366033

Log:
  [PowerPC64LE] LE bringup work: locore / machdep / platform
  
  This is the initial LE changes required in the machdep code to get as far
  as platform attachment on qemu pseries.
  
  Sponsored by: Tag1 Consulting, Inc.

Modified:
  head/sys/powerpc/aim/aim_machdep.c
  head/sys/powerpc/aim/locore64.S
  head/sys/powerpc/ofw/ofw_machdep.c
  head/sys/powerpc/ofw/ofwcall64.S
  head/sys/powerpc/pseries/platform_chrp.c

Modified: head/sys/powerpc/aim/aim_machdep.c
==============================================================================
--- head/sys/powerpc/aim/aim_machdep.c  Tue Sep 22 23:49:30 2020        
(r366032)
+++ head/sys/powerpc/aim/aim_machdep.c  Tue Sep 22 23:55:34 2020        
(r366033)
@@ -61,6 +61,7 @@ __FBSDID("$FreeBSD$");
 #include "opt_kstack_pages.h"
 #include "opt_platform.h"
 
+#include <sys/endian.h>
 #include <sys/param.h>
 #include <sys/proc.h>
 #include <sys/systm.h>
@@ -257,6 +258,11 @@ aim_cpu_init(vm_offset_t toc)
        psl_kernset |= PSL_SF;
        if (mfmsr() & PSL_HV)
                psl_kernset |= PSL_HV;
+
+#if BYTE_ORDER == LITTLE_ENDIAN
+       psl_kernset |= PSL_LE;
+#endif
+
 #endif
        psl_userset = psl_kernset | PSL_PR;
 #ifdef __powerpc64__

Modified: head/sys/powerpc/aim/locore64.S
==============================================================================
--- head/sys/powerpc/aim/locore64.S     Tue Sep 22 23:49:30 2020        
(r366032)
+++ head/sys/powerpc/aim/locore64.S     Tue Sep 22 23:55:34 2020        
(r366033)
@@ -133,7 +133,11 @@ btext:
  * r7: Magic cookie (0xfb5d104d) to indicate that r6 has loader metadata
  */
        .text
-ASENTRY_NOPROF(__start)
+_NAKED_ENTRY(__start)
+
+#ifdef __LITTLE_ENDIAN__
+       RETURN_TO_NATIVE_ENDIAN
+#endif
        /* Set 64-bit mode if not yet set before branching to C */
        mfmsr   %r20
        li      %r21,1

Modified: head/sys/powerpc/ofw/ofw_machdep.c
==============================================================================
--- head/sys/powerpc/ofw/ofw_machdep.c  Tue Sep 22 23:49:30 2020        
(r366032)
+++ head/sys/powerpc/ofw/ofw_machdep.c  Tue Sep 22 23:55:34 2020        
(r366033)
@@ -572,6 +572,10 @@ OF_initial_setup(void *fdt_ptr, void *junk, int (*open
        ofmsr[0] = mfmsr();
        #ifdef __powerpc64__
        ofmsr[0] &= ~PSL_SF;
+       #ifdef __LITTLE_ENDIAN__
+       /* Assume OFW is BE. */
+       ofmsr[0] &= ~PSL_LE;
+       #endif
        #else
        __asm __volatile("mfsprg0 %0" : "=&r"(ofmsr[1]));
        #endif
@@ -645,7 +649,7 @@ OF_bootstrap()
                 * of its auto-remapping function once the kernel is loaded.
                 * This is a dirty hack, but what we have.
                 */
-#ifdef _LITTLE_ENDIAN
+#ifdef __LITTLE_ENDIAN__
                fdt_bt = &bs_le_tag;
 #else
                fdt_bt = &bs_be_tag;

Modified: head/sys/powerpc/ofw/ofwcall64.S
==============================================================================
--- head/sys/powerpc/ofw/ofwcall64.S    Tue Sep 22 23:49:30 2020        
(r366032)
+++ head/sys/powerpc/ofw/ofwcall64.S    Tue Sep 22 23:55:34 2020        
(r366033)
@@ -113,6 +113,7 @@ ASENTRY_NOPROF(ofwcall)
        /*
         * Set the MSR to the OF value. This has the side effect of disabling
         * exceptions, which is important for the next few steps.
+        * This does NOT, however, cause us to switch endianness.
         */
 
        addis   %r5,%r2,TOC_REF(ofmsr)@ha
@@ -138,9 +139,28 @@ ASENTRY_NOPROF(ofwcall)
        stw     %r5,4(%r1)
        stw     %r5,0(%r1)
 
+#ifdef __LITTLE_ENDIAN__
+       /* Atomic context switch w/ endian change */
+       mtmsrd  %r5, 1  /* Clear PSL_EE|PSL_RI */
+       addis   %r5,%r2,TOC_REF(ofmsr)@ha
+       ld      %r5,TOC_REF(ofmsr)@l(%r5)
+       ld      %r5,0(%r5)
+       mtsrr0  %r4
+       mtsrr1  %r5
+       LOAD_LR_NIA
+1:
+       mflr    %r5
+       addi    %r5, %r5, (2f-1b)
+       mtlr    %r5
+       li      %r5, 0
+       rfid
+2:
+       RETURN_TO_NATIVE_ENDIAN
+#else
        /* Finally, branch to OF */
        mtctr   %r4
        bctrl
+#endif
 
        /* Reload stack pointer, MSR, and reference PC from the OFW stack */
        ld      %r7,32(%r1)

Modified: head/sys/powerpc/pseries/platform_chrp.c
==============================================================================
--- head/sys/powerpc/pseries/platform_chrp.c    Tue Sep 22 23:49:30 2020        
(r366032)
+++ head/sys/powerpc/pseries/platform_chrp.c    Tue Sep 22 23:55:34 2020        
(r366033)
@@ -30,6 +30,7 @@
 #include <sys/cdefs.h>
 __FBSDID("$FreeBSD$");
 
+#include <sys/endian.h>
 #include <sys/param.h>
 #include <sys/systm.h>
 #include <sys/kernel.h>
@@ -414,7 +415,7 @@ chrp_cpuref_init(void)
        /* /chosen/cpu */
        if (OF_getproplen(chosen, "cpu") == sizeof(ihandle_t)) {
                OF_getprop(chosen, "cpu", &ibsp, sizeof(ibsp));
-               pbsp = OF_instance_to_package(ibsp);
+               pbsp = OF_instance_to_package(be32toh(ibsp));
                if (pbsp != -1)
                        get_cpu_reg(pbsp, &bsp_reg);
        }
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to