]> git.dujemihanovic.xyz Git - nameless-os.git/blob - kernel/kernel.c
(VERY BROKEN) Enable paging
[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 extern void double_fault(struct abort_frame *frame);
9 extern void keyb_handler(struct interrupt_frame *frame);
10 extern void pf_handler(struct fault_frame *frame);
11 static struct idt_descriptor idt[256] __attribute__((aligned(0x10)));
12 static struct idtr idtr __attribute__((aligned(0x10)));
13
14 static struct page_directory_entry page_dir[1024] __attribute__((aligned(0x1000)));
15 static struct page_table_entry page_table[1024] __attribute__((aligned(0x1000)));
16
17 void kmain(void)
18 {
19 screen_clear();
20 kprint("Welcome to Nameless OS!\nRunning revision: ", 0);
21 kprint(GIT_COMMIT, 0);
22 kprint("\nEnabling paging...\n", 0);
23 for (int i=0xb8; i < 0xc0; i++) {
24 page_table[i].p = 1;
25 page_table[i].rw = 0;
26 page_table[i].us = 0;
27 page_table[i].page_frame_addr = i;
28 }
29 for (int i=0x100; i < 0x102; i++) {
30 page_table[i].p = 1;
31 page_table[i].rw = 0;
32 page_table[i].us = 0;
33 page_table[i].page_frame_addr = i;
34 }
35 for (int i=0x102; i < 0x110; i++) {
36 page_table[i].p = 1;
37 page_table[i].rw = 1;
38 page_table[i].us = 0;
39 page_table[i].page_frame_addr = i;
40 }
41 page_dir[0].p = 1;
42 page_dir[0].page_table_addr = (int) &page_table >> 12;
43 enable_paging(page_dir);
44 kprint("Preparing IDT...\n", 0);
45 idt_set_descriptor(idt, 8, 0x8, (uint32_t) double_fault, IDT_INTERRUPT_GATE, 0x0);
46 idt_set_descriptor(idt, 14, 0x8, (uint32_t) pf_handler, IDT_INTERRUPT_GATE, 0x0);
47 idt_set_descriptor(idt, 33, 0x8, (uint32_t) keyb_handler, IDT_INTERRUPT_GATE, 0x0);
48 kprint("IDT prepared, loading...\n", 0);
49 populate_idtr(&idtr, idt);
50 load_idt(idtr);
51 kprint("IDT loaded, enabling interrupts...\n", 0);
52 pic_init(0x20, 0x28);
53 pic_mask_all();
54 pic_unmask(1);
55 asm volatile ("sti");
56 kprint("All done\n", 0);
57 struct idtr curr_idtr;
58 asm ("sidt %0": "=m" (curr_idtr));
59 kprintw(curr_idtr.limit);
60 kprintd(curr_idtr.base);
61 //kprint("Gonna force a double fault\n", 0);
62 //int test = 1/0;
63 //int test2 = *(int *) (0xa0000000);
64 while(1);
65 }