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 directory.
That said, I got a look at the code on https://github.com/udosteinberg/NOVA/tree/master/src 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.