]> git.dujemihanovic.xyz Git - nameless-os.git/blob - kernel/kernel.c
9257a0e9cdedc7a251d84912414f5591c9c87976
[nameless-os.git] / kernel / kernel.c
1 #include <tty.h>
2 #include <io.h>
3 #include <irq/idt.h>
4 #include <irq/i8259a.h>
5 #include <stdint.h>
6 #include <mm/paging.h>
7
8 struct abort_frame;
9 struct interrupt_frame;
10 struct fault_frame;
11 extern void double_fault(struct abort_frame *frame);
12 extern void keyb_handler(struct interrupt_frame *frame);
13 extern void pf_handler(struct fault_frame *frame);
14 static struct idt_descriptor idt[256] __attribute__((aligned(0x10)));
15 static struct idtr idtr __attribute__((aligned(0x10)));
16
17 struct e820_map {
18 uint64_t base;
19 uint64_t length;
20 uint32_t type;
21 uint32_t attrib;
22 };
23
24 void print_e820(struct e820_map *mmap, int mmap_size)
25 {
26 kprint(" Base | Length | Type | Attrib |\n", 0);
27 kprint("------------------------------------------------------------\n", 0);
28 for (int i=0; i<mmap_size; i++) {
29 kprintq(mmap[i].base);
30 kprintc('|', 0);
31 kprintq(mmap[i].length);
32 kprintc('|', 0);
33 kprintd(mmap[i].type);
34 kprintc('|', 0);
35 kprintd(mmap[i].attrib);
36 kprintc('|', 0);
37 kprintc('\n', 0);
38 }
39 }
40
41 void kmain(struct e820_map *mmap, int mmap_size)
42 {
43 screen_clear();
44 kprint("Welcome to Nameless OS!\nRunning revision: ", 0);
45 kprint(GIT_COMMIT, 0);
46 kprint("\n", 0);
47 kprint("BIOS memory map:\n", 0);
48 print_e820(mmap, mmap_size);
49 kprint("Preparing IDT...\n", 0);
50 idt_set_descriptor(idt, 8, 0x8, (uint32_t) double_fault, IDT_INTERRUPT_GATE, 0x0);
51 idt_set_descriptor(idt, 14, 0x8, (uint32_t) pf_handler, IDT_INTERRUPT_GATE, 0x0);
52 idt_set_descriptor(idt, 33, 0x8, (uint32_t) keyb_handler, IDT_INTERRUPT_GATE, 0x0);
53 kprint("IDT prepared, loading...\n", 0);
54 populate_idtr(&idtr, idt);
55 load_idt(idtr);
56 kprint("IDT loaded, enabling interrupts...\n", 0);
57 pic_init(0x20, 0x28);
58 pic_mask_all();
59 pic_unmask(1);
60 asm volatile ("sti");
61 kprint("All done\n", 0);
62 while(1);
63 }