svn commit: r355209 - head/sys/powerpc/pseries

Leandro Lupori luporl at FreeBSD.org
Fri Nov 29 11:34:12 UTC 2019


Author: luporl
Date: Fri Nov 29 11:34:11 2019
New Revision: 355209
URL: https://svnweb.freebsd.org/changeset/base/355209

Log:
  [PPC] Remove extra \0 char inserted on vty by QEMU
  
  Since version 2.11.0, QEMU became bug-compatible with
  PowerVM's vty implementation, by inserting a \0 after
  every \r going to the guest. Guests are expected to
  workaround this issue by removing every \0 immediately
  following a \r.
  
  Reviewed by:	jhibbits
  Differential Revision:	https://reviews.freebsd.org/D22171

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

Modified: head/sys/powerpc/pseries/phyp_console.c
==============================================================================
--- head/sys/powerpc/pseries/phyp_console.c	Fri Nov 29 06:25:07 2019	(r355208)
+++ head/sys/powerpc/pseries/phyp_console.c	Fri Nov 29 11:34:11 2019	(r355209)
@@ -287,6 +287,7 @@ uart_phyp_get(struct uart_phyp_softc *sc, void *buffer
 {
 	int err;
 	int hdr = 0;
+	uint64_t i, j;
 
 	uart_lock(&sc->sc_mtx);
 	if (sc->inbuflen == 0) {
@@ -297,7 +298,7 @@ uart_phyp_get(struct uart_phyp_softc *sc, void *buffer
 			uart_unlock(&sc->sc_mtx);
 			return (-1);
 		}
-		hdr = 1; 
+		hdr = 1;
 	}
 
 	if (sc->inbuflen == 0) {
@@ -305,15 +306,35 @@ uart_phyp_get(struct uart_phyp_softc *sc, void *buffer
 		return (0);
 	}
 
-	if (bufsize > sc->inbuflen)
-		bufsize = sc->inbuflen;
-
 	if ((sc->protocol == HVTERMPROT) && (hdr == 1)) {
 		sc->inbuflen = sc->inbuflen - 4;
 		/* The VTERM protocol has a 4 byte header, skip it here. */
 		memmove(&sc->phyp_inbuf.str[0], &sc->phyp_inbuf.str[4],
 		    sc->inbuflen);
 	}
+
+	/*
+	 * Since version 2.11.0, QEMU became bug-compatible with
+	 * PowerVM's vty implementation, by inserting a \0 after
+	 * every \r going to the guest. Guests are expected to
+	 * workaround this issue by removing every \0 immediately
+	 * following a \r.
+	 */
+	if (hdr == 1) {
+		for (i = 0, j = 0; i < sc->inbuflen; i++, j++) {
+			if (i > j)
+				sc->phyp_inbuf.str[j] = sc->phyp_inbuf.str[i];
+
+			if (sc->phyp_inbuf.str[i] == '\r' &&
+			    i < sc->inbuflen - 1 &&
+			    sc->phyp_inbuf.str[i + 1] == '\0')
+				i++;
+		}
+		sc->inbuflen -= i - j;
+	}
+
+	if (bufsize > sc->inbuflen)
+		bufsize = sc->inbuflen;
 
 	memcpy(buffer, sc->phyp_inbuf.str, bufsize);
 	sc->inbuflen -= bufsize;


More information about the svn-src-head mailing list