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

Alexey Kardashevskiy aik at ozlabs.ru
Tue Jun 6 16:28:02 AEST 2017


On 01/06/17 22:38, Thomas Huth wrote:
> 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

Why not stderr as well?


> 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 */
> 


-- 
Alexey


More information about the SLOF mailing list