/** * 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(); } }