polka/src/Main.cc

68 lines
1.9 KiB
C++
Raw Normal View History

/* Main.cc
* vim: set tw=80:
* Eryn Wells <eryn@erynwells.me>
*/
/**
* Entry point for the kernel in C/C++.
*/
2016-02-26 22:31:34 -08:00
#include <stddef.h>
#include <stdint.h>
2016-02-27 13:50:51 -05:00
#include "Console.hh"
2016-02-28 23:26:42 -05:00
#include "Descriptors.hh"
#include "Interrupts.hh"
#include "Multiboot.hh"
2016-02-26 22:31:34 -08:00
#if defined(__linux__)
#error "This file should be compiled with a cross-compiler, not the Linux system compiler!"
#endif
#if !defined(__i386__)
#error "This file should be compiled with an ix86-elf compiler!"
#endif
2016-02-27 12:34:36 -05:00
/** Called very early, before global initialization. */
2016-02-26 22:31:34 -08:00
extern "C"
void
kearly()
2016-02-27 13:50:51 -05:00
{
2016-03-01 12:01:51 -05:00
using kernel::Console;
// Create a console object for early use because global initialization hasn't happened yet.
2016-03-01 12:01:51 -05:00
Console console;
2016-02-27 13:50:51 -05:00
console.clear(kernel::Console::Color::Blue);
console.printString("Loading system ...\n");
2016-02-27 13:50:51 -05:00
}
/** The beginning of the world... */
extern "C"
void
kmain(multiboot::Information *information)
2016-03-01 12:01:51 -05:00
{
multiboot::Information::setInformation(information);
auto info = multiboot::Information::information();
2016-03-01 12:01:51 -05:00
// Reinitialize the system console now that we have global static objects.
auto& console = kernel::Console::systemConsole();
console.clear(kernel::Console::Color::Blue);
2016-03-01 12:01:51 -05:00
console.printString("Loading Polka ...\n");
console.printFormat("Detected memory: lower = %ld KB, upper = %ld KB\n", info->lowerMemoryKB(), info->upperMemoryKB());
auto& gdt = x86::GDT::systemGDT();
2016-03-01 12:01:51 -05:00
gdt.setNullDescriptor(0);
gdt.setDescriptor(1, x86::GDT::DescriptorSpec::kernelSegment(0, 0xFFFFFFFF, x86::GDT::Type::CodeEXR));
gdt.setDescriptor(2, x86::GDT::DescriptorSpec::kernelSegment(0, 0xFFFFFFFF, x86::GDT::Type::DataRW));
2016-03-01 12:01:51 -05:00
gdt.load();
console.printString("GDT loaded\n");
2016-03-02 02:57:35 -05:00
auto& interruptHandler = x86::InterruptHandler::systemInterruptHandler();
interruptHandler.initialize();
2016-03-13 12:52:47 -04:00
interruptHandler.enableInterrupts();
console.printString("Interrupts enabled\n");
2016-03-13 12:52:47 -04:00
for (;;) { }
2016-03-01 12:01:51 -05:00
}