4 #include <irq/i8259a.h>
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)));
14 static struct page_directory_entry page_dir
[1024] __attribute__((aligned(0x1000)));
15 static struct page_table_entry page_table
[1024] __attribute__((aligned(0x1000)));
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
++) {
27 page_table
[i
].page_frame_addr
= i
;
29 for (int i
=0x100; i
< 0x102; i
++) {
33 page_table
[i
].page_frame_addr
= i
;
35 for (int i
=0x102; i
< 0x110; i
++) {
39 page_table
[i
].page_frame_addr
= i
;
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
);
51 kprint("IDT loaded, enabling interrupts...\n", 0);
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);
63 //int test2 = *(int *) (0xa0000000);