problems running hello in fiasco

Fabian Sturm f at
Mon Mar 31 01:02:32 CEST 2003


On Sun, Mar 30, 2003 at 05:14:10PM +0200, Alexander Warg wrote:
> I'm not sure which constructors are called after the Timer, but I'll
> look for it tomorrow.

It still would be interesting to see if the order of the 
constructors is different than what is defined in static_init?
Probably not.

What I mainly missed was the point that not all classes
were initialized because they were excluded with the configure
options. Mainly the UART_INIT_PRIO and KDB_INIT_PRIO are 
interchanged (if I got it right).

So your guess was definitv right! It was the non existing serial
port which gets configured by the built in kdb.

In kdb.c is a line with:

 if(strstr(cmdline, " -nokdb") || strstr(cmdline, " -noserial")

but this comes only after:

  Uart *com = Kernel_uart::uart();

So the -noserial has not the effect I would need.
Maybe it would make sense to interchange the two lines?
Or split the check up into 

  if(strstr(cmdline, " -noserial"))

  Uart *com = Kernel_uart::uart();

  if(strstr(cmdline, " -nokdb"))

if kdb can work without a serial port.

If I follow the uart call I can track it down to this
part of code in drivers/uart-16550.cpp:

  Proc::Status o = Proc::cli_save();
  ier( 0 );    /* disable all rs-232 interrupts */
  mcr( 0x0b ); /* out2, rts, and dtr enabled */
  fcr( 1 );    /* enable fifo */
  fcr( 0x07 ); /* clear rcv xmit fifo */
  fcr( 1 );    /* enable fifo */
  lcr( 0 );    /* clear line control register */

  /* clearall interrupts */
  /*read*/ msr(); /* IRQID 0*/
  /*read*/ iir(); /* IRQID 1*/
  /*read*/ trb(); /* IRQID 2*/
  /*read*/ lsr(); /* IRQID 3*/

  while(lsr() & 1/*DATA READY*/) /*read*/ trb();

It hangs somewhere in here, due to non existing port.
So if I disable kdb everything works fine and I end up in the jdb
prompt, and if continued with g I get the hello world output!

> > What is initialized next I can only guess.
> > It seems to be some kind of linker magic with the minilib/construction.c
> > which calls all the functions which are declared with
> The "magic" in construction.c does simply run all C++ and C

Sorry my fault.
The problem why I called it magic was because I didn't saw the
additional "R". With that it makes sense, because it ends up in
two different macros.

> > STATIC_INITIALIZER_P(uart_console_init ,UART_INIT_PRIO);

Thanks a lot, Fabian

More information about the l4-hackers mailing list