]>
git.dujemihanovic.xyz Git - nameless-os.git/blob - kernel/kernel/kernel.c
4 #include <irq/interrupt.h>
5 #include <irq/i8259a.h>
11 struct idt_descriptor idt
[256] __attribute__((aligned(0x10)));
12 struct idtr idtr
__attribute__((aligned(0x10)));
13 extern void (*_int_handler_table
[48])(void);
22 void print_e820(struct e820_map
*mmap
, int mmap_size
)
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
);
39 /* Small handler for double faults. Will be put elsewhere eventually. */
40 int double_fault_handler(struct interrupt_frame
*frame
)
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");
76 void kmain(struct e820_map
*mmap
, int mmap_size
)
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);
88 kprint("IDT prepared, loading...\n", VGA_LIGHT_GRAY
, VGA_BLACK
);
89 populate_idtr(&idtr
, idt
);
91 kprint("Setting up interrupts...\n", VGA_LIGHT_GRAY
, VGA_BLACK
);
92 register_interrupt(8, &double_fault_handler
);
96 kprint("Initializing PS/2...\n", VGA_LIGHT_GRAY
, VGA_BLACK
);
97 int ret
= ps2_initialize();
100 kprint("No PS/2 devices found or something is faulty\n", VGA_LIGHT_GRAY
, VGA_BLACK
);
103 kprint("One PS/2 device found\n", VGA_LIGHT_GRAY
, VGA_BLACK
);
106 kprint("Two PS/2 devices found\n", VGA_LIGHT_GRAY
, VGA_BLACK
);
108 kprint("All done\n", VGA_LIGHT_GRAY
, VGA_BLACK
);