Author: bdragon
Date: Wed Sep 23 00:06:48 2020
New Revision: 366036
URL: https://svnweb.freebsd.org/changeset/base/366036

Log:
  [PowerPC64LE] Fix endianness issues in phyp and opal consoles.
  
  This applies to both pseries and powernv, which were tested at different
  points during the patchset development.
  
  Sponsored by: Tag1 Consulting, Inc.

Modified:
  head/sys/powerpc/powernv/opal_console.c
  head/sys/powerpc/pseries/phyp_console.c

Modified: head/sys/powerpc/powernv/opal_console.c
==============================================================================
--- head/sys/powerpc/powernv/opal_console.c     Wed Sep 23 00:03:35 2020        
(r366035)
+++ head/sys/powerpc/powernv/opal_console.c     Wed Sep 23 00:06:48 2020        
(r366036)
@@ -25,6 +25,7 @@
 #include <sys/cdefs.h>
 __FBSDID("$FreeBSD$");
 
+#include <sys/endian.h>
 #include <sys/param.h>
 #include <sys/conf.h>
 #include <sys/cons.h>
@@ -323,7 +324,7 @@ uart_opal_get(struct uart_opal_softc *sc, void *buffer
        int hdr = 0;
 
        if (sc->protocol == OPAL_RAW) {
-               uint64_t len = bufsize;
+               uint64_t len = htobe64(bufsize);
                uint64_t olen = (uint64_t)&len;
                uint64_t obuf = (uint64_t)buffer;
 
@@ -336,7 +337,7 @@ uart_opal_get(struct uart_opal_softc *sc, void *buffer
                if (err != OPAL_SUCCESS)
                        return (-1);
 
-               bufsize = len;
+               bufsize = be64toh(len);
        } else {
                uart_lock(&sc->sc_mtx);
                if (sc->inbuflen == 0) {
@@ -347,6 +348,7 @@ uart_opal_get(struct uart_opal_softc *sc, void *buffer
                                return (-1);
                        }
                        hdr = 1; 
+                       sc->inbuflen = be64toh(sc->inbuflen);
                }
 
                if (sc->inbuflen == 0) {
@@ -391,7 +393,9 @@ uart_opal_put(struct uart_opal_softc *sc, void *buffer
                len = bufsize;
 
                uart_opal_real_map_outbuffer(&obuf, &olen);
+               *(uint64_t*)olen = htobe64(*(uint64_t*)olen);
                err = opal_call(OPAL_CONSOLE_WRITE, sc->vtermid, olen, obuf);
+               *(uint64_t*)olen = be64toh(*(uint64_t*)olen);
                uart_opal_real_unmap_outbuffer(&len);
        } else {
                uart_lock(&sc->sc_mtx);
@@ -406,7 +410,9 @@ uart_opal_put(struct uart_opal_softc *sc, void *buffer
                len = 4 + bufsize;
 
                uart_opal_real_map_outbuffer(&obuf, &olen);
+               *(uint64_t*)olen = htobe64(*(uint64_t*)olen);
                err = opal_call(OPAL_CONSOLE_WRITE, sc->vtermid, olen, obuf);
+               *(uint64_t*)olen = be64toh(*(uint64_t*)olen);
                uart_opal_real_unmap_outbuffer(&len);
 
                uart_unlock(&sc->sc_mtx);

Modified: head/sys/powerpc/pseries/phyp_console.c
==============================================================================
--- head/sys/powerpc/pseries/phyp_console.c     Wed Sep 23 00:03:35 2020        
(r366035)
+++ head/sys/powerpc/pseries/phyp_console.c     Wed Sep 23 00:06:48 2020        
(r366036)
@@ -27,6 +27,7 @@
 #include <sys/cdefs.h>
 __FBSDID("$FreeBSD$");
 
+#include <sys/endian.h>
 #include <sys/param.h>
 #include <sys/kdb.h>
 #include <sys/kernel.h>
@@ -306,6 +307,11 @@ uart_phyp_get(struct uart_phyp_softc *sc, void *buffer
                return (0);
        }
 
+#if BYTE_ORDER == LITTLE_ENDIAN
+       sc->phyp_inbuf.u64[0] = be64toh(sc->phyp_inbuf.u64[0]);
+       sc->phyp_inbuf.u64[1] = be64toh(sc->phyp_inbuf.u64[1]);
+#endif
+
        if ((sc->protocol == HVTERMPROT) && (hdr == 1)) {
                sc->inbuflen = sc->inbuflen - 4;
                /* The VTERM protocol has a 4 byte header, skip it here. */
@@ -380,8 +386,8 @@ uart_phyp_put(struct uart_phyp_softc *sc, void *buffer
        }
 
        do {
-           err = phyp_hcall(H_PUT_TERM_CHAR, sc->vtermid, len, cbuf.u64[0],
-                           cbuf.u64[1]);
+           err = phyp_hcall(H_PUT_TERM_CHAR, sc->vtermid, len, 
htobe64(cbuf.u64[0]),
+                           htobe64(cbuf.u64[1]));
                DELAY(100);
        } while (err == H_BUSY);
 
_______________________________________________
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