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