]> rtime.felk.cvut.cz Git - l4.git/blob - kernel/fiasco/src/kern/ia32/32/main-ia32-32.cpp
daa8d4b104d379f69319fcab2d703e65b70bcd72
[l4.git] / kernel / fiasco / src / kern / ia32 / 32 / main-ia32-32.cpp
1 /*
2  * Fiasco ia32 / UX
3  * Shared main startup/shutdown code
4  */
5
6 INTERFACE[ia32,ux]:
7
8 #include "initcalls.h"
9
10 class Kernel_thread;
11
12
13 IMPLEMENTATION[ia32,ux]:
14
15 #include <cstdio>
16 #include "config.h"
17 #include "cpu.h"
18 #include "div32.h"
19 #include "globals.h"
20 #include "kernel_task.h"
21 #include "kernel_thread.h"
22
23
24 FIASCO_INIT
25 void
26 kernel_main (void)
27 {
28   unsigned dummy;
29
30   Cpu const &cpu = *Cpu::boot_cpu();
31
32   // caution: no stack variables in this function because we're going
33   // to change the stack pointer!
34   cpu.print();
35   cpu.show_cache_tlb_info("");
36
37   printf ("\nFreeing init code/data: %lu bytes (%lu pages)\n\n",
38           (Address)(&Mem_layout::initcall_end - &Mem_layout::initcall_start),
39           (Address)(&Mem_layout::initcall_end - &Mem_layout::initcall_start 
40              >> Config::PAGE_SHIFT));
41
42   // Perform architecture specific initialization
43   main_arch();
44
45   // create kernel thread
46   static Kernel_thread *kernel = new (Ram_quota::root) Kernel_thread;
47   nil_thread = kernel;
48   Space *const ktask = Kernel_task::kernel_task();
49   check(kernel->bind(ktask, 0));
50
51   // switch to stack of kernel thread and bootstrap the kernel
52   asm volatile
53     ("  movl %%esp, %0          \n\t"   // save stack pointer in safe variable
54      "  movl %%esi, %%esp       \n\t"   // switch stack
55      "  call call_bootstrap     \n\t"   // bootstrap kernel thread
56      :  "=m" (boot_stack),
57         "=a" (dummy), "=c" (dummy), "=d" (dummy)
58      :  "a"(kernel), "S" (kernel->init_stack()));
59 }
60
61
62 //------------------------------------------------------------------------
63 IMPLEMENTATION[(ia32,ux) && mp]:
64
65 #include "kernel_thread.h"
66
67 void
68 main_switch_ap_cpu_stack(Kernel_thread *kernel)
69 {
70   Mword dummy;
71
72   // switch to stack of kernel thread and bootstrap the kernel
73   asm volatile
74     ("  movl %%esi, %%esp       \n\t"   // switch stack
75      "  call call_ap_bootstrap  \n\t"   // bootstrap kernel thread
76      :  "=a" (dummy), "=c" (dummy), "=d" (dummy)
77      :  "a"(kernel), "S" (kernel->init_stack()));
78 }