]> rtime.felk.cvut.cz Git - l4.git/blob - kernel/fiasco/src/kern/ia32/startup-ia32.cpp
4cd0c14d4b7784ddd401fe7f082c1ead20a20850
[l4.git] / kernel / fiasco / src / kern / ia32 / startup-ia32.cpp
1 IMPLEMENTATION[ia32,amd64]:
2
3 #include <cstdlib>
4 #include <cstdio>
5
6 #include "apic.h"
7 #include "banner.h"
8 #include "boot_console.h"
9 #include "boot_info.h"
10 #include "config.h"
11 #include "cpu.h"
12 #include "dirq.h"
13 #include "dirq_io_apic.h"
14 #include "fpu.h"
15 #include "idt.h"
16 #include "initcalls.h"
17 #include "ipi.h"
18 #include "kernel_console.h"
19 #include "kernel_task.h"
20 #include "kip_init.h"
21 #include "kmem.h"
22 #include "kmem_alloc.h"
23 #include "per_cpu_data.h"
24 #include "per_cpu_data_alloc.h"
25 #include "pic.h"
26 #include "static_init.h"
27 #include "std_macros.h"
28 #include "thread.h"
29 #include "timer.h"
30 #include "utcb_init.h"
31 #include "vmem_alloc.h"
32
33 #include "io_apic.h"
34
35 IMPLEMENT FIASCO_INIT FIASCO_NOINLINE
36 void
37 Startup::stage1()
38 {
39   Boot_info::init();
40   Config::init();
41 }
42
43 IMPLEMENT FIASCO_INIT FIASCO_NOINLINE
44 void
45 Startup::stage2()
46 {
47   Banner::init();
48   Kip_init::init();
49   Kmem_alloc::init();
50
51   // initialize initial page tables (also used for other CPUs later)
52   Kmem::init_mmu();
53
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);
58
59   // set frequency in KIP to that of the boot CPU
60   Kip_init::init_freq(Cpu::cpus.cpu(0));
61
62   if (Io_apic::init())
63     {
64       Config::apic = true;
65       Pic::disable_all_save();
66       Dirq_io_apic::init();
67
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 };
71
72       if (   Config::scheduler_irq_vector >= Pic_base
73           && Config::scheduler_irq_vector < Pic_base + Pic_irqs)
74         {
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;
82         }
83     }
84   else
85     {
86       Pic::init();
87       Dirq_pic_pin::init();
88     }
89
90   Kernel_task::init(); // enables current_mem_space()
91   Vmem_alloc::init();
92
93   // initialize initial TSS, GDT, IDT
94   Kmem::init_cpu(Cpu::cpus.cpu(0));
95   Utcb_init::init();
96   Idt::init();
97   Fpu::init(0);
98   Apic::init();
99   Ipi::cpu(0).init();
100   Timer::init();
101   Timer::master_cpu(0);
102   Apic::check_still_getting_interrupts();
103 //  Cpu::init_global_features();
104 }