[SLOF] [PATCH] Use TYPE for the standard output instead of io_putchar()

Thomas Huth thuth at redhat.com
Thu Jun 1 22:38:57 AEST 2017


All stdout text from the C code of the paflof binary (e.g. all output
from printf() and friends) is currently only written via io_putchar()
to the hvterm console. If the user decided to use a VGA display instead,
the text is currently not shown there. This is especially affecting the
output of the TFTP boot functions which are using printf() to provide
valuable information like IP addresses and progress indication to the
user. Let's fix this nuisance by routing the stdout text through the
TYPE Forth word instead, so that it now shows up on both, the hvterm
console and the VGA console.

Signed-off-by: Thomas Huth <thuth at redhat.com>
---
 slof/paflof.c |  3 ++-
 slof/ppc64.c  | 29 +++++++++++++++++++++++------
 2 files changed, 25 insertions(+), 7 deletions(-)

diff --git a/slof/paflof.c b/slof/paflof.c
index 2fc25c8..5c4f4e1 100644
--- a/slof/paflof.c
+++ b/slof/paflof.c
@@ -42,6 +42,8 @@ unsigned long epapr_magic;
 unsigned long epapr_ima_size;		// ePAPR initially mapped area size
 unsigned char hash_table[HASHSIZE*CELLSIZE];
 
+static int init_engine;
+
 #include ISTR(TARG,c)
 
 static int did_stackwarning;
@@ -73,7 +75,6 @@ long engine(int mode, long param_1, long param_2)
 	#include "prep.h"
 	#include "dict.xt"
 
-	static int init_engine = 0;
 	if (init_engine == 0) {
 		// one-time initialisation
 		init_engine = 1;
diff --git a/slof/ppc64.c b/slof/ppc64.c
index a3e84ae..83a8e82 100644
--- a/slof/ppc64.c
+++ b/slof/ppc64.c
@@ -71,19 +71,36 @@ static long writeLogByte_wrapper(long x, long y)
  */
 ssize_t write(int fd, const void *buf, size_t count)
 {
-	int i;
 	char *ptr = (char *)buf;
+	int len;
 
 	if (fd != 1 && fd != 2)
 		return 0;
 
-	for (i = 0; i < count; i++) {
-		if (*ptr == '\n')
-			io_putchar('\r');
-		io_putchar(*ptr++);
+	if (!init_engine || fd == 2) {
+		len = count;
+		while (len-- > 0) {
+			if (*ptr == '\n')
+				io_putchar('\r');
+			io_putchar(*ptr++);
+		}
+		return count;
+	}
+
+	while ((ptr = strchr(buf, '\n')) != NULL) {
+		forth_push((long)buf);
+		forth_push((long)ptr - (long)buf);
+		forth_eval("type cr");
+		buf = ptr + 1;
+	}
+	len = strlen(buf);
+	if (len) {
+		forth_push((long)buf);
+		forth_push(len);
+		forth_eval("type");
 	}
 
-	return i;
+	return count;
 }
 
 /* This should probably be temporary until a better solution is found */
-- 
1.8.3.1



More information about the SLOF mailing list