2022-11-15 00:32:07 +02:00
|
|
|
#include <kernel/GDT.h>
|
2022-11-16 19:49:09 +02:00
|
|
|
#include <kernel/IDT.h>
|
2022-12-10 00:33:03 +02:00
|
|
|
#include <kernel/IO.h>
|
2022-12-08 17:52:08 +02:00
|
|
|
#include <kernel/Keyboard.h>
|
2022-11-15 00:32:07 +02:00
|
|
|
#include <kernel/kmalloc.h>
|
2022-12-10 00:33:03 +02:00
|
|
|
#include <kernel/kprint.h>
|
2022-11-15 21:42:14 +02:00
|
|
|
#include <kernel/multiboot.h>
|
2022-11-15 00:32:07 +02:00
|
|
|
#include <kernel/panic.h>
|
2022-12-07 02:41:18 +02:00
|
|
|
#include <kernel/PIC.h>
|
|
|
|
#include <kernel/PIT.h>
|
2022-12-10 00:33:03 +02:00
|
|
|
#include <kernel/Serial.h>
|
2022-11-12 21:04:47 +02:00
|
|
|
#include <kernel/tty.h>
|
|
|
|
|
2022-11-15 00:32:07 +02:00
|
|
|
#include <string.h>
|
|
|
|
#include <stdlib.h>
|
2022-11-13 01:04:10 +02:00
|
|
|
|
2022-11-15 00:32:07 +02:00
|
|
|
#define DISABLE_INTERRUPTS() asm volatile("cli")
|
|
|
|
#define ENABLE_INTERRUPTS() asm volatile("sti")
|
2022-11-12 21:04:47 +02:00
|
|
|
|
2022-11-15 21:42:14 +02:00
|
|
|
multiboot_info_t* s_multiboot_info;
|
2022-11-14 00:27:11 +02:00
|
|
|
|
2022-12-08 17:52:08 +02:00
|
|
|
void on_key_press(Keyboard::Key key, uint8_t modifiers, bool pressed)
|
|
|
|
{
|
|
|
|
if (pressed)
|
|
|
|
{
|
2022-12-10 00:33:03 +02:00
|
|
|
if (key == Keyboard::Key::Escape)
|
|
|
|
{
|
|
|
|
kprint("time since boot: {} ms\n", PIT::ms_since_boot());
|
|
|
|
return;
|
|
|
|
}
|
2022-12-10 03:53:44 +02:00
|
|
|
else if (key == Keyboard::Key::Backspace)
|
|
|
|
{
|
|
|
|
kprint("\b \b");
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
char ascii = Keyboard::key_to_ascii(key, modifiers);
|
|
|
|
if (ascii)
|
|
|
|
kprint("{}", ascii);
|
|
|
|
}
|
2022-12-08 17:52:08 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-11-15 00:32:07 +02:00
|
|
|
extern "C"
|
|
|
|
void kernel_main(multiboot_info_t* mbi, uint32_t magic)
|
|
|
|
{
|
|
|
|
DISABLE_INTERRUPTS();
|
2022-11-14 00:27:11 +02:00
|
|
|
|
2022-11-15 21:42:14 +02:00
|
|
|
s_multiboot_info = mbi;
|
|
|
|
|
2022-12-07 02:41:18 +02:00
|
|
|
if (magic != 0x2BADB002)
|
2022-12-10 00:33:03 +02:00
|
|
|
return;
|
2022-12-07 02:41:18 +02:00
|
|
|
|
2022-12-10 00:33:03 +02:00
|
|
|
TTY::initialize();
|
|
|
|
Serial::initialize();
|
2022-11-13 01:04:10 +02:00
|
|
|
|
2022-11-16 19:49:09 +02:00
|
|
|
kmalloc_initialize();
|
2022-11-15 21:42:14 +02:00
|
|
|
|
2022-12-07 02:41:18 +02:00
|
|
|
PIC::initialize();
|
2022-11-16 19:49:09 +02:00
|
|
|
gdt_initialize();
|
2022-12-07 02:41:18 +02:00
|
|
|
IDT::initialize();
|
|
|
|
|
|
|
|
PIT::initialize();
|
2022-12-08 17:52:08 +02:00
|
|
|
Keyboard::initialize(on_key_press);
|
2022-11-15 21:42:14 +02:00
|
|
|
|
2022-12-10 00:33:03 +02:00
|
|
|
kprintln("Hello from the kernel!");
|
|
|
|
|
2022-12-10 03:53:44 +02:00
|
|
|
kprint("HHHHHHHHHHHHHHHHHHHHHHHHHHHHH\e[20D.\e[3K");
|
2022-12-10 00:33:03 +02:00
|
|
|
|
2022-12-10 03:53:44 +02:00
|
|
|
ENABLE_INTERRUPTS();
|
2022-11-13 01:04:10 +02:00
|
|
|
|
2022-12-07 02:41:18 +02:00
|
|
|
for (;;)
|
|
|
|
{
|
|
|
|
asm("hlt");
|
|
|
|
}
|
2022-11-12 21:04:47 +02:00
|
|
|
}
|