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