/** * 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.pit; 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 */ HULK_VIRTUAL_BASE_ADDRESS, /* virt_base */ HULK_VIRTUAL_STACK_TOP_ADDRESS, /* virt_stack_top */ HULK_VIRTUAL_FRAMEBUFFER_ADDRESS, /* 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 *)HULK_VIRTUAL_FRAMEBUFFER_ADDRESS, 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(); pit.initialize(); sti(); for (;;) { hlt(); } }