Date: Tue, 22 Sep 2020 23:55:34 +0000 (UTC) From: Brandon Bergren <bdragon@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366033 - in head/sys/powerpc: aim ofw pseries Message-ID: <202009222355.08MNtYOt009947@repo.freebsd.org>
next in thread | raw e-mail | index | archive | help
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); }
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202009222355.08MNtYOt009947>