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.