]> rtime.felk.cvut.cz Git - l4.git/blob - kernel/fiasco/src/kern/ia32/startup-ia32.cpp
update
[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 "kernel_uart.h"
22 #include "kmem.h"
23 #include "kmem_alloc.h"
24 #include "per_cpu_data.h"
25 #include "per_cpu_data_alloc.h"
26 #include "pic.h"
27 #include "static_init.h"
28 #include "std_macros.h"
29 #include "thread.h"
30 #include "timer.h"
31 #include "utcb_init.h"
32 #include "vmem_alloc.h"
33
34 #include "io_apic.h"
35
36 IMPLEMENT FIASCO_INIT FIASCO_NOINLINE
37 void
38 Startup::stage1()
39 {
40   Boot_info::init();
41   Config::init();
42   if (Kernel_uart::init(Kernel_uart::Init_before_mmu))
43     Banner::init();
44 }
45
46 IMPLEMENT FIASCO_INIT FIASCO_NOINLINE
47 void
48 Startup::stage2()
49 {
50   Kip_init::init();
51   Kmem_alloc::init();
52
53   // initialize initial page tables (also used for other CPUs later)
54   Kmem::init_mmu();
55
56   if (Kernel_uart::init(Kernel_uart::Init_after_mmu))
57     Banner::init();
58
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);
63
64   // set frequency in KIP to that of the boot CPU
65   Kip_init::init_freq(Cpu::cpus.cpu(0));
66
67   bool use_io_apic = Io_apic::init();
68   if (use_io_apic)
69     {
70       Config::apic = true;
71       Pic::disable_all_save();
72       Dirq_io_apic::init();
73     }
74   else
75     {
76       Pic::init();
77       Dirq_pic_pin::init();
78     }
79
80   Kernel_task::init(); // enables current_mem_space()
81   Vmem_alloc::init();
82
83   // initialize initial TSS, GDT, IDT
84   Kmem::init_cpu(Cpu::cpus.cpu(0));
85   Utcb_init::init();
86   Idt::init();
87   Fpu::init(0);
88   Apic::init();
89   Ipi::cpu(0).init();
90   Timer::init();
91   int timer_irq = Timer::irq_line();
92   if (use_io_apic)
93     {
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;
97
98       if (timer_irq >= 0)
99         {
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);
105         }
106     }
107   else
108     {
109       if (timer_irq >= 0)
110         Config::scheduler_irq_vector = 0x20 + timer_irq;
111       else
112         Config::scheduler_irq_vector = Config::Apic_timer_vector;
113     }
114
115   Idt::set_vectors_run();
116   Timer::master_cpu(0);
117   Apic::check_still_getting_interrupts();
118 //  Cpu::init_global_features();
119 }