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"
22 #include "kmem_alloc.h"
23 #include "per_cpu_data.h"
24 #include "per_cpu_data_alloc.h"
26 #include "static_init.h"
27 #include "std_macros.h"
30 #include "utcb_init.h"
31 #include "vmem_alloc.h"
35 IMPLEMENT FIASCO_INIT FIASCO_NOINLINE
43 IMPLEMENT FIASCO_INIT FIASCO_NOINLINE
51 // initialize initial page tables (also used for other CPUs later)
54 // Initialize cpu-local data management and run constructors for CPU 0
55 Per_cpu_data::init_ctors(Kmem_alloc::allocator());
56 Per_cpu_data_alloc::alloc(0);
57 Per_cpu_data::run_ctors(0);
59 // set frequency in KIP to that of the boot CPU
60 Kip_init::init_freq(Cpu::cpus.cpu(0));
65 Pic::disable_all_save();
68 // If we use the IOAPIC, we route our timer IRQ to
69 // Config::Apic_timer_vector, even with PIT or RTC
70 enum { Pic_base = 0x20, Pic_irqs = 0x10 };
72 if ( Config::scheduler_irq_vector >= Pic_base
73 && Config::scheduler_irq_vector < Pic_base + Pic_irqs)
75 unsigned const pic_pin
76 = Io_apic::legacy_override(Config::scheduler_irq_vector - Pic_base);
77 // assume the legacy irqs are routet to IO-APIC 0
78 Io_apic_entry e = Io_apic::apic(0)->read_entry(pic_pin);
79 e.vector(Config::Apic_timer_vector);
80 Io_apic::apic(0)->write_entry(pic_pin, e);
81 Config::scheduler_irq_vector = Config::Apic_timer_vector;
90 Kernel_task::init(); // enables current_mem_space()
93 // initialize initial TSS, GDT, IDT
94 Kmem::init_cpu(Cpu::cpus.cpu(0));
101 Timer::master_cpu(0);
102 Apic::check_still_getting_interrupts();
103 // Cpu::init_global_features();