Well, this old Pentium 4 computer does seems to have an IOAPIC, as
seen in the dmesg log:
[ 0.015459] Freeing SMP alternatives: 24k freed
[ 0.015506] ACPI: Core revision 20120320
[ 0.019020] ftrace: allocating 22322 entries in 44 pages
[ 0.031186] Enabling APIC mode: Flat. Using 1 I/O APICs
[ 0.031562] ..TIMER: vector=0x30 apic1=0 pin1=0 apic2=-1 pin2=-1
[ 0.031997] ..MP-BIOS bug: 8254 timer not connected to IO-APIC
[ 0.031997] ...trying to set up timer (IRQ0) through the 8259A ...
[ 0.031997] ..... (found apic 0 pin 0) ...
[ 0.042985] ....... works.
[ 0.042988] CPU0: Intel(R) Pentium(R) 4 CPU 2.26GHz stepping 04
[ 0.043996] Performance Events: Netburst events, Netburst P4/Xeon PMU driver.
[ 0.043996] ... version: 0
[ 0.043996] ... bit width: 40
[ 0.043996] ... generic registers: 18
[ 0.043996] ... value mask: 000000ffffffffff
[ 0.043996] ... max period: 0000007fffffffff
[ 0.043996] ... fixed-purpose events: 0
[ 0.043996] ... event mask: 000000000003ffff
[ 0.044304] NMI watchdog: enabled on all CPUs, permanently consumes
one hw-PMU counter.
[ 0.044410] Brought up 1 CPUs
[ 0.044415] Total of 1 processors activated (4517.85 BogoMIPS).
[ 0.045127] devtmpfs: initialized
Although "[ 0.031997] ..MP-BIOS bug: 8254 timer not connected to
IO-APIC" suggest some problem with it.
Up to now, by adding some Console::print in bootstrap.cpp (Nova):
extern "C" NORETURN
void bootstrap()
{
static mword barrier;
Cpu::init();
Console::print("Cpu::init done in bootstrap");
// Create idle EC
Ec::current = new Ec (Pd::current = &Pd::kern, 0, Ec::idle, Cpu::id);
Space_obj::insert_root (Sc::current = new Sc (&Pd::kern, Cpu::id,
Ec::current));
// Barrier: wait for all ECs to arrive here
for (Atomic::add (barrier, 1UL); barrier != Cpu::online; pause()) ;
Console::print("about to Msr::write");
Msr::write<uint64>(Msr::IA32_TSC, 0);
Console::print("will create root task");
// Create root task
if (Cpu::bsp) {
Hip::add_check();
Ec *root_ec = new Ec (&Pd::root, NUM_EXC + 1, &Pd::root,
Ec::root_invoke, Cpu::id, 0, USER_ADDR - 2 * PAGE_SIZE, 0);
Sc *root_sc = new Sc (&Pd::root, NUM_EXC + 2, root_ec,
Cpu::id, Sc::default_prio, Sc::default_quantum);
root_sc->remote_enqueue();
}
Console::print("Scheduling");
Sc::schedule();
}
I do see my "Scheduling" when booting. But I don't understand which
code is executed next.
Ok... I understand it is not a interesting computer to use Nova on.