banan-os/kernel/kernel/kernel.cpp

103 lines
2.0 KiB
C++
Raw Normal View History

#include <BAN/Memory.h>
#include <kernel/APIC.h>
#include <kernel/GDT.h>
2022-11-16 19:49:09 +02:00
#include <kernel/IDT.h>
2022-12-30 19:38:21 +02:00
#include <kernel/Input.h>
#include <kernel/kmalloc.h>
#include <kernel/kprint.h>
#include <kernel/MMU.h>
2022-11-15 21:42:14 +02:00
#include <kernel/multiboot.h>
2022-12-07 02:41:18 +02:00
#include <kernel/PIC.h>
#include <kernel/PIT.h>
2022-12-13 10:41:36 +02:00
#include <kernel/RTC.h>
#include <kernel/Serial.h>
#include <kernel/Shell.h>
2022-12-23 15:55:45 +02:00
#include <kernel/TTY.h>
#include <kernel/VesaTerminalDriver.h>
#define DISABLE_INTERRUPTS() asm volatile("cli")
#define ENABLE_INTERRUPTS() asm volatile("sti")
extern "C" const char g_kernel_cmdline[];
2022-11-14 00:27:11 +02:00
using namespace BAN;
struct ParsedCommandLine
{
bool force_pic = false;
};
ParsedCommandLine ParseCommandLine()
{
ParsedCommandLine result;
if (!(g_multiboot_info->flags & 0x02))
return result;
const char* start = g_kernel_cmdline;
const char* current = g_kernel_cmdline;
while (true)
{
if (!*current || *current == ' ' || *current == '\t')
{
if (current - start == 6 && memcmp(start, "noapic", 6) == 0)
result.force_pic = true;
if (!*current)
break;
start = current + 1;
}
current++;
}
return result;
}
extern "C" void kernel_main()
{
DISABLE_INTERRUPTS();
2022-11-14 00:27:11 +02:00
2022-12-15 19:05:07 +02:00
Serial::initialize();
if (g_multiboot_magic != 0x2BADB002)
2022-12-15 19:05:07 +02:00
{
dprintln("Invalid multiboot magic number");
return;
2022-12-15 19:05:07 +02:00
}
dprintln("Serial output initialized");
2022-12-07 02:41:18 +02:00
auto cmdline = ParseCommandLine();
kmalloc_initialize();
dprintln("kmalloc initialized");
2022-12-07 02:41:18 +02:00
IDT::initialize();
dprintln("IDT initialized");
2022-12-07 02:41:18 +02:00
MMU::Intialize();
dprintln("MMU initialized");
TerminalDriver* terminal_driver = VesaTerminalDriver::Create();
ASSERT(terminal_driver);
dprintln("VESA initialized");
TTY* tty1 = new TTY(terminal_driver);
APIC::Initialize(cmdline.force_pic);
dprintln("APIC initialized");
2023-01-04 19:22:23 +02:00
PIT::initialize();
dprintln("PIT initialized");
2022-12-30 19:38:21 +02:00
if (!Input::initialize())
return;
dprintln("8042 initialized");
2022-11-15 21:42:14 +02:00
2022-12-10 03:53:44 +02:00
ENABLE_INTERRUPTS();
kprintln("Hello from the kernel!");
2023-01-16 15:16:39 +02:00
Kernel::Shell shell(tty1);
shell.Run();
2022-12-07 02:41:18 +02:00
for (;;)
{
asm("hlt");
2022-12-07 02:41:18 +02:00
}
}