#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define DISABLE_INTERRUPTS() asm volatile("cli") #define ENABLE_INTERRUPTS() asm volatile("sti") multiboot_info_t* s_multiboot_info; using namespace BAN; struct ParsedCommandLine { bool force_pic = false; }; ParsedCommandLine ParseCommandLine(const char* command_line) { auto args = MUST(StringView(command_line).Split([](char c) { return c == ' ' || c == '\t'; })); ParsedCommandLine result; result.force_pic = args.Has("noapic"); return result; } extern "C" void kernel_main(multiboot_info_t* mbi, uint32_t magic) { DISABLE_INTERRUPTS(); Serial::initialize(); if (magic != 0x2BADB002) { dprintln("Invalid multiboot magic number"); return; } s_multiboot_info = mbi; if (!VESA::Initialize()) { dprintln("Could not initialize VESA"); return; } ParsedCommandLine cmdline; if (mbi->flags & 0x02) cmdline = ParseCommandLine((const char*)mbi->cmdline); APIC::Initialize(cmdline.force_pic); gdt_initialize(); IDT::initialize(); PIT::initialize(); kmalloc_initialize(); TTY* tty1 = new TTY; tty1->SetCursorPosition(0, 2); if (!Keyboard::initialize()) return; ENABLE_INTERRUPTS(); kprintln("Hello from the kernel!"); auto& shell = Kernel::Shell::Get(); shell.SetTTY(tty1); shell.Run(); for (;;) { asm("hlt"); } }