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
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to