3981ea2cb4ed884146a0678345a640fb27195ac0
[akaros.git] / kern / src / init.c
1 /* See COPYRIGHT for copyright information. */
2
3 #ifdef __SHARC__
4 #pragma nosharc
5 #endif
6
7 #ifdef __BSD_ON_CORE_0__
8 #include Everything For Free -- It just works!!
9 #else
10
11 #include <arch/arch.h>
12 #include <arch/console.h>
13 #include <multiboot.h>
14 #include <stab.h>
15 #include <smp.h>
16
17 #include <atomic.h>
18 #include <stdio.h>
19 #include <string.h>
20 #include <assert.h>
21 #include <monitor.h>
22 #include <pmap.h>
23 #include <process.h>
24 #include <trap.h>
25 #include <syscall.h>
26 #include <kclock.h>
27 #include <manager.h>
28 #include <testing.h>
29
30 #ifdef __i386__
31 #include <arch/rl8168.h>
32 #include <arch/ne2k.h>
33 #include <arch/mptables.h>
34 #include <arch/pci.h>
35 #include <arch/ioapic.h>
36 #endif
37
38 void kernel_init(multiboot_info_t *mboot_info)
39 {
40         extern char (BND(__this, end) edata)[], (SNT end)[];
41
42         // Before doing anything else, complete the ELF loading process.
43         // Clear the uninitialized global data (BSS) section of our program.
44         // This ensures that all static/global variables start out zero.
45         memset(edata, 0, end - edata);
46
47         // Initialize the console.
48         // Can't call cprintf until after we do this!
49         cons_init();
50
51         print_cpuinfo();
52
53         // Old way, pre Zach's Ivy annotations
54         //multiboot_detect_memory((multiboot_info_t*)((uint32_t)mboot_info + KERNBASE));
55         //multiboot_print_memory_map((multiboot_info_t*)((uint32_t)mboot_info + KERNBASE));
56         
57         // Paul: Can't use KADDR as arg to multiboot_detect_memory
58         //  since multiboot_detect_memory is what sets npages. 
59         //  Must simulate KADDR macro (ugly).
60         multiboot_detect_memory((multiboot_info_t*SAFE)(void*TRUSTED)((physaddr_t)mboot_info + KERNBASE));
61         
62         multiboot_print_memory_map((multiboot_info_t*COUNT(1))KADDR((physaddr_t)mboot_info));
63
64         vm_init();
65
66         cache_init();
67         page_init();
68         page_check();
69         //test_page_coloring();
70
71         idt_init();
72         sysenter_init();
73         timer_init();
74         
75         // @todo: Add an arch specific init? This is ugly
76         #ifdef __i386__
77         mptables_parse();
78         pci_init();
79         ioapic_init(); // MUST BE AFTER PCI/ISA INIT!
80         #endif // __i386__
81                 
82         // this returns when all other cores are done and ready to receive IPIs
83         smp_boot();
84         env_init();
85         
86
87         /* EXPERIMENTAL NETWORK FUNCTIONALITY
88          * To enable, define __NETWORK__ in your Makelocal
89          * If enabled, will load the rl8168 driver (if device exists)
90          * and will a boot into userland matrix, so remote syscalls can be performed.
91          * If in simulation, will do some debugging information with the ne2k device
92          *
93          * Note: If you use this, you should also define the mac address of the 
94          * teathered machine via USER_MAC_ADDRESS in Makelocal.
95          *
96          * Additionally, you should have a look at the syscall server in the tools directory
97          */
98         #ifdef __NETWORK__
99         rl8168_init();          
100         ne2k_init();
101         #endif // __NETWORK__
102
103         manager();
104 }
105
106 /*
107  * Panic is called on unresolvable fatal errors.
108  * It prints "panic: mesg", and then enters the kernel monitor.
109  */
110 void _panic(const char *file, int line, const char *fmt,...)
111 {
112         va_list ap;
113
114         va_start(ap, fmt);
115         cprintf("kernel panic at %s:%d, from core %d: ", file, line, core_id());
116         vcprintf(fmt, ap);
117         cprintf("\n");
118         va_end(ap);
119
120 dead:
121         /* break into the kernel monitor, if we're core 0 */
122         if (core_id()) {
123                 smp_idle();
124                 panic("should never see me");
125         }
126         while (1)
127                 monitor(NULL);
128 }
129
130 /* like panic, but don't */
131 void _warn(const char *file, int line, const char *fmt,...)
132 {
133         va_list ap;
134
135         va_start(ap, fmt);
136         cprintf("kernel warning at %s:%d, from core %d: ", file, line, core_id());
137         vcprintf(fmt, ap);
138         cprintf("\n");
139         va_end(ap);
140 }
141
142 #endif //Everything For Free