Alex wrote:
I would suggest to instrument NOVA and see up to which point it gets.
Well, because I had no VGA output at all, I thought that bender was not working.
I removed it from GRUB config, and start with the kernel.
This does not help.

I also try the different parameters to Nova, but without change.
(The most obvious one was removing IOMMU).

The bring-up of the other CPUs/Hyperthread seem to be missing in your
log output. ([ 0] CORE:0:0:0 6:f:b:0 ....).
You are misled, this is not mine outout.
I don't have serial output (I 'stupidly' throw away my serial null cable).

I followed your suggestion to update BIOS.
BIOS gone from 2006 version to late 2011 one.
Now dmidecode does way much more nice information! (was having just about 5 
short hexadecimal tables before).
But that did not help.

I am not too sure how to keep a version of the Nova kernel to work on.
I searched for the source, but it does not seems to be kept in after the 
prepare... which leave the
the compiled .o and compiled hypervisor in the bin? directory of the build 

That said, I got a look at the code on
And it looks way too familiar.
In fact, I think I had isolated similar if not exact same symptom when I work 
on that few years? ago.

When I look in init.cpp code:
extern "C" INIT REGPARM (1)
void init (mword mbi)
    // Setup 0-page and 1-page
    memset (reinterpret_cast<void *>(&PAGE_0),  0,  PAGE_SIZE);
    memset (reinterpret_cast<void *>(&PAGE_1), ~0u, PAGE_SIZE);

    for (void (**func)() = &CTORS_G; func != &CTORS_E; (*func++)()) ;

    Hip::build (mbi);

    for (void (**func)() = &CTORS_C; func != &CTORS_G; (*func++)()) ;

    // Now we're ready to talk to the world
    Console::print ("\fNOVA Microhypervisor v%d-%07lx (%s): %s %s [%s]\n", CFG_VER, 
reinterpret_cast<mword>(&GIT_VER), ARCH, __DATE__, __TIME__, COMPILER_STRING);

I can like remember that I was blocking in these constructors code calling 
functions loops (more the
second one from memory). I believe I was back then using the same technique I 
was to use here:
adding while (1) line to see when it hangs and when it reboots.

I can see they are coming from hypervisor.ld file:
    .init_array : AT (ADDR (.init_array) - OFFSET)
        PROVIDE (CTORS_L = .);
        KEEP (SORT_BY_INIT_PRIORITY(*)(.init_array.65534 .ctors.00001))
        PROVIDE (CTORS_C = .);
        KEEP (SORT_BY_INIT_PRIORITY(*)(.init_array.65533 .ctors.00002))
        PROVIDE (CTORS_G = .);
        KEEP (SORT_BY_INIT_PRIORITY(*)(.init_array.* .ctors.*))
        KEEP (*(.init_array .ctors))
        PROVIDE (CTORS_E = .);
    } : kern
but that's looking like black magic to me.
I suspect this is a way to do what a C++ runtime would do to call static class 
constructors... but
this is mostly a guess from the .ctors name.

Anyway, back then I believe the code was not taken from git hub at prepare 
time, then erased after prepare.
And now, I am unsure if I must write patches in the patch directory or what.
I really wish I would have the Nova source kept, and that make would recompile 
Nova on demand but I have pretty
much no clue how to achieve that.

Genode users mailing list

Reply via email to