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