|
|
|
#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");
|
|
|
|
|
|
|
|
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;
|
|
|
|
|