]> git.dujemihanovic.xyz Git - nameless-os.git/blob - kernel/kernel.c
5a6a82d1d75b816e9efdee7eb3c7d3e151d4bdcf
[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 void kmain(struct e820_map *mmap, int mmap_size)
38 {
39 screen_clear();
40 kprint("Welcome to Nameless OS!\nRunning revision: ", 0);
41 kprint(GIT_COMMIT, 0);
42 kprint("\n", 0);
43 kprint("BIOS memory map:\n", 0);
44 print_e820(mmap, mmap_size);
45 kprint("Preparing IDT...\n", 0);
46 for (int i=0; i<48; i++) {
47 idt_set_descriptor(idt, i, 0x8, _int_handler_table[i], IDT_INTERRUPT_GATE, 0);
48 }
49 kprint("IDT prepared, loading...\n", 0);
50 populate_idtr(&idtr, idt);
51 load_idt(idtr);
52 kprint("Setting up interrupts...\n", 0);
53 pic_init(0x20, 0x28);
54 pic_mask_all();
55 asm volatile ("sti");
56 kprint("All done\n", 0);
57 while(1);
58 }