85 lines
1.9 KiB
D
85 lines
1.9 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;
|
|
|
|
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();
|
|
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("Welcome to HULK, the HOS UltraLight Kernel!");
|
|
|
|
Hurl.initialize(&hulk_header);
|
|
Pci.initialize();
|
|
Pic.initialize();
|
|
Acpi.initialize(hulk_header.bootinfo.acpi_xsdt_phys);
|
|
Apic.initialize();
|
|
Rtc.initialize();
|
|
sti();
|
|
|
|
for (;;)
|
|
{
|
|
hlt();
|
|
}
|
|
}
|