2b27507a75e97f28e0d126e8531a9a67f1639ff1
[akaros.git] / kern / init.c
1 /* See COPYRIGHT for copyright information. */
2
3 #include <inc/stdio.h>
4 #include <inc/string.h>
5 #include <inc/assert.h>
6 #include <inc/multiboot.h>
7 #include <inc/stab.h>
8
9 #include <kern/monitor.h>
10 #include <kern/console.h>
11 #include <kern/pmap.h>
12 #include <kern/kclock.h>
13 #include <kern/env.h>
14 #include <kern/trap.h>
15
16 void kernel_init(multiboot_info_t *mboot_info)
17 {
18         extern char (BND(__this, end) edata)[], (SNT end)[];
19
20         // Before doing anything else, complete the ELF loading process.
21         // Clear the uninitialized global data (BSS) section of our program.
22         // This ensures that all static/global variables start out zero.
23         memset(edata, 0, end - edata);
24
25         // Initialize the console.
26         // Can't call cprintf until after we do this!
27         cons_init();
28
29         // Lab 2 memory management initialization functions
30         i386_detect_memory();
31         i386_vm_init();
32         page_init();
33         page_check();
34
35         // Lab 3 user environment initialization functions
36         env_init();
37         idt_init();
38
39         // Temporary test code specific to LAB 3
40 #if defined(TEST)
41         // Don't touch -- used by grading script!
42         ENV_CREATE2(TEST, TESTSIZE);
43 #else
44         // Touch all you want.
45         ENV_CREATE(user_hello);
46 #endif // TEST*
47
48
49         // We only have one user environment for now, so just run it.
50         env_run(&envs[0]);
51 }
52
53
54 /*
55  * Variable panicstr contains argument to first call to panic; used as flag
56  * to indicate that the kernel has already called panic.
57  */
58 static const char *NTS panicstr;
59
60 /*
61  * Panic is called on unresolvable fatal errors.
62  * It prints "panic: mesg", and then enters the kernel monitor.
63  */
64 void _panic(const char *file, int line, const char *fmt,...)
65 {
66         va_list ap;
67
68         if (panicstr)
69                 goto dead;
70         panicstr = fmt;
71
72         va_start(ap, fmt);
73         cprintf("kernel panic at %s:%d: ", file, line);
74         vcprintf(fmt, ap);
75         cprintf("\n");
76         va_end(ap);
77
78 dead:
79         /* break into the kernel monitor */
80         while (1)
81                 monitor(NULL);
82 }
83
84 /* like panic, but don't */
85 void _warn(const char *file, int line, const char *fmt,...) 
86 {
87         va_list ap;
88
89         va_start(ap, fmt);
90         cprintf("kernel warning at %s:%d: ", file, line);
91         vcprintf(fmt, ap);
92         cprintf("\n");
93         va_end(ap);
94 }
95
96
97         /* Backup of old shit that i hoard for no reason
98          *
99          * all of this was in kernel_init
100         cprintf("6828 decimal is %o octal!\n", 6828);
101         cprintf("Symtab section should begin at: 0x%x \n", stab);
102
103         // double check
104         mboot_info = (multiboot_info_t*)(0xc0000000 + (char*)mboot_info);
105         cprintf("Mboot info address: %p\n", mboot_info);
106         elf_section_header_table_t *elf_head= &(mboot_info->u.elf_sec);
107         cprintf("elf sec info address: %p\n", elf_head);
108     cprintf ("elf_sec: num = %u, size = 0x%x, addr = 0x%x, shndx = 0x%x\n",
109             elf_head->num, elf_head->size,
110             elf_head->addr, elf_head->shndx);
111         
112         struct Secthdr *elf_sym = (struct Secthdr*)(0xc0000000 + elf_head->addr + elf_head->size * 3);
113
114         cprintf("Symtab multiboot struct address: %p\n", elf_sym);
115         cprintf("Symtab multiboot address: %p\n", elf_sym->sh_addr);
116
117         // this walks a symtable, but we don't have one...
118         Elf32_Sym* symtab = (Elf32_Sym*)stab;
119         Elf32_Sym* oldsymtab = symtab;
120         for (; symtab < oldsymtab + 10 ; symtab++) {
121                 cprintf("Symbol name index = 0x%x\n", symtab->st_name);
122                 //cprintf("Symbol name = %s\n", stabstr + symtab->st_name);
123                 cprintf("Symbol vale = 0x%x\n", symtab->st_value);
124         }
125         */
126         /*
127         extern stab_t stab[], estab[];
128         extern char stabstr[];
129         stab_t* symtab;
130         // Spits out the stabs for functions
131         for (symtab = stab; symtab < estab; symtab++) {
132                 // gives us only functions.  not really needed if we scan by address
133                 if (symtab->n_type != 36)
134                         continue;
135                 cprintf("Symbol name = %s\n", stabstr + symtab->n_strx);
136                 cprintf("Symbol type = %d\n", symtab->n_type);
137                 cprintf("Symbol value = 0x%x\n", symtab->n_value);
138                 cprintf("\n");
139         }
140         */
141
142