1 IMPLEMENTATION[ia32,amd64]:
8 #include "boot_console.h"
13 #include "dirq_io_apic.h"
16 #include "initcalls.h"
18 #include "kernel_console.h"
19 #include "kernel_task.h"
21 #include "kernel_uart.h"
23 #include "kmem_alloc.h"
24 #include "per_cpu_data.h"
25 #include "per_cpu_data_alloc.h"
27 #include "static_init.h"
28 #include "std_macros.h"
31 #include "utcb_init.h"
32 #include "vmem_alloc.h"
36 IMPLEMENT FIASCO_INIT FIASCO_NOINLINE
42 if (Kernel_uart::init(Kernel_uart::Init_before_mmu))
46 IMPLEMENT FIASCO_INIT FIASCO_NOINLINE
53 // initialize initial page tables (also used for other CPUs later)
56 if (Kernel_uart::init(Kernel_uart::Init_after_mmu))
59 // Initialize cpu-local data management and run constructors for CPU 0
60 Per_cpu_data::init_ctors(Kmem_alloc::allocator());
61 Per_cpu_data_alloc::alloc(0);
62 Per_cpu_data::run_ctors(0);
64 // set frequency in KIP to that of the boot CPU
65 Kip_init::init_freq(Cpu::cpus.cpu(0));
67 bool use_io_apic = Io_apic::init();
71 Pic::disable_all_save();
80 Kernel_task::init(); // enables current_mem_space()
83 // initialize initial TSS, GDT, IDT
84 Kmem::init_cpu(Cpu::cpus.cpu(0));
91 int timer_irq = Timer::irq_line();
94 // If we use the IOAPIC, we route our timer IRQ to
95 // Config::Apic_timer_vector, even with PIT or RTC
96 Config::scheduler_irq_vector = Config::Apic_timer_vector;
100 unsigned const pic_pin = Io_apic::legacy_override(timer_irq);
101 // assume the legacy irqs are routet to IO-APIC 0
102 Io_apic_entry e = Io_apic::apic(0)->read_entry(pic_pin);
103 e.vector(Config::Apic_timer_vector);
104 Io_apic::apic(0)->write_entry(pic_pin, e);
110 Config::scheduler_irq_vector = 0x20 + timer_irq;
112 Config::scheduler_irq_vector = Config::Apic_timer_vector;
115 Idt::set_vectors_run();
116 Timer::master_cpu(0);
117 Apic::check_still_getting_interrupts();
118 // Cpu::init_global_features();