|
|
|
#include "acpi.hpp"
|
|
|
|
#include "gdt.hpp"
|
|
|
|
#include "idt.hpp"
|
|
|
|
#include "keyboard.hpp"
|
|
|
|
#include "memory.hpp"
|
|
|
|
#include "multiboot.hpp"
|
|
|
|
#include "pic.hpp"
|
|
|
|
#include "pit.hpp"
|
|
|
|
#include "portio.hpp"
|
|
|
|
#include "tasking.hpp"
|
|
|
|
#include "vgaterminal.hpp"
|
|
|
|
|
|
|
|
static VGATerminal vga;
|
|
|
|
TextOutput& term = vga;
|
|
|
|
|
|
|
|
static volatile bool termBusy = false;
|
|
|
|
|
|
|
|
void kernel_main(void)
|
|
|
|
{
|
|
|
|
term.write("Clyne's kernel, v2024\n\n");
|
|
|
|
|
|
|
|
if (!multiboot_initialize())
|
|
|
|
for (;;);
|
|
|
|
|
|
|
|
idt_register_callback(14, [](auto& regs) {
|
|
|
|
term.write("Page fault! eip=");
|
|
|
|
term.write(regs.eip);
|
|
|
|
term.write('\n');
|
|
|
|
for (;;);
|
|
|
|
});
|
|
|
|
|
|
|
|
acpi_initialize();
|
|
|
|
memory_initialize();
|
|
|
|
gdt_initialize();
|
|
|
|
pic_initialize();
|
|
|
|
idt_initialize();
|
|
|
|
pit_initialize();
|
|
|
|
keyboard_initialize();
|
|
|
|
asm volatile("sti");
|
|
|
|
tasking_initialize();
|
|
|
|
term.write("Tasking enabled.\n");
|
|
|
|
|
|
|
|
//tasking_spawn([] {
|
|
|
|
// for (;;) {
|
|
|
|
// do pit_delay_ms(1);
|
|
|
|
// while (termBusy);
|
|
|
|
|
|
|
|
// termBusy = true;
|
|
|
|
// term.write('B');
|
|
|
|
// termBusy = false;
|
|
|
|
// }
|
|
|
|
//}, 256);
|
|
|
|
|
|
|
|
//tasking_spawn([] {
|
|
|
|
// for (;;) {
|
|
|
|
// do pit_delay_ms(1);
|
|
|
|
// while (termBusy);
|
|
|
|
|
|
|
|
// termBusy = true;
|
|
|
|
// term.write('C');
|
|
|
|
// termBusy = false;
|
|
|
|
// }
|
|
|
|
//}, 256);
|
|
|
|
|
|
|
|
for (;;) {
|
|
|
|
pit_delay_ms(100);
|
|
|
|
//while (termBusy);
|
|
|
|
|
|
|
|
//termBusy = true;
|
|
|
|
//term.write('A');
|
|
|
|
//termBusy = false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|