[OpenBIOS] PATCH: Implement Forth source debugger for OpenBIOS

Laurent Vivier Laurent at Vivier.EU
Wed Nov 4 12:36:15 CET 2009


>Laurent Vivier wrote:
>
>>> In the meantime, I've looked again at the v2 patch I posted and I still 
>>> can't work out why the debugging output by printk() doesn't appear on a 
>>> VNC display for Qemu SPARC64, while it appears fine when Qemu SPARC64 is 
>>> invoked in -nographic mode. Can anyone shed any light on this?
>> 
>> Because "printk()" are sent to serial and must use only for debug purpose.
>> You must use forth words like "emit" or "type" to send characters to 
>display. For instance, look at "modules/cmdline.c":
>> 
>> static void
>> emit( int ch )
>> {
>>         PUSH( ch );
>>         fword("emit");
>> }
>> 
>> static int
>> emit_str( const char *str )
>> {
>>         int n = 0;
>>         while( *str ) {
>>                 n++;
>>                 emit( *str++ );
>>         }
>>         return n;
>> }
>
>Yeah, I did consider that this might be the case but it still doesn't 
>seem to make sense looking at the code. The source for the forth emit 
>word can be found in kernel/forth.c:
>
>
>/*
>  *   emit       ( char --  )
>  */
>
>static void emit(void)
>{
>#ifndef FCOMPILER
>         cell tmp = POP();
>         putchar(tmp);
>#else
>         (void) POP();
>#endif
>}
>
>
>while for SPARC64 the source for printk() can be found in 
>arch/sparc64/lib.c:
>
>
>/* Format a string and print it on the screen, just like the libc
>  * function printf.
>  */
>int printk( const char *fmt, ... )
>{
>         char *p, buf[512];
>         va_list args;
>         int i;
>
>         va_start(args, fmt);
>         i = vsnprintf(buf, sizeof(buf), fmt, args);
>         va_end(args);
>
>         for( p=buf; *p; p++ )
>                 putchar(*p);
>         return i;
>}
>
>
>Both of these use putchar() in order to write characters out to the 
>console, and yet one of them works in a graphical terminal and one of 
>them doesn't...
>

But "emit" is redefined later to "io-emit" which use "stdout" which can be serial or graphic:

0- arch/ppc/qemu/start.S:_entry (this is the bootstrap)

    ...
    bl      entry
    ...

1- arch/ppc/qemu/init.c:entry()

    ...
    initialize_forth();
    ...

2- arch/ppc/qemu/kernel.c:initialize_forth()

    ...
    PUSH_xt( bind_noname_func(arch_of_init) );
    fword("PREPOST-initializer");

    PC = (ucell)findword("initialize-of");
    ...

3- forth/system/main.fs:initialize-of

    ...
    install-console
    ...

4- forth/admin/iocontrol.fs:install-console

    ...
    ['] io-emit to emit
    ...

where io-emit is:

: io-emit ( char -- )
  io-out-char c!
  io-out-char 1 " write" stdout @ $call-method drop
;

And stdout is defined in arch/ppc/qemu/init.c:arch_of_init() (see 2- )


Regards,
Laurent
-- 
--------------------- Laurent at vivier.eu  ---------------------
"Tout ce qui est impossible reste à accomplir"    Jules Verne
"Things are only impossible until they're not" Jean-Luc Picard



More information about the OpenBIOS mailing list