105 lines
2.5 KiB
D
105 lines
2.5 KiB
D
/**
|
|
* HULK, the HOS Ultra Light Kernel.
|
|
*/
|
|
module hulk.hulk;
|
|
|
|
import hulk.header;
|
|
import hulk.fb;
|
|
import hulk.console;
|
|
import hulk.memory;
|
|
import ldc.attributes;
|
|
import hulk.kfont;
|
|
import hulk.klog;
|
|
import hulk.hurl;
|
|
import hulk.hippo;
|
|
import hulk.pci;
|
|
import hulk.gdt;
|
|
import hulk.idt;
|
|
import hulk.cpu;
|
|
import ldc.llvmasm;
|
|
import hulk.pic;
|
|
import hulk.acpi;
|
|
import hulk.apic;
|
|
import hulk.rtc;
|
|
import hulk.serial;
|
|
import hulk.usb;
|
|
import hulk.pit;
|
|
import hulk.time;
|
|
|
|
extern extern(C) __gshared ubyte _hulk_bss_size;
|
|
|
|
@(ldc.attributes.section(".hulk_header"))
|
|
private __gshared HulkHeader hulk_header = {
|
|
&_hulk_bss_size, /* hulk_bss_size */
|
|
&hulk_start, /* entry */
|
|
16u * 1024u, /* stack_size */
|
|
Hurl.HULK_BASE, /* virt_base */
|
|
Hurl.HULK_STACK_TOP, /* virt_stack_top */
|
|
Hurl.HULK_FRAMEBUFFER, /* virt_fb_buffer */
|
|
};
|
|
|
|
private void initialize_cpu()
|
|
{
|
|
/* Enable SSE. */
|
|
/* Turn off CR0.EM and turn on CR0.MP. */
|
|
write_cr0((read_cr0() & ~CR0_EM) | CR0_MP);
|
|
/* Set CR4.OSFXSR and CR4.OSXMMEXCPT. */
|
|
write_cr4(read_cr4() | CR4_OSFXSR | CR4_OSXMMEXCPT);
|
|
|
|
/* Enable OSXSAVE. */
|
|
write_cr4(read_cr4() | CR4_OSXSAVE);
|
|
|
|
/* Turn on NXE (no execute enable) flag in the EFER MSR. */
|
|
wrmsr(MSR_EFER, rdmsr(MSR_EFER) | EFER_NXE);
|
|
}
|
|
|
|
/**
|
|
* HULK entry point.
|
|
*/
|
|
void hulk_start()
|
|
{
|
|
cli();
|
|
initialize_cpu();
|
|
Serial.initialize();
|
|
Gdt.initialize();
|
|
Idt.initialize();
|
|
Fb.initialize(cast(uint *)Hurl.HULK_FRAMEBUFFER,
|
|
cast(uint *)hulk_header.bootinfo.fb_buffer1_phys,
|
|
hulk_header.bootinfo.fb.width,
|
|
hulk_header.bootinfo.fb.height,
|
|
hulk_header.bootinfo.fb.stride);
|
|
Console.initialize();
|
|
Console.clear();
|
|
Klog.initialize();
|
|
|
|
Klog.writefln("\a5Welcome to HULK, the HOS UltraLight Kernel!");
|
|
|
|
Hurl.initialize(&hulk_header);
|
|
Pic.initialize();
|
|
Acpi.initialize(hulk_header.bootinfo.acpi_xsdt_phys);
|
|
Apic.initialize();
|
|
Rtc.initialize();
|
|
/* Read the current system time. */
|
|
Rtc.time t = Rtc.read_rtc_time();
|
|
Klog.writefln("System time is 20%02u-%02u-%02u %02u:%02u:%02u",
|
|
t.year, t.month, t.day, t.hour, t.minute, t.second);
|
|
Pit.initialize();
|
|
Pci.initialize();
|
|
Usb.initialize();
|
|
sti();
|
|
|
|
/* Check that PIT millisecond interrupt is firing. */
|
|
size_t uptime = Time.uptime();
|
|
while (Time.uptime() <= uptime)
|
|
{
|
|
}
|
|
Klog.writefln("\a5HULK Initialization Complete!");
|
|
|
|
/* Idle loop. */
|
|
Time.msleep(1);
|
|
for (;;)
|
|
{
|
|
hlt();
|
|
}
|
|
}
|