aboutsummaryrefslogtreecommitdiffstats
path: root/src/kernel.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/kernel.cpp')
-rw-r--r--src/kernel.cpp104
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;
+