]> git.dujemihanovic.xyz Git - nameless-os.git/blob - kernel/kernel/kernel.c
Merge branch 'ps2-driver' into mm
[nameless-os.git] / kernel / kernel / kernel.c
1 #include <kprint.h>
2 #include <io.h>
3 #include <irq/idt.h>
4 #include <irq/interrupt.h>
5 #include <irq/i8259a.h>
6 #include <input/ps2.h>
7 #include <stdint.h>
8 #include <mm/paging.h>
9 #include <panic.h>
10
11 struct idt_descriptor idt[256] __attribute__((aligned(0x10)));
12 struct idtr idtr __attribute__((aligned(0x10)));
13 extern void (*_int_handler_table[48])(void);
14
15 struct e820_map {
16 uint64_t base;
17 uint64_t length;
18 uint32_t type;
19 uint32_t attrib;
20 };
21
22 void print_e820(struct e820_map *mmap, int mmap_size)
23 {
24 kprint(" Base | Length | Type | Attrib |\n", VGA_LIGHT_GRAY, VGA_BLACK);
25 kprint("------------------------------------------------------------\n", VGA_LIGHT_GRAY, VGA_BLACK);
26 for (int i=0; i<mmap_size; i++) {
27 kprintq(mmap[i].base, 1);
28 kprintc('|', VGA_LIGHT_GRAY, VGA_BLACK);
29 kprintq(mmap[i].length, 1);
30 kprintc('|', VGA_LIGHT_GRAY, VGA_BLACK);
31 kprintd(mmap[i].type, 1);
32 kprintc('|', VGA_LIGHT_GRAY, VGA_BLACK);
33 kprintd(mmap[i].attrib, 1);
34 kprintc('|', VGA_LIGHT_GRAY, VGA_BLACK);
35 kprintc('\n', VGA_LIGHT_GRAY, VGA_BLACK);
36 }
37 }
38
39 /* Small handler for double faults. Will be put elsewhere eventually. */
40 int double_fault_handler(struct interrupt_frame *frame)
41 {
42 kprint("Double fault occurred!\n", VGA_BRIGHT_RED, VGA_BLACK);
43 kprint("EAX: ", VGA_LIGHT_GRAY, VGA_BLACK);
44 kprintd(frame->eax, 1);
45 kprintc(' ', VGA_LIGHT_GRAY, VGA_BLACK);
46 kprint("EBX: ", VGA_LIGHT_GRAY, VGA_BLACK);
47 kprintd(frame->ebx, 1);
48 kprintc(' ', VGA_LIGHT_GRAY, VGA_BLACK);
49 kprint("ECX: ", VGA_LIGHT_GRAY, VGA_BLACK);
50 kprintd(frame->ecx, 1);
51 kprintc(' ', VGA_LIGHT_GRAY, VGA_BLACK);
52 kprint("EDX: ", VGA_LIGHT_GRAY, VGA_BLACK);
53 kprintd(frame->edx, 1);
54 kprintc('\n', VGA_LIGHT_GRAY, VGA_BLACK);
55 kprint("EBP: ", VGA_LIGHT_GRAY, VGA_BLACK);
56 kprintd(frame->ebp, 1);
57 kprintc(' ', VGA_LIGHT_GRAY, VGA_BLACK);
58 kprint("ESP: ", VGA_LIGHT_GRAY, VGA_BLACK);
59 kprintd(frame->esp, 1);
60 kprintc('\n', VGA_LIGHT_GRAY, VGA_BLACK);
61 kprint("ESI: ", VGA_LIGHT_GRAY, VGA_BLACK);
62 kprintd(frame->esi, 1);
63 kprintc(' ', VGA_LIGHT_GRAY, VGA_BLACK);
64 kprint("EDI: ", VGA_LIGHT_GRAY, VGA_BLACK);
65 kprintd(frame->edi, 1);
66 kprintc('\n', VGA_LIGHT_GRAY, VGA_BLACK);
67 kprint("EIP: ", VGA_LIGHT_GRAY, VGA_BLACK);
68 kprintd(frame->eip, 1);
69 kprintc(' ', VGA_LIGHT_GRAY, VGA_BLACK);
70 kprint("EFLAGS: ", VGA_LIGHT_GRAY, VGA_BLACK);
71 kprintd(frame->eflags, 1);
72 kprintc('\n', VGA_LIGHT_GRAY, VGA_BLACK);
73 PANIC("double fault");
74 }
75
76 void kmain(struct e820_map *mmap, int mmap_size)
77 {
78 vga_initialize();
79 kprint("Welcome to Nameless OS!\nRunning revision: ", VGA_LIGHT_GRAY, VGA_BLACK);
80 kprint(GIT_COMMIT, VGA_LIGHT_GRAY, VGA_BLACK);
81 kprint("\n", VGA_LIGHT_GRAY, VGA_BLACK);
82 kprint("BIOS memory map:\n", VGA_LIGHT_GRAY, VGA_BLACK);
83 print_e820(mmap, mmap_size);
84 kprint("Preparing IDT...\n", VGA_LIGHT_GRAY, VGA_BLACK);
85 for (int i=0; i<48; i++) {
86 idt_set_descriptor(idt, i, 0x8, _int_handler_table[i], IDT_INTERRUPT_GATE, 0);
87 }
88 kprint("IDT prepared, loading...\n", VGA_LIGHT_GRAY, VGA_BLACK);
89 populate_idtr(&idtr, idt);
90 load_idt(idtr);
91 kprint("Setting up interrupts...\n", VGA_LIGHT_GRAY, VGA_BLACK);
92 register_interrupt(8, &double_fault_handler);
93 pic_init(0x20, 0x28);
94 pic_mask_all();
95 asm volatile ("sti");
96 kprint("Initializing PS/2...\n", VGA_LIGHT_GRAY, VGA_BLACK);
97 int ret = ps2_initialize();
98 switch (ret) {
99 case -1:
100 kprint("No PS/2 devices found or something is faulty\n", VGA_LIGHT_GRAY, VGA_BLACK);
101 break;
102 case 0:
103 kprint("One PS/2 device found\n", VGA_LIGHT_GRAY, VGA_BLACK);
104 break;
105 case 1:
106 kprint("Two PS/2 devices found\n", VGA_LIGHT_GRAY, VGA_BLACK);
107 }
108 kprint("All done\n", VGA_LIGHT_GRAY, VGA_BLACK);
109 while(1);
110 }