diff options
Diffstat (limited to 'src/kernel.cpp')
-rw-r--r-- | src/kernel.cpp | 104 |
1 files changed, 104 insertions, 0 deletions
diff --git a/src/kernel.cpp b/src/kernel.cpp new file mode 100644 index 0000000..ae3f153 --- /dev/null +++ b/src/kernel.cpp @@ -0,0 +1,104 @@ +#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<ATA::Primary> bus0; + ATA::Bus<ATA::Secondary> 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<char>(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 (*)(void *), void *, void *) +{ + return 0; +} + +int __dso_handle = 0; + |