]>
git.dujemihanovic.xyz Git - nameless-os.git/blob - kernel/kernel.c
4 #include <irq/interrupt.h>
5 #include <irq/i8259a.h>
9 struct idt_descriptor idt
[256] __attribute__((aligned(0x10)));
10 struct idtr idtr
__attribute__((aligned(0x10)));
11 extern void (*_int_handler_table
[48])(void);
20 void print_e820(struct e820_map
*mmap
, int mmap_size
)
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
);
27 kprintq(mmap
[i
].length
);
29 kprintd(mmap
[i
].type
);
31 kprintd(mmap
[i
].attrib
);
37 /* Small handler for double faults. Will be put elsewhere eventually. */
38 int double_fault_handler(struct interrupt_frame
*frame
)
40 kprint("PANIC: Double fault occurred!\n", VGA_COLOR_BRIGHT_RED
);
41 kprint("EAX: ", VGA_COLOR_BRIGHT_RED
);
43 kprint("\n", VGA_COLOR_BRIGHT_RED
);
44 kprint("EBX: ", VGA_COLOR_BRIGHT_RED
);
46 kprint("\n", VGA_COLOR_BRIGHT_RED
);
47 kprint("ECX: ", VGA_COLOR_BRIGHT_RED
);
49 kprint("\n", VGA_COLOR_BRIGHT_RED
);
50 kprint("EDX: ", VGA_COLOR_BRIGHT_RED
);
52 kprint("\n", VGA_COLOR_BRIGHT_RED
);
53 kprint("EBP: ", VGA_COLOR_BRIGHT_RED
);
55 kprint("\n", VGA_COLOR_BRIGHT_RED
);
56 kprint("ESP: ", VGA_COLOR_BRIGHT_RED
);
58 kprint("\n", VGA_COLOR_BRIGHT_RED
);
59 kprint("ESI: ", VGA_COLOR_BRIGHT_RED
);
61 kprint("\n", VGA_COLOR_BRIGHT_RED
);
62 kprint("EDI: ", VGA_COLOR_BRIGHT_RED
);
64 kprint("\n", VGA_COLOR_BRIGHT_RED
);
65 kprint("EIP: ", VGA_COLOR_BRIGHT_RED
);
67 kprint("\n", VGA_COLOR_BRIGHT_RED
);
68 kprint("EFLAGS: ", VGA_COLOR_BRIGHT_RED
);
69 kprintd(frame
->eflags
);
70 kprint("\n", VGA_COLOR_BRIGHT_RED
);
72 /* IF has already been cleared for us */
79 void kmain(struct e820_map
*mmap
, int mmap_size
)
82 kprint("Welcome to Nameless OS!\nRunning revision: ", 0);
83 kprint(GIT_COMMIT
, 0);
85 kprint("BIOS memory map:\n", 0);
86 print_e820(mmap
, mmap_size
);
87 kprint("Preparing IDT...\n", 0);
88 for (int i
=0; i
<48; i
++) {
89 idt_set_descriptor(idt
, i
, 0x8, _int_handler_table
[i
], IDT_INTERRUPT_GATE
, 0);
91 kprint("IDT prepared, loading...\n", 0);
92 populate_idtr(&idtr
, idt
);
94 kprint("Setting up interrupts...\n", 0);
95 register_interrupt(8, &double_fault_handler
);
99 kprint("All done\n", 0);