#include "acpi.hpp" #include "ata.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 ata_probe(auto bus, ATA::Drive drv, const char *name) { switch (bus.identify(drv)) { case ATA::Type::ATA: term.write("ata:"); term.write(name); term.write(": ATA drive detected.\n"); break; case ATA::Type::ATAPI: term.write("ata:"); term.write(name); term.write(": ATAPI drive detected.\n"); break; default: break; } } 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"); ATA::Bus bus0; ATA::Bus bus1; ata_probe(bus0, ATA::Master, "0:0"); ata_probe(bus0, ATA::Slave, "0:1"); ata_probe(bus1, ATA::Master, "1:0"); ata_probe(bus1, ATA::Slave, "1:1"); idt_register_callback(0x28, [](auto& regs) { term.write(static_cast(regs.eax)); }); term.write("Entering user mode...\n"); enter_user_mode([] { asm volatile("int $0x28" :: "a" ('Z')); for (;;); }); for (;;) { const auto ch = keyboard_read(); if (ch) term.write(*ch); pit_delay_ms(10); } } extern "C" void abort() { term.write("!!! abort() called !!!"); asm volatile("cli"); for (;;); } extern "C" int __cxa_atexit(void (*func)(void *), void *arg, void *dso_handle) { return 0; } int __dso_handle = 0;