]> git.dujemihanovic.xyz Git - nameless-os.git/blob - kernel/kernel/kernel.c
cd3e228a0867ddf370fdabd48acdd6c9af223cf8
[nameless-os.git] / kernel / kernel / kernel.c
1 #include <tty.h>
2 #include <io.h>
3 #include <irq/idt.h>
4 #include <irq/interrupt.h>
5 #include <irq/i8259a.h>
6 #include <stdint.h>
7 #include <mm/paging.h>
8 #include <panic.h>
9
10 struct idt_descriptor idt[256] __attribute__((aligned(0x10)));
11 struct idtr idtr __attribute__((aligned(0x10)));
12 extern void (*_int_handler_table[48])(void);
13
14 struct e820_map {
15 uint64_t base;
16 uint64_t length;
17 uint32_t type;
18 uint32_t attrib;
19 };
20
21 void print_e820(struct e820_map *mmap, int mmap_size)
22 {
23 kprint(" Base | Length | Type | Attrib |\n", 0);
24 kprint("------------------------------------------------------------\n", 0);
25 for (int i=0; i<mmap_size; i++) {
26 kprintq(mmap[i].base, 1);
27 kprintc('|', 0);
28 kprintq(mmap[i].length, 1);
29 kprintc('|', 0);
30 kprintd(mmap[i].type, 1);
31 kprintc('|', 0);
32 kprintd(mmap[i].attrib, 1);
33 kprintc('|', 0);
34 kprintc('\n', 0);
35 }
36 }
37
38 /* Small handler for double faults. Will be put elsewhere eventually. */
39 int double_fault_handler(struct interrupt_frame *frame)
40 {
41 kprint("Double fault occurred!\n", VGA_COLOR_BRIGHT_RED);
42 kprint("EAX: ", 0);
43 kprintd(frame->eax, 1);
44 kprintc(' ', 0);
45 kprint("EBX: ", 0);
46 kprintd(frame->ebx, 1);
47 kprintc(' ', 0);
48 kprint("ECX: ", 0);
49 kprintd(frame->ecx, 1);
50 kprintc(' ', 0);
51 kprint("EDX: ", 0);
52 kprintd(frame->edx, 1);
53 kprintc('\n', 0);
54 kprint("EBP: ", 0);
55 kprintd(frame->ebp, 1);
56 kprintc(' ', 0);
57 kprint("ESP: ", 0);
58 kprintd(frame->esp, 1);
59 kprintc('\n', 0);
60 kprint("ESI: ", 0);
61 kprintd(frame->esi, 1);
62 kprintc(' ', 0);
63 kprint("EDI: ", 0);
64 kprintd(frame->edi, 1);
65 kprintc('\n', 0);
66 kprint("EIP: ", 0);
67 kprintd(frame->eip, 1);
68 kprintc(' ', 0);
69 kprint("EFLAGS: ", 0);
70 kprintd(frame->eflags, 1);
71 kprintc('\n', 0);
72 PANIC("double fault");
73 }
74
75 void kmain(struct e820_map *mmap, int mmap_size)
76 {
77 screen_clear();
78 kprint("Welcome to Nameless OS!\nRunning revision: ", 0);
79 kprint(GIT_COMMIT, 0);
80 kprint("\n", 0);
81 kprint("BIOS memory map:\n", 0);
82 print_e820(mmap, mmap_size);
83 kprint("Preparing IDT...\n", 0);
84 for (int i=0; i<48; i++) {
85 idt_set_descriptor(idt, i, 0x8, _int_handler_table[i], IDT_INTERRUPT_GATE, 0);
86 }
87 kprint("IDT prepared, loading...\n", 0);
88 populate_idtr(&idtr, idt);
89 load_idt(idtr);
90 kprint("Setting up interrupts...\n", 0);
91 register_interrupt(8, &double_fault_handler);
92 pic_init(0x20, 0x28);
93 pic_mask_all();
94 asm volatile ("sti");
95 kprint("All done\n", 0);
96 while(1);
97 }