svn commit: r366040 - head/sys/powerpc/powernv

Brandon Bergren bdragon at FreeBSD.org
Wed Sep 23 00:28:48 UTC 2020


Author: bdragon
Date: Wed Sep 23 00:28:47 2020
New Revision: 366040
URL: https://svnweb.freebsd.org/changeset/base/366040

Log:
  [PowerPC64LE] LE opal_call() implementation
  
  OPAL runs in big endian, so we need to rfid into it to switch endian
  atomically when branching to it, and we need to do the
  RETURN_TO_NATIVE_ENDIAN dance when it returns to us.
  
  Sponsored by:	Tag1 Consulting, Inc.

Modified:
  head/sys/powerpc/powernv/opal.c
  head/sys/powerpc/powernv/opalcall.S

Modified: head/sys/powerpc/powernv/opal.c
==============================================================================
--- head/sys/powerpc/powernv/opal.c	Wed Sep 23 00:21:51 2020	(r366039)
+++ head/sys/powerpc/powernv/opal.c	Wed Sep 23 00:28:47 2020	(r366040)
@@ -57,7 +57,7 @@ opal_check(void)
 	OF_getencprop(opal, "opal-entry-address", val, sizeof(val));
 	opal_entrypoint = ((uint64_t)val[0] << 32) | val[1];
 
-	opal_msr = mfmsr() & ~(PSL_EE | PSL_IR | PSL_DR | PSL_SE);
+	opal_msr = mfmsr() & ~(PSL_EE | PSL_IR | PSL_DR | PSL_SE | PSL_LE);
 
 	opal_initialized = 1;
 

Modified: head/sys/powerpc/powernv/opalcall.S
==============================================================================
--- head/sys/powerpc/powernv/opalcall.S	Wed Sep 23 00:21:51 2020	(r366039)
+++ head/sys/powerpc/powernv/opalcall.S	Wed Sep 23 00:28:47 2020	(r366040)
@@ -84,6 +84,10 @@ ASENTRY(opal_call)
 	xori	%r3,%r3,1
 #endif
 
+#ifdef __LITTLE_ENDIAN__
+	mtsrr1	%r3
+#endif
+
 	/* Shift registers over */
 	mr	%r3,%r4
 	mr	%r4,%r5
@@ -93,8 +97,23 @@ ASENTRY(opal_call)
 	mr	%r8,%r9
 	mr	%r9,%r10
 
+#ifdef __LITTLE_ENDIAN__
+	/* We need to rfid to switch endian. */
+	mfctr	%r11
+	mtsrr0	%r11
+	LOAD_LR_NIA
+1:
+	mflr	%r11
+	addi	%r11, %r11, (2f-1b)
+	mtlr	%r11
 	/* Call OPAL */
+	rfid
+2:
+	RETURN_TO_NATIVE_ENDIAN
+#else
+	/* Call OPAL */
 	bctrl
+#endif
 
 	/* Restore MSR */
 	mtmsrd	%r31


More information about the svn-src-head mailing list