diff --git a/src/hulk/hulk.d b/src/hulk/hulk.d index f23f0bc..f6ae27a 100644 --- a/src/hulk/hulk.d +++ b/src/hulk/hulk.d @@ -33,12 +33,26 @@ private __gshared HulkHeader hulk_header = { HULK_VIRTUAL_FRAMEBUFFER_ADDRESS, /* virt_fb_buffer */ }; +private void initialize_cpu() +{ + /* 1. Enable SSE. */ + /* 1.a. Turn off CR0.EM and turn on CR0.MP. */ + write_cr0((read_cr0() & ~CR0_EM) | CR0_MP); + /* 1.b. Set CR4.OSFXSR and CR4.OSXMMEXCPT. */ + write_cr4(read_cr4() | CR4_OSFXSR | CR4_OSXMMEXCPT); + /* 2. Enable OSXSAVE. */ + // write_cr4(read_cr4() | CR4_OSXSAVE); + /* 3. Enable AVX. */ +// xsetbv(0u, xgetbv(0u) | XCR0_X87 | XCR0_SSE | XCR0_AVX); +} + /** * HULK entry point. */ void hulk_start() { cli(); + initialize_cpu(); gdt.initialize(); idt.initialize(); fb.initialize(cast(uint *)HULK_VIRTUAL_FRAMEBUFFER_ADDRESS, hulk_header.bootinfo.fb.width, hulk_header.bootinfo.fb.height, hulk_header.bootinfo.fb.stride);